6 #include "dt/dt_pinmux.h"
7 #include "dt/dt_rv_core_ibex.h"
8 #include "dt/dt_rv_plic.h"
9 #include "dt/dt_spi_host.h"
17 #include "sw/device/lib/runtime/irq.h"
19 #include "sw/device/lib/testing/dma_testutils.h"
20 #include "sw/device/lib/testing/pinmux_testutils.h"
21 #include "sw/device/lib/testing/rand_testutils.h"
22 #include "sw/device/lib/testing/rv_core_ibex_testutils.h"
23 #include "sw/device/lib/testing/test_framework/check.h"
25 #include "sw/device/lib/testing/test_framework/status.h"
30 #define CHUNK_SIZE 32 * 4
32 OTTF_DEFINE_TEST_CONFIG();
35 kHart = kTopDarjeelingPlicTargetIbex0,
36 kIrqVoid = UINT32_MAX,
39 dif_dma_transaction_width_t dma_transfer_widths[] = {
40 kDifDmaTransWidth1Byte, kDifDmaTransWidth2Bytes, kDifDmaTransWidth4Bytes};
43 static volatile const uint32_t kShaDigestExpData[16];
44 static volatile const uint8_t kShaMode;
46 uint32_t digest[16], digest_2[16];
47 uint8_t received_data[TX_SIZE] __attribute__((aligned(4)));
48 uint8_t target_ot_internal_data[TX_SIZE] __attribute__((aligned(4)));
49 uint8_t target_ctn_data[TX_SIZE] __attribute__((aligned(4)))
50 __attribute__((section(".ctn_data")));
51 static volatile
bool is_finished;
53 static dif_spi_host_t spi_host;
54 static dif_pinmux_t pinmux;
56 static dif_rv_core_ibex_t rv_core_ibex;
57 static dif_rv_plic_t rv_plic;
64 static
void init_interrupts(
void) {
65 irq_global_ctrl(
false);
66 irq_external_ctrl(
false);
90 irq_external_ctrl(
true);
91 irq_global_ctrl(
true);
102 static status_t external_isr(
void) {
103 dif_dma_irq_t dma_irq_id;
105 top_darjeeling_plic_peripheral_t peripheral;
113 CHECK(plic_irq_id >= kTopDarjeelingPlicIrqIdDmaDmaDone &&
114 plic_irq_id <= kTopDarjeelingPlicIrqIdDmaDmaError,
115 "got an irq from a plic_peripheral that is not a DMA!");
117 peripheral = (top_darjeeling_plic_peripheral_t)
118 top_darjeeling_plic_interrupt_for_peripheral[plic_irq_id];
121 kTopDarjeelingPlicIrqIdDmaDmaDone;
123 if (peripheral != kTopDarjeelingPlicPeripheralDma) {
124 CHECK(
false,
"Invalid plic_irq_id that from a DMA!");
127 dma_irq_id = (dif_dma_irq_t)(plic_irq_id - plic_periph_base_irq_id);
130 if (dma_irq_id == kDifDmaIrqDmaDone) {
137 CHECK(
false,
"Invalid dma_irq_id: %d", dma_irq_id);
148 CHECK_DIF_OK(dif_dma_irq_acknowledge(&dma, dma_irq_id));
159 static volatile status_t isr_result;
161 void ottf_external_isr(
void) {
163 if (status_ok(isr_result)) {
170 CHECK_DIF_OK(dif_pinmux_init_from_dt(kDtPinmuxAon, &pinmux));
171 pinmux_testutils_init(&pinmux);
174 CHECK_DIF_OK(dif_dma_init_from_dt(kDtDma, &dma));
177 CHECK_DIF_OK(dif_rv_core_ibex_init_from_dt(kDtRvCoreIbex, &rv_core_ibex));
178 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kDtRvPlic, &rv_plic));
181 setup_pads_spi_host0(&pinmux);
184 CHECK_DIF_OK(dif_spi_host_init_from_dt((dt_spi_host_t)0, &spi_host));
191 LOG_INFO(
"spi host configuration complete");
197 setup_spi_dma_transaction(&spi_host, &dma, &received_data[0], CHUNK_SIZE,
204 ATOMIC_WAIT_FOR_INTERRUPT(is_finished);
206 dif_dma_status_code_t
status;
209 CHECK((
status & kDifDmaStatusDone) == kDifDmaStatusDone,
210 "DMA status done not asserted");
211 CHECK((
status & kDifDmaStatusSha2DigestValid) == kDifDmaStatusSha2DigestValid,
212 "DMA status digest valid not asserted");
218 dif_dma_transaction_width_t transfer_width =
219 dma_transfer_widths[rand_testutils_gen32_range(
231 .address = (uint32_t)&target_ot_internal_data[0],
232 .asid = kDifDmaOpentitanInternalBus};
236 .address = (uint32_t)&target_ctn_data[0],
237 .asid = kDifDmaSoCControlRegisterBus};
242 CHECK_ARRAYS_EQ((uint8_t *)digest, (uint8_t *)kShaDigestExpData, digest_len);
245 .source = {.address = (uint32_t)&received_data[0],
246 .asid = kDifDmaOpentitanInternalBus},
247 .destination = dest_transaction_address,
248 .src_config = {.wrap =
false, .increment =
true},
249 .dst_config = {.wrap =
false, .increment =
true},
250 .total_size = TX_SIZE,
251 .chunk_size = TX_SIZE,
252 .width = transfer_width};
261 CHECK_ARRAYS_EQ((uint8_t *)received_data,
262 (uint8_t *)dest_transaction_address.address, TX_SIZE);