]>
Commit | Line | Data |
---|---|---|
50acfb2b | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
6d60b6ee PD |
2 | /* |
3 | * Copyright (C) 2015 Regents of the University of California | |
8446923a | 4 | * Copyright (c) 2020 Western Digital Corporation or its affiliates. |
6d60b6ee PD |
5 | */ |
6 | ||
7 | #ifndef _ASM_RISCV_SBI_H | |
8 | #define _ASM_RISCV_SBI_H | |
9 | ||
10 | #include <linux/types.h> | |
11 | ||
3b03ac6b | 12 | #ifdef CONFIG_RISCV_SBI |
b9dcd9e4 | 13 | enum sbi_ext_id { |
efca1398 | 14 | #ifdef CONFIG_RISCV_SBI_V01 |
b9dcd9e4 AP |
15 | SBI_EXT_0_1_SET_TIMER = 0x0, |
16 | SBI_EXT_0_1_CONSOLE_PUTCHAR = 0x1, | |
17 | SBI_EXT_0_1_CONSOLE_GETCHAR = 0x2, | |
18 | SBI_EXT_0_1_CLEAR_IPI = 0x3, | |
19 | SBI_EXT_0_1_SEND_IPI = 0x4, | |
20 | SBI_EXT_0_1_REMOTE_FENCE_I = 0x5, | |
21 | SBI_EXT_0_1_REMOTE_SFENCE_VMA = 0x6, | |
22 | SBI_EXT_0_1_REMOTE_SFENCE_VMA_ASID = 0x7, | |
23 | SBI_EXT_0_1_SHUTDOWN = 0x8, | |
efca1398 | 24 | #endif |
b9dcd9e4 | 25 | SBI_EXT_BASE = 0x10, |
ecbacc2a AP |
26 | SBI_EXT_TIME = 0x54494D45, |
27 | SBI_EXT_IPI = 0x735049, | |
28 | SBI_EXT_RFENCE = 0x52464E43, | |
db5a7946 | 29 | SBI_EXT_HSM = 0x48534D, |
b9dcd9e4 | 30 | }; |
6d60b6ee | 31 | |
b9dcd9e4 AP |
32 | enum sbi_ext_base_fid { |
33 | SBI_EXT_BASE_GET_SPEC_VERSION = 0, | |
34 | SBI_EXT_BASE_GET_IMP_ID, | |
35 | SBI_EXT_BASE_GET_IMP_VERSION, | |
36 | SBI_EXT_BASE_PROBE_EXT, | |
37 | SBI_EXT_BASE_GET_MVENDORID, | |
38 | SBI_EXT_BASE_GET_MARCHID, | |
39 | SBI_EXT_BASE_GET_MIMPID, | |
40 | }; | |
6d60b6ee | 41 | |
ecbacc2a AP |
42 | enum sbi_ext_time_fid { |
43 | SBI_EXT_TIME_SET_TIMER = 0, | |
44 | }; | |
45 | ||
46 | enum sbi_ext_ipi_fid { | |
47 | SBI_EXT_IPI_SEND_IPI = 0, | |
48 | }; | |
49 | ||
50 | enum sbi_ext_rfence_fid { | |
51 | SBI_EXT_RFENCE_REMOTE_FENCE_I = 0, | |
52 | SBI_EXT_RFENCE_REMOTE_SFENCE_VMA, | |
53 | SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID, | |
ecbacc2a | 54 | SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID, |
6dd4879f | 55 | SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA, |
ecbacc2a | 56 | SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID, |
6dd4879f | 57 | SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA, |
ecbacc2a AP |
58 | }; |
59 | ||
db5a7946 AP |
60 | enum sbi_ext_hsm_fid { |
61 | SBI_EXT_HSM_HART_START = 0, | |
62 | SBI_EXT_HSM_HART_STOP, | |
63 | SBI_EXT_HSM_HART_STATUS, | |
64 | }; | |
65 | ||
66 | enum sbi_hsm_hart_status { | |
67 | SBI_HSM_HART_STATUS_STARTED = 0, | |
68 | SBI_HSM_HART_STATUS_STOPPED, | |
69 | SBI_HSM_HART_STATUS_START_PENDING, | |
70 | SBI_HSM_HART_STATUS_STOP_PENDING, | |
71 | }; | |
72 | ||
b9dcd9e4 AP |
73 | #define SBI_SPEC_VERSION_DEFAULT 0x1 |
74 | #define SBI_SPEC_VERSION_MAJOR_SHIFT 24 | |
75 | #define SBI_SPEC_VERSION_MAJOR_MASK 0x7f | |
76 | #define SBI_SPEC_VERSION_MINOR_MASK 0xffffff | |
6d60b6ee | 77 | |
b9dcd9e4 AP |
78 | /* SBI return error codes */ |
79 | #define SBI_SUCCESS 0 | |
80 | #define SBI_ERR_FAILURE -1 | |
81 | #define SBI_ERR_NOT_SUPPORTED -2 | |
82 | #define SBI_ERR_INVALID_PARAM -3 | |
83 | #define SBI_ERR_DENIED -4 | |
84 | #define SBI_ERR_INVALID_ADDRESS -5 | |
6d60b6ee | 85 | |
b9dcd9e4 AP |
86 | extern unsigned long sbi_spec_version; |
87 | struct sbiret { | |
88 | long error; | |
89 | long value; | |
90 | }; | |
6d60b6ee | 91 | |
641e8cd2 | 92 | void sbi_init(void); |
b9dcd9e4 AP |
93 | struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, |
94 | unsigned long arg1, unsigned long arg2, | |
95 | unsigned long arg3, unsigned long arg4, | |
96 | unsigned long arg5); | |
6d60b6ee | 97 | |
b9dcd9e4 AP |
98 | void sbi_console_putchar(int ch); |
99 | int sbi_console_getchar(void); | |
183787c6 VC |
100 | long sbi_get_mvendorid(void); |
101 | long sbi_get_marchid(void); | |
102 | long sbi_get_mimpid(void); | |
b9dcd9e4 AP |
103 | void sbi_set_timer(uint64_t stime_value); |
104 | void sbi_shutdown(void); | |
105 | void sbi_clear_ipi(void); | |
4bb87563 AP |
106 | int sbi_send_ipi(const unsigned long *hart_mask); |
107 | int sbi_remote_fence_i(const unsigned long *hart_mask); | |
108 | int sbi_remote_sfence_vma(const unsigned long *hart_mask, | |
b9dcd9e4 AP |
109 | unsigned long start, |
110 | unsigned long size); | |
6d60b6ee | 111 | |
4bb87563 | 112 | int sbi_remote_sfence_vma_asid(const unsigned long *hart_mask, |
b9dcd9e4 AP |
113 | unsigned long start, |
114 | unsigned long size, | |
115 | unsigned long asid); | |
1ef46c23 AP |
116 | int sbi_remote_hfence_gvma(const unsigned long *hart_mask, |
117 | unsigned long start, | |
118 | unsigned long size); | |
119 | int sbi_remote_hfence_gvma_vmid(const unsigned long *hart_mask, | |
120 | unsigned long start, | |
121 | unsigned long size, | |
122 | unsigned long vmid); | |
123 | int sbi_remote_hfence_vvma(const unsigned long *hart_mask, | |
124 | unsigned long start, | |
125 | unsigned long size); | |
126 | int sbi_remote_hfence_vvma_asid(const unsigned long *hart_mask, | |
127 | unsigned long start, | |
128 | unsigned long size, | |
129 | unsigned long asid); | |
b9dcd9e4 | 130 | int sbi_probe_extension(int ext); |
6d60b6ee | 131 | |
b9dcd9e4 AP |
132 | /* Check if current SBI specification version is 0.1 or not */ |
133 | static inline int sbi_spec_is_0_1(void) | |
6d60b6ee | 134 | { |
b9dcd9e4 | 135 | return (sbi_spec_version == SBI_SPEC_VERSION_DEFAULT) ? 1 : 0; |
6d60b6ee PD |
136 | } |
137 | ||
b9dcd9e4 AP |
138 | /* Get the major version of SBI */ |
139 | static inline unsigned long sbi_major_version(void) | |
6d60b6ee | 140 | { |
b9dcd9e4 AP |
141 | return (sbi_spec_version >> SBI_SPEC_VERSION_MAJOR_SHIFT) & |
142 | SBI_SPEC_VERSION_MAJOR_MASK; | |
6d60b6ee PD |
143 | } |
144 | ||
b9dcd9e4 AP |
145 | /* Get the minor version of SBI */ |
146 | static inline unsigned long sbi_minor_version(void) | |
6d60b6ee | 147 | { |
b9dcd9e4 | 148 | return sbi_spec_version & SBI_SPEC_VERSION_MINOR_MASK; |
6d60b6ee | 149 | } |
f90b43ce AP |
150 | |
151 | int sbi_err_map_linux_errno(int err); | |
8bf90f32 | 152 | #else /* CONFIG_RISCV_SBI */ |
4bb87563 | 153 | static inline int sbi_remote_fence_i(const unsigned long *hart_mask) { return -1; } |
641e8cd2 | 154 | static inline void sbi_init(void) {} |
3b03ac6b CH |
155 | #endif /* CONFIG_RISCV_SBI */ |
156 | #endif /* _ASM_RISCV_SBI_H */ |