xref: /aosp_15_r20/external/coreboot/src/include/espi.h (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef __ESPI_H__
4 #define __ESPI_H__
5 
6 #include <types.h>
7 
8 /* ESPI Slave Registers (Document # 327432-004 Revision 1.0 Chapter 7) */
9 
10 #define ESPI_SLAVE_DEVICE_ID				0x04
11 #define  ESPI_SLAVE_VERSION_ID_SHIFT			0
12 #define  ESPI_SLAVE_VERSION_ID_MASK			0xf
13 
14 #define ESPI_SLAVE_GENERAL_CFG				0x08
15 #define  ESPI_SLAVE_CRC_ENABLE				(1 << 31)
16 #define  ESPI_SLAVE_CRC_DISABLE				(0 << 31)
17 #define  ESPI_SLAVE_RESP_MOD_ENABLE			(1 << 30)
18 #define  ESPI_SLAVE_RESP_MOD_DISABLE			(0 << 30)
19 #define  ESPI_SLAVE_ALERT_MODE_PIN			(1 << 28)
20 #define  ESPI_SLAVE_ALERT_MODE_IO1			(0 << 28)
21 #define  ESPI_SLAVE_IO_MODE_SEL_SHIFT			26
22 #define  ESPI_SLAVE_IO_MODE_SEL_MASK			(0x3 << ESPI_SLAVE_IO_MODE_SEL_SHIFT)
23 #define  ESPI_SLAVE_IO_MODE_SEL_VAL(x)			((x) << ESPI_SLAVE_IO_MODE_SEL_SHIFT)
24 #define  ESPI_SLAVE_IO_MODE_SEL_SINGLE			ESPI_SLAVE_IO_MODE_SEL_VAL(0)
25 #define  ESPI_SLAVE_IO_MODE_SEL_DUAL			ESPI_SLAVE_IO_MODE_SEL_VAL(1)
26 #define  ESPI_SLAVE_IO_MODE_SEL_QUAD			ESPI_SLAVE_IO_MODE_SEL_VAL(2)
27 #define  ESPI_SLAVE_IO_MODE_SUPP_SHIFT			24
28 #define  ESPI_SLAVE_IO_MODE_SUPP_MASK			(0x3 << ESPI_SLAVE_IO_MODE_SUPP_SHIFT)
29 #define  ESPI_SLAVE_IO_MODE_SUPP_VAL(x)			((x) << ESPI_SLAVE_IO_MODE_SUPP_SHIFT)
30 #define  ESPI_SLAVE_IO_MODE_SUPP_SINGLE_ONLY		ESPI_SLAVE_IO_MODE_SUPP_VAL(0)
31 #define  ESPI_SLAVE_IO_MODE_SUPP_SINGLE_DUAL		ESPI_SLAVE_IO_MODE_SUPP_VAL(1)
32 #define  ESPI_SLAVE_IO_MODE_SUPP_SINGLE_QUAD		ESPI_SLAVE_IO_MODE_SUPP_VAL(2)
33 #define  ESPI_SLAVE_IO_MODE_SUPP_SINGLE_DUAL_QUAD	ESPI_SLAVE_IO_MODE_SUPP_VAL(3)
34 #define  ESPI_SLAVE_OPEN_DRAIN_ALERT_SEL		(1 << 23)
35 #define  ESPI_SLAVE_PUSH_PULL_ALERT_SEL			(0 << 23)
36 #define  ESPI_SLAVE_OP_FREQ_SEL_SHIFT			20
37 #define  ESPI_SLAVE_OP_FREQ_SEL_MASK			(0x7 << ESPI_SLAVE_OP_FREQ_SEL_SHIFT)
38 #define  ESPI_SLAVE_OP_FREQ_SEL_VAL(x)			((x) << ESPI_SLAVE_OP_FREQ_SEL_SHIFT)
39 #define  ESPI_SLAVE_OP_FREQ_SEL_20_MHZ			ESPI_SLAVE_OP_FREQ_SEL_VAL(0)
40 #define  ESPI_SLAVE_OP_FREQ_SEL_25_MHZ			ESPI_SLAVE_OP_FREQ_SEL_VAL(1)
41 #define  ESPI_SLAVE_OP_FREQ_SEL_33_MHZ			ESPI_SLAVE_OP_FREQ_SEL_VAL(2)
42 #define  ESPI_SLAVE_OP_FREQ_SEL_50_MHZ			ESPI_SLAVE_OP_FREQ_SEL_VAL(3)
43 #define  ESPI_SLAVE_OP_FREQ_SEL_66_MHZ			ESPI_SLAVE_OP_FREQ_SEL_VAL(4)
44 #define  ESPI_SLAVE_OPEN_DRAIN_ALERT_SUPP		(1 << 19)
45 #define  ESPI_SLAVE_OP_FREQ_SUPP_SHIFT			16
46 #define  ESPI_SLAVE_OP_FREQ_SUPP_MASK			(0x7 << ESPI_SLAVE_OP_FREQ_SUPP_SHIFT)
47 #define  ESPI_SLAVE_OP_FREQ_SUPP_VAL(x)			((x) << ESPI_SLAVE_OP_FREQ_SUPP_SHIFT)
48 #define  ESPI_SLAVE_OP_FREQ_SUPP_20_MHZ			ESPI_SLAVE_OP_FREQ_SUPP_VAL(0)
49 #define  ESPI_SLAVE_OP_FREQ_SUPP_25_MHZ			ESPI_SLAVE_OP_FREQ_SUPP_VAL(1)
50 #define  ESPI_SLAVE_OP_FREQ_SUPP_33_MHZ			ESPI_SLAVE_OP_FREQ_SUPP_VAL(2)
51 #define  ESPI_SLAVE_OP_FREQ_SUPP_50_MHZ			ESPI_SLAVE_OP_FREQ_SUPP_VAL(3)
52 #define  ESPI_SLAVE_OP_FREQ_SUPP_66_MHZ			ESPI_SLAVE_OP_FREQ_SUPP_VAL(4)
53 #define  ESPI_SLAVE_MAX_WAIT_SHIFT			12
54 #define  ESPI_SLAVE_MAX_WAIT_MASK			(0xf << ESPI_SLAVE_MAX_WAIT_SHIFT)
55 #define  ESPI_SLAVE_MAX_WAIT_STATE(x)			\
56 				(((x) << ESPI_SLAVE_MAX_WAIT_SHIFT) & ESPI_MAX_WAIT_MASK)
57 #define  ESPI_SLAVE_FLASH_CH_SUPP			(1 << 3)
58 #define  ESPI_SLAVE_OOB_CH_SUPP				(1 << 2)
59 #define  ESPI_SLAVE_VW_CH_SUPP				(1 << 1)
60 #define  ESPI_SLAVE_PERIPH_CH_SUPP			(1 << 0)
61 
62 #define ESPI_SLAVE_PERIPH_CFG				0x10
63 #define  ESPI_SLAVE_PERIPH_MAX_READ_SIZE_SHIFT		12
64 #define  ESPI_SLAVE_PERIPH_MAX_READ_SIZE_MASK		\
65 						(0x7 << ESPI_SLAVE_PERIPH_MAX_READ_SIZE_SHIFT)
66 #define  ESPI_SLAVE_PERIPH_MAX_READ_SIZE_VAL(x)		\
67 						((x) << ESPI_SLAVE_PERIPH_MAX_READ_SIZE_SHIFT)
68 #define  ESPI_SLAVE_PERIPH_MAX_READ_64B			ESPI_SLAVE_PERIPH_MAX_READ_SIZE_VAL(1)
69 #define  ESPI_SLAVE_PERIPH_MAX_READ_128B		ESPI_SLAVE_PERIPH_MAX_READ_SIZE_VAL(2)
70 #define  ESPI_SLAVE_PERIPH_MAX_READ_256B		ESPI_SLAVE_PERIPH_MAX_READ_SIZE_VAL(3)
71 #define  ESPI_SLAVE_PERIPH_MAX_READ_512B		ESPI_SLAVE_PERIPH_MAX_READ_SIZE_VAL(4)
72 #define  ESPI_SLAVE_PERIPH_MAX_READ_1024B		ESPI_SLAVE_PERIPH_MAX_READ_SIZE_VAL(5)
73 #define  ESPI_SLAVE_PERIPH_MAX_READ_2048B		ESPI_SLAVE_PERIPH_MAX_READ_SIZE_VAL(6)
74 #define  ESPI_SLAVE_PERIPH_MAX_READ_4096B		ESPI_SLAVE_PERIPH_MAX_READ_SIZE_VAL(7)
75 #define  ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SEL_SHIFT	8
76 #define  ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SEL_MASK	\
77 					(0x7 << ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SEL_SHIFT)
78 #define  ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SEL_VAL(x)	\
79 					((x) << ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SEL_SHIFT)
80 #define  ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SEL_64B	\
81 						ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SEL_VAL(1)
82 #define  ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SEL_128B	\
83 						ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SEL_VAL(2)
84 #define  ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SEL_256B	\
85 						ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SEL_VAL(3)
86 #define  ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SUPP_SHIFT	4
87 #define  ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SUPP_MASK	\
88 					(0x7 << ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SUPP_SHIFT)
89 #define  ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SUPP_VAL(x)	\
90 					((x) << ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SUPP_SHIFT)
91 #define  ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SUPP_64B	\
92 						ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SUPP_VAL(1)
93 #define  ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SUPP_128B	\
94 						ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SUPP_VAL(2)
95 #define  ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SUPP_256B	\
96 						ESPI_SLAVE_PERIPH_MAX_PAYLOAD_SIZE_SUPP_VAL(3)
97 #define  ESPI_SLAVE_PERIPH_BUS_MASTER_ENABLE		(1 << 2)
98 
99 #define ESPI_SLAVE_VW_CFG				0x20
100 #define  ESPI_SLAVE_VW_COUNT_SEL_SHIFT			16
101 #define  ESPI_SLAVE_VW_COUNT_SEL_MASK			(0x3f << ESPI_SLAVE_VW_COUNT_SEL_SHIFT)
102 /* 0-based field. Value of 0 indicates 1 virtual wire selected. */
103 #define  ESPI_SLAVE_VW_COUNT_SEL_VAL(x)			\
104 						((x) << ESPI_SLAVE_VW_COUNT_SEL_SHIFT)
105 #define  ESPI_SLAVE_VW_COUNT_SUPP_SHIFT			8
106 #define  ESPI_SLAVE_VW_COUNT_SUPP_MASK			\
107 						(0x3f << ESPI_SLAVE_VW_COUNT_SUPP_SHIFT)
108 
109 #define ESPI_SLAVE_OOB_CFG				0x30
110 #define  ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SEL_SHIFT	8
111 #define  ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SEL_MASK	\
112 					(0x7 << ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SEL_SHIFT)
113 #define  ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SEL_VAL(x)	\
114 					((x) << ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SEL_SHIFT)
115 #define  ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SEL_64B	\
116 						ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SEL_VAL(1)
117 #define  ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SEL_128B	\
118 						ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SEL_VAL(2)
119 #define  ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SEL_256B	\
120 						ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SEL_VAL(3)
121 #define  ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SUPP_SHIFT	4
122 #define  ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SUPP_MASK	\
123 					(0x7 << ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SUPP_SHIFT)
124 #define  ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SUPP_VAL(x)	\
125 					((x) << ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SUPP_SHIFT)
126 #define  ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SUPP_64B	\
127 						ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SUPP_VAL(1)
128 #define  ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SUPP_128B	\
129 						ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SUPP_VAL(2)
130 #define  ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SUPP_256B	\
131 						ESPI_SLAVE_OOB_MAX_PAYLOAD_SIZE_SUPP_VAL(3)
132 
133 #define ESPI_SLAVE_FLASH_CFG				0x40
134 #define  ESPI_SLAVE_FLASH_MAX_READ_SIZE_SHIFT		12
135 #define  ESPI_SLAVE_FLASH_MAX_READ_SIZE_MASK		\
136 						(0x7 << ESPI_SLAVE_FLASH_MAX_READ_SIZE_SHIFT)
137 #define  ESPI_SLAVE_FLASH_MAX_READ_SIZE_VAL(x)		\
138 						((x) << ESPI_SLAVE_FLASH_MAX_READ_SIZE_SHIFT)
139 #define  ESPI_SLAVE_FLASH_MAX_READ_64B			ESPI_SLAVE_FLASH_MAX_READ_SIZE_VAL(1)
140 #define  ESPI_SLAVE_FLASH_MAX_READ_128B			ESPI_SLAVE_FLASH_MAX_READ_SIZE_VAL(2)
141 #define  ESPI_SLAVE_FLASH_MAX_READ_256B			ESPI_SLAVE_FLASH_MAX_READ_SIZE_VAL(3)
142 #define  ESPI_SLAVE_FLASH_MAX_READ_512B			ESPI_SLAVE_FLASH_MAX_READ_SIZE_VAL(4)
143 #define  ESPI_SLAVE_FLASH_MAX_READ_1024B		ESPI_SLAVE_FLASH_MAX_READ_SIZE_VAL(5)
144 #define  ESPI_SLAVE_FLASH_MAX_READ_2048B		ESPI_SLAVE_FLASH_MAX_READ_SIZE_VAL(6)
145 #define  ESPI_SLAVE_FLASH_MAX_READ_4096B		ESPI_SLAVE_FLASH_MAX_READ_SIZE_VAL(7)
146 #define  ESPI_SLAVE_FLASH_SHARING_MODE_MAF		(1 << 11)
147 #define  ESPI_SLAVE_FLASH_SHARING_MODE_SAF		(0 << 11)
148 #define  ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SEL_SHIFT	8
149 #define  ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SEL_MASK	\
150 					(0x7 << ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SEL_SHIFT)
151 #define  ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SEL_VAL(x)	\
152 					((x) << ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SEL_SHIFT)
153 #define  ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SEL_64B	\
154 						ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SEL_VAL(1)
155 #define  ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SEL_128B	\
156 						ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SEL_VAL(2)
157 #define  ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SEL_256B	\
158 						ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SEL_VAL(3)
159 #define  ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SUPP_SHIFT	5
160 #define  ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SUPP_MASK	\
161 					(0x7 << ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SUPP_SHIFT)
162 #define  ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SUPP_VAL(x)	\
163 					((x) << ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SUPP_SHIFT)
164 #define  ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SUPP_64B	\
165 						ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SUPP_VAL(1)
166 #define  ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SUPP_128B	\
167 						ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SUPP_VAL(2)
168 #define  ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SUPP_256B	\
169 						ESPI_SLAVE_FLASH_MAX_PAYLOAD_SIZE_SUPP_VAL(3)
170 #define  ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_SHIFT	2
171 #define  ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_MASK		\
172 					(0x7 << ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_SHIFT)
173 #define  ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_VAL(x)	\
174 					((x) << ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_SHIFT)
175 #define  ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_4K		\
176 						ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_VAL(1)
177 #define  ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_64K		\
178 						ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_VAL(2)
179 #define  ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_4K_64K	\
180 						ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_VAL(3)
181 #define  ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_128K		\
182 						ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_VAL(4)
183 #define  ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_256K		\
184 						ESPI_SLAVE_FLASH_BLOCK_ERASE_SIZE_VAL(5)
185 
186 /*
187  * All channels -- peripheral, OOB, VW and flash use the same bits for channel ready and channel
188  * enable.
189  */
190 #define  ESPI_SLAVE_CHANNEL_READY		(1 << 1)
191 #define  ESPI_SLAVE_CHANNEL_ENABLE		(1 << 0)
192 
193 /* ESPI Slave Registers (Document # 327432-004 Revision 1.0 Chapter 5) */
194 #define ESPI_VW_INDEX_INTERRUPT_EVENT_0		0	/* Interrupt lines 0 - 127 */
195 #define ESPI_VW_INDEX_INTERRUPT_EVENT_1		1	/* Interrupt lines 128-255 */
196 #define  ESPI_VW_INTERRUPT_LEVEL_HIGH		(1 << 7)
197 #define  ESPI_VW_INTERRUPT_LEVEL_LOW		(0 << 7)
198 
199 #define ESPI_VW_INDEX_SYSTEM_EVENT_2		2
200 #define  ESPI_VW_SLP_S5				2
201 #define  ESPI_VW_SLP_S4				1
202 #define  ESPI_VW_SLP_S3				0
203 #define ESPI_VW_INDEX_SYSTEM_EVENT_3		3
204 #define  ESPI_VW_OOB_RST_WARN			2
205 #define  ESPI_VW_PLTRST				1
206 #define  ESPI_VW_SUS_STAT			0
207 #define ESPI_VW_INDEX_SYSTEM_EVENT_4		4
208 #define  ESPI_VW_PME				3
209 #define  ESPI_VW_WAKE				2
210 #define  ESPI_VW_OOB_RST_ACK			0
211 #define ESPI_VW_INDEX_SYSTEM_EVENT_5		5
212 #define  ESPI_VW_SLAVE_BOOT_LOAD_STATUS		3
213 #define  ESPI_VW_ERROR_NON_FATAL		2
214 #define  ESPI_VW_ERROR_FATAL			1
215 #define  ESPI_VW_SLV_BOOT_LOAD_DONE		0
216 #define ESPI_VW_INDEX_SYSTEM_EVENT_6		6
217 #define  ESPI_VW_HOST_RST_ACK			3
218 #define  ESPI_VW_RCIN				2
219 #define  ESPI_VW_SMI				1
220 #define  ESPI_VW_SCI				0
221 #define ESPI_VW_INDEX_SYSTEM_EVENT_7		7
222 #define  ESPI_VW_NMIOUT				2
223 #define  ESPI_VW_SMIOUT				1
224 #define  ESPI_VW_HOST_RST_WARN			0
225 
226 #define  ESPI_VW_VALID(x)			(1 << ((x) + 4))
227 #define  ESPI_VW_VALUE(x, v)			((v) << (x))
228 #define  ESPI_VW_SIGNAL_HIGH(x)			(ESPI_VW_VALID(x) | ESPI_VW_VALUE(1, x))
229 #define  ESPI_VW_SIGNAL_LOW(x)			(ESPI_VW_VALID(x) | ESPI_VW_VALUE(0, x))
230 
231 #if CONFIG(ESPI_DEBUG)
232 void espi_show_slave_general_configuration(uint32_t config);
233 void espi_show_slave_peripheral_channel_configuration(uint32_t config);
234 #else
espi_show_slave_general_configuration(uint32_t config)235 static inline void espi_show_slave_general_configuration(uint32_t config) {}
espi_show_slave_peripheral_channel_configuration(uint32_t config)236 static inline void espi_show_slave_peripheral_channel_configuration(uint32_t config) {}
237 #endif
238 
espi_slave_supports_quad_io(uint32_t gen_caps)239 static inline bool espi_slave_supports_quad_io(uint32_t gen_caps)
240 {
241 	uint32_t mode = gen_caps & ESPI_SLAVE_IO_MODE_SUPP_MASK;
242 	return (mode == ESPI_SLAVE_IO_MODE_SUPP_SINGLE_QUAD) ||
243 		(mode == ESPI_SLAVE_IO_MODE_SUPP_SINGLE_DUAL_QUAD);
244 }
245 
espi_slave_supports_dual_io(uint32_t gen_caps)246 static inline bool espi_slave_supports_dual_io(uint32_t gen_caps)
247 {
248 	uint32_t mode = gen_caps & ESPI_SLAVE_IO_MODE_SUPP_MASK;
249 	return (mode == ESPI_SLAVE_IO_MODE_SUPP_SINGLE_DUAL) ||
250 		(mode == ESPI_SLAVE_IO_MODE_SUPP_SINGLE_DUAL_QUAD);
251 }
252 
espi_slave_supports_66_mhz(uint32_t gen_caps)253 static inline bool espi_slave_supports_66_mhz(uint32_t gen_caps)
254 {
255 	uint32_t freq = gen_caps & ESPI_SLAVE_OP_FREQ_SUPP_MASK;
256 	return freq == ESPI_SLAVE_OP_FREQ_SUPP_66_MHZ;
257 }
258 
espi_slave_supports_50_mhz(uint32_t gen_caps)259 static inline bool espi_slave_supports_50_mhz(uint32_t gen_caps)
260 {
261 	uint32_t freq = gen_caps & ESPI_SLAVE_OP_FREQ_SUPP_MASK;
262 	return freq == ESPI_SLAVE_OP_FREQ_SUPP_50_MHZ;
263 }
264 
espi_slave_supports_33_mhz(uint32_t gen_caps)265 static inline bool espi_slave_supports_33_mhz(uint32_t gen_caps)
266 {
267 	uint32_t freq = gen_caps & ESPI_SLAVE_OP_FREQ_SUPP_MASK;
268 	return freq == ESPI_SLAVE_OP_FREQ_SUPP_33_MHZ;
269 }
270 
espi_slave_supports_25_mhz(uint32_t gen_caps)271 static inline bool espi_slave_supports_25_mhz(uint32_t gen_caps)
272 {
273 	uint32_t freq = gen_caps & ESPI_SLAVE_OP_FREQ_SUPP_MASK;
274 	return freq == ESPI_SLAVE_OP_FREQ_SUPP_25_MHZ;
275 }
276 
espi_slave_supports_20_mhz(uint32_t gen_caps)277 static inline bool espi_slave_supports_20_mhz(uint32_t gen_caps)
278 {
279 	uint32_t freq = gen_caps & ESPI_SLAVE_OP_FREQ_SUPP_MASK;
280 	return freq == ESPI_SLAVE_OP_FREQ_SUPP_20_MHZ;
281 }
282 
espi_slave_max_speed_mhz_supported(uint32_t gen_caps)283 static inline int espi_slave_max_speed_mhz_supported(uint32_t gen_caps)
284 {
285 	if (espi_slave_supports_66_mhz(gen_caps))
286 		return 66;
287 	else if (espi_slave_supports_50_mhz(gen_caps))
288 		return 50;
289 	else if (espi_slave_supports_33_mhz(gen_caps))
290 		return 33;
291 	else if (espi_slave_supports_25_mhz(gen_caps))
292 		return 25;
293 	else if (espi_slave_supports_20_mhz(gen_caps))
294 		return 20;
295 	return 0;
296 }
297 
espi_slave_supports_vw_channel(uint32_t gen_caps)298 static inline bool espi_slave_supports_vw_channel(uint32_t gen_caps)
299 {
300 	return !!(gen_caps & ESPI_SLAVE_VW_CH_SUPP);
301 }
302 
espi_slave_supports_periph_channel(uint32_t gen_caps)303 static inline bool espi_slave_supports_periph_channel(uint32_t gen_caps)
304 {
305 	return !!(gen_caps & ESPI_SLAVE_PERIPH_CH_SUPP);
306 }
307 
espi_slave_supports_oob_channel(uint32_t gen_caps)308 static inline bool espi_slave_supports_oob_channel(uint32_t gen_caps)
309 {
310 	return !!(gen_caps & ESPI_SLAVE_OOB_CH_SUPP);
311 }
312 
espi_slave_supports_flash_channel(uint32_t gen_caps)313 static inline bool espi_slave_supports_flash_channel(uint32_t gen_caps)
314 {
315 	return !!(gen_caps & ESPI_SLAVE_FLASH_CH_SUPP);
316 }
317 
espi_slave_is_channel_ready(uint32_t config)318 static inline bool espi_slave_is_channel_ready(uint32_t config)
319 {
320 	return !!(config & ESPI_SLAVE_CHANNEL_READY);
321 }
322 
espi_slave_get_vw_count_supp(uint32_t vw_caps)323 static inline uint32_t espi_slave_get_vw_count_supp(uint32_t vw_caps)
324 {
325 	return (vw_caps & ESPI_SLAVE_VW_COUNT_SUPP_MASK) >> ESPI_SLAVE_VW_COUNT_SUPP_SHIFT;
326 }
327 
328 #endif /* __ESPI_H__ */
329