@@ -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+
292297u64 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+
317351void dart_shutdown (dart_dev_t * dart )
318352{
319353 if (!dart -> locked && !dart -> keep )
0 commit comments