Merge branch 'pci/resource' into next
* pci/resource: PCI: Simplify pci_create_attr() control flow PCI: Don't leak memory if sysfs_create_bin_file() fails PCI: Simplify sysfs ROM cleanup PCI: Remove unused IORESOURCE_ROM_COPY and IORESOURCE_ROM_BIOS_COPY MIPS: Loongson 3: Keep CPU physical (not virtual) addresses in shadow ROM resource MIPS: Loongson 3: Use temporary struct resource * to avoid repetition ia64/PCI: Keep CPU physical (not virtual) addresses in shadow ROM resource ia64/PCI: Use ioremap() instead of open-coded equivalent ia64/PCI: Use temporary struct resource * to avoid repetition PCI: Clean up pci_map_rom() whitespace PCI: Remove arch-specific IORESOURCE_ROM_SHADOW size from sysfs PCI: Set ROM shadow location in arch code, not in PCI core PCI: Don't enable/disable ROM BAR if we're using a RAM shadow copy PCI: Don't assign or reassign immutable resources PCI: Mark shadow copy of VGA ROM as IORESOURCE_PCI_FIXED x86/PCI: Mark Broadwell-EP Home Agent & PCU as having non-compliant BARs PCI: Disable IO/MEM decoding for devices with non-compliant BARs
This commit is contained in:
@@ -17,14 +17,14 @@
|
||||
*
|
||||
* The standard boot ROM sequence for an x86 machine uses the BIOS
|
||||
* to select an initial video card for boot display. This boot video
|
||||
* card will have it's BIOS copied to C0000 in system RAM.
|
||||
* card will have its BIOS copied to 0xC0000 in system RAM.
|
||||
* IORESOURCE_ROM_SHADOW is used to associate the boot video
|
||||
* card with this copy. On laptops this copy has to be used since
|
||||
* the main ROM may be compressed or combined with another image.
|
||||
* See pci_map_rom() for use of this flag. Before marking the device
|
||||
* with IORESOURCE_ROM_SHADOW check if a vga_default_device is already set
|
||||
* by either arch cde or vga-arbitration, if so only apply the fixup to this
|
||||
* already determined primary video card.
|
||||
* by either arch code or vga-arbitration; if so only apply the fixup to this
|
||||
* already-determined primary video card.
|
||||
*/
|
||||
|
||||
static void pci_fixup_video(struct pci_dev *pdev)
|
||||
@@ -32,6 +32,7 @@ static void pci_fixup_video(struct pci_dev *pdev)
|
||||
struct pci_dev *bridge;
|
||||
struct pci_bus *bus;
|
||||
u16 config;
|
||||
struct resource *res;
|
||||
|
||||
if ((strcmp(ia64_platform_name, "dig") != 0)
|
||||
&& (strcmp(ia64_platform_name, "hpzx1") != 0))
|
||||
@@ -61,8 +62,18 @@ static void pci_fixup_video(struct pci_dev *pdev)
|
||||
if (!vga_default_device() || pdev == vga_default_device()) {
|
||||
pci_read_config_word(pdev, PCI_COMMAND, &config);
|
||||
if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
|
||||
pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
|
||||
dev_printk(KERN_DEBUG, &pdev->dev, "Video device with shadowed ROM\n");
|
||||
res = &pdev->resource[PCI_ROM_RESOURCE];
|
||||
|
||||
pci_disable_rom(pdev);
|
||||
if (res->parent)
|
||||
release_resource(res);
|
||||
|
||||
res->start = 0xC0000;
|
||||
res->end = res->start + 0x20000 - 1;
|
||||
res->flags = IORESOURCE_MEM | IORESOURCE_ROM_SHADOW |
|
||||
IORESOURCE_PCI_FIXED;
|
||||
dev_info(&pdev->dev, "Video device with shadowed ROM at %pR\n",
|
||||
res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -429,7 +429,8 @@ sn_acpi_slot_fixup(struct pci_dev *dev)
|
||||
void __iomem *addr;
|
||||
struct pcidev_info *pcidev_info = NULL;
|
||||
struct sn_irq_info *sn_irq_info = NULL;
|
||||
size_t image_size, size;
|
||||
struct resource *res;
|
||||
size_t size;
|
||||
|
||||
if (sn_acpi_get_pcidev_info(dev, &pcidev_info, &sn_irq_info)) {
|
||||
panic("%s: Failure obtaining pcidev_info for %s\n",
|
||||
@@ -443,17 +444,20 @@ sn_acpi_slot_fixup(struct pci_dev *dev)
|
||||
* of the shadowed copy, and the actual length of the ROM image.
|
||||
*/
|
||||
size = pci_resource_len(dev, PCI_ROM_RESOURCE);
|
||||
addr = ioremap(pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE],
|
||||
size);
|
||||
image_size = pci_get_rom_size(dev, addr, size);
|
||||
dev->resource[PCI_ROM_RESOURCE].start = (unsigned long) addr;
|
||||
dev->resource[PCI_ROM_RESOURCE].end =
|
||||
(unsigned long) addr + image_size - 1;
|
||||
dev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_BIOS_COPY;
|
||||
|
||||
res = &dev->resource[PCI_ROM_RESOURCE];
|
||||
|
||||
pci_disable_rom(dev);
|
||||
if (res->parent)
|
||||
release_resource(res);
|
||||
|
||||
res->start = pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE];
|
||||
res->end = res->start + size - 1;
|
||||
res->flags = IORESOURCE_MEM | IORESOURCE_ROM_SHADOW |
|
||||
IORESOURCE_PCI_FIXED;
|
||||
}
|
||||
sn_pci_fixup_slot(dev, pcidev_info, sn_irq_info);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(sn_acpi_slot_fixup);
|
||||
|
||||
|
||||
|
@@ -150,7 +150,8 @@ void
|
||||
sn_io_slot_fixup(struct pci_dev *dev)
|
||||
{
|
||||
int idx;
|
||||
unsigned long addr, end, size, start;
|
||||
struct resource *res;
|
||||
unsigned long addr, size;
|
||||
struct pcidev_info *pcidev_info;
|
||||
struct sn_irq_info *sn_irq_info;
|
||||
int status;
|
||||
@@ -175,55 +176,41 @@ sn_io_slot_fixup(struct pci_dev *dev)
|
||||
|
||||
/* Copy over PIO Mapped Addresses */
|
||||
for (idx = 0; idx <= PCI_ROM_RESOURCE; idx++) {
|
||||
|
||||
if (!pcidev_info->pdi_pio_mapped_addr[idx]) {
|
||||
if (!pcidev_info->pdi_pio_mapped_addr[idx])
|
||||
continue;
|
||||
}
|
||||
|
||||
start = dev->resource[idx].start;
|
||||
end = dev->resource[idx].end;
|
||||
size = end - start;
|
||||
if (size == 0) {
|
||||
res = &dev->resource[idx];
|
||||
|
||||
size = res->end - res->start;
|
||||
if (size == 0)
|
||||
continue;
|
||||
}
|
||||
addr = pcidev_info->pdi_pio_mapped_addr[idx];
|
||||
addr = ((addr << 4) >> 4) | __IA64_UNCACHED_OFFSET;
|
||||
dev->resource[idx].start = addr;
|
||||
dev->resource[idx].end = addr + size;
|
||||
|
||||
res->start = pcidev_info->pdi_pio_mapped_addr[idx];
|
||||
res->end = addr + size;
|
||||
|
||||
/*
|
||||
* if it's already in the device structure, remove it before
|
||||
* inserting
|
||||
*/
|
||||
if (dev->resource[idx].parent && dev->resource[idx].parent->child)
|
||||
release_resource(&dev->resource[idx]);
|
||||
if (res->parent && res->parent->child)
|
||||
release_resource(res);
|
||||
|
||||
if (dev->resource[idx].flags & IORESOURCE_IO)
|
||||
insert_resource(&ioport_resource, &dev->resource[idx]);
|
||||
if (res->flags & IORESOURCE_IO)
|
||||
insert_resource(&ioport_resource, res);
|
||||
else
|
||||
insert_resource(&iomem_resource, &dev->resource[idx]);
|
||||
insert_resource(&iomem_resource, res);
|
||||
/*
|
||||
* If ROM, set the actual ROM image size, and mark as
|
||||
* shadowed in PROM.
|
||||
* If ROM, mark as shadowed in PROM.
|
||||
*/
|
||||
if (idx == PCI_ROM_RESOURCE) {
|
||||
size_t image_size;
|
||||
void __iomem *rom;
|
||||
|
||||
rom = ioremap(pci_resource_start(dev, PCI_ROM_RESOURCE),
|
||||
size + 1);
|
||||
image_size = pci_get_rom_size(dev, rom, size + 1);
|
||||
dev->resource[PCI_ROM_RESOURCE].end =
|
||||
dev->resource[PCI_ROM_RESOURCE].start +
|
||||
image_size - 1;
|
||||
dev->resource[PCI_ROM_RESOURCE].flags |=
|
||||
IORESOURCE_ROM_BIOS_COPY;
|
||||
pci_disable_rom(dev);
|
||||
res->flags = IORESOURCE_MEM | IORESOURCE_ROM_SHADOW |
|
||||
IORESOURCE_PCI_FIXED;
|
||||
}
|
||||
}
|
||||
|
||||
sn_pci_fixup_slot(dev, pcidev_info, sn_irq_info);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(sn_io_slot_fixup);
|
||||
|
||||
/*
|
||||
|
Fai riferimento in un nuovo problema
Block a user