Skip to content

Commit 0104abb

Browse files
jannaumarcan
authored andcommitted
dart: Add dart_find_iova() to find unused IOVA space
Signed-off-by: Janne Grunau <[email protected]>
1 parent 90479ac commit 0104abb

2 files changed

Lines changed: 38 additions & 3 deletions

File tree

src/dart.c

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,12 +264,12 @@ void dart_unmap(dart_dev_t *dart, uintptr_t iova, size_t len)
264264
dart_tlb_invalidate(dart);
265265
}
266266

267-
void *dart_translate(dart_dev_t *dart, uintptr_t iova)
267+
static void *dart_translate_internal(dart_dev_t *dart, uintptr_t iova, int silent)
268268
{
269269
u32 ttbr = (iova >> 36) & 0x3;
270270
u32 l1_index = (iova >> 25) & 0x7ff;
271271

272-
if (!(dart->l1[ttbr][l1_index] & DART_PTE_VALID)) {
272+
if (!(dart->l1[ttbr][l1_index] & DART_PTE_VALID) && !silent) {
273273
printf("dart: l1 translation failure %x %lx\n", l1_index, iova);
274274
return NULL;
275275
}
@@ -278,7 +278,7 @@ void *dart_translate(dart_dev_t *dart, uintptr_t iova)
278278
u64 *l2 =
279279
(u64 *)(FIELD_GET(dart->offset_mask, dart->l1[ttbr][l1_index]) << DART_PTE_OFFSET_SHIFT);
280280

281-
if (!(l2[l2_index] & DART_PTE_VALID)) {
281+
if (!(l2[l2_index] & DART_PTE_VALID) && !silent) {
282282
printf("dart: l2 translation failure\n");
283283
return NULL;
284284
}
@@ -289,6 +289,11 @@ void *dart_translate(dart_dev_t *dart, uintptr_t iova)
289289
return base + offset;
290290
}
291291

292+
void *dart_translate(dart_dev_t *dart, uintptr_t iova)
293+
{
294+
return dart_translate_internal(dart, iova, 0);
295+
}
296+
292297
u64 dart_search(dart_dev_t *dart, void *paddr)
293298
{
294299
for (int ttbr = 0; ttbr < 4; ++ttbr) {
@@ -314,6 +319,35 @@ u64 dart_search(dart_dev_t *dart, void *paddr)
314319
return 0;
315320
}
316321

322+
s64 dart_find_iova(dart_dev_t *dart, s64 start, size_t len)
323+
{
324+
if (len % SZ_16K)
325+
return -1;
326+
if (start < 0 || start % SZ_16K)
327+
return -1;
328+
329+
uintptr_t end = 1LLU << 32;
330+
uintptr_t iova = start;
331+
332+
while (iova + len <= end) {
333+
334+
if (dart_translate_internal(dart, iova, 1) == NULL) {
335+
size_t size;
336+
for (size = SZ_16K; size < len; size += SZ_16K) {
337+
if (dart_translate_internal(dart, iova + size, 1) != NULL)
338+
break;
339+
}
340+
if (size == len)
341+
return iova;
342+
343+
iova += size + SZ_16K;
344+
} else
345+
iova += SZ_16K;
346+
}
347+
348+
return -1;
349+
}
350+
317351
void dart_shutdown(dart_dev_t *dart)
318352
{
319353
if (!dart->locked && !dart->keep)

src/dart.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ int dart_map(dart_dev_t *dart, uintptr_t iova, void *bfr, size_t len);
1313
void dart_unmap(dart_dev_t *dart, uintptr_t iova, size_t len);
1414
void *dart_translate(dart_dev_t *dart, uintptr_t iova);
1515
u64 dart_search(dart_dev_t *dart, void *paddr);
16+
s64 dart_find_iova(dart_dev_t *dart, s64 start, size_t len);
1617
void dart_shutdown(dart_dev_t *dart);
1718

1819
#endif

0 commit comments

Comments
 (0)