1#include "drivers/tests/test_internal.h"
2
3TEST_GROUP_DECLARE(vtd_unit, .intensity_desc = {
4 .curve = SCALE_PIECEWISE_LOG,
5 .unit = "iov_addrs",
6 });
7
8TEST_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