5#ifndef OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_NVM_CTRL_H_
6#define OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_NVM_CTRL_H_
12#include "sw/device/lib/base/multibits.h"
13#include "sw/device/silicon_creator/lib/error.h"
24#include "hw/top/flash_ctrl_regs.h"
25#if defined(OPENTITAN_IS_EARLGREY)
27#elif defined(OPENTITAN_IS_ENGLISHBREAKFAST)
30#error "USE_FLASH set for an unsupported top"
32#elif !defined(USE_RRAM)
33#error "nvm_ctrl.h requires USE_FLASH or USE_RRAM to be defined"
46#define NVM_BYTES_PER_PAGE FLASH_CTRL_PARAM_BYTES_PER_PAGE
48#define NVM_BYTES_PER_WORD FLASH_CTRL_PARAM_BYTES_PER_WORD
50#define NVM_BYTES_PER_BANK FLASH_CTRL_PARAM_BYTES_PER_BANK
52#define NVM_NUM_BANKS FLASH_CTRL_PARAM_REG_NUM_BANKS
54#define NVM_PAGES_PER_BANK FLASH_CTRL_PARAM_REG_PAGES_PER_BANK
55#if defined(OPENTITAN_IS_EARLGREY)
57#define NVM_DATA_BASE_ADDR TOP_EARLGREY_FLASH_CTRL_MEM_BASE_ADDR
59#define NVM_DATA_SIZE_BYTES TOP_EARLGREY_FLASH_CTRL_MEM_SIZE_BYTES
60#elif defined(OPENTITAN_IS_ENGLISHBREAKFAST)
62#define NVM_DATA_BASE_ADDR TOP_ENGLISHBREAKFAST_FLASH_CTRL_MEM_BASE_ADDR
64#define NVM_DATA_SIZE_BYTES TOP_ENGLISHBREAKFAST_FLASH_CTRL_MEM_SIZE_BYTES
68#define NVM_BYTES_PER_SLOT (NVM_DATA_SIZE_BYTES / 2)
71enum { kNvmErasedWord = UINT32_MAX };
85 multi_bit_bool_t read;
86 multi_bit_bool_t write;
87 multi_bit_bool_t erase;
98 multi_bit_bool_t scrambling;
104extern const nvm_page_perms_t kNvmPagePermsReadWrite;
106extern const nvm_page_perms_t kNvmPagePermsReadOnly;
108extern const nvm_page_perms_t kNvmPagePermsNone;
110extern const nvm_page_perms_t kNvmPagePermsErase;
113extern const nvm_page_cfg_t kNvmPageCfgScrambled;
115extern const nvm_page_cfg_t kNvmPageCfgPlain;
117extern const nvm_page_cfg_t kNvmPageCfgRaw;
130typedef enum nvm_info_page {
132 kNvmInfoPageFactoryId = 0,
133 kNvmInfoPageCreatorSecret = 1,
134 kNvmInfoPageOwnerSecret = 2,
135 kNvmInfoPageWaferAuthSecret = 3,
136 kNvmInfoPageAttestationKeySeeds = 4,
137 kNvmInfoPageOwnerReserved0 = 5,
138 kNvmInfoPageOwnerReserved1 = 6,
139 kNvmInfoPageOwnerReserved2 = 7,
140 kNvmInfoPageOwnerReserved3 = 8,
141 kNvmInfoPageFactoryCerts = 9,
143 kNvmInfoPageBootData0 = 10,
144 kNvmInfoPageBootData1 = 11,
145 kNvmInfoPageOwnerSlot0 = 12,
146 kNvmInfoPageOwnerSlot1 = 13,
147 kNvmInfoPageCreatorReserved0 = 14,
148 kNvmInfoPageOwnerReserved4 = 15,
149 kNvmInfoPageOwnerReserved5 = 16,
150 kNvmInfoPageOwnerReserved6 = 17,
151 kNvmInfoPageOwnerReserved7 = 18,
152 kNvmInfoPageDiceCerts = 19,
162 kNvmCtrlSecMmioCertInfoPageCreatorCfg = 2,
163 kNvmCtrlSecMmioCertInfoPageOwnerRestrict = 2,
164 kNvmCtrlSecMmioCertInfoPagesOwnerRestrict = 5,
165 kNvmCtrlSecMmioCreatorInfoPagesLockdown = 14,
166 kNvmCtrlSecMmioDataDefaultCfgSet = 1,
167 kNvmCtrlSecMmioDataDefaultPermsSet = 1,
168 kNvmCtrlSecMmioExecSet = 1,
169 kNvmCtrlSecMmioInfoCfgSet = 1,
170 kNvmCtrlSecMmioInfoCfgLock = 1,
171 kNvmCtrlSecMmioInfoPageLockdown = 2,
172 kNvmCtrlSecMmioInfoPermsSet = 1,
173 kNvmCtrlSecMmioBankErasePermsSet = 1,
174 kNvmCtrlSecMmioInit = 3,
175 kNvmCtrlSecMmioDataRegionProtect = 1,
176 kNvmCtrlSecMmioDataRegionProtectLock = 1,
189void nvm_ctrl_init(
void);
194void nvm_ctrl_disable(
void);
213rom_error_t nvm_ctrl_info_page_lookup(uint8_t bank, uint8_t page,
214 nvm_info_page_t *out);
221rom_error_t nvm_ctrl_data_read(uint32_t addr, uint32_t word_count,
void *data);
224rom_error_t nvm_ctrl_data_write(uint32_t addr, uint32_t word_count,
228rom_error_t nvm_ctrl_data_erase(uint32_t addr);
231rom_error_t nvm_ctrl_data_erase_verify(uint32_t addr);
240rom_error_t nvm_ctrl_chip_erase(
void);
246rom_error_t nvm_ctrl_chip_erase_verify(
void);
264rom_error_t nvm_ctrl_page_program(uint32_t addr,
size_t byte_count,
276rom_error_t nvm_ctrl_sector_erase(uint32_t addr);
283rom_error_t nvm_ctrl_info_read(nvm_info_page_t page, uint32_t offset,
284 uint32_t word_count,
void *data);
290rom_error_t nvm_ctrl_info_read_zeros_on_read_error(nvm_info_page_t page,
296rom_error_t nvm_ctrl_info_write(nvm_info_page_t page, uint32_t offset,
297 uint32_t word_count,
const void *data);
300rom_error_t nvm_ctrl_info_erase(nvm_info_page_t page);
312void nvm_ctrl_data_default_perms_set(nvm_page_perms_t perms);
320void nvm_ctrl_info_perms_set(nvm_info_page_t page, nvm_page_perms_t perms);
328void nvm_ctrl_data_default_cfg_set(nvm_page_cfg_t cfg);
331nvm_page_cfg_t nvm_ctrl_data_default_cfg_get(
void);
334nvm_page_cfg_t nvm_ctrl_boot_data_cfg_get(
void);
342void nvm_ctrl_info_cfg_set(nvm_info_page_t page, nvm_page_cfg_t cfg);
350void nvm_ctrl_info_cfg_lock(nvm_info_page_t page);
363void nvm_ctrl_data_region_protect(uint32_t region, uint32_t page_offset,
364 uint32_t num_pages, nvm_page_perms_t perms,
384void nvm_ctrl_exec_set(uint32_t exec_val);
391extern const nvm_page_cfg_t kNvmCertInfoPageCfg;
393extern const nvm_page_perms_t kNvmCertInfoPageCreatorAccess;
395extern const nvm_page_perms_t kNvmCertInfoPageOwnerAccess;
406void nvm_ctrl_creator_info_pages_lockdown(
void);
414void nvm_ctrl_cert_info_page_creator_cfg(nvm_info_page_t page);
422void nvm_ctrl_cert_info_page_owner_restrict(nvm_info_page_t page);
428#define NVM_CONFIG_READ ((bitfield_field32_t) { .mask = 0xF, .index = 0 })
429#define NVM_CONFIG_PROGRAM ((bitfield_field32_t) { .mask = 0xF, .index = 4 })
430#define NVM_CONFIG_ERASE ((bitfield_field32_t) { .mask = 0xF, .index = 8 })
431#define NVM_CONFIG_PROTECT_WHEN_PRIMARY ((bitfield_field32_t) { .mask = 0xF, .index = 24 })
432#define NVM_CONFIG_LOCK ((bitfield_field32_t) { .mask = 0xF, .index = 28 })
437#define NVM_CONFIG_SCRAMBLE ((bitfield_field32_t) { .mask = 0xF, .index = 0 })
438#define NVM_CONFIG_ECC ((bitfield_field32_t) { .mask = 0xF, .index = 4 })
439#define NVM_CONFIG_HIGH_ENDURANCE ((bitfield_field32_t) { .mask = 0xF, .index = 8 })