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"
17#include "hw/top/flash_ctrl_regs.h"
29#define NVM_BYTES_PER_PAGE FLASH_CTRL_PARAM_BYTES_PER_PAGE
31#define NVM_BYTES_PER_WORD FLASH_CTRL_PARAM_BYTES_PER_WORD
33#define NVM_BYTES_PER_BANK FLASH_CTRL_PARAM_BYTES_PER_BANK
35#define NVM_NUM_BANKS FLASH_CTRL_PARAM_REG_NUM_BANKS
37#define NVM_PAGES_PER_BANK FLASH_CTRL_PARAM_REG_PAGES_PER_BANK
39#define NVM_DATA_BASE_ADDR TOP_EARLGREY_FLASH_CTRL_MEM_BASE_ADDR
41#define NVM_DATA_SIZE_BYTES TOP_EARLGREY_FLASH_CTRL_MEM_SIZE_BYTES
44enum { kNvmErasedWord = UINT32_MAX };
58 multi_bit_bool_t read;
59 multi_bit_bool_t write;
60 multi_bit_bool_t erase;
71 multi_bit_bool_t scrambling;
77extern const nvm_page_perms_t kNvmPagePermsReadWrite;
79extern const nvm_page_perms_t kNvmPagePermsReadOnly;
81extern const nvm_page_perms_t kNvmPagePermsNone;
83extern const nvm_page_perms_t kNvmPagePermsErase;
86extern const nvm_page_cfg_t kNvmPageCfgScrambled;
88extern const nvm_page_cfg_t kNvmPageCfgPlain;
90extern const nvm_page_cfg_t kNvmPageCfgRaw;
103typedef enum nvm_info_page {
105 kNvmInfoPageFactoryId = 0,
106 kNvmInfoPageCreatorSecret = 1,
107 kNvmInfoPageOwnerSecret = 2,
108 kNvmInfoPageWaferAuthSecret = 3,
109 kNvmInfoPageAttestationKeySeeds = 4,
110 kNvmInfoPageOwnerReserved0 = 5,
111 kNvmInfoPageOwnerReserved1 = 6,
112 kNvmInfoPageOwnerReserved2 = 7,
113 kNvmInfoPageOwnerReserved3 = 8,
114 kNvmInfoPageFactoryCerts = 9,
116 kNvmInfoPageBootData0 = 10,
117 kNvmInfoPageBootData1 = 11,
118 kNvmInfoPageOwnerSlot0 = 12,
119 kNvmInfoPageOwnerSlot1 = 13,
120 kNvmInfoPageCreatorReserved0 = 14,
121 kNvmInfoPageOwnerReserved4 = 15,
122 kNvmInfoPageOwnerReserved5 = 16,
123 kNvmInfoPageOwnerReserved6 = 17,
124 kNvmInfoPageOwnerReserved7 = 18,
125 kNvmInfoPageDiceCerts = 19,
135 kNvmCtrlSecMmioCertInfoPageCreatorCfg = 2,
136 kNvmCtrlSecMmioCertInfoPageOwnerRestrict = 2,
137 kNvmCtrlSecMmioCertInfoPagesOwnerRestrict = 5,
138 kNvmCtrlSecMmioCreatorInfoPagesLockdown = 14,
139 kNvmCtrlSecMmioDataDefaultCfgSet = 1,
140 kNvmCtrlSecMmioDataDefaultPermsSet = 1,
141 kNvmCtrlSecMmioExecSet = 1,
142 kNvmCtrlSecMmioInfoCfgSet = 1,
143 kNvmCtrlSecMmioInfoCfgLock = 1,
144 kNvmCtrlSecMmioInfoPageLockdown = 2,
145 kNvmCtrlSecMmioInfoPermsSet = 1,
146 kNvmCtrlSecMmioBankErasePermsSet = 1,
147 kNvmCtrlSecMmioInit = 3,
148 kNvmCtrlSecMmioDataRegionProtect = 1,
149 kNvmCtrlSecMmioDataRegionProtectLock = 1,
162void nvm_ctrl_init(
void);
167void nvm_ctrl_disable(
void);
186rom_error_t nvm_ctrl_info_page_lookup(uint8_t bank, uint8_t page,
187 nvm_info_page_t *out);
194rom_error_t nvm_ctrl_data_read(uint32_t addr, uint32_t word_count,
void *data);
197rom_error_t nvm_ctrl_data_write(uint32_t addr, uint32_t word_count,
201rom_error_t nvm_ctrl_data_erase(uint32_t addr);
204rom_error_t nvm_ctrl_data_erase_verify(uint32_t addr);
213rom_error_t nvm_ctrl_chip_erase(
void);
219rom_error_t nvm_ctrl_chip_erase_verify(
void);
237rom_error_t nvm_ctrl_page_program(uint32_t addr,
size_t byte_count,
249rom_error_t nvm_ctrl_sector_erase(uint32_t addr);
256rom_error_t nvm_ctrl_info_read(nvm_info_page_t page, uint32_t offset,
257 uint32_t word_count,
void *data);
263rom_error_t nvm_ctrl_info_read_zeros_on_read_error(nvm_info_page_t page,
269rom_error_t nvm_ctrl_info_write(nvm_info_page_t page, uint32_t offset,
270 uint32_t word_count,
const void *data);
273rom_error_t nvm_ctrl_info_erase(nvm_info_page_t page);
285void nvm_ctrl_data_default_perms_set(nvm_page_perms_t perms);
293void nvm_ctrl_info_perms_set(nvm_info_page_t page, nvm_page_perms_t perms);
301void nvm_ctrl_data_default_cfg_set(nvm_page_cfg_t cfg);
304nvm_page_cfg_t nvm_ctrl_data_default_cfg_get(
void);
307nvm_page_cfg_t nvm_ctrl_boot_data_cfg_get(
void);
315void nvm_ctrl_info_cfg_set(nvm_info_page_t page, nvm_page_cfg_t cfg);
323void nvm_ctrl_info_cfg_lock(nvm_info_page_t page);
336void nvm_ctrl_data_region_protect(uint32_t region, uint32_t page_offset,
337 uint32_t num_pages, nvm_page_perms_t perms,
357void nvm_ctrl_exec_set(uint32_t exec_val);
364extern const nvm_page_cfg_t kNvmCertInfoPageCfg;
366extern const nvm_page_perms_t kNvmCertInfoPageCreatorAccess;
368extern const nvm_page_perms_t kNvmCertInfoPageOwnerAccess;
379void nvm_ctrl_creator_info_pages_lockdown(
void);
387void nvm_ctrl_cert_info_page_creator_cfg(nvm_info_page_t page);
395void nvm_ctrl_cert_info_page_owner_restrict(nvm_info_page_t page);
401#define NVM_CONFIG_READ ((bitfield_field32_t) { .mask = 0xF, .index = 0 })
402#define NVM_CONFIG_PROGRAM ((bitfield_field32_t) { .mask = 0xF, .index = 4 })
403#define NVM_CONFIG_ERASE ((bitfield_field32_t) { .mask = 0xF, .index = 8 })
404#define NVM_CONFIG_PROTECT_WHEN_PRIMARY ((bitfield_field32_t) { .mask = 0xF, .index = 24 })
405#define NVM_CONFIG_LOCK ((bitfield_field32_t) { .mask = 0xF, .index = 28 })
410#define NVM_CONFIG_SCRAMBLE ((bitfield_field32_t) { .mask = 0xF, .index = 0 })
411#define NVM_CONFIG_ECC ((bitfield_field32_t) { .mask = 0xF, .index = 4 })
412#define NVM_CONFIG_HIGH_ENDURANCE ((bitfield_field32_t) { .mask = 0xF, .index = 8 })