7 #include "gtest/gtest.h"
9 #include "sw/device/lib/base/mock_mmio.h"
16 namespace dif_dma_test {
35 public testing::WithParamInterface<dif_dma_transaction_t> {};
40 DMA_SRC_ADDR_LO_REG_OFFSET,
41 transaction.source.address & std::numeric_limits<uint32_t>::max());
42 EXPECT_WRITE32(DMA_SRC_ADDR_HI_REG_OFFSET, transaction.source.address >> 32);
44 DMA_DST_ADDR_LO_REG_OFFSET,
45 transaction.destination.address & std::numeric_limits<uint32_t>::max());
46 EXPECT_WRITE32(DMA_DST_ADDR_HI_REG_OFFSET,
47 transaction.destination.address >> 32);
50 DMA_SRC_CONFIG_REG_OFFSET,
52 {DMA_SRC_CONFIG_INCREMENT_BIT, transaction.src_config.increment},
53 {DMA_SRC_CONFIG_WRAP_BIT, transaction.src_config.wrap},
56 DMA_DST_CONFIG_REG_OFFSET,
58 {DMA_DST_CONFIG_INCREMENT_BIT, transaction.dst_config.increment},
59 {DMA_DST_CONFIG_WRAP_BIT, transaction.dst_config.wrap},
63 DMA_ADDR_SPACE_ID_REG_OFFSET,
65 {DMA_ADDR_SPACE_ID_SRC_ASID_OFFSET, transaction.source.asid},
66 {DMA_ADDR_SPACE_ID_DST_ASID_OFFSET, transaction.destination.asid},
69 EXPECT_WRITE32(DMA_CHUNK_DATA_SIZE_REG_OFFSET, transaction.chunk_size);
70 EXPECT_WRITE32(DMA_TOTAL_DATA_SIZE_REG_OFFSET, transaction.total_size);
71 EXPECT_WRITE32(DMA_TRANSFER_WIDTH_REG_OFFSET, transaction.width);
76 INSTANTIATE_TEST_SUITE_P(
77 ConfigureTest, ConfigureTest,
78 testing::ValuesIn(std::vector<dif_dma_transaction_t>{{
83 .address = 0xB05BA84B,
84 .asid = kDifDmaOpentitanInternalBus,
88 .address = 0x721F400F,
89 .asid = kDifDmaOpentitanInternalBus,
105 .width = kDifDmaTransWidth1Byte,
111 .address = 0x34FCA80BC5C5CA67,
112 .asid = kDifDmaSoCSystemBus,
116 .address = 0xD0CF2C50,
117 .asid = kDifDmaSoCControlRegisterBus,
133 .width = kDifDmaTransWidth2Bytes,
139 .address = 0x05BA857F8D9C0838,
140 .asid = kDifDmaSoCControlRegisterBus,
144 .address = 0x32CD872A12225CCE,
145 .asid = kDifDmaSoCSystemBus,
161 .width = kDifDmaTransWidth4Bytes,
167 .address = 0xBFED148856E0555E,
168 .asid = kDifDmaSoCSystemBus,
172 .address = 0x9ECFA11919F684D7,
173 .asid = kDifDmaOpentitanInternalBus,
187 .chunk_size = std::numeric_limits<uint32_t>::max(),
188 .total_size = std::numeric_limits<uint32_t>::max(),
189 .width = kDifDmaTransWidth4Bytes,
195 .address = 0x05BA857F8D9C0838,
196 .asid = kDifDmaSoCControlRegisterBus,
200 .address = 0x32CD872A12225CCE,
201 .asid = kDifDmaSoCSystemBus,
217 .width = kDifDmaTransWidth4Bytes,
223 .address = 0x05BA857F8D9C0838,
224 .asid = kDifDmaSoCControlRegisterBus,
228 .address = 0x32CD872A12225CCE,
229 .asid = kDifDmaSoCSystemBus,
245 .width = kDifDmaTransWidth4Bytes,
249 TEST_F(ConfigureTest, BadArg) {
258 EXPECT_READ32(DMA_CONTROL_REG_OFFSET,
260 {DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT,
true},
262 EXPECT_WRITE32(DMA_CONTROL_REG_OFFSET,
264 {DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT,
true},
270 TEST_F(HandshakeTest, DisableSuccess) {
271 EXPECT_READ32(DMA_CONTROL_REG_OFFSET,
273 {DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT,
true},
275 EXPECT_WRITE32(DMA_CONTROL_REG_OFFSET,
277 {DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT,
false},
283 TEST_F(HandshakeTest, EnableBadArg) {
287 TEST_F(HandshakeTest, DisableBadArg) {
294 public testing::WithParamInterface<dif_dma_transaction_opcode_t> {};
297 dif_dma_transaction_opcode_t opcode = GetParam();
298 EXPECT_READ32(DMA_CONTROL_REG_OFFSET,
299 {{DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT,
true}});
300 EXPECT_WRITE32(DMA_CONTROL_REG_OFFSET,
302 {DMA_CONTROL_OPCODE_OFFSET, opcode},
303 {DMA_CONTROL_INITIAL_TRANSFER_BIT,
true},
304 {DMA_CONTROL_GO_BIT,
true},
305 {DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT,
true},
311 INSTANTIATE_TEST_SUITE_P(
312 StartTest, StartTest,
313 testing::ValuesIn(std::vector<dif_dma_transaction_opcode_t>{{
317 TEST_F(StartTest, BadArg) {
325 enum { kStartAddr = 0xD0CF2C50, kEndAddr = 0xD1CF2C0F };
326 EXPECT_WRITE32(DMA_ENABLED_MEMORY_RANGE_BASE_REG_OFFSET, kStartAddr);
327 EXPECT_WRITE32(DMA_ENABLED_MEMORY_RANGE_LIMIT_REG_OFFSET, kEndAddr);
328 EXPECT_WRITE32(DMA_RANGE_VALID_REG_OFFSET, 1);
334 TEST_F(MemoryRangeTests, GetSuccess) {
335 enum { kAddress = 0x721F400F, kSize = 0xF0000 };
336 EXPECT_READ32(DMA_ENABLED_MEMORY_RANGE_BASE_REG_OFFSET, kAddress);
337 EXPECT_READ32(DMA_ENABLED_MEMORY_RANGE_LIMIT_REG_OFFSET,
338 kAddress + kSize - 1);
340 uint32_t address = 0;
343 EXPECT_EQ(address, kAddress);
344 EXPECT_EQ(size, kSize);
347 TEST_F(MemoryRangeTests, GetBadArg) {
348 uint32_t address = 0;
359 EXPECT_READ32(DMA_CONTROL_REG_OFFSET,
360 {{DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT,
true}});
361 EXPECT_WRITE32(DMA_CONTROL_REG_OFFSET,
363 {DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT,
true},
364 {DMA_CONTROL_ABORT_BIT,
true},
376 EXPECT_WRITE32(DMA_RANGE_REGWEN_REG_OFFSET, kMultiBitBool4False);
381 TEST_F(MemoryRangeLockTest, GetLocked) {
383 EXPECT_READ32(DMA_RANGE_REGWEN_REG_OFFSET, kMultiBitBool4False);
389 TEST_F(MemoryRangeLockTest, SetBadArg) {
393 TEST_F(MemoryRangeLockTest, GetBadArg) {
405 public testing::WithParamInterface<status_reg_t> {};
410 EXPECT_READ32(DMA_STATUS_REG_OFFSET, status_arg.reg);
415 EXPECT_EQ(
status, status_arg.status);
418 INSTANTIATE_TEST_SUITE_P(
419 StatusGetTest, StatusGetTest,
420 testing::ValuesIn(std::vector<status_reg_t>{{
421 {1 << DMA_STATUS_BUSY_BIT, kDifDmaStatusBusy},
422 {1 << DMA_STATUS_DONE_BIT, kDifDmaStatusDone},
423 {1 << DMA_STATUS_ABORTED_BIT, kDifDmaStatusAborted},
424 {1 << DMA_STATUS_ERROR_BIT, kDifDmaStatusError},
425 {1 << DMA_STATUS_SHA2_DIGEST_VALID_BIT, kDifDmaStatusSha2DigestValid},
426 {1 << DMA_STATUS_CHUNK_DONE_BIT, kDifDmaStatusChunkDone},
429 TEST_F(StatusGetTest, GetBadArg) {
436 public testing::WithParamInterface<status_reg_t> {};
441 EXPECT_WRITE32(DMA_STATUS_REG_OFFSET, status_arg.reg);
446 INSTANTIATE_TEST_SUITE_P(
447 StatusWriteTest, StatusWriteTest,
448 testing::ValuesIn(std::vector<status_reg_t>{{
449 {1 << DMA_STATUS_DONE_BIT, kDifDmaStatusDone},
450 {1 << DMA_STATUS_ABORTED_BIT, kDifDmaStatusAborted},
451 {1 << DMA_STATUS_ERROR_BIT, kDifDmaStatusError},
452 {1 << DMA_STATUS_SHA2_DIGEST_VALID_BIT, kDifDmaStatusSha2DigestValid},
453 {1 << DMA_STATUS_CHUNK_DONE_BIT, kDifDmaStatusChunkDone},
456 TEST_F(StatusWriteTest, GetBadArg) {
464 EXPECT_WRITE32(DMA_STATUS_REG_OFFSET,
465 1 << DMA_STATUS_DONE_BIT | 1 << DMA_STATUS_ABORTED_BIT |
466 1 << DMA_STATUS_ERROR_BIT | 1 << DMA_STATUS_ERROR_BIT);
471 TEST_F(StatusClearTest, GetBadArg) {
476 dif_dma_error_code_t error_code;
479 public testing::WithParamInterface<error_code_reg_t> {};
484 EXPECT_READ32(DMA_ERROR_CODE_REG_OFFSET, error_code_arg.reg);
486 dif_dma_error_code error_code;
489 EXPECT_EQ(error_code, error_code_arg.error_code);
492 INSTANTIATE_TEST_SUITE_P(
493 ErrorTest, ErrorTest,
494 testing::ValuesIn(std::vector<error_code_reg_t>{{
495 {1 << DMA_ERROR_CODE_SRC_ADDR_ERROR_BIT, kDifDmaErrorSourceAddress},
496 {1 << DMA_ERROR_CODE_DST_ADDR_ERROR_BIT,
497 kDifDmaErrorDestinationAddress},
498 {1 << DMA_ERROR_CODE_OPCODE_ERROR_BIT, kDifDmaErrorOpcode},
499 {1 << DMA_ERROR_CODE_SIZE_ERROR_BIT, kDifDmaErrorSize},
500 {1 << DMA_ERROR_CODE_BUS_ERROR_BIT, kDifDmaErrorBus},
501 {1 << DMA_ERROR_CODE_BASE_LIMIT_ERROR_BIT,
502 kDifDmaErrorEnableMemoryConfig},
503 {1 << DMA_ERROR_CODE_RANGE_VALID_ERROR_BIT, kDifDmaErrorRangeValid},
504 {1 << DMA_ERROR_CODE_ASID_ERROR_BIT, kDifDmaErrorInvalidAsid},
507 TEST_F(ErrorTest, GetErrorBadArg) {
508 dif_dma_error_code_t dummy;
515 dif_dma_status_code_t
status;
519 public testing::WithParamInterface<status_poll_reg_t> {};
524 EXPECT_READ32(DMA_STATUS_REG_OFFSET, 0);
525 EXPECT_READ32(DMA_STATUS_REG_OFFSET, 0);
526 EXPECT_READ32(DMA_STATUS_REG_OFFSET, 0);
527 EXPECT_READ32(DMA_STATUS_REG_OFFSET, status_arg.reg);
532 INSTANTIATE_TEST_SUITE_P(
533 StatusPollTest, StatusPollTest,
534 testing::ValuesIn(std::vector<status_poll_reg_t>{{
535 {1 << DMA_STATUS_BUSY_BIT, kDifDmaStatusBusy},
536 {1 << DMA_STATUS_DONE_BIT, kDifDmaStatusDone},
537 {1 << DMA_STATUS_ABORTED_BIT, kDifDmaStatusAborted},
538 {1 << DMA_STATUS_ERROR_BIT, kDifDmaStatusError},
539 {1 << DMA_STATUS_SHA2_DIGEST_VALID_BIT, kDifDmaStatusSha2DigestValid},
542 TEST_F(StatusPollTest, BadArg) {
551 EXPECT_EQ(digest_len, 8);
554 EXPECT_EQ(digest_len, 12);
557 EXPECT_EQ(digest_len, 16);
560 TEST_F(GetDigestLenTest, BadArg) {
567 dif_dma_transaction_opcode_t opcode;
568 uint32_t num_digest_regs;
572 public testing::WithParamInterface<digest_reg_t> {};
576 uint32_t digest[16] = {0};
578 for (uint32_t i = 0; i < digest_arg.num_digest_regs; ++i) {
579 EXPECT_READ32(DMA_SHA2_DIGEST_0_REG_OFFSET +
580 (ptrdiff_t)i * (ptrdiff_t)
sizeof(uint32_t),
586 for (uint32_t i = 0; i < 16; ++i) {
587 if (i < digest_arg.num_digest_regs) {
588 EXPECT_EQ(digest[i], i * 1024 + i);
590 EXPECT_EQ(digest[i], 0);
595 INSTANTIATE_TEST_SUITE_P(GetDigestTest, GetDigestTest,
596 testing::ValuesIn(std::vector<digest_reg_t>{{
597 {kDifDmaSha256Opcode, 8},
598 {kDifDmaSha384Opcode, 12},
599 {kDifDmaSha512Opcode, 16},
602 TEST_F(GetDigestTest, BadArg) {
615 EXPECT_WRITE32(DMA_HANDSHAKE_INTR_ENABLE_REG_OFFSET, 0x3);
620 TEST_F(HandshakeEnableIrqTest, BadArg) {
628 EXPECT_WRITE32(DMA_CLEAR_INTR_SRC_REG_OFFSET, 0x3);
633 TEST_F(HandshakeClearIrqTest, BadArg) {
641 EXPECT_WRITE32(DMA_CLEAR_INTR_BUS_REG_OFFSET, 0x2);
646 TEST_F(HandshakeClearBusTest, BadArg) {
657 public testing::WithParamInterface<dma_clear_irq_reg_t> {};
662 EXPECT_WRITE32(clear_irq_reg.reg, 0x123456);
667 INSTANTIATE_TEST_SUITE_P(
668 HandshakeClearAddressTest, HandshakeClearAddressTest,
669 testing::ValuesIn(std::vector<dma_clear_irq_reg_t>{{
670 {DMA_INTR_SRC_ADDR_0_REG_OFFSET, kDifDmaIntrClearIdx0},
671 {DMA_INTR_SRC_ADDR_1_REG_OFFSET, kDifDmaIntrClearIdx1},
672 {DMA_INTR_SRC_ADDR_2_REG_OFFSET, kDifDmaIntrClearIdx2},
673 {DMA_INTR_SRC_ADDR_3_REG_OFFSET, kDifDmaIntrClearIdx3},
674 {DMA_INTR_SRC_ADDR_4_REG_OFFSET, kDifDmaIntrClearIdx4},
675 {DMA_INTR_SRC_ADDR_5_REG_OFFSET, kDifDmaIntrClearIdx5},
676 {DMA_INTR_SRC_ADDR_6_REG_OFFSET, kDifDmaIntrClearIdx6},
677 {DMA_INTR_SRC_ADDR_7_REG_OFFSET, kDifDmaIntrClearIdx7},
678 {DMA_INTR_SRC_ADDR_8_REG_OFFSET, kDifDmaIntrClearIdx8},
679 {DMA_INTR_SRC_ADDR_9_REG_OFFSET, kDifDmaIntrClearIdx9},
680 {DMA_INTR_SRC_ADDR_10_REG_OFFSET, kDifDmaIntrClearIdx10},
683 TEST_F(HandshakeClearAddressTest, BadArg) {
690 public testing::WithParamInterface<dma_clear_irq_reg_t> {};
695 EXPECT_WRITE32(clear_irq_reg.reg, 0x123456);
700 INSTANTIATE_TEST_SUITE_P(
701 HandshakeClearValueTest, HandshakeClearValueTest,
702 testing::ValuesIn(std::vector<dma_clear_irq_reg_t>{{
703 {DMA_INTR_SRC_WR_VAL_0_REG_OFFSET, kDifDmaIntrClearIdx0},
704 {DMA_INTR_SRC_WR_VAL_1_REG_OFFSET, kDifDmaIntrClearIdx1},
705 {DMA_INTR_SRC_WR_VAL_2_REG_OFFSET, kDifDmaIntrClearIdx2},
706 {DMA_INTR_SRC_WR_VAL_3_REG_OFFSET, kDifDmaIntrClearIdx3},
707 {DMA_INTR_SRC_WR_VAL_4_REG_OFFSET, kDifDmaIntrClearIdx4},
708 {DMA_INTR_SRC_WR_VAL_5_REG_OFFSET, kDifDmaIntrClearIdx5},
709 {DMA_INTR_SRC_WR_VAL_6_REG_OFFSET, kDifDmaIntrClearIdx6},
710 {DMA_INTR_SRC_WR_VAL_7_REG_OFFSET, kDifDmaIntrClearIdx7},
711 {DMA_INTR_SRC_WR_VAL_8_REG_OFFSET, kDifDmaIntrClearIdx8},
712 {DMA_INTR_SRC_WR_VAL_9_REG_OFFSET, kDifDmaIntrClearIdx9},
713 {DMA_INTR_SRC_WR_VAL_10_REG_OFFSET, kDifDmaIntrClearIdx10},
716 TEST_F(HandshakeClearValueTest, BadArg) {