5 #include "sw/device/silicon_creator/lib/drivers/ast.h"
10 #include "sw/device/lib/base/multibits.h"
11 #include "sw/device/silicon_creator/lib/drivers/flash_ctrl.h"
12 #include "sw/device/silicon_creator/lib/drivers/otp.h"
16 #include "otp_ctrl_regs.h"
17 #include "sensor_ctrl_regs.h"
19 #ifndef OT_PLATFORM_RV32
36 kAstCalibrationDataSizeIn32BitWords =
37 (AST_REGAL_REG_OFFSET +
sizeof(uint32_t)) /
sizeof(uint32_t),
46 kAstCalibrationDataInfoFlashByteOffset =
47 OTP_CTRL_PARAM_DEVICE_ID_SIZE + OTP_CTRL_PARAM_MANUF_STATE_SIZE,
50 rom_error_t ast_check(lifecycle_state_t lc_state) {
54 switch (launder32(lc_state)) {
76 uint32_t en = otp_read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_AST_INIT_EN_OFFSET);
77 if (launder32(en) == kMultiBitBool4False) {
85 rom_error_t res = kErrorAstInitNotDone;
92 "kErrorOk must be equal to kHardenedBoolTrue");
93 res = (rom_error_t)init_done;
102 static bool done_bit_get(
void) {
104 abs_mmio_read32(kBaseSensorCtrl + SENSOR_CTRL_STATUS_REG_OFFSET);
110 "This function expects kHardenedBoolTrue to be 0x739");
139 static rom_error_t load_ast_config_from_flash(uint32_t *ast_data) {
140 flash_ctrl_info_perms_set(&kFlashCtrlInfoPageFactoryId,
142 .read = kMultiBitBool4True,
143 .write = kMultiBitBool4False,
144 .erase = kMultiBitBool4False,
146 flash_ctrl_info_cfg_set(&kFlashCtrlInfoPageFactoryId,
148 .scrambling = kMultiBitBool4False,
149 .ecc = kMultiBitBool4True,
150 .he = kMultiBitBool4False,
152 return flash_ctrl_info_read(&kFlashCtrlInfoPageFactoryId,
153 kAstCalibrationDataInfoFlashByteOffset,
154 kAstCalibrationDataSizeIn32BitWords, ast_data);
157 rom_error_t ast_patch(lifecycle_state_t lc_state) {
158 uint32_t ast_data[kAstCalibrationDataSizeIn32BitWords];
159 HARDENED_RETURN_IF_ERROR(load_ast_config_from_flash(ast_data));
163 if (ast_data[0] == 0 || ast_data[0] == UINT32_MAX) {
164 return ast_check(lc_state);
167 if (ast_data[1] == 0 || ast_data[1] == UINT32_MAX) {
168 return ast_check(lc_state);
171 for (
size_t i = 0; i < kAstCalibrationDataSizeIn32BitWords; ++i) {
172 abs_mmio_write32(kBaseAst + i *
sizeof(uint32_t), ast_data[i]);
175 return ast_check(lc_state);