diff options
Diffstat (limited to 'arch/x86_64/pci/mmconfig.c')
-rw-r--r-- | arch/x86_64/pci/mmconfig.c | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/arch/x86_64/pci/mmconfig.c b/arch/x86_64/pci/mmconfig.c index 3c55c76c6fd5..7732f4254d21 100644 --- a/arch/x86_64/pci/mmconfig.c +++ b/arch/x86_64/pci/mmconfig.c | |||
@@ -156,15 +156,45 @@ static __init void unreachable_devices(void) | |||
156 | addr = pci_dev_base(0, k, PCI_DEVFN(i, 0)); | 156 | addr = pci_dev_base(0, k, PCI_DEVFN(i, 0)); |
157 | if (addr == NULL|| readl(addr) != val1) { | 157 | if (addr == NULL|| readl(addr) != val1) { |
158 | set_bit(i + 32*k, fallback_slots); | 158 | set_bit(i + 32*k, fallback_slots); |
159 | printk(KERN_NOTICE | 159 | printk(KERN_NOTICE "PCI: No mmconfig possible" |
160 | "PCI: No mmconfig possible on device %x:%x\n", | 160 | " on device %02x:%02x\n", k, i); |
161 | k, i); | ||
162 | } | 161 | } |
163 | } | 162 | } |
164 | } | 163 | } |
165 | } | 164 | } |
166 | 165 | ||
167 | void __init pci_mmcfg_init(void) | 166 | static __init void pci_mmcfg_insert_resources(void) |
167 | { | ||
168 | #define PCI_MMCFG_RESOURCE_NAME_LEN 19 | ||
169 | int i; | ||
170 | struct resource *res; | ||
171 | char *names; | ||
172 | unsigned num_buses; | ||
173 | |||
174 | res = kcalloc(PCI_MMCFG_RESOURCE_NAME_LEN + sizeof(*res), | ||
175 | pci_mmcfg_config_num, GFP_KERNEL); | ||
176 | |||
177 | if (!res) { | ||
178 | printk(KERN_ERR "PCI: Unable to allocate MMCONFIG resources\n"); | ||
179 | return; | ||
180 | } | ||
181 | |||
182 | names = (void *)&res[pci_mmcfg_config_num]; | ||
183 | for (i = 0; i < pci_mmcfg_config_num; i++, res++) { | ||
184 | num_buses = pci_mmcfg_config[i].end_bus_number - | ||
185 | pci_mmcfg_config[i].start_bus_number + 1; | ||
186 | res->name = names; | ||
187 | snprintf(names, PCI_MMCFG_RESOURCE_NAME_LEN, "PCI MMCONFIG %u", | ||
188 | pci_mmcfg_config[i].pci_segment_group_number); | ||
189 | res->start = pci_mmcfg_config[i].base_address; | ||
190 | res->end = res->start + (num_buses << 20) - 1; | ||
191 | res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; | ||
192 | insert_resource(&iomem_resource, res); | ||
193 | names += PCI_MMCFG_RESOURCE_NAME_LEN; | ||
194 | } | ||
195 | } | ||
196 | |||
197 | void __init pci_mmcfg_init(int type) | ||
168 | { | 198 | { |
169 | int i; | 199 | int i; |
170 | 200 | ||
@@ -177,7 +207,9 @@ void __init pci_mmcfg_init(void) | |||
177 | (pci_mmcfg_config[0].base_address == 0)) | 207 | (pci_mmcfg_config[0].base_address == 0)) |
178 | return; | 208 | return; |
179 | 209 | ||
180 | if (!e820_all_mapped(pci_mmcfg_config[0].base_address, | 210 | /* Only do this check when type 1 works. If it doesn't work |
211 | assume we run on a Mac and always use MCFG */ | ||
212 | if (type == 1 && !e820_all_mapped(pci_mmcfg_config[0].base_address, | ||
181 | pci_mmcfg_config[0].base_address + MMCONFIG_APER_MIN, | 213 | pci_mmcfg_config[0].base_address + MMCONFIG_APER_MIN, |
182 | E820_RESERVED)) { | 214 | E820_RESERVED)) { |
183 | printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %x is not E820-reserved\n", | 215 | printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %x is not E820-reserved\n", |
@@ -186,7 +218,6 @@ void __init pci_mmcfg_init(void) | |||
186 | return; | 218 | return; |
187 | } | 219 | } |
188 | 220 | ||
189 | /* RED-PEN i386 doesn't do _nocache right now */ | ||
190 | pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL); | 221 | pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL); |
191 | if (pci_mmcfg_virt == NULL) { | 222 | if (pci_mmcfg_virt == NULL) { |
192 | printk("PCI: Can not allocate memory for mmconfig structures\n"); | 223 | printk("PCI: Can not allocate memory for mmconfig structures\n"); |
@@ -205,6 +236,7 @@ void __init pci_mmcfg_init(void) | |||
205 | } | 236 | } |
206 | 237 | ||
207 | unreachable_devices(); | 238 | unreachable_devices(); |
239 | pci_mmcfg_insert_resources(); | ||
208 | 240 | ||
209 | raw_pci_ops = &pci_mmcfg; | 241 | raw_pci_ops = &pci_mmcfg; |
210 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; | 242 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; |