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((uint32_t)kRramCtrlInfoPagesRegionATotal <=
177 (uint32_t)kRramCtrlReservedPageCount,
178 "RRAM_CTRL_INFO_PAGES_DEFINE's Region A entries overflow "
179 "kRramCtrlEmulRegionA's window");
180static_assert((uint32_t)kRramCtrlInfoPagesRegionBTotal <=
181 (uint32_t)(kRramCtrlReservedPageCount -
182 kRramCtrlOtpPageCount),
183 "RRAM_CTRL_INFO_PAGES_DEFINE's Region B entries would overlap "
193#define INFO_PAGE_STRUCT_DECL_(name_, page_id_, emulated_, num_pages_) \
194 extern const rram_ctrl_info_page_t name_;
199RRAM_CTRL_INFO_PAGES_DEFINE(INFO_PAGE_STRUCT_DECL_);
201#undef INFO_PAGE_STRUCT_DECL_
215#define INFO_PAGE_SIZE_ENUM_(name_, page_id_, emulated_, num_pages_) \
216 name_##Size = (num_pages_) * RRAM_CTRL_PARAM_BYTES_PER_PAGE,
218enum { RRAM_CTRL_INFO_PAGES_DEFINE(INFO_PAGE_SIZE_ENUM_) };
220#undef INFO_PAGE_SIZE_ENUM_
233#define RRAM_CTRL_OTP_FIELD_SCRAMBLING \
234 (bitfield_field32_t){.mask = UINT8_MAX, .index = CHAR_BIT * 0}
235#define RRAM_CTRL_OTP_FIELD_ECC \
236 (bitfield_field32_t){.mask = UINT8_MAX, .index = CHAR_BIT * 1}
245#define RRAM_CTRL_OTP_FIELD_HW_INFO_CFG_OVERRIDE_SCRAMBLE_DIS \
246 (bitfield_field32_t){.mask = UINT8_MAX, .index = CHAR_BIT * 0}
247#define RRAM_CTRL_OTP_FIELD_HW_INFO_CFG_OVERRIDE_ECC_DIS \
248 (bitfield_field32_t){.mask = UINT8_MAX, .index = CHAR_BIT * 1}
256 kRramCtrlSecMmioDataDefaultPermsSet = 1,
257 kRramCtrlSecMmioDataDefaultCfgSet = 1,
258 kRramCtrlSecMmioInfoPermsSet = 1,
259 kRramCtrlSecMmioInfoCfgSet = 1,
260 kRramCtrlSecMmioInfoCfgLock = 1,
261 kRramCtrlSecMmioInfoPageLockdown = 2,
262 kRramCtrlSecMmioExecSet = 1,
264 kRramCtrlSecMmioDataRegionProtect = 2,
265 kRramCtrlSecMmioDataRegionProtectLock = 1,
266 kRramCtrlSecMmioInit = 1,
279void rram_ctrl_init(
void);
284void rram_ctrl_disable(
void);
317void rram_ctrl_status_get(rram_ctrl_status_t *
status);
340} rram_ctrl_error_code_t;
347void rram_ctrl_error_code_get(rram_ctrl_error_code_t *error_code);
358rom_error_t rram_ctrl_data_read(uint32_t addr, uint32_t word_count,
void *data);
370rom_error_t rram_ctrl_info_read(
const rram_ctrl_info_page_t *info_page,
371 uint32_t offset, uint32_t word_count,
385rom_error_t rram_ctrl_info_read_zeros_on_read_error(
386 const rram_ctrl_info_page_t *info_page, uint32_t offset,
387 uint32_t word_count,
void *data);
401rom_error_t rram_ctrl_data_write(uint32_t addr, uint32_t word_count,
414rom_error_t rram_ctrl_info_write(
const rram_ctrl_info_page_t *info_page,
415 uint32_t offset, uint32_t word_count,
451void rram_ctrl_data_default_perms_set(rram_ctrl_perms_t perms);
463void rram_ctrl_info_perms_set(
const rram_ctrl_info_page_t *info_page,
464 rram_ctrl_perms_t perms);
499void rram_ctrl_data_default_cfg_set(rram_ctrl_cfg_t cfg);
506rram_ctrl_cfg_t rram_ctrl_data_default_cfg_get(
void);
516rram_ctrl_cfg_t rram_ctrl_boot_data_cfg_get(
void);
521typedef uint32_t rram_ctrl_region_index_t;
544void rram_ctrl_data_region_protect(rram_ctrl_region_index_t region,
545 uint32_t page_offset, uint32_t num_pages,
546 rram_ctrl_perms_t perms, rram_ctrl_cfg_t cfg,
559void rram_ctrl_info_cfg_set(
const rram_ctrl_info_page_t *info_page,
560 rram_ctrl_cfg_t cfg);
571void rram_ctrl_info_cfg_lock(
const rram_ctrl_info_page_t *info_page);
586void rram_ctrl_info_page_lockdown(
const rram_ctrl_info_page_t *info_page);
602void rram_ctrl_exec_set(uint32_t exec_val);