1use kernel::utilities::registers::ReadWrite;
13use kernel::utilities::registers::{register_bitfields, register_structs};
14pub const SPI_DEVICE_PARAM_NUM_ALERTS: u32 = 1;
16pub const SPI_DEVICE_PARAM_REG_WIDTH: u32 = 32;
18
19register_structs! {
20 pub SpiDeviceRegisters {
21 (0x0000 => pub(crate) intr_state: ReadWrite<u32, INTR::Register>),
23 (0x0004 => pub(crate) intr_enable: ReadWrite<u32, INTR::Register>),
25 (0x0008 => pub(crate) intr_test: ReadWrite<u32, INTR::Register>),
27 (0x000c => pub(crate) alert_test: ReadWrite<u32, ALERT_TEST::Register>),
29 (0x0010 => pub(crate) control: ReadWrite<u32, CONTROL::Register>),
31 (0x0014 => pub(crate) cfg: ReadWrite<u32, CFG::Register>),
33 (0x0018 => pub(crate) fifo_level: ReadWrite<u32, FIFO_LEVEL::Register>),
35 (0x001c => pub(crate) async_fifo_level: ReadWrite<u32, ASYNC_FIFO_LEVEL::Register>),
37 (0x0020 => pub(crate) status: ReadWrite<u32, STATUS::Register>),
39 (0x0024 => pub(crate) rxf_ptr: ReadWrite<u32, RXF_PTR::Register>),
41 (0x0028 => pub(crate) txf_ptr: ReadWrite<u32, TXF_PTR::Register>),
43 (0x002c => pub(crate) rxf_addr: ReadWrite<u32, RXF_ADDR::Register>),
45 (0x0030 => pub(crate) txf_addr: ReadWrite<u32, TXF_ADDR::Register>),
47 (0x0034 => pub(crate) intercept_en: ReadWrite<u32, INTERCEPT_EN::Register>),
49 (0x0038 => pub(crate) last_read_addr: ReadWrite<u32, LAST_READ_ADDR::Register>),
51 (0x003c => pub(crate) flash_status: ReadWrite<u32, FLASH_STATUS::Register>),
53 (0x0040 => pub(crate) jedec_cc: ReadWrite<u32, JEDEC_CC::Register>),
55 (0x0044 => pub(crate) jedec_id: ReadWrite<u32, JEDEC_ID::Register>),
57 (0x0048 => pub(crate) read_threshold: ReadWrite<u32, READ_THRESHOLD::Register>),
59 (0x004c => pub(crate) mailbox_addr: ReadWrite<u32, MAILBOX_ADDR::Register>),
61 (0x0050 => pub(crate) upload_status: ReadWrite<u32, UPLOAD_STATUS::Register>),
63 (0x0054 => pub(crate) upload_status2: ReadWrite<u32, UPLOAD_STATUS2::Register>),
65 (0x0058 => pub(crate) upload_cmdfifo: ReadWrite<u32, UPLOAD_CMDFIFO::Register>),
67 (0x005c => pub(crate) upload_addrfifo: ReadWrite<u32, UPLOAD_ADDRFIFO::Register>),
69 (0x0060 => pub(crate) cmd_filter: [ReadWrite<u32, CMD_FILTER::Register>; 8]),
71 (0x0080 => pub(crate) addr_swap_mask: ReadWrite<u32, ADDR_SWAP_MASK::Register>),
73 (0x0084 => pub(crate) addr_swap_data: ReadWrite<u32, ADDR_SWAP_DATA::Register>),
75 (0x0088 => pub(crate) payload_swap_mask: ReadWrite<u32, PAYLOAD_SWAP_MASK::Register>),
77 (0x008c => pub(crate) payload_swap_data: ReadWrite<u32, PAYLOAD_SWAP_DATA::Register>),
79 (0x0090 => pub(crate) cmd_info: [ReadWrite<u32, CMD_INFO::Register>; 24]),
81 (0x00f0 => pub(crate) cmd_info_en4b: ReadWrite<u32, CMD_INFO_EN4B::Register>),
83 (0x00f4 => pub(crate) cmd_info_ex4b: ReadWrite<u32, CMD_INFO_EX4B::Register>),
85 (0x00f8 => pub(crate) cmd_info_wren: ReadWrite<u32, CMD_INFO_WREN::Register>),
87 (0x00fc => pub(crate) cmd_info_wrdi: ReadWrite<u32, CMD_INFO_WRDI::Register>),
89 (0x0100 => _reserved1),
90 (0x0800 => pub(crate) tpm_cap: ReadWrite<u32, TPM_CAP::Register>),
92 (0x0804 => pub(crate) tpm_cfg: ReadWrite<u32, TPM_CFG::Register>),
94 (0x0808 => pub(crate) tpm_status: ReadWrite<u32, TPM_STATUS::Register>),
96 (0x080c => pub(crate) tpm_access: [ReadWrite<u32, TPM_ACCESS::Register>; 2]),
98 (0x0814 => pub(crate) tpm_sts: ReadWrite<u32, TPM_STS::Register>),
100 (0x0818 => pub(crate) tpm_intf_capability: ReadWrite<u32, TPM_INTF_CAPABILITY::Register>),
102 (0x081c => pub(crate) tpm_int_enable: ReadWrite<u32, TPM_INT_ENABLE::Register>),
104 (0x0820 => pub(crate) tpm_int_vector: ReadWrite<u32, TPM_INT_VECTOR::Register>),
106 (0x0824 => pub(crate) tpm_int_status: ReadWrite<u32, TPM_INT_STATUS::Register>),
108 (0x0828 => pub(crate) tpm_did_vid: ReadWrite<u32, TPM_DID_VID::Register>),
110 (0x082c => pub(crate) tpm_rid: ReadWrite<u32, TPM_RID::Register>),
112 (0x0830 => pub(crate) tpm_cmd_addr: ReadWrite<u32, TPM_CMD_ADDR::Register>),
114 (0x0834 => pub(crate) tpm_read_fifo: ReadWrite<u32, TPM_READ_FIFO::Register>),
116 (0x0838 => pub(crate) tpm_write_fifo: ReadWrite<u32, TPM_WRITE_FIFO::Register>),
118 (0x083c => _reserved2),
119 (0x1000 => pub(crate) buffer: [ReadWrite<u32>; 1024]),
121 (0x2000 => @END),
122 }
123}
124
125register_bitfields![u32,
126 pub(crate) INTR [
128 GENERIC_RX_FULL OFFSET(0) NUMBITS(1) [],
129 GENERIC_RX_WATERMARK OFFSET(1) NUMBITS(1) [],
130 GENERIC_TX_WATERMARK OFFSET(2) NUMBITS(1) [],
131 GENERIC_RX_ERROR OFFSET(3) NUMBITS(1) [],
132 GENERIC_RX_OVERFLOW OFFSET(4) NUMBITS(1) [],
133 GENERIC_TX_UNDERFLOW OFFSET(5) NUMBITS(1) [],
134 UPLOAD_CMDFIFO_NOT_EMPTY OFFSET(6) NUMBITS(1) [],
135 UPLOAD_PAYLOAD_NOT_EMPTY OFFSET(7) NUMBITS(1) [],
136 UPLOAD_PAYLOAD_OVERFLOW OFFSET(8) NUMBITS(1) [],
137 READBUF_WATERMARK OFFSET(9) NUMBITS(1) [],
138 READBUF_FLIP OFFSET(10) NUMBITS(1) [],
139 TPM_HEADER_NOT_EMPTY OFFSET(11) NUMBITS(1) [],
140 ],
141 pub(crate) ALERT_TEST [
142 FATAL_FAULT OFFSET(0) NUMBITS(1) [],
143 ],
144 pub(crate) CONTROL [
145 ABORT OFFSET(0) NUMBITS(1) [],
146 MODE OFFSET(4) NUMBITS(2) [
147 FWMODE = 0,
148 FLASHMODE = 1,
149 PASSTHROUGH = 2,
150 ],
151 RST_TXFIFO OFFSET(16) NUMBITS(1) [],
152 RST_RXFIFO OFFSET(17) NUMBITS(1) [],
153 SRAM_CLK_EN OFFSET(31) NUMBITS(1) [],
154 ],
155 pub(crate) CFG [
156 CPOL OFFSET(0) NUMBITS(1) [],
157 CPHA OFFSET(1) NUMBITS(1) [],
158 TX_ORDER OFFSET(2) NUMBITS(1) [],
159 RX_ORDER OFFSET(3) NUMBITS(1) [],
160 TIMER_V OFFSET(8) NUMBITS(8) [],
161 ADDR_4B_EN OFFSET(16) NUMBITS(1) [],
162 MAILBOX_EN OFFSET(24) NUMBITS(1) [],
163 ],
164 pub(crate) FIFO_LEVEL [
165 RXLVL OFFSET(0) NUMBITS(16) [],
166 TXLVL OFFSET(16) NUMBITS(16) [],
167 ],
168 pub(crate) ASYNC_FIFO_LEVEL [
169 RXLVL OFFSET(0) NUMBITS(8) [],
170 TXLVL OFFSET(16) NUMBITS(8) [],
171 ],
172 pub(crate) STATUS [
173 RXF_FULL OFFSET(0) NUMBITS(1) [],
174 RXF_EMPTY OFFSET(1) NUMBITS(1) [],
175 TXF_FULL OFFSET(2) NUMBITS(1) [],
176 TXF_EMPTY OFFSET(3) NUMBITS(1) [],
177 ABORT_DONE OFFSET(4) NUMBITS(1) [],
178 CSB OFFSET(5) NUMBITS(1) [],
179 TPM_CSB OFFSET(6) NUMBITS(1) [],
180 ],
181 pub(crate) RXF_PTR [
182 RPTR OFFSET(0) NUMBITS(16) [],
183 WPTR OFFSET(16) NUMBITS(16) [],
184 ],
185 pub(crate) TXF_PTR [
186 RPTR OFFSET(0) NUMBITS(16) [],
187 WPTR OFFSET(16) NUMBITS(16) [],
188 ],
189 pub(crate) RXF_ADDR [
190 BASE OFFSET(0) NUMBITS(16) [],
191 LIMIT OFFSET(16) NUMBITS(16) [],
192 ],
193 pub(crate) TXF_ADDR [
194 BASE OFFSET(0) NUMBITS(16) [],
195 LIMIT OFFSET(16) NUMBITS(16) [],
196 ],
197 pub(crate) INTERCEPT_EN [
198 STATUS OFFSET(0) NUMBITS(1) [],
199 JEDEC OFFSET(1) NUMBITS(1) [],
200 SFDP OFFSET(2) NUMBITS(1) [],
201 MBX OFFSET(3) NUMBITS(1) [],
202 ],
203 pub(crate) LAST_READ_ADDR [
204 ADDR OFFSET(0) NUMBITS(32) [],
205 ],
206 pub(crate) FLASH_STATUS [
207 BUSY OFFSET(0) NUMBITS(1) [],
208 STATUS OFFSET(1) NUMBITS(23) [],
209 ],
210 pub(crate) JEDEC_CC [
211 CC OFFSET(0) NUMBITS(8) [],
212 NUM_CC OFFSET(8) NUMBITS(8) [],
213 ],
214 pub(crate) JEDEC_ID [
215 ID OFFSET(0) NUMBITS(16) [],
216 MF OFFSET(16) NUMBITS(8) [],
217 ],
218 pub(crate) READ_THRESHOLD [
219 THRESHOLD OFFSET(0) NUMBITS(10) [],
220 ],
221 pub(crate) MAILBOX_ADDR [
222 ADDR OFFSET(0) NUMBITS(32) [],
223 ],
224 pub(crate) UPLOAD_STATUS [
225 CMDFIFO_DEPTH OFFSET(0) NUMBITS(5) [],
226 CMDFIFO_NOTEMPTY OFFSET(7) NUMBITS(1) [],
227 ADDRFIFO_DEPTH OFFSET(8) NUMBITS(5) [],
228 ADDRFIFO_NOTEMPTY OFFSET(15) NUMBITS(1) [],
229 ],
230 pub(crate) UPLOAD_STATUS2 [
231 PAYLOAD_DEPTH OFFSET(0) NUMBITS(9) [],
232 PAYLOAD_START_IDX OFFSET(16) NUMBITS(8) [],
233 ],
234 pub(crate) UPLOAD_CMDFIFO [
235 DATA OFFSET(0) NUMBITS(8) [],
236 ],
237 pub(crate) UPLOAD_ADDRFIFO [
238 DATA OFFSET(0) NUMBITS(32) [],
239 ],
240 pub(crate) CMD_FILTER [
241 FILTER_0 OFFSET(0) NUMBITS(1) [],
242 FILTER_1 OFFSET(1) NUMBITS(1) [],
243 FILTER_2 OFFSET(2) NUMBITS(1) [],
244 FILTER_3 OFFSET(3) NUMBITS(1) [],
245 FILTER_4 OFFSET(4) NUMBITS(1) [],
246 FILTER_5 OFFSET(5) NUMBITS(1) [],
247 FILTER_6 OFFSET(6) NUMBITS(1) [],
248 FILTER_7 OFFSET(7) NUMBITS(1) [],
249 FILTER_8 OFFSET(8) NUMBITS(1) [],
250 FILTER_9 OFFSET(9) NUMBITS(1) [],
251 FILTER_10 OFFSET(10) NUMBITS(1) [],
252 FILTER_11 OFFSET(11) NUMBITS(1) [],
253 FILTER_12 OFFSET(12) NUMBITS(1) [],
254 FILTER_13 OFFSET(13) NUMBITS(1) [],
255 FILTER_14 OFFSET(14) NUMBITS(1) [],
256 FILTER_15 OFFSET(15) NUMBITS(1) [],
257 FILTER_16 OFFSET(16) NUMBITS(1) [],
258 FILTER_17 OFFSET(17) NUMBITS(1) [],
259 FILTER_18 OFFSET(18) NUMBITS(1) [],
260 FILTER_19 OFFSET(19) NUMBITS(1) [],
261 FILTER_20 OFFSET(20) NUMBITS(1) [],
262 FILTER_21 OFFSET(21) NUMBITS(1) [],
263 FILTER_22 OFFSET(22) NUMBITS(1) [],
264 FILTER_23 OFFSET(23) NUMBITS(1) [],
265 FILTER_24 OFFSET(24) NUMBITS(1) [],
266 FILTER_25 OFFSET(25) NUMBITS(1) [],
267 FILTER_26 OFFSET(26) NUMBITS(1) [],
268 FILTER_27 OFFSET(27) NUMBITS(1) [],
269 FILTER_28 OFFSET(28) NUMBITS(1) [],
270 FILTER_29 OFFSET(29) NUMBITS(1) [],
271 FILTER_30 OFFSET(30) NUMBITS(1) [],
272 FILTER_31 OFFSET(31) NUMBITS(1) [],
273 ],
274 pub(crate) ADDR_SWAP_MASK [
275 MASK OFFSET(0) NUMBITS(32) [],
276 ],
277 pub(crate) ADDR_SWAP_DATA [
278 DATA OFFSET(0) NUMBITS(32) [],
279 ],
280 pub(crate) PAYLOAD_SWAP_MASK [
281 MASK OFFSET(0) NUMBITS(32) [],
282 ],
283 pub(crate) PAYLOAD_SWAP_DATA [
284 DATA OFFSET(0) NUMBITS(32) [],
285 ],
286 pub(crate) CMD_INFO [
287 OPCODE_0 OFFSET(0) NUMBITS(8) [],
288 ADDR_MODE_0 OFFSET(8) NUMBITS(2) [
289 ADDRDISABLED = 0,
290 ADDRCFG = 1,
291 ADDR3B = 2,
292 ADDR4B = 3,
293 ],
294 ADDR_SWAP_EN_0 OFFSET(10) NUMBITS(1) [],
295 MBYTE_EN_0 OFFSET(11) NUMBITS(1) [],
296 DUMMY_SIZE_0 OFFSET(12) NUMBITS(3) [],
297 DUMMY_EN_0 OFFSET(15) NUMBITS(1) [],
298 PAYLOAD_EN_0 OFFSET(16) NUMBITS(4) [],
299 PAYLOAD_DIR_0 OFFSET(20) NUMBITS(1) [
300 PAYLOADIN = 0,
301 PAYLOADOUT = 1,
302 ],
303 PAYLOAD_SWAP_EN_0 OFFSET(21) NUMBITS(1) [],
304 UPLOAD_0 OFFSET(24) NUMBITS(1) [],
305 BUSY_0 OFFSET(25) NUMBITS(1) [],
306 VALID_0 OFFSET(31) NUMBITS(1) [],
307 ],
308 pub(crate) CMD_INFO_EN4B [
309 OPCODE OFFSET(0) NUMBITS(8) [],
310 VALID OFFSET(31) NUMBITS(1) [],
311 ],
312 pub(crate) CMD_INFO_EX4B [
313 OPCODE OFFSET(0) NUMBITS(8) [],
314 VALID OFFSET(31) NUMBITS(1) [],
315 ],
316 pub(crate) CMD_INFO_WREN [
317 OPCODE OFFSET(0) NUMBITS(8) [],
318 VALID OFFSET(31) NUMBITS(1) [],
319 ],
320 pub(crate) CMD_INFO_WRDI [
321 OPCODE OFFSET(0) NUMBITS(8) [],
322 VALID OFFSET(31) NUMBITS(1) [],
323 ],
324 pub(crate) TPM_CAP [
325 REV OFFSET(0) NUMBITS(8) [],
326 LOCALITY OFFSET(8) NUMBITS(1) [],
327 MAX_WR_SIZE OFFSET(16) NUMBITS(3) [],
328 MAX_RD_SIZE OFFSET(20) NUMBITS(3) [],
329 ],
330 pub(crate) TPM_CFG [
331 EN OFFSET(0) NUMBITS(1) [],
332 TPM_MODE OFFSET(1) NUMBITS(1) [],
333 HW_REG_DIS OFFSET(2) NUMBITS(1) [],
334 TPM_REG_CHK_DIS OFFSET(3) NUMBITS(1) [],
335 INVALID_LOCALITY OFFSET(4) NUMBITS(1) [],
336 ],
337 pub(crate) TPM_STATUS [
338 CMDADDR_NOTEMPTY OFFSET(0) NUMBITS(1) [],
339 WRFIFO_DEPTH OFFSET(16) NUMBITS(7) [],
340 ],
341 pub(crate) TPM_ACCESS [
342 ACCESS_0 OFFSET(0) NUMBITS(8) [],
343 ACCESS_1 OFFSET(8) NUMBITS(8) [],
344 ACCESS_2 OFFSET(16) NUMBITS(8) [],
345 ACCESS_3 OFFSET(24) NUMBITS(8) [],
346 ],
347 pub(crate) TPM_STS [
348 STS OFFSET(0) NUMBITS(32) [],
349 ],
350 pub(crate) TPM_INTF_CAPABILITY [
351 INTF_CAPABILITY OFFSET(0) NUMBITS(32) [],
352 ],
353 pub(crate) TPM_INT_ENABLE [
354 INT_ENABLE OFFSET(0) NUMBITS(32) [],
355 ],
356 pub(crate) TPM_INT_VECTOR [
357 INT_VECTOR OFFSET(0) NUMBITS(8) [],
358 ],
359 pub(crate) TPM_INT_STATUS [
360 INT_STATUS OFFSET(0) NUMBITS(32) [],
361 ],
362 pub(crate) TPM_DID_VID [
363 VID OFFSET(0) NUMBITS(16) [],
364 DID OFFSET(16) NUMBITS(16) [],
365 ],
366 pub(crate) TPM_RID [
367 RID OFFSET(0) NUMBITS(8) [],
368 ],
369 pub(crate) TPM_CMD_ADDR [
370 ADDR OFFSET(0) NUMBITS(24) [],
371 CMD OFFSET(24) NUMBITS(8) [],
372 ],
373 pub(crate) TPM_READ_FIFO [
374 VALUE OFFSET(0) NUMBITS(32) [],
375 ],
376 pub(crate) TPM_WRITE_FIFO [
377 VALUE OFFSET(0) NUMBITS(8) [],
378 ],
379];
380
381