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"
26typedef 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) \
115} flash_ctrl_info_page_t;
123#define INFO_PAGE_STRUCT_DECL_(name_, bank_, page_) \
124 extern const flash_ctrl_info_page_t name_;
129FLASH_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 kFlashCtrlSecMmioCertInfoPagesOwnerRestrict = 5,
169 kFlashCtrlSecMmioDataDefaultCfgSet = 1,
170 kFlashCtrlSecMmioDataDefaultPermsSet = 1,
171 kFlashCtrlSecMmioExecSet = 1,
172 kFlashCtrlSecMmioInfoCfgSet = 1,
173 kFlashCtrlSecMmioInfoCfgLock = 1,
174 kFlashCtrlSecMmioInfoPageLockdown = 2,
175 kFlashCtrlSecMmioInfoPermsSet = 1,
176 kFlashCtrlSecMmioBankErasePermsSet = 1,
177 kFlashCtrlSecMmioInit = 3,
178 kFlashCtrlSecMmioDataRegionProtect = 1,
179 kFlashCtrlSecMmioDataRegionProtectLock = 1,
186 kFlashCtrlErasedWord = UINT32_MAX,
199void flash_ctrl_init(
void);
204void flash_ctrl_disable(
void);
230} flash_ctrl_status_t;
240void flash_ctrl_status_get(flash_ctrl_status_t *
status);
282} flash_ctrl_error_code_t;
292void flash_ctrl_error_code_get(flash_ctrl_error_code_t *error_code);
307rom_error_t flash_ctrl_data_read(uint32_t addr, uint32_t word_count,
324rom_error_t flash_ctrl_info_read(
const flash_ctrl_info_page_t *info_page,
325 uint32_t offset, uint32_t word_count,
343rom_error_t flash_ctrl_info_read_zeros_on_read_error(
344 const flash_ctrl_info_page_t *info_page, uint32_t offset,
345 uint32_t word_count,
void *data);
360rom_error_t flash_ctrl_data_write(uint32_t addr, uint32_t word_count,
377rom_error_t flash_ctrl_info_write(
const flash_ctrl_info_page_t *info_page,
378 uint32_t offset, uint32_t word_count,
392typedef enum flash_ctrl_erase_type {
396 kFlashCtrlEraseTypePage = 0xaf0eab8b,
400 kFlashCtrlEraseTypeBank = 0x80329be9,
401} flash_ctrl_erase_type_t;
415rom_error_t flash_ctrl_data_erase(uint32_t addr,
416 flash_ctrl_erase_type_t erase_type);
426rom_error_t flash_ctrl_data_erase_verify(uint32_t addr,
427 flash_ctrl_erase_type_t erase_type);
438rom_error_t flash_ctrl_info_erase(
const flash_ctrl_info_page_t *info_page,
439 flash_ctrl_erase_type_t erase_type);
481void flash_ctrl_data_default_perms_set(flash_ctrl_perms_t perms);
496void flash_ctrl_info_perms_set(
const flash_ctrl_info_page_t *info_page,
497 flash_ctrl_perms_t perms);
536void flash_ctrl_data_default_cfg_set(flash_ctrl_cfg_t cfg);
543flash_ctrl_cfg_t flash_ctrl_data_default_cfg_get(
void);
550flash_ctrl_cfg_t flash_ctrl_boot_data_cfg_get(
void);
555typedef uint32_t flash_ctrl_region_index_t;
572void flash_ctrl_data_region_protect(flash_ctrl_region_index_t region,
573 uint32_t page_offset, uint32_t num_pages,
574 flash_ctrl_perms_t perms,
587void flash_ctrl_info_cfg_set(
const flash_ctrl_info_page_t *info_page,
588 flash_ctrl_cfg_t cfg);
600void flash_ctrl_info_cfg_lock(
const flash_ctrl_info_page_t *info_page);
614void flash_ctrl_info_page_lockdown(
const flash_ctrl_info_page_t *info_page);
641void flash_ctrl_exec_set(uint32_t exec_val);