Software APIs
sram_cp_provision_functest.c
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #include <stdint.h>
6 
13 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
14 #include "sw/device/lib/testing/json/provisioning_data.h"
15 #include "sw/device/lib/testing/lc_ctrl_testutils.h"
16 #include "sw/device/lib/testing/otp_ctrl_testutils.h"
17 #include "sw/device/lib/testing/pinmux_testutils.h"
18 #include "sw/device/lib/testing/test_framework/check.h"
19 #include "sw/device/lib/testing/test_framework/ottf_console.h"
20 #include "sw/device/lib/testing/test_framework/ottf_test_config.h"
21 #include "sw/device/lib/testing/test_framework/ujson_ottf.h"
22 #include "sw/device/silicon_creator/manuf/base/flash_info_permissions.h"
23 #include "sw/device/silicon_creator/manuf/lib/flash_info_fields.h"
24 #include "sw/device/silicon_creator/manuf/lib/individualize.h"
25 #include "sw/device/silicon_creator/manuf/lib/otp_fields.h"
26 
28 #include "otp_ctrl_regs.h" // Generated.
29 
30 OTTF_DEFINE_TEST_CONFIG(.console.type = kOttfConsoleSpiDevice,
31  .console.base_addr = TOP_EARLGREY_SPI_DEVICE_BASE_ADDR,
32  .console.test_may_clobber = false, );
33 
34 static dif_otp_ctrl_t otp_ctrl;
35 static dif_pinmux_t pinmux;
36 static dif_flash_ctrl_state_t flash_ctrl_state;
37 static dif_lc_ctrl_t lc_ctrl;
38 
39 /**
40  * Initializes all DIF handles used in this SRAM program.
41  */
42 static status_t peripheral_handles_init(void) {
44  &flash_ctrl_state,
46  TRY(dif_lc_ctrl_init(
48  TRY(dif_otp_ctrl_init(
51  &pinmux));
52  return OK_STATUS();
53 }
54 
55 static status_t check_device_id_and_manuf_state(
56  manuf_cp_provisioning_data_t *expected_data) {
57  LOG_INFO("Checking expected DeviceId and ManufState data ...");
58  // Configure flash info page 0 permissions.
59  uint32_t byte_address = 0;
60  uint32_t actual_device_id[kHwCfgDeviceIdSizeIn32BitWords] = {0};
61  uint32_t actual_manuf_state[kHwCfgManufStateSizeIn32BitWords] = {0};
62  TRY(flash_ctrl_testutils_info_region_setup_properties(
63  &flash_ctrl_state, kFlashInfoFieldDeviceId.page,
64  kFlashInfoFieldDeviceId.bank, kFlashInfoFieldDeviceId.partition,
65  kFlashInfoPage0Permissions, &byte_address));
66 
67  // Read and check device_id.
68  TRY(flash_ctrl_testutils_read(
69  &flash_ctrl_state, byte_address, kFlashInfoFieldDeviceId.partition,
70  actual_device_id, kDifFlashCtrlPartitionTypeInfo,
71  kHwCfgDeviceIdSizeIn32BitWords,
72  /*delay_micros=*/0));
73  CHECK_ARRAYS_EQ(actual_device_id, expected_data->device_id,
74  kHwCfgDeviceIdSizeIn32BitWords);
75 
76  // Read and check manuf_state (on same page as device_id).
77  TRY(flash_ctrl_testutils_read(
78  &flash_ctrl_state, byte_address + kFlashInfoFieldManufState.byte_offset,
79  kFlashInfoFieldManufState.partition, actual_manuf_state,
80  kDifFlashCtrlPartitionTypeInfo, kHwCfgManufStateSizeIn32BitWords,
81  /*delay_micros=*/0));
82  CHECK_ARRAYS_EQ(actual_manuf_state, expected_data->manuf_state,
83  kHwCfgManufStateSizeIn32BitWords);
84 
85  return OK_STATUS();
86 }
87 
88 bool test_main(void) {
89  CHECK_STATUS_OK(peripheral_handles_init());
90  pinmux_testutils_init(&pinmux);
91  ottf_console_init();
92  ujson_t uj = ujson_ottf_console();
93 
94  // Check we are in in TEST_UNLOCKED1.
95  CHECK_STATUS_OK(
96  lc_ctrl_testutils_check_lc_state(&lc_ctrl, kDifLcCtrlStateTestUnlocked1));
97 
98  LOG_INFO("Waiting for expected CP provisioning data ...");
99 
100  // Get expected provisioning data over console.
101  manuf_cp_provisioning_data_t expected_data;
102  CHECK_STATUS_OK(
103  ujson_deserialize_manuf_cp_provisioning_data_t(&uj, &expected_data));
104 
105  // Read and check device_id and manuf_state fields from flash info page 0.
106  CHECK_STATUS_OK(check_device_id_and_manuf_state(&expected_data));
107 
108  // Note: we cannot read/check the wafer_auth_secret field in flash info page
109  // 3, as this page is not readable in the TEST_UNLOCKED* states.
110 
111  // Check the secret0 partition has been provisioned / locked.
112  CHECK_STATUS_OK(manuf_individualize_device_secret0_check(&otp_ctrl));
113 
114  LOG_INFO("Checks complete. Success");
115 
116  return true;
117 }