|
@@ -31,11 +31,8 @@
|
|
#include <linux/ioport.h>
|
|
#include <linux/ioport.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/bootmem.h>
|
|
#include <linux/bootmem.h>
|
|
-#include <linux/acpi.h>
|
|
|
|
|
|
|
|
#include <asm/pat.h>
|
|
#include <asm/pat.h>
|
|
-#include <asm/hpet.h>
|
|
|
|
-#include <asm/io_apic.h>
|
|
|
|
#include <asm/e820.h>
|
|
#include <asm/e820.h>
|
|
|
|
|
|
#include "pci.h"
|
|
#include "pci.h"
|
|
@@ -81,77 +78,6 @@ pcibios_align_resource(void *data, struct resource *res,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(pcibios_align_resource);
|
|
EXPORT_SYMBOL(pcibios_align_resource);
|
|
|
|
|
|
-static int check_res_with_valid(struct pci_dev *dev, struct resource *res)
|
|
|
|
-{
|
|
|
|
- unsigned long base;
|
|
|
|
- unsigned long size;
|
|
|
|
- int i;
|
|
|
|
-
|
|
|
|
- base = res->start;
|
|
|
|
- size = (res->start == 0 && res->end == res->start) ? 0 :
|
|
|
|
- (res->end - res->start + 1);
|
|
|
|
-
|
|
|
|
- if (!base || !size)
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
-#ifdef CONFIG_HPET_TIMER
|
|
|
|
- /* for hpet */
|
|
|
|
- if (base == hpet_address && (res->flags & IORESOURCE_MEM)) {
|
|
|
|
- dev_info(&dev->dev, "BAR has HPET at %08lx-%08lx\n",
|
|
|
|
- base, base + size - 1);
|
|
|
|
- return 1;
|
|
|
|
- }
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#ifdef CONFIG_X86_IO_APIC
|
|
|
|
- for (i = 0; i < nr_ioapics; i++) {
|
|
|
|
- unsigned long ioapic_phys = mp_ioapics[i].mp_apicaddr;
|
|
|
|
-
|
|
|
|
- if (base == ioapic_phys && (res->flags & IORESOURCE_MEM)) {
|
|
|
|
- dev_info(&dev->dev, "BAR has ioapic at %08lx-%08lx\n",
|
|
|
|
- base, base + size - 1);
|
|
|
|
- return 1;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#ifdef CONFIG_PCI_MMCONFIG
|
|
|
|
- for (i = 0; i < pci_mmcfg_config_num; i++) {
|
|
|
|
- unsigned long addr;
|
|
|
|
-
|
|
|
|
- addr = pci_mmcfg_config[i].address;
|
|
|
|
- if (base == addr && (res->flags & IORESOURCE_MEM)) {
|
|
|
|
- dev_info(&dev->dev, "BAR has MMCONFIG at %08lx-%08lx\n",
|
|
|
|
- base, base + size - 1);
|
|
|
|
- return 1;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int check_platform(struct pci_dev *dev, struct resource *res)
|
|
|
|
-{
|
|
|
|
- struct resource *root = NULL;
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * forcibly insert it into the
|
|
|
|
- * resource tree
|
|
|
|
- */
|
|
|
|
- if (res->flags & IORESOURCE_MEM)
|
|
|
|
- root = &iomem_resource;
|
|
|
|
- else if (res->flags & IORESOURCE_IO)
|
|
|
|
- root = &ioport_resource;
|
|
|
|
-
|
|
|
|
- if (root && check_res_with_valid(dev, res)) {
|
|
|
|
- insert_resource(root, res);
|
|
|
|
-
|
|
|
|
- return 1;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
/*
|
|
/*
|
|
* Handle resources of PCI devices. If the world were perfect, we could
|
|
* Handle resources of PCI devices. If the world were perfect, we could
|
|
* just allocate all the resource regions and do nothing more. It isn't.
|
|
* just allocate all the resource regions and do nothing more. It isn't.
|
|
@@ -203,8 +129,6 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
|
|
pr = pci_find_parent_resource(dev, r);
|
|
pr = pci_find_parent_resource(dev, r);
|
|
if (!r->start || !pr ||
|
|
if (!r->start || !pr ||
|
|
request_resource(pr, r) < 0) {
|
|
request_resource(pr, r) < 0) {
|
|
- if (check_platform(dev, r))
|
|
|
|
- continue;
|
|
|
|
dev_err(&dev->dev, "BAR %d: can't allocate resource\n", idx);
|
|
dev_err(&dev->dev, "BAR %d: can't allocate resource\n", idx);
|
|
/*
|
|
/*
|
|
* Something is wrong with the region.
|
|
* Something is wrong with the region.
|
|
@@ -246,8 +170,6 @@ static void __init pcibios_allocate_resources(int pass)
|
|
r->flags, disabled, pass);
|
|
r->flags, disabled, pass);
|
|
pr = pci_find_parent_resource(dev, r);
|
|
pr = pci_find_parent_resource(dev, r);
|
|
if (!pr || request_resource(pr, r) < 0) {
|
|
if (!pr || request_resource(pr, r) < 0) {
|
|
- if (check_platform(dev, r))
|
|
|
|
- continue;
|
|
|
|
dev_err(&dev->dev, "BAR %d: can't allocate resource\n", idx);
|
|
dev_err(&dev->dev, "BAR %d: can't allocate resource\n", idx);
|
|
/* We'll assign a new address later */
|
|
/* We'll assign a new address later */
|
|
r->end -= r->start;
|
|
r->end -= r->start;
|
|
@@ -306,6 +228,8 @@ void __init pcibios_resource_survey(void)
|
|
pcibios_allocate_bus_resources(&pci_root_buses);
|
|
pcibios_allocate_bus_resources(&pci_root_buses);
|
|
pcibios_allocate_resources(0);
|
|
pcibios_allocate_resources(0);
|
|
pcibios_allocate_resources(1);
|
|
pcibios_allocate_resources(1);
|
|
|
|
+
|
|
|
|
+ e820_reserve_resources_late();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|