5#include "sw/device/lib/testing/rram_ctrl_testutils.h"
16#include "sw/device/lib/testing/test_framework/check.h"
20#define MODULE_ID MAKE_MODULE_ID('r', 'c', 't')
25 TRY(dif_rram_ctrl_get_status(rram_state, &
status));
26 }
while (
status.controller_init_done == 0);
30status_t rram_ctrl_testutils_wait_transaction_end(
32 dif_rram_ctrl_output_t output;
35 dif_result = dif_rram_ctrl_end(rram_state, &output);
42 uint32_t error_reg = 0;
43 error_reg = bitfield_bit32_write(error_reg, RRAM_CTRL_ERR_CODE_OP_ERR_BIT,
45 error_reg = bitfield_bit32_write(error_reg, RRAM_CTRL_ERR_CODE_MP_ERR_BIT,
47 error_reg = bitfield_bit32_write(error_reg, RRAM_CTRL_ERR_CODE_RD_ERR_BIT,
49 error_reg = bitfield_bit32_write(error_reg, RRAM_CTRL_ERR_CODE_WR_ERR_BIT,
52 TRY(dif_rram_ctrl_clear_error_codes(rram_state, output.
error_code.
codes));
56status_t rram_ctrl_testutils_data_region_setup_properties(
58 uint32_t data_region, uint32_t region_size,
61 .base = base_page_index,
62 .properties = region_properties,
65 TRY(dif_rram_ctrl_set_data_region_properties(rram_state, data_region,
66 data_region_properties));
67 TRY(dif_rram_ctrl_set_data_region_enablement(rram_state, data_region,
71 dif_rram_ctrl_device_info_t device_info = dif_rram_ctrl_get_device_info();
77status_t rram_ctrl_testutils_data_region_setup(
79 uint32_t data_region, uint32_t region_size, uint32_t *offset) {
81 .ecc_en = kMultiBitBool4True,
82 .wr_en = kMultiBitBool4True,
83 .rd_en = kMultiBitBool4True,
84 .scramble_en = kMultiBitBool4False};
85 return rram_ctrl_testutils_data_region_setup_properties(
86 rram_state, base_page_index, data_region, region_size, region_properties,
90status_t rram_ctrl_testutils_data_region_scrambled_setup(
92 uint32_t data_region, uint32_t region_size, uint32_t *offset) {
94 .ecc_en = kMultiBitBool4True,
95 .wr_en = kMultiBitBool4True,
96 .rd_en = kMultiBitBool4True,
97 .scramble_en = kMultiBitBool4True};
98 return rram_ctrl_testutils_data_region_setup_properties(
99 rram_state, base_page_index, data_region, region_size, region_properties,
103status_t rram_ctrl_testutils_info_region_setup_properties(
108 TRY(dif_rram_ctrl_set_info_region_properties(rram_state, info_region,
110 TRY(dif_rram_ctrl_set_info_region_enablement(rram_state, info_region,
113 if (offset != NULL) {
114 dif_rram_ctrl_device_info_t device_info = dif_rram_ctrl_get_device_info();
120status_t rram_ctrl_testutils_info_region_setup(
123 .ecc_en = kMultiBitBool4True,
124 .wr_en = kMultiBitBool4True,
125 .rd_en = kMultiBitBool4True,
126 .scramble_en = kMultiBitBool4False};
127 return rram_ctrl_testutils_info_region_setup_properties(
128 rram_state, page_id, region_properties, offset);
131status_t rram_ctrl_testutils_info_region_scrambled_setup(
134 .ecc_en = kMultiBitBool4True,
135 .wr_en = kMultiBitBool4True,
136 .rd_en = kMultiBitBool4True,
137 .scramble_en = kMultiBitBool4True};
138 return rram_ctrl_testutils_info_region_setup_properties(
139 rram_state, page_id, region_properties, offset);
142status_t rram_ctrl_testutils_write(
145 uint32_t word_count) {
146 dif_rram_ctrl_transaction_t transaction = {.byte_address = byte_address,
148 .partition_type = partition_type,
150 uint32_t words_written = 0;
151 uint32_t word_address = byte_address /
sizeof(uint32_t);
152 const uint32_t max_words = (uint32_t)RRAM_CTRL_CONTROL_NUM_MASK + 1;
154 while (words_written < word_count) {
155 uint32_t words_remaining = word_count - words_written;
156 uint32_t words_to_write =
157 (words_remaining < max_words) ? words_remaining : max_words;
158 transaction.
byte_address = word_address *
sizeof(uint32_t);
160 TRY(dif_rram_ctrl_start(rram_state, transaction));
161 TRY(dif_rram_ctrl_wr_fifo_push(rram_state, words_to_write,
162 data + words_written));
163 TRY(rram_ctrl_testutils_wait_transaction_end(rram_state));
164 word_address += words_to_write;
165 words_written += words_to_write;
170status_t rram_ctrl_testutils_write_word(
173 dif_rram_ctrl_transaction_t transaction = {.byte_address = byte_address,
175 .partition_type = partition_type,
177 uint32_t word_addr_aligned = byte_address & ~(uintptr_t)0xF;
178 uint32_t word_idx = (byte_address >> 2) % 4;
180 uint32_t data_short[4];
181 CHECK_STATUS_OK(rram_ctrl_testutils_read(rram_state, word_addr_aligned,
182 data_short, partition_type, 4, 0));
183 data_short[word_idx] = *data;
187 TRY(dif_rram_ctrl_start(rram_state, transaction));
188 TRY(dif_rram_ctrl_wr_fifo_push(rram_state, 4, data_short));
189 return rram_ctrl_testutils_wait_transaction_end(rram_state);
193 uint32_t byte_address, uint32_t *data_out,
195 uint32_t word_count, uint32_t delay_micros) {
196 dif_rram_ctrl_transaction_t transaction = {.byte_address = byte_address,
198 .partition_type = partition_type,
199 .word_count = word_count};
202 TRY(dif_rram_ctrl_start(rram_state, transaction));
204 busy_spin_micros(delay_micros);
205 TRY(dif_rram_ctrl_read_fifo_pop(rram_state, word_count, data_out));
206 return rram_ctrl_testutils_wait_transaction_end(rram_state);
209status_t rram_ctrl_testutils_default_region_access(
213 .rd_en = rd_en ? kMultiBitBool4True : kMultiBitBool4False,
214 .wr_en = wr_en ? kMultiBitBool4True : kMultiBitBool4False,
215 .scramble_en = scramble_en ? kMultiBitBool4True : kMultiBitBool4False,
216 .ecc_en = ecc_en ? kMultiBitBool4True : kMultiBitBool4False};
218 TRY(dif_rram_ctrl_set_default_region_properties(rram_state,
219 default_properties));
223status_t rram_ctrl_testutils_log_faults(
225 dif_rram_ctrl_faults_t faults = {.lcmgr_memory_protection_error =
false};
226 TRY(dif_rram_ctrl_get_faults(rram_ctrl, &faults));
227#define LOG_IF_FIELD_SET(_struct, _field) \
228 if (_struct._field != 0) { \
229 LOG_INFO("rram_ctrl fault status has " #_field); \
232 LOG_IF_FIELD_SET(faults, lcmgr_operation_error);
233 LOG_IF_FIELD_SET(faults, lcmgr_memory_protection_error);
234 LOG_IF_FIELD_SET(faults, lcmgr_read_error);
235 LOG_IF_FIELD_SET(faults, lcmgr_write_error);
236#undef LOG_IF_FIELD_SET
241static const char *mubi_prop(multi_bit_bool_t val,
const char *name) {
243 case kMultiBitBool4True:
245 case kMultiBitBool4False:
252void rram_ctrl_testutils_data_region_print(
254 LOG_INFO(
"data region n=%u st=%u sz=%u %s-%s-%s-%s %s", index, p->
base,
264 LOG_INFO(
"info region page=%u %s-%s-%s-%s %s", region.
page,
265 mubi_prop(p->
rd_en,
"RD"), mubi_prop(p->
wr_en,
"WR"),
267 locked ?
"LK" :
"UN");