4#ifndef OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_RRAM_CTRL_H_
5#define OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_RRAM_CTRL_H_
13#include "sw/device/lib/base/multibits.h"
14#include "sw/device/silicon_creator/lib/error.h"
55} rram_ctrl_info_page_t;
69 kRramCtrlReservedPageCount = 0x8000 / RRAM_CTRL_PARAM_BYTES_PER_PAGE,
71 kRramCtrlEmulPageEndA = RRAM_CTRL_PARAM_NUM_DATA_PAGES / 2,
72 kRramCtrlEmulPageBaseA = kRramCtrlEmulPageEndA - kRramCtrlReservedPageCount,
73 kRramCtrlEmulRegionA = 8,
75 kRramCtrlEmulPageEndB = RRAM_CTRL_PARAM_NUM_DATA_PAGES,
76 kRramCtrlEmulPageBaseB = kRramCtrlEmulPageEndB - kRramCtrlReservedPageCount,
77 kRramCtrlEmulRegionB = 9,
83 kRramCtrlOtpPageCount = RRAM_CTRL_PARAM_NUM_OTP_PAGES,
99#define RRAM_CTRL_INFO_PAGES_DEFINE(X) \
105 X(kRramCtrlInfoPageFactoryId, 0, false, 1) \
106 X(kRramCtrlInfoPageAttestationKeySeeds, 1, false, 1) \
107 X(kRramCtrlInfoPageCreatorSecret, 5, false, 1) \
108 X(kRramCtrlInfoPageOwnerSecret, 6, false, 1) \
109 X(kRramCtrlInfoPageWaferAuthSecret, 7, false, 1) \
130 X(kRramCtrlInfoPageOwnerReserved0, kRramCtrlEmulPageBaseB + 0, true, 4) \
131 X(kRramCtrlInfoPageOwnerReserved1, kRramCtrlEmulPageBaseB + 4, true, 4) \
132 X(kRramCtrlInfoPageOwnerReserved2, kRramCtrlEmulPageBaseB + 8, true, 4) \
133 X(kRramCtrlInfoPageOwnerReserved3, kRramCtrlEmulPageBaseB + 12, true, 4) \
134 X(kRramCtrlInfoPageOwnerReserved4, kRramCtrlEmulPageBaseB + 16, true, 4) \
135 X(kRramCtrlInfoPageOwnerReserved5, kRramCtrlEmulPageBaseB + 20, true, 4) \
136 X(kRramCtrlInfoPageOwnerReserved6, kRramCtrlEmulPageBaseB + 24, true, 4) \
137 X(kRramCtrlInfoPageOwnerReserved7, kRramCtrlEmulPageBaseB + 28, true, 4) \
138 X(kRramCtrlInfoPageBootData0, kRramCtrlEmulPageBaseB + 32, true, 4) \
139 X(kRramCtrlInfoPageBootData1, kRramCtrlEmulPageBaseB + 36, true, 4) \
140 X(kRramCtrlInfoPageOwnerSlot0, kRramCtrlEmulPageBaseB + 40, true, 4) \
141 X(kRramCtrlInfoPageOwnerSlot1, kRramCtrlEmulPageBaseB + 44, true, 4) \
142 X(kRramCtrlInfoPageDiceCerts, kRramCtrlEmulPageBaseB + 48, true, 4) \
143 X(kRramCtrlInfoPageFactoryCerts, kRramCtrlEmulPageBaseB + 52, true, 4) \
148 X(kRramCtrlInfoPageCreatorReserved0, kRramCtrlEmulPageBaseA + 0, true, 4) \
158#define INFO_PAGE_SUM_REGION_A_(name_, page_id_, emulated_, num_pages_) \
159 +((emulated_) && (page_id_) >= kRramCtrlEmulPageBaseA && \
160 (page_id_) < kRramCtrlEmulPageEndA \
163#define INFO_PAGE_SUM_REGION_B_(name_, page_id_, emulated_, num_pages_) \
164 +((emulated_) && (page_id_) >= kRramCtrlEmulPageBaseB && \
165 (page_id_) < kRramCtrlEmulPageEndB \
169 kRramCtrlInfoPagesRegionATotal =
170 0 RRAM_CTRL_INFO_PAGES_DEFINE(INFO_PAGE_SUM_REGION_A_),
171 kRramCtrlInfoPagesRegionBTotal =
172 0 RRAM_CTRL_INFO_PAGES_DEFINE(INFO_PAGE_SUM_REGION_B_),
174#undef INFO_PAGE_SUM_REGION_A_
175#undef INFO_PAGE_SUM_REGION_B_
176static_assert(kRramCtrlInfoPagesRegionATotal <= kRramCtrlReservedPageCount,
177 "RRAM_CTRL_INFO_PAGES_DEFINE's Region A entries overflow "
178 "kRramCtrlEmulRegionA's window");
179static_assert(kRramCtrlInfoPagesRegionBTotal <=
180 kRramCtrlReservedPageCount - kRramCtrlOtpPageCount,
181 "RRAM_CTRL_INFO_PAGES_DEFINE's Region B entries would overlap "
191#define INFO_PAGE_STRUCT_DECL_(name_, page_id_, emulated_, num_pages_) \
192 extern const rram_ctrl_info_page_t name_;
197RRAM_CTRL_INFO_PAGES_DEFINE(INFO_PAGE_STRUCT_DECL_);
199#undef INFO_PAGE_STRUCT_DECL_
213#define INFO_PAGE_SIZE_ENUM_(name_, page_id_, emulated_, num_pages_) \
214 name_##Size = (num_pages_) * RRAM_CTRL_PARAM_BYTES_PER_PAGE,
216enum { RRAM_CTRL_INFO_PAGES_DEFINE(INFO_PAGE_SIZE_ENUM_) };
218#undef INFO_PAGE_SIZE_ENUM_
231#define RRAM_CTRL_OTP_FIELD_SCRAMBLING \
232 (bitfield_field32_t){.mask = UINT8_MAX, .index = CHAR_BIT * 0}
233#define RRAM_CTRL_OTP_FIELD_ECC \
234 (bitfield_field32_t){.mask = UINT8_MAX, .index = CHAR_BIT * 1}
243#define RRAM_CTRL_OTP_FIELD_HW_INFO_CFG_OVERRIDE_SCRAMBLE_DIS \
244 (bitfield_field32_t){.mask = UINT8_MAX, .index = CHAR_BIT * 0}
245#define RRAM_CTRL_OTP_FIELD_HW_INFO_CFG_OVERRIDE_ECC_DIS \
246 (bitfield_field32_t){.mask = UINT8_MAX, .index = CHAR_BIT * 1}
254 kRramCtrlSecMmioDataDefaultPermsSet = 1,
255 kRramCtrlSecMmioDataDefaultCfgSet = 1,
256 kRramCtrlSecMmioInfoPermsSet = 1,
257 kRramCtrlSecMmioInfoCfgSet = 1,
258 kRramCtrlSecMmioInfoCfgLock = 1,
259 kRramCtrlSecMmioInfoPageLockdown = 2,
260 kRramCtrlSecMmioExecSet = 1,
262 kRramCtrlSecMmioDataRegionProtect = 2,
263 kRramCtrlSecMmioDataRegionProtectLock = 1,
264 kRramCtrlSecMmioInit = 1,
277void rram_ctrl_init(
void);
282void rram_ctrl_disable(
void);
315void rram_ctrl_status_get(rram_ctrl_status_t *
status);
338} rram_ctrl_error_code_t;
345void rram_ctrl_error_code_get(rram_ctrl_error_code_t *error_code);
356rom_error_t rram_ctrl_data_read(uint32_t addr, uint32_t word_count,
void *data);
368rom_error_t rram_ctrl_info_read(
const rram_ctrl_info_page_t *info_page,
369 uint32_t offset, uint32_t word_count,
383rom_error_t rram_ctrl_info_read_zeros_on_read_error(
384 const rram_ctrl_info_page_t *info_page, uint32_t offset,
385 uint32_t word_count,
void *data);
399rom_error_t rram_ctrl_data_write(uint32_t addr, uint32_t word_count,
412rom_error_t rram_ctrl_info_write(
const rram_ctrl_info_page_t *info_page,
413 uint32_t offset, uint32_t word_count,
449void rram_ctrl_data_default_perms_set(rram_ctrl_perms_t perms);
461void rram_ctrl_info_perms_set(
const rram_ctrl_info_page_t *info_page,
462 rram_ctrl_perms_t perms);
497void rram_ctrl_data_default_cfg_set(rram_ctrl_cfg_t cfg);
504rram_ctrl_cfg_t rram_ctrl_data_default_cfg_get(
void);
514rram_ctrl_cfg_t rram_ctrl_boot_data_cfg_get(
void);
519typedef uint32_t rram_ctrl_region_index_t;
542void rram_ctrl_data_region_protect(rram_ctrl_region_index_t region,
543 uint32_t page_offset, uint32_t num_pages,
544 rram_ctrl_perms_t perms, rram_ctrl_cfg_t cfg,
557void rram_ctrl_info_cfg_set(
const rram_ctrl_info_page_t *info_page,
558 rram_ctrl_cfg_t cfg);
569void rram_ctrl_info_cfg_lock(
const rram_ctrl_info_page_t *info_page);
584void rram_ctrl_info_page_lockdown(
const rram_ctrl_info_page_t *info_page);
600void rram_ctrl_exec_set(uint32_t exec_val);