| 1 | #include "drivers/tests/test_internal.h" |
| 2 | |
| 3 | TEST_GROUP_DECLARE(vtd_unit, .intensity_desc = { |
| 4 | .curve = SCALE_PIECEWISE_LOG, |
| 5 | .unit = "iov_addrs" , |
| 6 | }); |
| 7 | |
| 8 | TEST_DECLARE_UNIT(vtd_unit, sl_iova_tiling, TEST_INTENSITY(1, 16, 4096)) { |
| 9 | size_t count = ctx->intensity_val ? ctx->intensity_val : 16; |
| 10 | for (size_t i = 0; i < count; i++) { |
| 11 | uint64_t iova = (0x00007FEDCBA98765ULL + (i * 0x1000000003ULL)) & |
| 12 | ((1ULL << 48) - 1); |
| 13 | |
| 14 | uint64_t pml4 = SL_PML4_INDEX(iova); |
| 15 | uint64_t pdpt = SL_PDPT_INDEX(iova); |
| 16 | uint64_t pd = SL_PD_INDEX(iova); |
| 17 | uint64_t pt = SL_PT_INDEX(iova); |
| 18 | uint64_t offset = SL_PAGE_OFFSET(iova); |
| 19 | |
| 20 | /* indices must strictly fit in (0..511), 9 bits */ |
| 21 | TEST_ASSERT_LT(pml4, SL_ENTRY_COUNT); |
| 22 | TEST_ASSERT_LT(pdpt, SL_ENTRY_COUNT); |
| 23 | TEST_ASSERT_LT(pd, SL_ENTRY_COUNT); |
| 24 | TEST_ASSERT_LT(pt, SL_ENTRY_COUNT); |
| 25 | TEST_ASSERT_LT(offset, PAGE_SIZE); |
| 26 | |
| 27 | /* Reconstruct 48-bit IOVA, assert equality */ |
| 28 | uint64_t reconstructed = |
| 29 | (pml4 << 39) | (pdpt << 30) | (pd << 21) | (pt << 12) | offset; |
| 30 | TEST_ASSERT_EQ(reconstructed, iova); |
| 31 | } |
| 32 | |
| 33 | return TEST_SUCCESS; |
| 34 | } |
| 35 | |