|
@@ -176,10 +176,27 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap)
|
|
unsigned long pfn, pgoff, order;
|
|
unsigned long pfn, pgoff, order;
|
|
pgprot_t pgprot = PAGE_KERNEL;
|
|
pgprot_t pgprot = PAGE_KERNEL;
|
|
int error, nid, is_ram;
|
|
int error, nid, is_ram;
|
|
|
|
+ struct dev_pagemap *conflict_pgmap;
|
|
|
|
|
|
align_start = res->start & ~(SECTION_SIZE - 1);
|
|
align_start = res->start & ~(SECTION_SIZE - 1);
|
|
align_size = ALIGN(res->start + resource_size(res), SECTION_SIZE)
|
|
align_size = ALIGN(res->start + resource_size(res), SECTION_SIZE)
|
|
- align_start;
|
|
- align_start;
|
|
|
|
+ align_end = align_start + align_size - 1;
|
|
|
|
+
|
|
|
|
+ conflict_pgmap = get_dev_pagemap(PHYS_PFN(align_start), NULL);
|
|
|
|
+ if (conflict_pgmap) {
|
|
|
|
+ dev_WARN(dev, "Conflicting mapping in same section\n");
|
|
|
|
+ put_dev_pagemap(conflict_pgmap);
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ conflict_pgmap = get_dev_pagemap(PHYS_PFN(align_end), NULL);
|
|
|
|
+ if (conflict_pgmap) {
|
|
|
|
+ dev_WARN(dev, "Conflicting mapping in same section\n");
|
|
|
|
+ put_dev_pagemap(conflict_pgmap);
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
+ }
|
|
|
|
+
|
|
is_ram = region_intersects(align_start, align_size,
|
|
is_ram = region_intersects(align_start, align_size,
|
|
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE);
|
|
IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE);
|
|
|
|
|
|
@@ -199,7 +216,6 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap)
|
|
|
|
|
|
mutex_lock(&pgmap_lock);
|
|
mutex_lock(&pgmap_lock);
|
|
error = 0;
|
|
error = 0;
|
|
- align_end = align_start + align_size - 1;
|
|
|
|
|
|
|
|
foreach_order_pgoff(res, order, pgoff) {
|
|
foreach_order_pgoff(res, order, pgoff) {
|
|
error = __radix_tree_insert(&pgmap_radix,
|
|
error = __radix_tree_insert(&pgmap_radix,
|