11#include "spi_device_regs.h"
13#define DIF_SPI_DEVICE_TPM_FIFO_DEPTH 16
16 kDifSpiDeviceEFlashLen =
17 SPI_DEVICE_PARAM_SRAM_READ_BUFFER_DEPTH *
sizeof(uint32_t),
18 kDifSpiDeviceMailboxLen =
19 SPI_DEVICE_PARAM_SRAM_MAILBOX_DEPTH *
sizeof(uint32_t),
20 kDifSpiDeviceSfdpLen = SPI_DEVICE_PARAM_SRAM_SFDP_DEPTH *
sizeof(uint32_t),
21 kDifSpiDevicePayloadLen =
22 SPI_DEVICE_PARAM_SRAM_PAYLOAD_DEPTH *
sizeof(uint32_t),
23 kDifSpiDeviceTpmWriteFifoLen =
24 SPI_DEVICE_PARAM_SRAM_TPM_WR_FIFO_DEPTH *
sizeof(uint32_t),
28 kDifSpiDeviceEFlashOffset =
29 SPI_DEVICE_PARAM_SRAM_READ_BUFFER_OFFSET *
sizeof(uint32_t),
30 kDifSpiDeviceMailboxOffset =
31 SPI_DEVICE_PARAM_SRAM_MAILBOX_OFFSET *
sizeof(uint32_t),
32 kDifSpiDeviceSfdpOffset =
33 SPI_DEVICE_PARAM_SRAM_SFDP_OFFSET *
sizeof(uint32_t),
34 kDifSpiDevicePayloadOffset =
35 SPI_DEVICE_PARAM_SRAM_PAYLOAD_OFFSET *
sizeof(uint32_t),
36 kDifSpiDeviceTpmWriteFifoOffset =
37 SPI_DEVICE_PARAM_SRAM_TPM_WR_FIFO_OFFSET *
sizeof(uint32_t),
44static inline uint32_t build_control_word(
48 val = bitfield_bit32_write(val, SPI_DEVICE_CFG_TX_ORDER_BIT,
50 val = bitfield_bit32_write(val, SPI_DEVICE_CFG_RX_ORDER_BIT,
60static inline uint32_t extract_mode_from_config(
62 switch (config.device_mode) {
64 return SPI_DEVICE_CONTROL_MODE_VALUE_DISABLED;
66 return SPI_DEVICE_CONTROL_MODE_VALUE_FLASHMODE;
68 return SPI_DEVICE_CONTROL_MODE_VALUE_PASSTHROUGH;
80 return dif_spi_device_init(base_addr, &spi->
dev);
86 mmio_region_from_addr(dt_spi_device_primary_reg_block(dt));
87 return dif_spi_device_init_handle(addr, spi);
96 uint32_t device_mode = extract_mode_from_config(config);
97 if (device_mode == -1u) {
101 uint32_t device_config = build_control_word(config);
102 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_CFG_REG_OFFSET,
106 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_CONTROL_REG_OFFSET);
108 control = bitfield_field32_write(control, SPI_DEVICE_CONTROL_MODE_FIELD,
110 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_CONTROL_REG_OFFSET,
119 if (spi == NULL || !dif_is_valid_toggle(enable)) {
123 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_CONTROL_REG_OFFSET);
124 uint32_t mode = bitfield_field32_read(control, SPI_DEVICE_CONTROL_MODE_FIELD);
125 if (mode != SPI_DEVICE_CONTROL_MODE_VALUE_FLASHMODE &&
126 mode != SPI_DEVICE_CONTROL_MODE_VALUE_PASSTHROUGH) {
129 if (dif_toggle_to_bool(enable)) {
130 control = bitfield_field32_write(control, SPI_DEVICE_CONTROL_MODE_FIELD,
131 SPI_DEVICE_CONTROL_MODE_VALUE_PASSTHROUGH);
133 control = bitfield_field32_write(control, SPI_DEVICE_CONTROL_MODE_FIELD,
134 SPI_DEVICE_CONTROL_MODE_VALUE_FLASHMODE);
136 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_CONTROL_REG_OFFSET,
143 if (spi == NULL || csb == NULL) {
147 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_STATUS_REG_OFFSET);
148 *csb = bitfield_bit32_read(reg_val, SPI_DEVICE_STATUS_CSB_BIT);
157 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_MAILBOX_ADDR_REG_OFFSET,
160 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_CFG_REG_OFFSET);
161 cfg_reg = bitfield_bit32_write(cfg_reg, SPI_DEVICE_CFG_MAILBOX_EN_BIT, 1);
162 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_CFG_REG_OFFSET, cfg_reg);
171 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_CFG_REG_OFFSET);
172 cfg_reg = bitfield_bit32_write(cfg_reg, SPI_DEVICE_CFG_MAILBOX_EN_BIT, 0);
173 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_CFG_REG_OFFSET, cfg_reg);
179 if (spi == NULL || is_enabled == NULL || address == NULL) {
183 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_CFG_REG_OFFSET);
184 bool mailbox_enabled =
185 bitfield_bit32_read(cfg_reg, SPI_DEVICE_CFG_MAILBOX_EN_BIT);
186 *is_enabled = dif_bool_to_toggle(mailbox_enabled);
188 SPI_DEVICE_MAILBOX_ADDR_REG_OFFSET);
194 if (spi == NULL || !dif_is_valid_toggle(addr_4b)) {
197 uint32_t cfg_reg = 0;
199 cfg_reg = bitfield_bit32_write(cfg_reg, SPI_DEVICE_ADDR_MODE_ADDR_4B_EN_BIT,
202 cfg_reg = bitfield_bit32_write(cfg_reg, SPI_DEVICE_ADDR_MODE_ADDR_4B_EN_BIT,
205 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_ADDR_MODE_REG_OFFSET,
212 if (spi == NULL || addr_4b == NULL) {
216 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_ADDR_MODE_REG_OFFSET);
217 if (bitfield_bit32_read(cfg_reg, SPI_DEVICE_ADDR_MODE_ADDR_4B_EN_BIT)) {
231 uint32_t device_mode = extract_mode_from_config(spi->
config);
232 if (device_mode == -1u) {
237 bitfield_field32_write(0, SPI_DEVICE_CONTROL_MODE_FIELD, device_mode);
238 control = bitfield_bit32_write(
239 control, SPI_DEVICE_CONTROL_FLASH_STATUS_FIFO_CLR_BIT,
true);
240 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_CONTROL_REG_OFFSET,
247 dif_spi_device_flash_id_t *
id) {
248 if (spi == NULL ||
id == NULL) {
252 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_JEDEC_CC_REG_OFFSET);
254 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_JEDEC_ID_REG_OFFSET);
255 id->num_continuation_code =
256 (uint8_t)bitfield_field32_read(cc_reg, SPI_DEVICE_JEDEC_CC_NUM_CC_FIELD);
257 id->continuation_code =
258 (uint8_t)bitfield_field32_read(cc_reg, SPI_DEVICE_JEDEC_CC_CC_FIELD);
259 id->manufacturer_id =
260 (uint8_t)bitfield_field32_read(id_reg, SPI_DEVICE_JEDEC_ID_MF_FIELD);
262 (uint16_t)bitfield_field32_read(id_reg, SPI_DEVICE_JEDEC_ID_ID_FIELD);
267 dif_spi_device_flash_id_t
id) {
271 uint32_t cc_reg = bitfield_field32_write(0, SPI_DEVICE_JEDEC_CC_NUM_CC_FIELD,
272 id.num_continuation_code);
273 cc_reg = bitfield_field32_write(cc_reg, SPI_DEVICE_JEDEC_CC_CC_FIELD,
274 id.continuation_code);
275 uint32_t id_reg = bitfield_field32_write(0, SPI_DEVICE_JEDEC_ID_MF_FIELD,
277 id_reg = bitfield_field32_write(id_reg, SPI_DEVICE_JEDEC_ID_ID_FIELD,
279 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_JEDEC_CC_REG_OFFSET,
281 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_JEDEC_ID_REG_OFFSET,
292 uint32_t reg_val = bitfield_bit32_write(0, SPI_DEVICE_INTERCEPT_EN_STATUS_BIT,
294 reg_val = bitfield_bit32_write(reg_val, SPI_DEVICE_INTERCEPT_EN_JEDEC_BIT,
296 reg_val = bitfield_bit32_write(reg_val, SPI_DEVICE_INTERCEPT_EN_SFDP_BIT,
298 reg_val = bitfield_bit32_write(reg_val, SPI_DEVICE_INTERCEPT_EN_MBX_BIT,
300 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_INTERCEPT_EN_REG_OFFSET,
307 if (spi == NULL || address == NULL) {
311 SPI_DEVICE_LAST_READ_ADDR_REG_OFFSET);
317 if (spi == NULL || address > SPI_DEVICE_READ_THRESHOLD_THRESHOLD_MASK) {
320 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_READ_THRESHOLD_REG_OFFSET,
330 uint32_t device_mode = extract_mode_from_config(spi->
config);
331 if (device_mode == -1u) {
336 bitfield_field32_write(0, SPI_DEVICE_CONTROL_MODE_FIELD, device_mode);
337 control = bitfield_bit32_write(
338 control, SPI_DEVICE_CONTROL_FLASH_READ_BUFFER_CLR_BIT,
true);
339 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_CONTROL_REG_OFFSET,
347 dif_spi_device_flash_command_t command_info) {
348 if (spi == NULL || slot >= SPI_DEVICE_PARAM_NUM_CMD_INFO ||
349 !dif_is_valid_toggle(enable)) {
352 ptrdiff_t reg_offset =
353 SPI_DEVICE_CMD_INFO_0_REG_OFFSET + slot *
sizeof(uint32_t);
354 uint32_t reg_val = 0;
357 bitfield_bit32_write(reg_val, SPI_DEVICE_CMD_INFO_0_VALID_0_BIT,
false);
360 uint32_t address_mode;
361 switch (command_info.address_type) {
363 address_mode = SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDRDISABLED;
366 address_mode = SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDRCFG;
369 address_mode = SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDR3B;
372 address_mode = SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDR4B;
378 (1u + SPI_DEVICE_CMD_INFO_0_DUMMY_SIZE_0_MASK)) {
404 uint32_t read_pipeline_mode;
408 SPI_DEVICE_CMD_INFO_0_READ_PIPELINE_MODE_0_VALUE_ZERO_STAGES;
412 SPI_DEVICE_CMD_INFO_0_READ_PIPELINE_MODE_0_VALUE_TWO_STAGES_HALF_CYCLE;
416 SPI_DEVICE_CMD_INFO_0_READ_PIPELINE_MODE_0_VALUE_TWO_STAGES_FULL_CYCLE;
434 reg_val = bitfield_field32_write(
435 reg_val, SPI_DEVICE_CMD_INFO_0_OPCODE_0_FIELD, command_info.
opcode);
436 reg_val = bitfield_field32_write(
437 reg_val, SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_FIELD, address_mode);
439 bitfield_bit32_write(reg_val, SPI_DEVICE_CMD_INFO_0_ADDR_SWAP_EN_0_BIT,
442 reg_val = bitfield_field32_write(reg_val,
443 SPI_DEVICE_CMD_INFO_0_DUMMY_SIZE_0_FIELD,
445 reg_val = bitfield_bit32_write(
446 reg_val, SPI_DEVICE_CMD_INFO_0_DUMMY_EN_0_BIT,
true);
448 reg_val = bitfield_field32_write(
449 reg_val, SPI_DEVICE_CMD_INFO_0_PAYLOAD_EN_0_FIELD, payload_en);
451 bitfield_bit32_write(reg_val, SPI_DEVICE_CMD_INFO_0_PAYLOAD_DIR_0_BIT,
453 reg_val = bitfield_bit32_write(reg_val,
454 SPI_DEVICE_CMD_INFO_0_PAYLOAD_SWAP_EN_0_BIT,
456 reg_val = bitfield_field32_write(
457 reg_val, SPI_DEVICE_CMD_INFO_0_READ_PIPELINE_MODE_0_FIELD,
459 reg_val = bitfield_bit32_write(reg_val, SPI_DEVICE_CMD_INFO_0_UPLOAD_0_BIT,
461 reg_val = bitfield_bit32_write(reg_val, SPI_DEVICE_CMD_INFO_0_BUSY_0_BIT,
464 bitfield_bit32_write(reg_val, SPI_DEVICE_CMD_INFO_0_VALID_0_BIT,
true);
466 mmio_region_write32(spi->
dev.
base_addr, reg_offset, reg_val);
472 dif_spi_device_flash_command_t *command_info) {
473 if (spi == NULL || enabled == NULL || command_info == NULL ||
474 slot >= SPI_DEVICE_PARAM_NUM_CMD_INFO) {
477 ptrdiff_t reg_offset =
478 SPI_DEVICE_CMD_INFO_0_REG_OFFSET + slot *
sizeof(uint32_t);
479 uint32_t reg_val = mmio_region_read32(spi->
dev.
base_addr, reg_offset);
481 dif_spi_device_flash_address_type_t address_type;
482 uint32_t reg_val_address_mode =
483 bitfield_field32_read(reg_val, SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_FIELD);
484 switch (reg_val_address_mode) {
485 case SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDRDISABLED:
488 case SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDRCFG:
491 case SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDR3B:
494 case SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDR4B:
498 address_type = kDifSpiDeviceFlashAddrCount;
502 uint32_t dummy_cycles = 0;
503 if (bitfield_bit32_read(reg_val, SPI_DEVICE_CMD_INFO_0_DUMMY_EN_0_BIT)) {
504 dummy_cycles = 1 + bitfield_field32_read(
505 reg_val, SPI_DEVICE_CMD_INFO_0_DUMMY_SIZE_0_FIELD);
510 uint32_t payload_en =
511 bitfield_field32_read(reg_val, SPI_DEVICE_CMD_INFO_0_PAYLOAD_EN_0_FIELD);
512 bool payload_dir_to_host =
513 bitfield_bit32_read(reg_val, SPI_DEVICE_CMD_INFO_0_PAYLOAD_DIR_0_BIT);
515 switch (payload_en) {
520 if (payload_dir_to_host) {
527 if (!payload_dir_to_host) {
544 dif_spi_device_flash_command_t cmd = {
545 .opcode = (uint8_t)bitfield_field32_read(
546 reg_val, SPI_DEVICE_CMD_INFO_0_OPCODE_0_FIELD),
547 .address_type = address_type,
548 .dummy_cycles = (uint8_t)dummy_cycles,
549 .payload_io_type = payload_io_type,
550 .passthrough_swap_address = bitfield_bit32_read(
551 reg_val, SPI_DEVICE_CMD_INFO_0_PAYLOAD_SWAP_EN_0_BIT),
552 .payload_dir_to_host = payload_dir_to_host,
553 .payload_swap_enable = bitfield_bit32_read(
554 reg_val, SPI_DEVICE_CMD_INFO_0_PAYLOAD_SWAP_EN_0_BIT),
556 bitfield_bit32_read(reg_val, SPI_DEVICE_CMD_INFO_0_UPLOAD_0_BIT),
558 bitfield_bit32_read(reg_val, SPI_DEVICE_CMD_INFO_0_BUSY_0_BIT),
562 if (bitfield_bit32_read(reg_val, SPI_DEVICE_CMD_INFO_0_VALID_0_BIT)) {
582 ptrdiff_t reg_offset) {
583 if (spi == NULL || !dif_is_valid_toggle(enable)) {
586 bool valid = dif_toggle_to_bool(enable);
588 bitfield_field32_write(0, SPI_DEVICE_CMD_INFO_EN4B_OPCODE_FIELD, opcode);
590 bitfield_bit32_write(reg_val, SPI_DEVICE_CMD_INFO_EN4B_VALID_BIT, valid);
591 mmio_region_write32(spi->
dev.
base_addr, reg_offset, reg_val);
597 return write_special_cmd_info(spi, enable, opcode,
598 SPI_DEVICE_CMD_INFO_EN4B_REG_OFFSET);
603 return write_special_cmd_info(spi, enable, opcode,
604 SPI_DEVICE_CMD_INFO_EX4B_REG_OFFSET);
609 return write_special_cmd_info(spi, enable, opcode,
610 SPI_DEVICE_CMD_INFO_WREN_REG_OFFSET);
615 return write_special_cmd_info(spi, enable, opcode,
616 SPI_DEVICE_CMD_INFO_WRDI_REG_OFFSET);
621 uint32_t replacement) {
625 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_ADDR_SWAP_MASK_REG_OFFSET,
627 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_ADDR_SWAP_DATA_REG_OFFSET,
634 uint32_t replacement) {
639 SPI_DEVICE_PAYLOAD_SWAP_MASK_REG_OFFSET, mask);
641 SPI_DEVICE_PAYLOAD_SWAP_DATA_REG_OFFSET, replacement);
647 if (spi == NULL || occupancy == NULL) {
650 uint32_t reg_val = mmio_region_read32(spi->
dev.
base_addr,
651 SPI_DEVICE_UPLOAD_STATUS_REG_OFFSET);
652 *occupancy = (uint8_t)bitfield_field32_read(
653 reg_val, SPI_DEVICE_UPLOAD_STATUS_CMDFIFO_DEPTH_FIELD);
659 if (spi == NULL || occupancy == NULL) {
662 uint32_t reg_val = mmio_region_read32(spi->
dev.
base_addr,
663 SPI_DEVICE_UPLOAD_STATUS_REG_OFFSET);
664 *occupancy = (uint8_t)bitfield_field32_read(
665 reg_val, SPI_DEVICE_UPLOAD_STATUS_ADDRFIFO_DEPTH_FIELD);
671 if (spi == NULL || occupancy == NULL || start_offset == NULL) {
674 uint32_t reg_val = mmio_region_read32(spi->
dev.
base_addr,
675 SPI_DEVICE_UPLOAD_STATUS2_REG_OFFSET);
676 *occupancy = (uint16_t)bitfield_field32_read(
677 reg_val, SPI_DEVICE_UPLOAD_STATUS2_PAYLOAD_DEPTH_FIELD);
678 *start_offset = bitfield_field32_read(
679 reg_val, SPI_DEVICE_UPLOAD_STATUS2_PAYLOAD_START_IDX_FIELD);
686 if (spi == NULL || command == NULL) {
689 uint32_t upload_status = mmio_region_read32(
690 spi->
dev.
base_addr, SPI_DEVICE_UPLOAD_STATUS_REG_OFFSET);
691 if (!bitfield_bit32_read(upload_status,
692 SPI_DEVICE_UPLOAD_STATUS_CMDFIFO_NOTEMPTY_BIT)) {
695 uint32_t cmd_item = mmio_region_read32(spi->
dev.
base_addr,
696 SPI_DEVICE_UPLOAD_CMDFIFO_REG_OFFSET);
697 *command = (uint8_t)bitfield_field32_read(
698 cmd_item, SPI_DEVICE_UPLOAD_CMDFIFO_DATA_FIELD);
704 if (spi == NULL || address == NULL) {
707 uint32_t upload_status = mmio_region_read32(
708 spi->
dev.
base_addr, SPI_DEVICE_UPLOAD_STATUS_REG_OFFSET);
709 if (!bitfield_bit32_read(upload_status,
710 SPI_DEVICE_UPLOAD_STATUS_ADDRFIFO_NOTEMPTY_BIT)) {
714 SPI_DEVICE_UPLOAD_ADDRFIFO_REG_OFFSET);
720 ptrdiff_t buffer_offset;
721} dif_spi_device_buffer_info_t;
723static dif_result_t dif_spi_device_get_flash_buffer_info(
724 dif_spi_device_flash_buffer_type_t buffer_type,
725 dif_spi_device_buffer_info_t *info) {
726 switch (buffer_type) {
728 info->buffer_len = kDifSpiDeviceEFlashLen;
729 info->buffer_offset = kDifSpiDeviceEFlashOffset;
732 info->buffer_len = kDifSpiDeviceMailboxLen;
733 info->buffer_offset = kDifSpiDeviceMailboxOffset;
736 info->buffer_len = kDifSpiDeviceSfdpLen;
737 info->buffer_offset = kDifSpiDeviceSfdpOffset;
748 if (spi == NULL || buf == NULL) {
751 const dif_spi_device_buffer_info_t info = {
752 .buffer_len = kDifSpiDevicePayloadLen,
753 .buffer_offset = kDifSpiDevicePayloadOffset,
755 if (offset >= (info.buffer_offset + (ptrdiff_t)info.buffer_len) ||
756 length > (info.buffer_offset + (ptrdiff_t)info.buffer_len -
757 (ptrdiff_t)offset)) {
760 ptrdiff_t offset_from_base = SPI_DEVICE_INGRESS_BUFFER_REG_OFFSET +
761 info.buffer_offset + (ptrdiff_t)offset;
762 mmio_region_memcpy_from_mmio32(spi->
dev.
base_addr, (uint32_t)offset_from_base,
769 dif_spi_device_flash_buffer_type_t buffer_type, uint32_t offset,
770 size_t length,
const uint8_t *buf) {
771 if (spi == NULL || buf == NULL) {
774 dif_spi_device_buffer_info_t info;
776 dif_spi_device_get_flash_buffer_info(buffer_type, &info);
780 if (offset >= (info.buffer_offset + (ptrdiff_t)info.buffer_len) ||
781 length > (info.buffer_offset + (ptrdiff_t)info.buffer_len -
782 (ptrdiff_t)offset)) {
785 ptrdiff_t offset_from_base = SPI_DEVICE_EGRESS_BUFFER_REG_OFFSET +
786 info.buffer_offset + (ptrdiff_t)offset;
787 mmio_region_memcpy_to_mmio32(spi->
dev.
base_addr, (uint32_t)offset_from_base,
794 if (spi == NULL || enabled == NULL) {
797 ptrdiff_t reg_offset =
798 SPI_DEVICE_CMD_FILTER_0_REG_OFFSET + (command >> 5) *
sizeof(uint32_t);
799 uint32_t command_index = command & 0x1fu;
800 uint32_t reg_value = mmio_region_read32(spi->
dev.
base_addr, reg_offset);
801 bool filtered = bitfield_bit32_read(reg_value, command_index);
812 if (spi == NULL || !dif_is_valid_toggle(enabled)) {
815 bool enable_filter = dif_toggle_to_bool(enabled);
816 ptrdiff_t reg_offset =
817 SPI_DEVICE_CMD_FILTER_0_REG_OFFSET + (command >> 5) *
sizeof(uint32_t);
818 uint32_t command_index = command & 0x1fu;
819 uint32_t reg_value = mmio_region_read32(spi->
dev.
base_addr, reg_offset);
820 reg_value = bitfield_bit32_write(reg_value, command_index, enable_filter);
821 mmio_region_write32(spi->
dev.
base_addr, reg_offset, reg_value);
827 if (spi == NULL || !dif_is_valid_toggle(enable)) {
830 uint32_t reg_value = dif_toggle_to_bool(enable) ? UINT32_MAX : 0;
831 for (
int i = 0; i < SPI_DEVICE_CMD_FILTER_MULTIREG_COUNT; i++) {
832 ptrdiff_t reg_offset =
833 SPI_DEVICE_CMD_FILTER_0_REG_OFFSET + i * (ptrdiff_t)
sizeof(uint32_t);
834 mmio_region_write32(spi->
dev.
base_addr, reg_offset, reg_value);
843 uint32_t reg_val = mmio_region_read32(spi->
dev.
base_addr,
844 SPI_DEVICE_FLASH_STATUS_REG_OFFSET);
846 bitfield_bit32_write(reg_val, SPI_DEVICE_FLASH_STATUS_WEL_BIT,
false);
848 bitfield_bit32_write(reg_val, SPI_DEVICE_FLASH_STATUS_BUSY_BIT,
false);
849 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_FLASH_STATUS_REG_OFFSET,
859 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_FLASH_STATUS_REG_OFFSET,
866 if (spi == NULL || value == NULL) {
870 SPI_DEVICE_FLASH_STATUS_REG_OFFSET);
876 if (spi == NULL || caps == NULL) {
880 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_TPM_CAP_REG_OFFSET);
882 (uint8_t)bitfield_field32_read(reg_val, SPI_DEVICE_TPM_CAP_REV_FIELD);
884 bitfield_bit32_read(reg_val, SPI_DEVICE_TPM_CAP_LOCALITY_BIT);
886 reg_val, SPI_DEVICE_TPM_CAP_MAX_WR_SIZE_FIELD);
888 reg_val, SPI_DEVICE_TPM_CAP_MAX_RD_SIZE_FIELD);
894 dif_spi_device_tpm_config_t config) {
895 if (spi == NULL || !dif_is_valid_toggle(enable)) {
898 bool tpm_en = dif_toggle_to_bool(enable);
899 uint32_t reg_val = bitfield_bit32_write(0, SPI_DEVICE_TPM_CFG_EN_BIT, tpm_en);
913 bitfield_bit32_write(reg_val, SPI_DEVICE_TPM_CFG_TPM_MODE_BIT, use_crb);
914 reg_val = bitfield_bit32_write(reg_val, SPI_DEVICE_TPM_CFG_HW_REG_DIS_BIT,
917 bitfield_bit32_write(reg_val, SPI_DEVICE_TPM_CFG_TPM_REG_CHK_DIS_BIT,
920 bitfield_bit32_write(reg_val, SPI_DEVICE_TPM_CFG_INVALID_LOCALITY_BIT,
923 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_TPM_CFG_REG_OFFSET,
930 if (spi == NULL ||
status == NULL) {
934 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_TPM_STATUS_REG_OFFSET);
936 bitfield_bit32_read(reg_val, SPI_DEVICE_TPM_STATUS_CMDADDR_NOTEMPTY_BIT);
938 bitfield_bit32_read(reg_val, SPI_DEVICE_TPM_STATUS_WRFIFO_PENDING_BIT);
940 bitfield_bit32_read(reg_val, SPI_DEVICE_TPM_STATUS_RDFIFO_ABORTED_BIT);
947 if (spi == NULL || locality >= SPI_DEVICE_PARAM_NUM_LOCALITY) {
952 ptrdiff_t reg_offset = SPI_DEVICE_TPM_ACCESS_0_REG_OFFSET + (locality & 0xfc);
953 uint32_t reg_val = mmio_region_read32(spi->
dev.
base_addr, reg_offset);
954 switch (locality & 0x03) {
956 reg_val = bitfield_field32_write(
957 reg_val, SPI_DEVICE_TPM_ACCESS_0_ACCESS_0_FIELD, value);
960 reg_val = bitfield_field32_write(
961 reg_val, SPI_DEVICE_TPM_ACCESS_0_ACCESS_1_FIELD, value);
964 reg_val = bitfield_field32_write(
965 reg_val, SPI_DEVICE_TPM_ACCESS_0_ACCESS_2_FIELD, value);
968 reg_val = bitfield_field32_write(
969 reg_val, SPI_DEVICE_TPM_ACCESS_0_ACCESS_3_FIELD, value);
974 mmio_region_write32(spi->
dev.
base_addr, reg_offset, reg_val);
981 if (spi == NULL || locality >= SPI_DEVICE_PARAM_NUM_LOCALITY ||
987 ptrdiff_t reg_offset = SPI_DEVICE_TPM_ACCESS_0_REG_OFFSET + (locality & 0xfc);
988 uint32_t reg_val = mmio_region_read32(spi->
dev.
base_addr, reg_offset);
989 switch (locality & 0x03) {
991 *value = (uint8_t)bitfield_field32_read(
992 reg_val, SPI_DEVICE_TPM_ACCESS_0_ACCESS_0_FIELD);
995 *value = (uint8_t)bitfield_field32_read(
996 reg_val, SPI_DEVICE_TPM_ACCESS_0_ACCESS_1_FIELD);
999 *value = (uint8_t)bitfield_field32_read(
1000 reg_val, SPI_DEVICE_TPM_ACCESS_0_ACCESS_2_FIELD);
1003 *value = (uint8_t)bitfield_field32_read(
1004 reg_val, SPI_DEVICE_TPM_ACCESS_0_ACCESS_3_FIELD);
1021 uint32_t value, ptrdiff_t reg_offset) {
1025 mmio_region_write32(spi->
dev.
base_addr, reg_offset, value);
1038 uint32_t *value, ptrdiff_t reg_offset) {
1039 if (spi == NULL || value == NULL) {
1042 *value = mmio_region_read32(spi->
dev.
base_addr, reg_offset);
1048 return tpm_reg_write32(spi, value, SPI_DEVICE_TPM_STS_REG_OFFSET);
1053 return tpm_reg_read32(spi, value, SPI_DEVICE_TPM_STS_REG_OFFSET);
1058 return tpm_reg_write32(spi, value, SPI_DEVICE_TPM_INTF_CAPABILITY_REG_OFFSET);
1063 return tpm_reg_read32(spi, value, SPI_DEVICE_TPM_INTF_CAPABILITY_REG_OFFSET);
1068 return tpm_reg_write32(spi, value, SPI_DEVICE_TPM_INT_ENABLE_REG_OFFSET);
1073 return tpm_reg_read32(spi, value, SPI_DEVICE_TPM_INT_ENABLE_REG_OFFSET);
1078 return tpm_reg_write32(spi, value, SPI_DEVICE_TPM_INT_VECTOR_REG_OFFSET);
1083 return tpm_reg_read32(spi, value, SPI_DEVICE_TPM_INT_VECTOR_REG_OFFSET);
1088 return tpm_reg_write32(spi, value, SPI_DEVICE_TPM_INT_STATUS_REG_OFFSET);
1093 return tpm_reg_read32(spi, value, SPI_DEVICE_TPM_INT_STATUS_REG_OFFSET);
1097 dif_spi_device_tpm_id_t
id) {
1103 bitfield_field32_write(0, SPI_DEVICE_TPM_DID_VID_VID_FIELD,
id.vendor_id);
1104 reg_val = bitfield_field32_write(reg_val, SPI_DEVICE_TPM_DID_VID_DID_FIELD,
1106 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_TPM_DID_VID_REG_OFFSET,
1108 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_TPM_RID_REG_OFFSET,
1114 dif_spi_device_tpm_id_t *value) {
1115 if (spi == NULL || value == NULL) {
1119 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_TPM_DID_VID_REG_OFFSET);
1121 mmio_region_read32(spi->
dev.
base_addr, SPI_DEVICE_TPM_RID_REG_OFFSET);
1122 value->
vendor_id = (uint16_t)bitfield_field32_read(
1123 did_vid, SPI_DEVICE_TPM_DID_VID_VID_FIELD);
1124 value->
device_id = (uint16_t)bitfield_field32_read(
1125 did_vid, SPI_DEVICE_TPM_DID_VID_DID_FIELD);
1127 (uint8_t)bitfield_field32_read(rid, SPI_DEVICE_TPM_RID_RID_FIELD);
1133 uint32_t *address) {
1134 if (spi == NULL || command == NULL || address == NULL) {
1137 uint32_t reg_val = mmio_region_read32(spi->
dev.
base_addr,
1138 SPI_DEVICE_TPM_CMD_ADDR_REG_OFFSET);
1139 *command = (uint8_t)bitfield_field32_read(reg_val,
1140 SPI_DEVICE_TPM_CMD_ADDR_CMD_FIELD);
1141 *address = bitfield_field32_read(reg_val, SPI_DEVICE_TPM_CMD_ADDR_ADDR_FIELD);
1146 size_t length, uint8_t *buf) {
1147 if (spi == NULL || buf == NULL) {
1150 dif_spi_device_tpm_data_status_t
status;
1152 uint8_t offset = length & 0x3;
1153 uint32_t rdfifo_wdata;
1158 if (DIF_SPI_DEVICE_TPM_FIFO_DEPTH *
sizeof(uint32_t) < length) {
1161 for (
int i = 0; i < length; i += 4) {
1162 if (i + 4 > length) {
1165 for (
int j = 0; j <= offset; j++) {
1166 rdfifo_wdata |= (uint32_t)(buf[i + j]) << (8 * j);
1170 rdfifo_wdata = *((uint32_t *)buf + (i >> 2));
1172 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_TPM_READ_FIFO_REG_OFFSET,
1179 size_t length, uint8_t *buf) {
1180 if (spi == NULL || buf == NULL) {
1183 const uint32_t kOffset = 0;
1184 const dif_spi_device_buffer_info_t kInfo = {
1185 .buffer_len = kDifSpiDeviceTpmWriteFifoLen,
1186 .buffer_offset = kDifSpiDeviceTpmWriteFifoOffset,
1188 if (kOffset >= (kInfo.buffer_offset + (ptrdiff_t)kInfo.buffer_len) ||
1189 length > (kInfo.buffer_offset + (ptrdiff_t)kInfo.buffer_len -
1190 (ptrdiff_t)kOffset)) {
1193 ptrdiff_t offset_from_base = SPI_DEVICE_INGRESS_BUFFER_REG_OFFSET +
1194 kInfo.buffer_offset + (ptrdiff_t)kOffset;
1195 mmio_region_memcpy_from_mmio32(spi->
dev.
base_addr, (uint32_t)offset_from_base,
1205 mmio_region_write32(spi->
dev.
base_addr, SPI_DEVICE_TPM_STATUS_REG_OFFSET, 0);