diff options
Diffstat (limited to 'drivers/pci/rom.c')
-rw-r--r-- | drivers/pci/rom.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c index f5ee7ce16fa6..d087e0817715 100644 --- a/drivers/pci/rom.c +++ b/drivers/pci/rom.c | |||
@@ -71,13 +71,18 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size) | |||
71 | void __iomem *image; | 71 | void __iomem *image; |
72 | int last_image; | 72 | int last_image; |
73 | 73 | ||
74 | /* IORESOURCE_ROM_SHADOW only set on x86 */ | 74 | /* |
75 | * IORESOURCE_ROM_SHADOW set on x86, x86_64 and IA64 supports legacy | ||
76 | * memory map if the VGA enable bit of the Bridge Control register is | ||
77 | * set for embedded VGA. | ||
78 | */ | ||
75 | if (res->flags & IORESOURCE_ROM_SHADOW) { | 79 | if (res->flags & IORESOURCE_ROM_SHADOW) { |
76 | /* primary video rom always starts here */ | 80 | /* primary video rom always starts here */ |
77 | start = (loff_t)0xC0000; | 81 | start = (loff_t)0xC0000; |
78 | *size = 0x20000; /* cover C000:0 through E000:0 */ | 82 | *size = 0x20000; /* cover C000:0 through E000:0 */ |
79 | } else { | 83 | } else { |
80 | if (res->flags & IORESOURCE_ROM_COPY) { | 84 | if (res->flags & |
85 | (IORESOURCE_ROM_COPY | IORESOURCE_ROM_BIOS_COPY)) { | ||
81 | *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); | 86 | *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); |
82 | return (void __iomem *)(unsigned long) | 87 | return (void __iomem *)(unsigned long) |
83 | pci_resource_start(pdev, PCI_ROM_RESOURCE); | 88 | pci_resource_start(pdev, PCI_ROM_RESOURCE); |
@@ -161,7 +166,8 @@ void __iomem *pci_map_rom_copy(struct pci_dev *pdev, size_t *size) | |||
161 | if (!rom) | 166 | if (!rom) |
162 | return NULL; | 167 | return NULL; |
163 | 168 | ||
164 | if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_SHADOW)) | 169 | if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_SHADOW | |
170 | IORESOURCE_ROM_BIOS_COPY)) | ||
165 | return rom; | 171 | return rom; |
166 | 172 | ||
167 | res->start = (unsigned long)kmalloc(*size, GFP_KERNEL); | 173 | res->start = (unsigned long)kmalloc(*size, GFP_KERNEL); |
@@ -187,7 +193,7 @@ void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom) | |||
187 | { | 193 | { |
188 | struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; | 194 | struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; |
189 | 195 | ||
190 | if (res->flags & IORESOURCE_ROM_COPY) | 196 | if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_BIOS_COPY)) |
191 | return; | 197 | return; |
192 | 198 | ||
193 | iounmap(rom); | 199 | iounmap(rom); |
@@ -211,6 +217,7 @@ void pci_remove_rom(struct pci_dev *pdev) | |||
211 | sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr); | 217 | sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr); |
212 | if (!(res->flags & (IORESOURCE_ROM_ENABLE | | 218 | if (!(res->flags & (IORESOURCE_ROM_ENABLE | |
213 | IORESOURCE_ROM_SHADOW | | 219 | IORESOURCE_ROM_SHADOW | |
220 | IORESOURCE_ROM_BIOS_COPY | | ||
214 | IORESOURCE_ROM_COPY))) | 221 | IORESOURCE_ROM_COPY))) |
215 | pci_disable_rom(pdev); | 222 | pci_disable_rom(pdev); |
216 | } | 223 | } |