perf top: Add overwrite fall back
[linux-2.6-microblaze.git] / kernel / resource.c
index 54ba6de..e270b50 100644 (file)
@@ -1022,6 +1022,7 @@ static void __init __reserve_region_with_split(struct resource *root,
        struct resource *conflict;
        struct resource *res = alloc_resource(GFP_ATOMIC);
        struct resource *next_res = NULL;
+       int type = resource_type(root);
 
        if (!res)
                return;
@@ -1029,7 +1030,7 @@ static void __init __reserve_region_with_split(struct resource *root,
        res->name = name;
        res->start = start;
        res->end = end;
-       res->flags = IORESOURCE_BUSY;
+       res->flags = type | IORESOURCE_BUSY;
        res->desc = IORES_DESC_NONE;
 
        while (1) {
@@ -1064,7 +1065,7 @@ static void __init __reserve_region_with_split(struct resource *root,
                                next_res->name = name;
                                next_res->start = conflict->end + 1;
                                next_res->end = end;
-                               next_res->flags = IORESOURCE_BUSY;
+                               next_res->flags = type | IORESOURCE_BUSY;
                                next_res->desc = IORES_DESC_NONE;
                        }
                } else {
@@ -1478,7 +1479,7 @@ void __devm_release_region(struct device *dev, struct resource *parent,
 EXPORT_SYMBOL(__devm_release_region);
 
 /*
- * Called from init/main.c to reserve IO ports.
+ * Reserve I/O ports or memory based on "reserve=" kernel parameter.
  */
 #define MAXRESERVE 4
 static int __init reserve_setup(char *str)
@@ -1489,26 +1490,38 @@ static int __init reserve_setup(char *str)
        for (;;) {
                unsigned int io_start, io_num;
                int x = reserved;
+               struct resource *parent;
 
-               if (get_option (&str, &io_start) != 2)
+               if (get_option(&str, &io_start) != 2)
                        break;
-               if (get_option (&str, &io_num)   == 0)
+               if (get_option(&str, &io_num) == 0)
                        break;
                if (x < MAXRESERVE) {
                        struct resource *res = reserve + x;
+
+                       /*
+                        * If the region starts below 0x10000, we assume it's
+                        * I/O port space; otherwise assume it's memory.
+                        */
+                       if (io_start < 0x10000) {
+                               res->flags = IORESOURCE_IO;
+                               parent = &ioport_resource;
+                       } else {
+                               res->flags = IORESOURCE_MEM;
+                               parent = &iomem_resource;
+                       }
                        res->name = "reserved";
                        res->start = io_start;
                        res->end = io_start + io_num - 1;
-                       res->flags = IORESOURCE_BUSY;
+                       res->flags |= IORESOURCE_BUSY;
                        res->desc = IORES_DESC_NONE;
                        res->child = NULL;
-                       if (request_resource(res->start >= 0x10000 ? &iomem_resource : &ioport_resource, res) == 0)
+                       if (request_resource(parent, res) == 0)
                                reserved = x+1;
                }
        }
        return 1;
 }
-
 __setup("reserve=", reserve_setup);
 
 /*
@@ -1563,17 +1576,17 @@ static int strict_iomem_checks;
 
 /*
  * check if an address is reserved in the iomem resource tree
- * returns 1 if reserved, 0 if not reserved.
+ * returns true if reserved, false if not reserved.
  */
-int iomem_is_exclusive(u64 addr)
+bool iomem_is_exclusive(u64 addr)
 {
        struct resource *p = &iomem_resource;
-       int err = 0;
+       bool err = false;
        loff_t l;
        int size = PAGE_SIZE;
 
        if (!strict_iomem_checks)
-               return 0;
+               return false;
 
        addr = addr & PAGE_MASK;
 
@@ -1596,7 +1609,7 @@ int iomem_is_exclusive(u64 addr)
                        continue;
                if (IS_ENABLED(CONFIG_IO_STRICT_DEVMEM)
                                || p->flags & IORESOURCE_EXCLUSIVE) {
-                       err = 1;
+                       err = true;
                        break;
                }
        }