@@ -333,14 +333,15 @@ int release_resource(struct resource *old)
333
333
EXPORT_SYMBOL (release_resource );
334
334
335
335
/*
336
- * Finds the lowest iomem reosurce exists with-in [res->start.res->end)
337
- * the caller must specify res->start, res->end, res->flags and "name".
338
- * If found, returns 0, res is overwritten, if not found, returns -1.
339
- * This walks through whole tree and not just first level children
340
- * until and unless first_level_children_only is true.
336
+ * Finds the lowest iomem resource existing within [res->start.res->end).
337
+ * The caller must specify res->start, res->end, res->flags, and optionally
338
+ * desc and "name". If found, returns 0, res is overwritten, if not found,
339
+ * returns -1.
340
+ * This function walks the whole tree and not just first level children until
341
+ * and unless first_level_children_only is true.
341
342
*/
342
- static int find_next_iomem_res (struct resource * res , char * name ,
343
- bool first_level_children_only )
343
+ static int find_next_iomem_res (struct resource * res , unsigned long desc ,
344
+ char * name , bool first_level_children_only )
344
345
{
345
346
resource_size_t start , end ;
346
347
struct resource * p ;
@@ -360,6 +361,8 @@ static int find_next_iomem_res(struct resource *res, char *name,
360
361
for (p = iomem_resource .child ; p ; p = next_resource (p , sibling_only )) {
361
362
if ((p -> flags & res -> flags ) != res -> flags )
362
363
continue ;
364
+ if ((desc != IORES_DESC_NONE ) && (desc != p -> desc ))
365
+ continue ;
363
366
if (name && strcmp (p -> name , name ))
364
367
continue ;
365
368
if (p -> start > end ) {
@@ -385,12 +388,55 @@ static int find_next_iomem_res(struct resource *res, char *name,
385
388
* Walks through iomem resources and calls func() with matching resource
386
389
* ranges. This walks through whole tree and not just first level children.
387
390
* All the memory ranges which overlap start,end and also match flags and
391
+ * desc are valid candidates.
392
+ *
393
+ * @desc: I/O resource descriptor. Use IORES_DESC_NONE to skip @desc check.
394
+ * @flags: I/O resource flags
395
+ * @start: start addr
396
+ * @end: end addr
397
+ *
398
+ * NOTE: For a new descriptor search, define a new IORES_DESC in
399
+ * <linux/ioport.h> and set it in 'desc' of a target resource entry.
400
+ */
401
+ int walk_iomem_res_desc (unsigned long desc , unsigned long flags , u64 start ,
402
+ u64 end , void * arg , int (* func )(u64 , u64 , void * ))
403
+ {
404
+ struct resource res ;
405
+ u64 orig_end ;
406
+ int ret = -1 ;
407
+
408
+ res .start = start ;
409
+ res .end = end ;
410
+ res .flags = flags ;
411
+ orig_end = res .end ;
412
+
413
+ while ((res .start < res .end ) &&
414
+ (!find_next_iomem_res (& res , desc , NULL , false))) {
415
+
416
+ ret = (* func )(res .start , res .end , arg );
417
+ if (ret )
418
+ break ;
419
+
420
+ res .start = res .end + 1 ;
421
+ res .end = orig_end ;
422
+ }
423
+
424
+ return ret ;
425
+ }
426
+
427
+ /*
428
+ * Walks through iomem resources and calls @func with matching resource
429
+ * ranges. This walks the whole tree and not just first level children.
430
+ * All the memory ranges which overlap start,end and also match flags and
388
431
* name are valid candidates.
389
432
*
390
433
* @name: name of resource
391
434
* @flags: resource flags
392
435
* @start: start addr
393
436
* @end: end addr
437
+ *
438
+ * NOTE: This function is deprecated and should not be used in new code.
439
+ * Use walk_iomem_res_desc(), instead.
394
440
*/
395
441
int walk_iomem_res (char * name , unsigned long flags , u64 start , u64 end ,
396
442
void * arg , int (* func )(u64 , u64 , void * ))
@@ -404,7 +450,7 @@ int walk_iomem_res(char *name, unsigned long flags, u64 start, u64 end,
404
450
res .flags = flags ;
405
451
orig_end = res .end ;
406
452
while ((res .start < res .end ) &&
407
- (!find_next_iomem_res (& res , name , false))) {
453
+ (!find_next_iomem_res (& res , IORES_DESC_NONE , name , false))) {
408
454
ret = (* func )(res .start , res .end , arg );
409
455
if (ret )
410
456
break ;
@@ -433,7 +479,7 @@ int walk_system_ram_res(u64 start, u64 end, void *arg,
433
479
res .flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY ;
434
480
orig_end = res .end ;
435
481
while ((res .start < res .end ) &&
436
- (!find_next_iomem_res (& res , NULL , true))) {
482
+ (!find_next_iomem_res (& res , IORES_DESC_NONE , NULL , true))) {
437
483
ret = (* func )(res .start , res .end , arg );
438
484
if (ret )
439
485
break ;
@@ -463,7 +509,7 @@ int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
463
509
res .flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY ;
464
510
orig_end = res .end ;
465
511
while ((res .start < res .end ) &&
466
- (find_next_iomem_res (& res , NULL , true) >= 0 )) {
512
+ (find_next_iomem_res (& res , IORES_DESC_NONE , NULL , true) >= 0 )) {
467
513
pfn = (res .start + PAGE_SIZE - 1 ) >> PAGE_SHIFT ;
468
514
end_pfn = (res .end + 1 ) >> PAGE_SHIFT ;
469
515
if (end_pfn > pfn )
0 commit comments