5 #include "sw/device/silicon_creator/manuf/lib/individualize_sw_cfg.h"
13 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
14 #include "sw/device/lib/testing/otp_ctrl_testutils.h"
15 #include "sw/device/silicon_creator/manuf/lib/flash_info_fields.h"
16 #include "sw/device/silicon_creator/manuf/lib/otp_img_types.h"
17 #include "sw/device/silicon_creator/manuf/lib/util.h"
19 #include "flash_ctrl_regs.h"
21 #include "otp_ctrl_regs.h"
24 kValidAstCfgOtpAddrLow = OTP_CTRL_PARAM_CREATOR_SW_CFG_AST_CFG_OFFSET,
25 kInvalidAstCfgOtpAddrHigh =
26 kValidAstCfgOtpAddrLow + OTP_CTRL_PARAM_CREATOR_SW_CFG_AST_CFG_SIZE,
31 flash_info_page_buf[FLASH_CTRL_PARAM_BYTES_PER_PAGE /
sizeof(uint32_t)];
47 static status_t otp_img_write(
const dif_otp_ctrl_t *otp,
50 for (
size_t i = 0; i < len; ++i) {
81 OTP_CTRL_PARAM_CREATOR_SW_CFG_FLASH_DATA_DEFAULT_CFG_OFFSET ||
82 kv[i].offset == OTP_CTRL_PARAM_CREATOR_SW_CFG_MANUF_STATE_OFFSET ||
84 OTP_CTRL_PARAM_CREATOR_SW_CFG_IMMUTABLE_ROM_EXT_EN_OFFSET ||
85 kv[i].offset == OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_BOOTSTRAP_DIS_OFFSET ||
86 (kv[i].offset >= kValidAstCfgOtpAddrLow &&
87 kv[i].offset < kInvalidAstCfgOtpAddrHigh)) {
93 case kOptValTypeUint32Buff:
94 TRY(otp_ctrl_testutils_dai_write32(otp, partition, offset,
95 kv[i].value32, kv[i].num_values));
97 case kOptValTypeUint64Buff:
98 TRY(otp_ctrl_testutils_dai_write64(otp, partition, offset,
99 kv[i].value64, kv[i].num_values));
101 case kOptValTypeUint64Rnd:
102 return UNIMPLEMENTED();
121 uint32_t field_offset,
123 uint32_t relative_addr;
125 switch (field_offset) {
126 case OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_BOOTSTRAP_DIS_OFFSET:
127 memcpy(buffer + relative_addr, &kOwnerSwCfgRomBootstrapDisValue,
130 case OTP_CTRL_PARAM_CREATOR_SW_CFG_MANUF_STATE_OFFSET:
131 memcpy(buffer + relative_addr, &kCreatorSwCfgManufStateValue,
134 case OTP_CTRL_PARAM_CREATOR_SW_CFG_IMMUTABLE_ROM_EXT_EN_OFFSET:
135 memcpy(buffer + relative_addr, &kCreatorSwCfgImmutableRomExtEnValue,
156 static status_t lock_otp_partition(
const dif_otp_ctrl_t *otp_ctrl,
159 uint32_t digest[kSha256DigestWords];
164 TRY(manuf_util_hash_otp_partition(otp_ctrl, partition, otp_partition_digest));
170 uint64_t partition_digest_lowest_64bits = __builtin_bswap32(digest[6]);
171 partition_digest_lowest_64bits =
172 (partition_digest_lowest_64bits << 32) | __builtin_bswap32(digest[7]);
174 TRY(otp_ctrl_testutils_lock_partition(
175 otp_ctrl, partition, partition_digest_lowest_64bits));
180 static status_t manuf_individualize_device_ast_cfg(
183 memset(flash_info_page_buf, UINT8_MAX, FLASH_CTRL_PARAM_BYTES_PER_PAGE);
187 uint32_t page_byte_address = 0;
188 TRY(flash_ctrl_testutils_info_region_setup_properties(
189 flash_state, kFlashInfoFieldAstCalibrationData.page,
190 kFlashInfoFieldAstCalibrationData.bank,
191 kFlashInfoFieldAstCalibrationData.partition,
193 .ecc_en = kMultiBitBool4True,
194 .high_endurance_en = kMultiBitBool4False,
195 .erase_en = kMultiBitBool4True,
196 .prog_en = kMultiBitBool4True,
197 .rd_en = kMultiBitBool4True,
198 .scramble_en = kMultiBitBool4False},
199 &page_byte_address));
200 TRY(flash_ctrl_testutils_read(
201 flash_state, page_byte_address,
202 kFlashInfoFieldAstCalibrationData.partition, flash_info_page_buf,
203 kDifFlashCtrlPartitionTypeInfo,
204 FLASH_CTRL_PARAM_BYTES_PER_PAGE /
sizeof(uint32_t),
208 size_t ast_cfg_offset =
209 kFlashInfoFieldAstCalibrationData.byte_offset /
sizeof(uint32_t);
210 for (
size_t i = 0; i < kFlashInfoAstCalibrationDataSizeIn32BitWords; ++i) {
212 OTP_CTRL_PARAM_CREATOR_SW_CFG_AST_CFG_OFFSET + i *
sizeof(uint32_t);
213 uint32_t data = flash_info_page_buf[ast_cfg_offset + i];
214 uint32_t relative_addr;
216 if (addr < kValidAstCfgOtpAddrLow || addr >= kInvalidAstCfgOtpAddrHigh) {
217 return OUT_OF_RANGE();
221 TRY(otp_ctrl_testutils_dai_write32(otp_ctrl,
223 relative_addr, &data, 1));
224 flash_info_page_buf[ast_cfg_offset + i] =
230 TRY(flash_ctrl_testutils_erase_page(
231 flash_state, page_byte_address,
232 kFlashInfoFieldAstCalibrationData.partition,
233 kDifFlashCtrlPartitionTypeInfo));
234 TRY(flash_ctrl_testutils_write(
235 flash_state, page_byte_address,
236 kFlashInfoFieldAstCalibrationData.partition, flash_info_page_buf,
237 kDifFlashCtrlPartitionTypeInfo,
238 FLASH_CTRL_PARAM_BYTES_PER_PAGE /
sizeof(uint32_t)));
243 status_t manuf_individualize_device_creator_sw_cfg(
246 kOtpKvCreatorSwCfg, kOtpKvCreatorSwCfgSize));
247 TRY(manuf_individualize_device_ast_cfg(otp_ctrl, flash_state));
251 status_t manuf_individualize_device_field_cfg(
const dif_otp_ctrl_t *otp_ctrl,
252 uint32_t field_offset) {
253 uint32_t relative_addr;
254 const uint32_t *field_value_addr;
256 switch (field_offset) {
257 case OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_BOOTSTRAP_DIS_OFFSET:
258 field_value_addr = &kOwnerSwCfgRomBootstrapDisValue;
261 case OTP_CTRL_PARAM_CREATOR_SW_CFG_FLASH_DATA_DEFAULT_CFG_OFFSET:
262 field_value_addr = &kCreatorSwCfgFlashDataDefaultCfgValue;
265 case OTP_CTRL_PARAM_CREATOR_SW_CFG_IMMUTABLE_ROM_EXT_EN_OFFSET:
266 field_value_addr = &kCreatorSwCfgImmutableRomExtEnValue;
269 case OTP_CTRL_PARAM_CREATOR_SW_CFG_MANUF_STATE_OFFSET:
270 field_value_addr = &kCreatorSwCfgManufStateValue;
278 TRY(otp_ctrl_testutils_dai_write32(otp_ctrl, partition, relative_addr,
279 field_value_addr, 1));
284 status_t manuf_individualize_device_flash_data_default_cfg_check(
285 const dif_otp_ctrl_t *otp_ctrl) {
289 OTP_CTRL_PARAM_CREATOR_SW_CFG_FLASH_DATA_DEFAULT_CFG_OFFSET, &offset));
293 bool is_provisioned = (val == kCreatorSwCfgFlashDataDefaultCfgValue);
294 return is_provisioned ? OK_STATUS() : INTERNAL();
297 status_t manuf_individualize_device_creator_sw_cfg_lock(
298 const dif_otp_ctrl_t *otp_ctrl) {
303 status_t manuf_individualize_device_creator_sw_cfg_check(
304 const dif_otp_ctrl_t *otp_ctrl) {
308 return is_locked ? OK_STATUS() : INTERNAL();
311 status_t manuf_individualize_device_owner_sw_cfg(
312 const dif_otp_ctrl_t *otp_ctrl) {
314 kOtpKvOwnerSwCfgSize));
318 status_t manuf_individualize_device_partition_expected_read(
322 TRY(otp_img_expected_value_read(
323 partition, OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_BOOTSTRAP_DIS_OFFSET,
327 TRY(otp_img_expected_value_read(
328 partition, OTP_CTRL_PARAM_CREATOR_SW_CFG_MANUF_STATE_OFFSET, buffer));
329 TRY(otp_img_expected_value_read(
330 partition, OTP_CTRL_PARAM_CREATOR_SW_CFG_IMMUTABLE_ROM_EXT_EN_OFFSET,
340 status_t manuf_individualize_device_owner_sw_cfg_lock(
341 const dif_otp_ctrl_t *otp_ctrl) {
346 status_t manuf_individualize_device_owner_sw_cfg_check(
347 const dif_otp_ctrl_t *otp_ctrl) {
351 return is_locked ? OK_STATUS() : INTERNAL();
354 status_t manuf_individualize_device_rot_creator_auth_codesign(
355 const dif_otp_ctrl_t *otp_ctrl) {
356 TRY(otp_img_write(otp_ctrl, kDifOtpCtrlPartitionRotCreatorAuthCodesign,
357 kOtpKvRotCreatorAuthCodesign,
358 kOtpKvRotCreatorAuthCodesignSize));
359 TRY(lock_otp_partition(otp_ctrl, kDifOtpCtrlPartitionRotCreatorAuthCodesign));
363 status_t manuf_individualize_device_rot_creator_auth_state(
364 const dif_otp_ctrl_t *otp_ctrl) {
365 TRY(otp_img_write(otp_ctrl, kDifOtpCtrlPartitionRotCreatorAuthState,
366 kOtpKvRotCreatorAuthState, kOtpKvRotCreatorAuthStateSize));
367 TRY(lock_otp_partition(otp_ctrl, kDifOtpCtrlPartitionRotCreatorAuthState));
371 status_t manuf_individualize_device_rot_creator_auth_codesign_check(
372 const dif_otp_ctrl_t *otp_ctrl) {
375 otp_ctrl, kDifOtpCtrlPartitionRotCreatorAuthCodesign, &is_locked));
376 return is_locked ? OK_STATUS() : INTERNAL();
379 status_t manuf_individualize_device_rot_creator_auth_state_check(
380 const dif_otp_ctrl_t *otp_ctrl) {
383 otp_ctrl, kDifOtpCtrlPartitionRotCreatorAuthState, &is_locked));
384 return is_locked ? OK_STATUS() : INTERNAL();