diff options
author | Bjorn Helgaas | 2017-12-01 18:50:33 +0100 |
---|---|---|
committer | Bjorn Helgaas | 2017-12-19 06:07:46 +0100 |
commit | ffd2e8df8d138e7436e218e0a9d3447a18b888e6 (patch) | |
tree | d2a9895eb988bfb44c8690630a2f2f5f6947e291 /kernel/resource.c | |
parent | irqchip/i8259: Set I/O port resource types correctly (diff) | |
download | kernel-qcow2-linux-ffd2e8df8d138e7436e218e0a9d3447a18b888e6.tar.gz kernel-qcow2-linux-ffd2e8df8d138e7436e218e0a9d3447a18b888e6.tar.xz kernel-qcow2-linux-ffd2e8df8d138e7436e218e0a9d3447a18b888e6.zip |
resource: Set type of "reserve=" user-specified resources
When we reserve regions because the user specified a "reserve=" parameter,
set the resource type to either IORESOURCE_IO (for regions below 0x10000)
or IORESOURCE_MEM. The test for 0x10000 is just a heuristic; obviously
there can be memory below 0x10000 as well.
Improve documentation of the "reserve=" parameter.
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'kernel/resource.c')
-rw-r--r-- | kernel/resource.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/kernel/resource.c b/kernel/resource.c index 54ba6de3757c..ba3252f7c319 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -1478,7 +1478,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 +1489,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); /* |