diff options
Diffstat (limited to 'kernel/resource.c')
| -rw-r--r-- | kernel/resource.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/kernel/resource.c b/kernel/resource.c index 46322019ab7d..0bcebffc4e77 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
| @@ -491,6 +491,42 @@ int __weak page_is_ram(unsigned long pfn) | |||
| 491 | } | 491 | } |
| 492 | EXPORT_SYMBOL_GPL(page_is_ram); | 492 | EXPORT_SYMBOL_GPL(page_is_ram); |
| 493 | 493 | ||
| 494 | /* | ||
| 495 | * Search for a resouce entry that fully contains the specified region. | ||
| 496 | * If found, return 1 if it is RAM, 0 if not. | ||
| 497 | * If not found, or region is not fully contained, return -1 | ||
| 498 | * | ||
| 499 | * Used by the ioremap functions to ensure the user is not remapping RAM and is | ||
| 500 | * a vast speed up over walking through the resource table page by page. | ||
| 501 | */ | ||
| 502 | int region_is_ram(resource_size_t start, unsigned long size) | ||
| 503 | { | ||
| 504 | struct resource *p; | ||
| 505 | resource_size_t end = start + size - 1; | ||
| 506 | int flags = IORESOURCE_MEM | IORESOURCE_BUSY; | ||
| 507 | const char *name = "System RAM"; | ||
| 508 | int ret = -1; | ||
| 509 | |||
| 510 | read_lock(&resource_lock); | ||
| 511 | for (p = iomem_resource.child; p ; p = p->sibling) { | ||
| 512 | if (end < p->start) | ||
| 513 | continue; | ||
| 514 | |||
| 515 | if (p->start <= start && end <= p->end) { | ||
| 516 | /* resource fully contains region */ | ||
| 517 | if ((p->flags != flags) || strcmp(p->name, name)) | ||
| 518 | ret = 0; | ||
| 519 | else | ||
| 520 | ret = 1; | ||
| 521 | break; | ||
| 522 | } | ||
| 523 | if (p->end < start) | ||
| 524 | break; /* not found */ | ||
| 525 | } | ||
| 526 | read_unlock(&resource_lock); | ||
| 527 | return ret; | ||
| 528 | } | ||
| 529 | |||
| 494 | void __weak arch_remove_reservations(struct resource *avail) | 530 | void __weak arch_remove_reservations(struct resource *avail) |
| 495 | { | 531 | { |
| 496 | } | 532 | } |
