10 #include "sw/device/lib/testing/test_framework/check.h"
12 #include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
17 kSramCtrlTestDataSizeWords = 3,
18 kSramCtrlTestDataSizeBytes = kSramCtrlTestDataSizeWords * 4,
21 OTTF_DEFINE_TEST_CONFIG();
27 static const uint32_t kRandomData[kSramCtrlTestDataSizeWords] = {
28 0x6b4abfae, 0x63bdb6e7, 0x87f99b1a};
34 static volatile uint32_t sram_main_buffer[kSramCtrlTestDataSizeWords];
40 kSramCtrlTestDataSizeBytes);
43 for (uint32_t i = 0; i < kSramCtrlTestDataSizeBytes; ++i) {
44 uint8_t expected = ((
volatile uint8_t *)kRandomData)[i];
45 uint8_t got = ((
volatile uint8_t *)region.base)[i];
46 CHECK(expected == got,
47 "byte %d read back incorrectly: expected %02x, got %02x", i, expected,
52 for (uint32_t i = 0; i < kSramCtrlTestDataSizeBytes - 1; ++i) {
53 uint16_t expected = *(
volatile uint16_t *)((uint8_t *)kRandomData + i);
54 uint16_t got = *(
volatile uint16_t *)((uint8_t *)region.base + i);
55 CHECK(expected == got,
56 "uint16_t %d read back incorrectly: expected %04x, got %04x", i,
61 for (uint32_t i = 0; i < kSramCtrlTestDataSizeBytes - 3; ++i) {
62 uint32_t expected = *(
volatile uint32_t *)((uint8_t *)kRandomData + i);
63 uint32_t got = *(
volatile uint32_t *)((uint8_t *)region.base + i);
64 CHECK(expected == got,
65 "uint32_t %d read back incorrectly: expected %08x, got %08x", i,
70 for (uint32_t i = 0; i < kSramCtrlTestDataSizeBytes - 7; ++i) {
71 uint64_t expected = *(
volatile uint64_t *)((uint8_t *)kRandomData + i);
72 uint64_t got = *(
volatile uint64_t *)((uint8_t *)region.base + i);
73 CHECK(expected == got,
74 "uint64_t %d read back incorrectly: expected %08x%08x, got %08x%08x",
75 i, (uint32_t)(expected >> 32), (uint32_t)expected,
76 (uint32_t)(got >> 32), (uint32_t)got);
82 for (uint32_t i = 0; i < kSramCtrlTestDataSizeWords; ++i) {
83 mmio_region_write32(region, (ptrdiff_t)i, 0);
89 static void check_sram_contents(
mmio_region_t region, uint32_t offset,
91 for (uint32_t i = 0; i < len; ++i) {
92 uint8_t expected = ((uint8_t *)kRandomData)[offset + i];
93 uint8_t got = mmio_region_read8(region, (ptrdiff_t)(offset + i));
94 CHECK(expected == got,
"byte %d did not match: expected %02x, got %02x",
95 offset + i, expected, got);
103 for (uint32_t i = 0; i < kSramCtrlTestDataSizeBytes; ++i) {
104 clear_sram_region(region);
105 ((
volatile uint8_t *)region.base)[i] = ((uint8_t *)kRandomData)[i];
106 check_sram_contents(region, i, 1);
110 for (uint32_t i = 0; i < kSramCtrlTestDataSizeBytes - 1; ++i) {
111 clear_sram_region(region);
112 *(
volatile uint16_t *)((uint8_t *)region.base + i) =
113 *(uint16_t *)((uint8_t *)kRandomData + i);
114 check_sram_contents(region, i, 2);
118 for (uint32_t i = 0; i < kSramCtrlTestDataSizeBytes - 3; ++i) {
119 clear_sram_region(region);
120 *(
volatile uint32_t *)((uint8_t *)region.base + i) =
121 *(uint32_t *)((uint8_t *)kRandomData + i);
122 check_sram_contents(region, i, 4);
126 for (uint32_t i = 0; i < kSramCtrlTestDataSizeBytes - 7; ++i) {
127 clear_sram_region(region);
128 *(
volatile uint64_t *)((uint8_t *)region.base + i) =
129 *(uint64_t *)((uint8_t *)kRandomData + i);
130 check_sram_contents(region, i, 8);
136 dif_sram_ctrl_t sram_ctrl_main;
137 dif_sram_ctrl_t sram_ctrl_ret;
138 CHECK_DIF_OK(dif_sram_ctrl_init(
141 CHECK_DIF_OK(dif_sram_ctrl_init(
152 CHECK((status_main & kStatusRegMask) == 0x0,
153 "SRAM main status error bits set, status = %08x.", status_main);
154 CHECK((status_ret & kStatusRegMask) == 0x0,
155 "SRAM ret status error bits set, status = %08x.", status_ret);
159 uintptr_t sram_main_buffer_addr = (uintptr_t)&sram_main_buffer;
162 uintptr_t sram_ret_buffer_addr =
172 LOG_INFO(
"Checking subword reads on SRAM_RET");
173 read_subwords_check(sram_region_ret_base_addr);
174 LOG_INFO(
"Checking subword reads on SRAM_MAIN");
175 read_subwords_check(sram_region_main_addr);
178 LOG_INFO(
"Checking subword writes on SRAM_RET");
179 write_subwords_check(sram_region_ret_base_addr);
180 LOG_INFO(
"Checking subword writes on SRAM_MAIN");
181 write_subwords_check(sram_region_main_addr);