Commit 414ae760 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Bjorn Helgaas

Merge branch 'pci/resource' into next

* pci/resource:
  PCI: tegra: Remove PCI_REASSIGN_ALL_BUS use on Tegra
  resource: Set type when reserving new regions
  resource: Set type of "reserve=" user-specified resources
  irqchip/i8259: Set I/O port resource types correctly
  powerpc: Set I/O port resource types correctly
  MIPS: Set I/O port resource types correctly
  vgacon: Set VGA struct resource types
  PCI: Use dev_info() rather than dev_err() for ROM validation
  PCI: Remove PCI_REASSIGN_ALL_RSRC use on arm and arm64
  PCI: Remove sysfs resource mmap warning

Conflicts:
	drivers/pci/rom.c
parents 11377725 a9b94b74
...@@ -3675,7 +3675,11 @@ ...@@ -3675,7 +3675,11 @@
[KNL, SMP] Set scheduler's default relax_domain_level. [KNL, SMP] Set scheduler's default relax_domain_level.
See Documentation/cgroup-v1/cpusets.txt. See Documentation/cgroup-v1/cpusets.txt.
reserve= [KNL,BUGS] Force the kernel to ignore some iomem area reserve= [KNL,BUGS] Force kernel to ignore I/O ports or memory
Format: <base1>,<size1>[,<base2>,<size2>,...]
Reserve I/O ports or memory so the kernel won't use
them. If <base> is less than 0x10000, the region
is assumed to be I/O ports; otherwise it is memory.
reservetop= [X86-32] reservetop= [X86-32]
Format: nn[KMG] Format: nn[KMG]
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
struct pci_controller *pci_vga_hose; struct pci_controller *pci_vga_hose;
static struct resource alpha_vga = { static struct resource alpha_vga = {
.name = "alpha-vga+", .name = "alpha-vga+",
.flags = IORESOURCE_IO,
.start = 0x3C0, .start = 0x3C0,
.end = 0x3DF .end = 0x3DF
}; };
......
...@@ -10,10 +10,7 @@ extern unsigned long pcibios_min_io; ...@@ -10,10 +10,7 @@ extern unsigned long pcibios_min_io;
extern unsigned long pcibios_min_mem; extern unsigned long pcibios_min_mem;
#define PCIBIOS_MIN_MEM pcibios_min_mem #define PCIBIOS_MIN_MEM pcibios_min_mem
static inline int pcibios_assign_all_busses(void) #define pcibios_assign_all_busses() pci_has_flag(PCI_REASSIGN_ALL_BUS)
{
return pci_has_flag(PCI_REASSIGN_ALL_RSRC);
}
#ifdef CONFIG_PCI_DOMAINS #ifdef CONFIG_PCI_DOMAINS
static inline int pci_proc_domain(struct pci_bus *bus) static inline int pci_proc_domain(struct pci_bus *bus)
......
...@@ -527,7 +527,7 @@ void pci_common_init_dev(struct device *parent, struct hw_pci *hw) ...@@ -527,7 +527,7 @@ void pci_common_init_dev(struct device *parent, struct hw_pci *hw)
struct pci_sys_data *sys; struct pci_sys_data *sys;
LIST_HEAD(head); LIST_HEAD(head);
pci_add_flags(PCI_REASSIGN_ALL_RSRC); pci_add_flags(PCI_REASSIGN_ALL_BUS);
if (hw->preinit) if (hw->preinit)
hw->preinit(); hw->preinit();
pcibios_init_hw(parent, hw, &head); pcibios_init_hw(parent, hw, &head);
......
...@@ -32,22 +32,22 @@ static struct resource jazz_io_resources[] = { ...@@ -32,22 +32,22 @@ static struct resource jazz_io_resources[] = {
.start = 0x00, .start = 0x00,
.end = 0x1f, .end = 0x1f,
.name = "dma1", .name = "dma1",
.flags = IORESOURCE_BUSY .flags = IORESOURCE_IO | IORESOURCE_BUSY
}, { }, {
.start = 0x40, .start = 0x40,
.end = 0x5f, .end = 0x5f,
.name = "timer", .name = "timer",
.flags = IORESOURCE_BUSY .flags = IORESOURCE_IO | IORESOURCE_BUSY
}, { }, {
.start = 0x80, .start = 0x80,
.end = 0x8f, .end = 0x8f,
.name = "dma page reg", .name = "dma page reg",
.flags = IORESOURCE_BUSY .flags = IORESOURCE_IO | IORESOURCE_BUSY
}, { }, {
.start = 0xc0, .start = 0xc0,
.end = 0xdf, .end = 0xdf,
.name = "dma2", .name = "dma2",
.flags = IORESOURCE_BUSY .flags = IORESOURCE_IO | IORESOURCE_BUSY
} }
}; };
......
...@@ -47,31 +47,31 @@ static struct resource standard_io_resources[] = { ...@@ -47,31 +47,31 @@ static struct resource standard_io_resources[] = {
.name = "dma1", .name = "dma1",
.start = 0x00, .start = 0x00,
.end = 0x1f, .end = 0x1f,
.flags = IORESOURCE_BUSY .flags = IORESOURCE_IO | IORESOURCE_BUSY
}, },
{ {
.name = "timer", .name = "timer",
.start = 0x40, .start = 0x40,
.end = 0x5f, .end = 0x5f,
.flags = IORESOURCE_BUSY .flags = IORESOURCE_IO | IORESOURCE_BUSY
}, },
{ {
.name = "keyboard", .name = "keyboard",
.start = 0x60, .start = 0x60,
.end = 0x6f, .end = 0x6f,
.flags = IORESOURCE_BUSY .flags = IORESOURCE_IO | IORESOURCE_BUSY
}, },
{ {
.name = "dma page reg", .name = "dma page reg",
.start = 0x80, .start = 0x80,
.end = 0x8f, .end = 0x8f,
.flags = IORESOURCE_BUSY .flags = IORESOURCE_IO | IORESOURCE_BUSY
}, },
{ {
.name = "dma2", .name = "dma2",
.start = 0xc0, .start = 0xc0,
.end = 0xdf, .end = 0xdf,
.flags = IORESOURCE_BUSY .flags = IORESOURCE_IO | IORESOURCE_BUSY
}, },
}; };
......
...@@ -134,7 +134,7 @@ int maple_set_rtc_time(struct rtc_time *tm) ...@@ -134,7 +134,7 @@ int maple_set_rtc_time(struct rtc_time *tm)
static struct resource rtc_iores = { static struct resource rtc_iores = {
.name = "rtc", .name = "rtc",
.flags = IORESOURCE_BUSY, .flags = IORESOURCE_IO | IORESOURCE_BUSY,
}; };
unsigned long __init maple_get_boot_time(void) unsigned long __init maple_get_boot_time(void)
......
...@@ -145,21 +145,21 @@ static struct resource pic1_iores = { ...@@ -145,21 +145,21 @@ static struct resource pic1_iores = {
.name = "8259 (master)", .name = "8259 (master)",
.start = 0x20, .start = 0x20,
.end = 0x21, .end = 0x21,
.flags = IORESOURCE_BUSY, .flags = IORESOURCE_IO | IORESOURCE_BUSY,
}; };
static struct resource pic2_iores = { static struct resource pic2_iores = {
.name = "8259 (slave)", .name = "8259 (slave)",
.start = 0xa0, .start = 0xa0,
.end = 0xa1, .end = 0xa1,
.flags = IORESOURCE_BUSY, .flags = IORESOURCE_IO | IORESOURCE_BUSY,
}; };
static struct resource pic_edgectrl_iores = { static struct resource pic_edgectrl_iores = {
.name = "8259 edge control", .name = "8259 edge control",
.start = 0x4d0, .start = 0x4d0,
.end = 0x4d1, .end = 0x4d1,
.flags = IORESOURCE_BUSY, .flags = IORESOURCE_IO | IORESOURCE_BUSY,
}; };
static int i8259_host_match(struct irq_domain *h, struct device_node *node, static int i8259_host_match(struct irq_domain *h, struct device_node *node,
......
...@@ -289,14 +289,14 @@ static struct resource pic1_io_resource = { ...@@ -289,14 +289,14 @@ static struct resource pic1_io_resource = {
.name = "pic1", .name = "pic1",
.start = PIC_MASTER_CMD, .start = PIC_MASTER_CMD,
.end = PIC_MASTER_IMR, .end = PIC_MASTER_IMR,
.flags = IORESOURCE_BUSY .flags = IORESOURCE_IO | IORESOURCE_BUSY
}; };
static struct resource pic2_io_resource = { static struct resource pic2_io_resource = {
.name = "pic2", .name = "pic2",
.start = PIC_SLAVE_CMD, .start = PIC_SLAVE_CMD,
.end = PIC_SLAVE_IMR, .end = PIC_SLAVE_IMR,
.flags = IORESOURCE_BUSY .flags = IORESOURCE_IO | IORESOURCE_BUSY
}; };
static int i8259A_irq_domain_map(struct irq_domain *d, unsigned int virq, static int i8259A_irq_domain_map(struct irq_domain *d, unsigned int virq,
......
...@@ -142,7 +142,7 @@ int pci_host_common_probe(struct platform_device *pdev, ...@@ -142,7 +142,7 @@ int pci_host_common_probe(struct platform_device *pdev,
/* Do not reassign resources if probe only */ /* Do not reassign resources if probe only */
if (!pci_has_flag(PCI_PROBE_ONLY)) if (!pci_has_flag(PCI_PROBE_ONLY))
pci_add_flags(PCI_REASSIGN_ALL_RSRC | PCI_REASSIGN_ALL_BUS); pci_add_flags(PCI_REASSIGN_ALL_BUS);
list_splice_init(&resources, &bridge->windows); list_splice_init(&resources, &bridge->windows);
bridge->dev.parent = dev; bridge->dev.parent = dev;
......
...@@ -2382,7 +2382,6 @@ static int tegra_pcie_probe(struct platform_device *pdev) ...@@ -2382,7 +2382,6 @@ static int tegra_pcie_probe(struct platform_device *pdev)
tegra_pcie_enable_ports(pcie); tegra_pcie_enable_ports(pcie);
pci_add_flags(PCI_REASSIGN_ALL_RSRC | PCI_REASSIGN_ALL_BUS);
host->busnr = pcie->busn.start; host->busnr = pcie->busn.start;
host->dev.parent = &pdev->dev; host->dev.parent = &pdev->dev;
host->ops = &tegra_pcie_ops; host->ops = &tegra_pcie_ops;
......
...@@ -202,7 +202,7 @@ static int versatile_pci_probe(struct platform_device *pdev) ...@@ -202,7 +202,7 @@ static int versatile_pci_probe(struct platform_device *pdev)
writel(0, versatile_cfg_base[0] + PCI_INTERRUPT_LINE); writel(0, versatile_cfg_base[0] + PCI_INTERRUPT_LINE);
pci_add_flags(PCI_ENABLE_PROC_DOMAINS); pci_add_flags(PCI_ENABLE_PROC_DOMAINS);
pci_add_flags(PCI_REASSIGN_ALL_BUS | PCI_REASSIGN_ALL_RSRC); pci_add_flags(PCI_REASSIGN_ALL_BUS);
list_splice_init(&pci_res, &bridge->windows); list_splice_init(&pci_res, &bridge->windows);
bridge->dev.parent = dev; bridge->dev.parent = dev;
......
...@@ -459,7 +459,7 @@ static int rcar_pcie_enable(struct rcar_pcie *pcie) ...@@ -459,7 +459,7 @@ static int rcar_pcie_enable(struct rcar_pcie *pcie)
rcar_pcie_setup(&bridge->windows, pcie); rcar_pcie_setup(&bridge->windows, pcie);
pci_add_flags(PCI_REASSIGN_ALL_RSRC | PCI_REASSIGN_ALL_BUS); pci_add_flags(PCI_REASSIGN_ALL_BUS);
bridge->dev.parent = dev; bridge->dev.parent = dev;
bridge->sysdata = pcie; bridge->sysdata = pcie;
......
...@@ -1216,14 +1216,9 @@ static int pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, ...@@ -1216,14 +1216,9 @@ static int pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr,
if (res->flags & IORESOURCE_MEM && iomem_is_exclusive(res->start)) if (res->flags & IORESOURCE_MEM && iomem_is_exclusive(res->start))
return -EINVAL; return -EINVAL;
if (!pci_mmap_fits(pdev, bar, vma, PCI_MMAP_SYSFS)) { if (!pci_mmap_fits(pdev, bar, vma, PCI_MMAP_SYSFS))
WARN(1, "process \"%s\" tried to map 0x%08lx bytes at page 0x%08lx on %s BAR %d (start 0x%16Lx, size 0x%16Lx)\n",
current->comm, vma->vm_end-vma->vm_start, vma->vm_pgoff,
pci_name(pdev), bar,
(u64)pci_resource_start(pdev, bar),
(u64)pci_resource_len(pdev, bar));
return -EINVAL; return -EINVAL;
}
mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io; mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io;
return pci_mmap_resource_range(pdev, bar, vma, mmap_type, write_combine); return pci_mmap_resource_range(pdev, bar, vma, mmap_type, write_combine);
......
...@@ -92,15 +92,15 @@ size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size) ...@@ -92,15 +92,15 @@ size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size)
void __iomem *pds; void __iomem *pds;
/* Standard PCI ROMs start out with these bytes 55 AA */ /* Standard PCI ROMs start out with these bytes 55 AA */
if (readw(image) != 0xAA55) { if (readw(image) != 0xAA55) {
pci_err(pdev, "Invalid PCI ROM header signature: expecting 0xaa55, got %#06x\n", pci_info(pdev, "Invalid PCI ROM header signature: expecting 0xaa55, got %#06x\n",
readw(image)); readw(image));
break; break;
} }
/* get the PCI data structure and check its "PCIR" signature */ /* get the PCI data structure and check its "PCIR" signature */
pds = image + readw(image + 24); pds = image + readw(image + 24);
if (readl(pds) != 0x52494350) { if (readl(pds) != 0x52494350) {
pci_err(pdev, "Invalid PCI ROM data signature: expecting 0x52494350, got %#010x\n", pci_info(pdev, "Invalid PCI ROM data signature: expecting 0x52494350, got %#010x\n",
readl(pds)); readl(pds));
break; break;
} }
last_image = readb(pds + 21) & 0x80; last_image = readb(pds + 21) & 0x80;
......
...@@ -422,7 +422,10 @@ static const char *vgacon_startup(void) ...@@ -422,7 +422,10 @@ static const char *vgacon_startup(void)
vga_video_port_val = VGA_CRT_DM; vga_video_port_val = VGA_CRT_DM;
if ((screen_info.orig_video_ega_bx & 0xff) != 0x10) { if ((screen_info.orig_video_ega_bx & 0xff) != 0x10) {
static struct resource ega_console_resource = static struct resource ega_console_resource =
{ .name = "ega", .start = 0x3B0, .end = 0x3BF }; { .name = "ega",
.flags = IORESOURCE_IO,
.start = 0x3B0,
.end = 0x3BF };
vga_video_type = VIDEO_TYPE_EGAM; vga_video_type = VIDEO_TYPE_EGAM;
vga_vram_size = 0x8000; vga_vram_size = 0x8000;
display_desc = "EGA+"; display_desc = "EGA+";
...@@ -430,9 +433,15 @@ static const char *vgacon_startup(void) ...@@ -430,9 +433,15 @@ static const char *vgacon_startup(void)
&ega_console_resource); &ega_console_resource);
} else { } else {
static struct resource mda1_console_resource = static struct resource mda1_console_resource =
{ .name = "mda", .start = 0x3B0, .end = 0x3BB }; { .name = "mda",
.flags = IORESOURCE_IO,
.start = 0x3B0,
.end = 0x3BB };
static struct resource mda2_console_resource = static struct resource mda2_console_resource =
{ .name = "mda", .start = 0x3BF, .end = 0x3BF }; { .name = "mda",
.flags = IORESOURCE_IO,
.start = 0x3BF,
.end = 0x3BF };
vga_video_type = VIDEO_TYPE_MDA; vga_video_type = VIDEO_TYPE_MDA;
vga_vram_size = 0x2000; vga_vram_size = 0x2000;
display_desc = "*MDA"; display_desc = "*MDA";
...@@ -454,15 +463,21 @@ static const char *vgacon_startup(void) ...@@ -454,15 +463,21 @@ static const char *vgacon_startup(void)
vga_vram_size = 0x8000; vga_vram_size = 0x8000;
if (!screen_info.orig_video_isVGA) { if (!screen_info.orig_video_isVGA) {
static struct resource ega_console_resource static struct resource ega_console_resource =
= { .name = "ega", .start = 0x3C0, .end = 0x3DF }; { .name = "ega",
.flags = IORESOURCE_IO,
.start = 0x3C0,
.end = 0x3DF };
vga_video_type = VIDEO_TYPE_EGAC; vga_video_type = VIDEO_TYPE_EGAC;
display_desc = "EGA"; display_desc = "EGA";
request_resource(&ioport_resource, request_resource(&ioport_resource,
&ega_console_resource); &ega_console_resource);
} else { } else {
static struct resource vga_console_resource static struct resource vga_console_resource =
= { .name = "vga+", .start = 0x3C0, .end = 0x3DF }; { .name = "vga+",
.flags = IORESOURCE_IO,
.start = 0x3C0,
.end = 0x3DF };
vga_video_type = VIDEO_TYPE_VGAC; vga_video_type = VIDEO_TYPE_VGAC;
display_desc = "VGA+"; display_desc = "VGA+";
request_resource(&ioport_resource, request_resource(&ioport_resource,
...@@ -494,7 +509,10 @@ static const char *vgacon_startup(void) ...@@ -494,7 +509,10 @@ static const char *vgacon_startup(void)
} }
} else { } else {
static struct resource cga_console_resource = static struct resource cga_console_resource =
{ .name = "cga", .start = 0x3D4, .end = 0x3D5 }; { .name = "cga",
.flags = IORESOURCE_IO,
.start = 0x3D4,
.end = 0x3D5 };
vga_video_type = VIDEO_TYPE_CGA; vga_video_type = VIDEO_TYPE_CGA;
vga_vram_size = 0x2000; vga_vram_size = 0x2000;
display_desc = "*CGA"; display_desc = "*CGA";
......
...@@ -1022,6 +1022,7 @@ static void __init __reserve_region_with_split(struct resource *root, ...@@ -1022,6 +1022,7 @@ static void __init __reserve_region_with_split(struct resource *root,
struct resource *conflict; struct resource *conflict;
struct resource *res = alloc_resource(GFP_ATOMIC); struct resource *res = alloc_resource(GFP_ATOMIC);
struct resource *next_res = NULL; struct resource *next_res = NULL;
int type = resource_type(root);
if (!res) if (!res)
return; return;
...@@ -1029,7 +1030,7 @@ static void __init __reserve_region_with_split(struct resource *root, ...@@ -1029,7 +1030,7 @@ static void __init __reserve_region_with_split(struct resource *root,
res->name = name; res->name = name;
res->start = start; res->start = start;
res->end = end; res->end = end;
res->flags = IORESOURCE_BUSY; res->flags = type | IORESOURCE_BUSY;
res->desc = IORES_DESC_NONE; res->desc = IORES_DESC_NONE;
while (1) { while (1) {
...@@ -1064,7 +1065,7 @@ static void __init __reserve_region_with_split(struct resource *root, ...@@ -1064,7 +1065,7 @@ static void __init __reserve_region_with_split(struct resource *root,
next_res->name = name; next_res->name = name;
next_res->start = conflict->end + 1; next_res->start = conflict->end + 1;
next_res->end = end; next_res->end = end;
next_res->flags = IORESOURCE_BUSY; next_res->flags = type | IORESOURCE_BUSY;
next_res->desc = IORES_DESC_NONE; next_res->desc = IORES_DESC_NONE;
} }
} else { } else {
...@@ -1478,7 +1479,7 @@ void __devm_release_region(struct device *dev, struct resource *parent, ...@@ -1478,7 +1479,7 @@ void __devm_release_region(struct device *dev, struct resource *parent,
EXPORT_SYMBOL(__devm_release_region); 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 #define MAXRESERVE 4
static int __init reserve_setup(char *str) static int __init reserve_setup(char *str)
...@@ -1489,26 +1490,38 @@ static int __init reserve_setup(char *str) ...@@ -1489,26 +1490,38 @@ static int __init reserve_setup(char *str)
for (;;) { for (;;) {
unsigned int io_start, io_num; unsigned int io_start, io_num;
int x = reserved; int x = reserved;
struct resource *parent;
if (get_option (&str, &io_start) != 2) if (get_option(&str, &io_start) != 2)
break; break;
if (get_option (&str, &io_num) == 0) if (get_option(&str, &io_num) == 0)
break; break;
if (x < MAXRESERVE) { if (x < MAXRESERVE) {
struct resource *res = reserve + x; 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->name = "reserved";
res->start = io_start; res->start = io_start;
res->end = io_start + io_num - 1; res->end = io_start + io_num - 1;
res->flags = IORESOURCE_BUSY; res->flags |= IORESOURCE_BUSY;
res->desc = IORES_DESC_NONE; res->desc = IORES_DESC_NONE;
res->child = NULL; res->child = NULL;
if (request_resource(res->start >= 0x10000 ? &iomem_resource : &ioport_resource, res) == 0) if (request_resource(parent, res) == 0)
reserved = x+1; reserved = x+1;
} }
} }
return 1; return 1;
} }
__setup("reserve=", reserve_setup); __setup("reserve=", reserve_setup);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment