Software APIs
dif_dma_unittest.cc
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 
6 
7 #include "gtest/gtest.h"
9 #include "sw/device/lib/base/mock_mmio.h"
11 
12 extern "C" {
13 #include "dma_regs.h" // Generated.
14 } // extern "C"
15 
16 namespace dif_dma_test {
19 using testing::Test;
20 
21 // Base class for the rest fixtures in this file.
22 class DmaTest : public testing::Test, public mock_mmio::MmioTest {};
23 
24 // Base class for the rest of the tests in this file, provides a
25 // `dif_dma_t` instance.
26 class DmaTestInitialized : public DmaTest {
27  protected:
28  dif_dma_t dma_;
29 
30  DmaTestInitialized() { EXPECT_DIF_OK(dif_dma_init(dev().region(), &dma_)); }
31 };
32 
34  : public DmaTestInitialized,
35  public testing::WithParamInterface<dif_dma_transaction_t> {};
36 
37 TEST_P(ConfigureTest, Success) {
38  dif_dma_transaction_t transaction = GetParam();
39  EXPECT_WRITE32(
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);
43  EXPECT_WRITE32(
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);
48 
49  EXPECT_WRITE32(
50  DMA_SRC_CONFIG_REG_OFFSET,
51  {
52  {DMA_SRC_CONFIG_INCREMENT_BIT, transaction.src_config.increment},
53  {DMA_SRC_CONFIG_WRAP_BIT, transaction.src_config.wrap},
54  });
55  EXPECT_WRITE32(
56  DMA_DST_CONFIG_REG_OFFSET,
57  {
58  {DMA_DST_CONFIG_INCREMENT_BIT, transaction.dst_config.increment},
59  {DMA_DST_CONFIG_WRAP_BIT, transaction.dst_config.wrap},
60  });
61 
62  EXPECT_WRITE32(
63  DMA_ADDR_SPACE_ID_REG_OFFSET,
64  {
65  {DMA_ADDR_SPACE_ID_SRC_ASID_OFFSET, transaction.source.asid},
66  {DMA_ADDR_SPACE_ID_DST_ASID_OFFSET, transaction.destination.asid},
67  });
68 
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);
72 
73  EXPECT_DIF_OK(dif_dma_configure(&dma_, transaction));
74 }
75 
76 INSTANTIATE_TEST_SUITE_P(
77  ConfigureTest, ConfigureTest,
78  testing::ValuesIn(std::vector<dif_dma_transaction_t>{{
79  // Test 0
80  {
81  .source =
82  {
83  .address = 0xB05BA84B,
84  .asid = kDifDmaOpentitanInternalBus,
85  },
86  .destination =
87  {
88  .address = 0x721F400F,
89  .asid = kDifDmaOpentitanInternalBus,
90  },
91  // Regular memory behavior.
92  .src_config =
93  {
94  .wrap = 0,
95  .increment = 1,
96  },
97  // Typical FIFO behavior.
98  .dst_config =
99  {
100  .wrap = 1,
101  .increment = 0,
102  },
103  .chunk_size = 0x1,
104  .total_size = 0x1,
105  .width = kDifDmaTransWidth1Byte,
106  },
107  // Test 1
108  {
109  .source =
110  {
111  .address = 0x34FCA80BC5C5CA67,
112  .asid = kDifDmaSoCSystemBus,
113  },
114  .destination =
115  {
116  .address = 0xD0CF2C50,
117  .asid = kDifDmaSoCControlRegisterBus,
118  },
119  // Typical FIFO behavior.
120  .src_config =
121  {
122  .wrap = 1,
123  .increment = 0,
124  },
125  // Regular memory behavior.
126  .dst_config =
127  {
128  .wrap = 0,
129  .increment = 1,
130  },
131  .chunk_size = 0x2,
132  .total_size = 0x2,
133  .width = kDifDmaTransWidth2Bytes,
134  },
135  // Test 2
136  {
137  .source =
138  {
139  .address = 0x05BA857F8D9C0838,
140  .asid = kDifDmaSoCControlRegisterBus,
141  },
142  .destination =
143  {
144  .address = 0x32CD872A12225CCE,
145  .asid = kDifDmaSoCSystemBus,
146  },
147  // Regular memory behavior.
148  .src_config =
149  {
150  .wrap = 0,
151  .increment = 1,
152  },
153  // FIFO occupying a block of addresses.
154  .dst_config =
155  {
156  .wrap = 1,
157  .increment = 1,
158  },
159  .chunk_size = 0x4,
160  .total_size = 0x4,
161  .width = kDifDmaTransWidth4Bytes,
162  },
163  // Test 3
164  {
165  .source =
166  {
167  .address = 0xBFED148856E0555E,
168  .asid = kDifDmaSoCSystemBus,
169  },
170  .destination =
171  {
172  .address = 0x9ECFA11919F684D7,
173  .asid = kDifDmaOpentitanInternalBus,
174  },
175  // Regular memory behavior.
176  .src_config =
177  {
178  .wrap = 0,
179  .increment = 1,
180  },
181  // Regular memory behavior.
182  .dst_config =
183  {
184  .wrap = 0,
185  .increment = 1,
186  },
187  .chunk_size = std::numeric_limits<uint32_t>::max(),
188  .total_size = std::numeric_limits<uint32_t>::max(),
189  .width = kDifDmaTransWidth4Bytes,
190  },
191  // Test 4
192  {
193  .source =
194  {
195  .address = 0x05BA857F8D9C0838,
196  .asid = kDifDmaSoCControlRegisterBus,
197  },
198  .destination =
199  {
200  .address = 0x32CD872A12225CCE,
201  .asid = kDifDmaSoCSystemBus,
202  },
203  // Unusual addressing; FIFO-like but not wrapping.
204  .src_config =
205  {
206  .wrap = 0,
207  .increment = 0,
208  },
209  // Typical FIFO behavior.
210  .dst_config =
211  {
212  .wrap = 1,
213  .increment = 0,
214  },
215  .chunk_size = 0x4,
216  .total_size = 0x4,
217  .width = kDifDmaTransWidth4Bytes,
218  },
219  // Test 5
220  {
221  .source =
222  {
223  .address = 0x05BA857F8D9C0838,
224  .asid = kDifDmaSoCControlRegisterBus,
225  },
226  .destination =
227  {
228  .address = 0x32CD872A12225CCE,
229  .asid = kDifDmaSoCSystemBus,
230  },
231  // Chunk-based firmware-controlled transfer.
232  .src_config =
233  {
234  .wrap = 1,
235  .increment = 1,
236  },
237  // Unusual addressing; FIFO-like but not wrapping.
238  .dst_config =
239  {
240  .wrap = 0,
241  .increment = 0,
242  },
243  .chunk_size = 0x4,
244  .total_size = 0x4,
245  .width = kDifDmaTransWidth4Bytes,
246  },
247  }}));
248 
249 TEST_F(ConfigureTest, BadArg) {
250  dif_dma_transaction_t transaction;
251  EXPECT_DIF_BADARG(dif_dma_configure(nullptr, transaction));
252 }
253 
254 // Handshake tests
256 
257 TEST_F(HandshakeTest, EnableSuccess) {
258  EXPECT_READ32(DMA_CONTROL_REG_OFFSET,
259  {
260  {DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT, true},
261  });
262  EXPECT_WRITE32(DMA_CONTROL_REG_OFFSET,
263  {
264  {DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT, true},
265  });
266 
268 }
269 
270 TEST_F(HandshakeTest, DisableSuccess) {
271  EXPECT_READ32(DMA_CONTROL_REG_OFFSET,
272  {
273  {DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT, true},
274  });
275  EXPECT_WRITE32(DMA_CONTROL_REG_OFFSET,
276  {
277  {DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT, false},
278  });
279 
281 }
282 
283 TEST_F(HandshakeTest, EnableBadArg) {
285 }
286 
287 TEST_F(HandshakeTest, DisableBadArg) {
289 }
290 
291 // DMA start tests
293  : public DmaTestInitialized,
294  public testing::WithParamInterface<dif_dma_transaction_opcode_t> {};
295 
296 TEST_P(StartTest, Success) {
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,
301  {
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},
306  });
307 
308  EXPECT_DIF_OK(dif_dma_start(&dma_, opcode));
309 }
310 
311 INSTANTIATE_TEST_SUITE_P(
312  StartTest, StartTest,
313  testing::ValuesIn(std::vector<dif_dma_transaction_opcode_t>{{
314  kDifDmaCopyOpcode,
315  }}));
316 
317 TEST_F(StartTest, BadArg) {
318  EXPECT_DIF_BADARG(dif_dma_start(nullptr, kDifDmaCopyOpcode));
319 }
320 
321 // DMA memory range tests
323 
324 TEST_F(MemoryRangeTests, SetSuccess) {
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);
329 
331  dif_dma_memory_range_set(&dma_, kStartAddr, kEndAddr - kStartAddr + 1));
332 }
333 
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);
339 
340  uint32_t address = 0;
341  size_t size = 0;
342  EXPECT_DIF_OK(dif_dma_memory_range_get(&dma_, &address, &size));
343  EXPECT_EQ(address, kAddress);
344  EXPECT_EQ(size, kSize);
345 }
346 
347 TEST_F(MemoryRangeTests, GetBadArg) {
348  uint32_t address = 0;
349  size_t size = 0;
350  EXPECT_DIF_BADARG(dif_dma_memory_range_get(nullptr, &address, &size));
351  EXPECT_DIF_BADARG(dif_dma_memory_range_get(&dma_, NULL, &size));
352  EXPECT_DIF_BADARG(dif_dma_memory_range_get(&dma_, &address, NULL));
353 }
354 
355 // DMA abort tests
356 class AbortTest : public DmaTestInitialized {};
357 
358 TEST_F(AbortTest, Success) {
359  EXPECT_READ32(DMA_CONTROL_REG_OFFSET,
360  {{DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT, true}});
361  EXPECT_WRITE32(DMA_CONTROL_REG_OFFSET,
362  {
363  {DMA_CONTROL_HARDWARE_HANDSHAKE_ENABLE_BIT, true},
364  {DMA_CONTROL_ABORT_BIT, true},
365  });
366 
368 }
369 
370 TEST_F(AbortTest, BadArg) { EXPECT_DIF_BADARG(dif_dma_abort(nullptr)); }
371 
372 // DMA Memory range lock tests
374 
375 TEST_F(MemoryRangeLockTest, SetSuccess) {
376  EXPECT_WRITE32(DMA_RANGE_REGWEN_REG_OFFSET, kMultiBitBool4False);
377 
379 }
380 
381 TEST_F(MemoryRangeLockTest, GetLocked) {
382  bool locked = false;
383  EXPECT_READ32(DMA_RANGE_REGWEN_REG_OFFSET, kMultiBitBool4False);
384 
386  EXPECT_TRUE(locked);
387 }
388 
389 TEST_F(MemoryRangeLockTest, SetBadArg) {
391 }
392 
393 TEST_F(MemoryRangeLockTest, GetBadArg) {
394  bool dummy;
397 }
398 
399 // DMA status tests
400 typedef struct status_reg {
401  uint32_t reg;
403 } status_reg_t;
405  public testing::WithParamInterface<status_reg_t> {};
406 
407 TEST_P(StatusGetTest, GetSuccess) {
408  status_reg_t status_arg = GetParam();
409 
410  EXPECT_READ32(DMA_STATUS_REG_OFFSET, status_arg.reg);
411 
413 
415  EXPECT_EQ(status, status_arg.status);
416 }
417 
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},
427  }}));
428 
429 TEST_F(StatusGetTest, GetBadArg) {
430  dif_dma_status_t dummy;
431  EXPECT_DIF_BADARG(dif_dma_status_get(nullptr, &dummy));
432  EXPECT_DIF_BADARG(dif_dma_status_get(&dma_, nullptr));
433 }
434 
436  public testing::WithParamInterface<status_reg_t> {};
437 
438 TEST_P(StatusWriteTest, SetSuccess) {
439  status_reg_t status_arg = GetParam();
440 
441  EXPECT_WRITE32(DMA_STATUS_REG_OFFSET, status_arg.reg);
442 
443  EXPECT_DIF_OK(dif_dma_status_write(&dma_, status_arg.status));
444 }
445 
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},
454  }}));
455 
456 TEST_F(StatusWriteTest, GetBadArg) {
457  dif_dma_status_t dummy = kDifDmaStatusDone;
458  EXPECT_DIF_BADARG(dif_dma_status_write(nullptr, dummy));
459 }
460 
462 
463 TEST_F(StatusClearTest, SetSuccess) {
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);
467 
469 }
470 
471 TEST_F(StatusClearTest, GetBadArg) {
473 }
474 typedef struct error_code_reg {
475  uint32_t reg;
476  dif_dma_error_code_t error_code;
479  public testing::WithParamInterface<error_code_reg_t> {};
480 
481 TEST_P(ErrorTest, GetSuccess) {
482  error_code_reg_t error_code_arg = GetParam();
483 
484  EXPECT_READ32(DMA_ERROR_CODE_REG_OFFSET, error_code_arg.reg);
485 
486  dif_dma_error_code error_code;
487 
488  EXPECT_DIF_OK(dif_dma_error_code_get(&dma_, &error_code));
489  EXPECT_EQ(error_code, error_code_arg.error_code);
490 }
491 
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},
505  }}));
506 
507 TEST_F(ErrorTest, GetErrorBadArg) {
508  dif_dma_error_code_t dummy;
509  EXPECT_DIF_BADARG(dif_dma_error_code_get(nullptr, &dummy));
510  EXPECT_DIF_BADARG(dif_dma_error_code_get(&dma_, nullptr));
511 }
512 
513 typedef struct status_poll_reg {
514  uint32_t reg;
515  dif_dma_status_code_t status;
517 
519  public testing::WithParamInterface<status_poll_reg_t> {};
520 
521 TEST_P(StatusPollTest, GetSuccess) {
522  status_poll_reg_t status_arg = GetParam();
523 
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);
528 
529  EXPECT_DIF_OK(dif_dma_status_poll(&dma_, status_arg.status));
530 }
531 
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},
540  }}));
541 
542 TEST_F(StatusPollTest, BadArg) {
543  EXPECT_DIF_BADARG(dif_dma_status_poll(nullptr, kDifDmaStatusDone));
544 }
545 
547 
548 TEST_F(GetDigestLenTest, Success) {
549  uint32_t digest_len;
550  EXPECT_DIF_OK(dif_dma_get_digest_length(kDifDmaSha256Opcode, &digest_len));
551  EXPECT_EQ(digest_len, 8);
552 
553  EXPECT_DIF_OK(dif_dma_get_digest_length(kDifDmaSha384Opcode, &digest_len));
554  EXPECT_EQ(digest_len, 12);
555 
556  EXPECT_DIF_OK(dif_dma_get_digest_length(kDifDmaSha512Opcode, &digest_len));
557  EXPECT_EQ(digest_len, 16);
558 }
559 
560 TEST_F(GetDigestLenTest, BadArg) {
561  uint32_t digest_len;
562  EXPECT_DIF_BADARG(dif_dma_get_digest_length(kDifDmaSha256Opcode, nullptr));
563  EXPECT_DIF_BADARG(dif_dma_get_digest_length(kDifDmaCopyOpcode, &digest_len));
564 }
565 
566 typedef struct digest_reg {
567  dif_dma_transaction_opcode_t opcode;
568  uint32_t num_digest_regs;
569 } digest_reg_t;
570 
572  public testing::WithParamInterface<digest_reg_t> {};
573 
574 TEST_P(GetDigestTest, GetSuccess) {
575  digest_reg_t digest_arg = GetParam();
576  uint32_t digest[16] = {0};
577 
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),
581  i * 1024 + i);
582  }
583 
584  EXPECT_DIF_OK(dif_dma_sha2_digest_get(&dma_, digest_arg.opcode, digest));
585 
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);
589  } else {
590  EXPECT_EQ(digest[i], 0);
591  }
592  }
593 }
594 
595 INSTANTIATE_TEST_SUITE_P(GetDigestTest, GetDigestTest,
596  testing::ValuesIn(std::vector<digest_reg_t>{{
597  {kDifDmaSha256Opcode, 8},
598  {kDifDmaSha384Opcode, 12},
599  {kDifDmaSha512Opcode, 16},
600  }}));
601 
602 TEST_F(GetDigestTest, BadArg) {
603  uint32_t digest[16];
605  dif_dma_sha2_digest_get(nullptr, kDifDmaSha256Opcode, digest));
607  dif_dma_sha2_digest_get(&dma_, kDifDmaSha256Opcode, nullptr));
608  EXPECT_DIF_BADARG(dif_dma_sha2_digest_get(&dma_, kDifDmaCopyOpcode, digest));
609 }
610 
611 // DMA handshake irq enable tests
613 
614 TEST_F(HandshakeEnableIrqTest, Success) {
615  EXPECT_WRITE32(DMA_HANDSHAKE_INTR_ENABLE_REG_OFFSET, 0x3);
616 
618 }
619 
620 TEST_F(HandshakeEnableIrqTest, BadArg) {
622 }
623 
624 // DMA handshake irq clear tests
626 
627 TEST_F(HandshakeClearIrqTest, Success) {
628  EXPECT_WRITE32(DMA_CLEAR_INTR_SRC_REG_OFFSET, 0x3);
629 
631 }
632 
633 TEST_F(HandshakeClearIrqTest, BadArg) {
635 }
636 
637 // DMA handshake irq clear bus tests
639 
640 TEST_F(HandshakeClearBusTest, Success) {
641  EXPECT_WRITE32(DMA_CLEAR_INTR_BUS_REG_OFFSET, 0x2);
642 
644 }
645 
646 TEST_F(HandshakeClearBusTest, BadArg) {
648 }
649 
650 typedef struct dma_clear_irq_reg {
651  uint32_t reg;
652  dif_dma_intr_idx_t idx;
654 
656  : public DmaTestInitialized,
657  public testing::WithParamInterface<dma_clear_irq_reg_t> {};
658 
659 TEST_P(HandshakeClearAddressTest, GetSuccess) {
660  dma_clear_irq_reg_t clear_irq_reg = GetParam();
661 
662  EXPECT_WRITE32(clear_irq_reg.reg, 0x123456);
663 
664  EXPECT_DIF_OK(dif_dma_intr_src_addr(&dma_, clear_irq_reg.idx, 0x123456));
665 }
666 
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},
681  }}));
682 
683 TEST_F(HandshakeClearAddressTest, BadArg) {
685  dif_dma_intr_src_addr(nullptr, kDifDmaIntrClearIdx0, 0x12345));
686 }
687 
689  : public DmaTestInitialized,
690  public testing::WithParamInterface<dma_clear_irq_reg_t> {};
691 
692 TEST_P(HandshakeClearValueTest, GetSuccess) {
693  dma_clear_irq_reg_t clear_irq_reg = GetParam();
694 
695  EXPECT_WRITE32(clear_irq_reg.reg, 0x123456);
696 
697  EXPECT_DIF_OK(dif_dma_intr_write_value(&dma_, clear_irq_reg.idx, 0x123456));
698 }
699 
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},
714  }}));
715 
716 TEST_F(HandshakeClearValueTest, BadArg) {
718  dif_dma_intr_write_value(nullptr, kDifDmaIntrClearIdx0, 0x4567));
719 }
720 
721 } // namespace dif_dma_test