5#ifndef OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_NVM_CTRL_H_
6#define OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_NVM_CTRL_H_
13#include "sw/device/lib/base/multibits.h"
14#include "sw/device/silicon_creator/lib/error.h"
23#if defined(OPENTITAN_IS_EARLGREY)
25#elif defined(OPENTITAN_IS_ENGLISHBREAKFAST)
28#error "USE_FLASH set for an unsupported top"
30#elif defined(USE_RRAM)
31#include "sw/device/silicon_creator/lib/drivers/rram_ctrl.h"
34#if defined(OPENTITAN_IS_EARLGREY)
37#error "USE_RRAM set for an unsupported top"
40#error "nvm_ctrl.h requires USE_FLASH or USE_RRAM to be defined"
53#define NVM_BYTES_PER_PAGE FLASH_CTRL_PARAM_BYTES_PER_PAGE
55#define NVM_BYTES_PER_WORD FLASH_CTRL_PARAM_BYTES_PER_WORD
57#define NVM_BYTES_PER_BANK FLASH_CTRL_PARAM_BYTES_PER_BANK
59#define NVM_NUM_BANKS FLASH_CTRL_PARAM_REG_NUM_BANKS
61#define NVM_PAGES_PER_BANK FLASH_CTRL_PARAM_REG_PAGES_PER_BANK
63#define NVM_EXEC_EN FLASH_CTRL_PARAM_EXEC_EN
64#if defined(OPENTITAN_IS_EARLGREY)
66#define NVM_DATA_BASE_ADDR TOP_EARLGREY_FLASH_CTRL_MEM_BASE_ADDR
68#define NVM_DATA_SIZE_BYTES TOP_EARLGREY_FLASH_CTRL_MEM_SIZE_BYTES
69#elif defined(OPENTITAN_IS_ENGLISHBREAKFAST)
71#define NVM_DATA_BASE_ADDR TOP_ENGLISHBREAKFAST_FLASH_CTRL_MEM_BASE_ADDR
73#define NVM_DATA_SIZE_BYTES TOP_ENGLISHBREAKFAST_FLASH_CTRL_MEM_SIZE_BYTES
75#elif defined(USE_RRAM)
77#define NVM_BYTES_PER_PAGE RRAM_CTRL_PARAM_BYTES_PER_PAGE
88#define NVM_BYTES_PER_WORD 8
98#define NVM_NUM_BANKS 1u
100#define NVM_PAGES_PER_BANK RRAM_CTRL_PARAM_NUM_DATA_PAGES
102#define NVM_BYTES_PER_BANK (NVM_PAGES_PER_BANK * NVM_BYTES_PER_PAGE)
104#define NVM_EXEC_EN RRAM_CTRL_PARAM_EXEC_EN
112#define NVM_DATA_BASE_ADDR TOP_EARLGREY_RRAM_CTRL_HOST_BASE_ADDR
114#define NVM_DATA_SIZE_BYTES \
115 (RRAM_CTRL_PARAM_NUM_DATA_PAGES * RRAM_CTRL_PARAM_BYTES_PER_PAGE)
125#define NVM_PAGES_PER_SLOT ((NVM_NUM_BANKS * NVM_PAGES_PER_BANK) / 2)
126#define NVM_BYTES_PER_SLOT (NVM_PAGES_PER_SLOT * NVM_BYTES_PER_PAGE)
129#define NVM_SLOT_A_START_BYTES 0
131#define NVM_SLOT_B_START_BYTES NVM_BYTES_PER_SLOT
138#define NVM_SLOT_USABLE_SIZE_BYTES \
139 (NVM_BYTES_PER_SLOT - kRramCtrlReservedPageCount * NVM_BYTES_PER_PAGE)
141#define NVM_SLOT_USABLE_SIZE_BYTES NVM_BYTES_PER_SLOT
148#define NVM_SLOT_A_END_BYTES \
149 (NVM_SLOT_A_START_BYTES + NVM_SLOT_USABLE_SIZE_BYTES)
150#define NVM_SLOT_B_END_BYTES \
151 (NVM_SLOT_B_START_BYTES + NVM_SLOT_USABLE_SIZE_BYTES)
171#define NVM_PROG_PAGE_SIZE 512
173#define NVM_PROG_PAGE_SIZE 256
177#define kNvmErasedWord UINT32_MAX
210 uint32_t scrambling : 4;
218extern const nvm_page_perms_t kNvmPagePermsReadWrite;
220extern const nvm_page_perms_t kNvmPagePermsReadOnly;
222extern const nvm_page_perms_t kNvmPagePermsNone;
224extern const nvm_page_perms_t kNvmPagePermsErase;
227extern const nvm_page_cfg_t kNvmPageCfgScrambled;
229extern const nvm_page_cfg_t kNvmPageCfgPlain;
231extern const nvm_page_cfg_t kNvmPageCfgRaw;
244typedef enum nvm_info_page {
246 kNvmInfoPageFactoryId = 0,
247 kNvmInfoPageCreatorSecret = 1,
248 kNvmInfoPageOwnerSecret = 2,
249 kNvmInfoPageWaferAuthSecret = 3,
250 kNvmInfoPageAttestationKeySeeds = 4,
251 kNvmInfoPageOwnerReserved0 = 5,
252 kNvmInfoPageOwnerReserved1 = 6,
253 kNvmInfoPageOwnerReserved2 = 7,
254 kNvmInfoPageOwnerReserved3 = 8,
255 kNvmInfoPageFactoryCerts = 9,
257 kNvmInfoPageBootData0 = 10,
258 kNvmInfoPageBootData1 = 11,
259 kNvmInfoPageOwnerSlot0 = 12,
260 kNvmInfoPageOwnerSlot1 = 13,
261 kNvmInfoPageCreatorReserved0 = 14,
262 kNvmInfoPageOwnerReserved4 = 15,
263 kNvmInfoPageOwnerReserved5 = 16,
264 kNvmInfoPageOwnerReserved6 = 17,
265 kNvmInfoPageOwnerReserved7 = 18,
266 kNvmInfoPageDiceCerts = 19,
275 kNvmInfoPageDiceCertsSize = kRramCtrlInfoPageDiceCertsSize,
276 kNvmInfoPageFactoryCertsSize = kRramCtrlInfoPageFactoryCertsSize,
277 kNvmInfoPageBootData0Size = kRramCtrlInfoPageBootData0Size,
278 kNvmInfoPageBootData1Size = kRramCtrlInfoPageBootData1Size,
293const rram_ctrl_info_page_t *nvm_ctrl_rram_page_info(nvm_info_page_t page);
296 kNvmInfoPageDiceCertsSize = NVM_BYTES_PER_PAGE,
297 kNvmInfoPageFactoryCertsSize = NVM_BYTES_PER_PAGE,
298 kNvmInfoPageBootData0Size = NVM_BYTES_PER_PAGE,
299 kNvmInfoPageBootData1Size = NVM_BYTES_PER_PAGE,
329 kNvmCtrlSecMmioCertInfoPageCreatorCfg = 2,
330 kNvmCtrlSecMmioCertInfoPageOwnerRestrict = 2,
331 kNvmCtrlSecMmioCertInfoPagesOwnerRestrict = 5,
338 kNvmCtrlSecMmioCreatorInfoPagesLockdown = 8,
340 kNvmCtrlSecMmioCreatorInfoPagesLockdown = 14,
342 kNvmCtrlSecMmioDataDefaultCfgSet = 1,
343 kNvmCtrlSecMmioDataDefaultPermsSet = 1,
344 kNvmCtrlSecMmioExecSet = 1,
345 kNvmCtrlSecMmioInfoCfgSet = 1,
346 kNvmCtrlSecMmioInfoCfgLock = 1,
347 kNvmCtrlSecMmioInfoPageLockdown = 2,
348 kNvmCtrlSecMmioInfoPermsSet = 1,
349 kNvmCtrlSecMmioBankErasePermsSet = 1,
353 kNvmCtrlSecMmioInit = 2,
355 kNvmCtrlSecMmioInit = 3,
358 kNvmCtrlSecMmioDataRegionProtect = 2,
359 kNvmCtrlSecMmioDataRegionProtectLock = 1,
372void nvm_ctrl_init(
void);
377void nvm_ctrl_disable(
void);
398rom_error_t nvm_ctrl_info_page_lookup(uint8_t bank, uint8_t page,
399 nvm_info_page_t *out);
406rom_error_t nvm_ctrl_data_read(uint32_t addr, uint32_t word_count,
void *data);
409rom_error_t nvm_ctrl_data_write(uint32_t addr, uint32_t word_count,
413rom_error_t nvm_ctrl_data_erase(uint32_t addr);
416rom_error_t nvm_ctrl_data_erase_verify(uint32_t addr);
425rom_error_t nvm_ctrl_chip_erase(
void);
431rom_error_t nvm_ctrl_chip_erase_verify(
void);
452rom_error_t nvm_ctrl_bootstrap_page_program(uint32_t addr,
size_t byte_count,
467rom_error_t nvm_ctrl_bootstrap_sector_erase(uint32_t addr);
474rom_error_t nvm_ctrl_info_read(nvm_info_page_t page, uint32_t offset,
475 uint32_t word_count,
void *data);
481rom_error_t nvm_ctrl_info_read_zeros_on_read_error(nvm_info_page_t page,
487rom_error_t nvm_ctrl_info_write(nvm_info_page_t page, uint32_t offset,
488 uint32_t word_count,
const void *data);
491rom_error_t nvm_ctrl_info_erase(nvm_info_page_t page);
503void nvm_ctrl_data_default_perms_set(nvm_page_perms_t perms);
511void nvm_ctrl_info_perms_set(nvm_info_page_t page, nvm_page_perms_t perms);
519void nvm_ctrl_data_default_cfg_set(nvm_page_cfg_t cfg);
522nvm_page_cfg_t nvm_ctrl_data_default_cfg_get(
void);
525nvm_page_cfg_t nvm_ctrl_boot_data_cfg_get(
void);
533void nvm_ctrl_info_cfg_set(nvm_info_page_t page, nvm_page_cfg_t cfg);
541void nvm_ctrl_info_cfg_lock(nvm_info_page_t page);
554void nvm_ctrl_data_region_protect(uint32_t region, uint32_t page_offset,
555 uint32_t num_pages, nvm_page_perms_t perms,
575void nvm_ctrl_exec_set(uint32_t exec_val);
582extern const nvm_page_cfg_t kNvmCertInfoPageCfg;
584extern const nvm_page_perms_t kNvmCertInfoPageCreatorAccess;
586extern const nvm_page_perms_t kNvmCertInfoPageOwnerAccess;
597void nvm_ctrl_creator_info_pages_lockdown(
void);
605void nvm_ctrl_cert_info_page_creator_cfg(nvm_info_page_t page);
613void nvm_ctrl_cert_info_page_owner_restrict(nvm_info_page_t page);
619#define OWNER_NVM_CONFIG_READ ((bitfield_field32_t) { .mask = 0xF, .index = 0 })
620#define OWNER_NVM_CONFIG_PROGRAM ((bitfield_field32_t) { .mask = 0xF, .index = 4 })
621#define OWNER_NVM_CONFIG_ERASE ((bitfield_field32_t) { .mask = 0xF, .index = 8 })
622#define OWNER_NVM_CONFIG_PROTECT_WHEN_PRIMARY ((bitfield_field32_t) { .mask = 0xF, .index = 24 })
623#define OWNER_NVM_CONFIG_LOCK ((bitfield_field32_t) { .mask = 0xF, .index = 28 })
628#define OWNER_NVM_CONFIG_SCRAMBLE ((bitfield_field32_t) { .mask = 0xF, .index = 0 })
629#define OWNER_NVM_CONFIG_ECC ((bitfield_field32_t) { .mask = 0xF, .index = 4 })
630#define OWNER_NVM_CONFIG_HIGH_ENDURANCE ((bitfield_field32_t) { .mask = 0xF, .index = 8 })