4 #ifndef OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_FLASH_CTRL_H_
5 #define OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_FLASH_CTRL_H_
11 #include "sw/device/lib/base/multibits.h"
12 #include "sw/device/silicon_creator/lib/error.h"
26 typedef enum flash_ctrl_partition {
30 kFlashCtrlPartitionData = 0,
36 kFlashCtrlPartitionInfo0 = (0 << 1) | 1,
42 kFlashCtrlPartitionInfo1 = (1 << 1) | 1,
48 kFlashCtrlPartitionInfo2 = (2 << 1) | 1,
49 } flash_ctrl_partition_t;
55 #define FLASH_CTRL_PARTITION_BIT_IS_INFO 0
56 #define FLASH_CTRL_PARTITION_FIELD_INFO_TYPE \
57 ((bitfield_field32_t){.mask = 0x3, .index = 1})
69 #define FLASH_CTRL_INFO_PAGES_DEFINE(X) \
73 X(kFlashCtrlInfoPageFactoryId, 0, 0) \
74 X(kFlashCtrlInfoPageCreatorSecret, 0, 1) \
75 X(kFlashCtrlInfoPageOwnerSecret, 0, 2) \
76 X(kFlashCtrlInfoPageWaferAuthSecret, 0, 3) \
77 X(kFlashCtrlInfoPageAttestationKeySeeds, 0, 4) \
78 X(kFlashCtrlInfoPageOwnerReserved0, 0, 5) \
79 X(kFlashCtrlInfoPageOwnerReserved1, 0, 6) \
80 X(kFlashCtrlInfoPageOwnerReserved2, 0, 7) \
81 X(kFlashCtrlInfoPageOwnerReserved3, 0, 8) \
82 X(kFlashCtrlInfoPageFactoryCerts, 0, 9) \
86 X(kFlashCtrlInfoPageBootData0, 1, 0) \
87 X(kFlashCtrlInfoPageBootData1, 1, 1) \
88 X(kFlashCtrlInfoPageOwnerSlot0, 1, 2) \
89 X(kFlashCtrlInfoPageOwnerSlot1, 1, 3) \
90 X(kFlashCtrlInfoPageCreatorReserved0, 1, 4) \
91 X(kFlashCtrlInfoPageOwnerReserved4, 1, 5) \
92 X(kFlashCtrlInfoPageOwnerReserved5, 1, 6) \
93 X(kFlashCtrlInfoPageOwnerReserved6, 1, 7) \
94 X(kFlashCtrlInfoPageOwnerReserved7, 1, 8) \
95 X(kFlashCtrlInfoPageDiceCerts, 1, 9) \
123 #define INFO_PAGE_STRUCT_DECL_(name_, bank_, page_) \
124 extern const flash_ctrl_info_page_t name_;
129 FLASH_CTRL_INFO_PAGES_DEFINE(INFO_PAGE_STRUCT_DECL_);
131 #undef INFO_PAGE_STRUCT_DECL_
139 #define FLASH_CTRL_OTP_FIELD_SCRAMBLING \
140 (bitfield_field32_t) { .mask = UINT8_MAX, .index = CHAR_BIT * 0 }
141 #define FLASH_CTRL_OTP_FIELD_ECC \
142 (bitfield_field32_t) { .mask = UINT8_MAX, .index = CHAR_BIT * 1 }
143 #define FLASH_CTRL_OTP_FIELD_HE \
144 (bitfield_field32_t) { .mask = UINT8_MAX, .index = CHAR_BIT * 2 }
151 #define FLASH_CTRL_OTP_FIELD_HW_INFO_CFG_OVERRIDE_SCRAMBLE_DIS \
152 (bitfield_field32_t) { .mask = UINT8_MAX, .index = CHAR_BIT * 0 }
153 #define FLASH_CTRL_OTP_FIELD_HW_INFO_CFG_OVERRIDE_ECC_DIS \
154 (bitfield_field32_t) { .mask = UINT8_MAX, .index = CHAR_BIT * 1 }
168 kFlashCtrlSecMmioCertInfoPageCreatorCfg = 2,
169 kFlashCtrlSecMmioCertInfoPageOwnerRestrict = 1,
170 kFlashCtrlSecMmioCertInfoPagesOwnerRestrict = 5,
171 kFlashCtrlSecMmioCreatorInfoPagesLockdown = 12,
172 kFlashCtrlSecMmioDataDefaultCfgSet = 1,
173 kFlashCtrlSecMmioDataDefaultPermsSet = 1,
174 kFlashCtrlSecMmioExecSet = 1,
175 kFlashCtrlSecMmioInfoCfgSet = 1,
176 kFlashCtrlSecMmioInfoCfgLock = 1,
177 kFlashCtrlSecMmioInfoPermsSet = 1,
178 kFlashCtrlSecMmioBankErasePermsSet = 1,
179 kFlashCtrlSecMmioInit = 3,
186 kFlashCtrlErasedWord = UINT32_MAX,
199 void flash_ctrl_init(
void);
302 rom_error_t flash_ctrl_data_read(uint32_t addr, uint32_t word_count,
320 uint32_t offset, uint32_t word_count,
338 rom_error_t flash_ctrl_info_read_zeros_on_read_error(
340 uint32_t word_count,
void *data);
364 rom_error_t flash_ctrl_data_write(uint32_t addr, uint32_t word_count,
382 uint32_t offset, uint32_t word_count,
396 typedef enum flash_ctrl_erase_type {
400 kFlashCtrlEraseTypePage = 0xaf0eab8b,
404 kFlashCtrlEraseTypeBank = 0x80329be9,
405 } flash_ctrl_erase_type_t;
419 rom_error_t flash_ctrl_data_erase(uint32_t addr,
420 flash_ctrl_erase_type_t erase_type);
430 rom_error_t flash_ctrl_data_erase_verify(uint32_t addr,
431 flash_ctrl_erase_type_t erase_type);
443 flash_ctrl_erase_type_t erase_type);
464 multi_bit_bool_t
erase;
547 typedef uint32_t flash_ctrl_region_index_t;
564 void flash_ctrl_data_region_protect(flash_ctrl_region_index_t region,
565 uint32_t page_offset, uint32_t num_pages,
619 void flash_ctrl_exec_set(uint32_t exec_val);
631 void flash_ctrl_creator_info_pages_lockdown(
void);
654 void flash_ctrl_cert_info_page_creator_cfg(
665 void flash_ctrl_cert_info_page_owner_restrict(