Merge branch 'pci-for-jesse' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip into x86-merge
Conflicts: drivers/pci/probe.c
This commit is contained in:
@@ -293,7 +293,7 @@ static acpi_status __init find_mboard_resource(acpi_handle handle, u32 lvl,
|
|||||||
return AE_OK;
|
return AE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init is_acpi_reserved(unsigned long start, unsigned long end)
|
static int __init is_acpi_reserved(u64 start, u64 end, unsigned not_used)
|
||||||
{
|
{
|
||||||
struct resource mcfg_res;
|
struct resource mcfg_res;
|
||||||
|
|
||||||
@@ -310,6 +310,41 @@ static int __init is_acpi_reserved(unsigned long start, unsigned long end)
|
|||||||
return mcfg_res.flags;
|
return mcfg_res.flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef int (*check_reserved_t)(u64 start, u64 end, unsigned type);
|
||||||
|
|
||||||
|
static int __init is_mmconf_reserved(check_reserved_t is_reserved,
|
||||||
|
u64 addr, u64 size, int i,
|
||||||
|
typeof(pci_mmcfg_config[0]) *cfg, int with_e820)
|
||||||
|
{
|
||||||
|
u64 old_size = size;
|
||||||
|
int valid = 0;
|
||||||
|
|
||||||
|
while (!is_reserved(addr, addr + size - 1, E820_RESERVED)) {
|
||||||
|
size >>= 1;
|
||||||
|
if (size < (16UL<<20))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size >= (16UL<<20) || size == old_size) {
|
||||||
|
printk(KERN_NOTICE
|
||||||
|
"PCI: MCFG area at %Lx reserved in %s\n",
|
||||||
|
addr, with_e820?"E820":"ACPI motherboard resources");
|
||||||
|
valid = 1;
|
||||||
|
|
||||||
|
if (old_size != size) {
|
||||||
|
/* update end_bus_number */
|
||||||
|
cfg->end_bus_number = cfg->start_bus_number + ((size>>20) - 1);
|
||||||
|
printk(KERN_NOTICE "PCI: updated MCFG configuration %d: base %lx "
|
||||||
|
"segment %hu buses %u - %u\n",
|
||||||
|
i, (unsigned long)cfg->address, cfg->pci_segment,
|
||||||
|
(unsigned int)cfg->start_bus_number,
|
||||||
|
(unsigned int)cfg->end_bus_number);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
static void __init pci_mmcfg_reject_broken(int early)
|
static void __init pci_mmcfg_reject_broken(int early)
|
||||||
{
|
{
|
||||||
typeof(pci_mmcfg_config[0]) *cfg;
|
typeof(pci_mmcfg_config[0]) *cfg;
|
||||||
@@ -324,21 +359,22 @@ static void __init pci_mmcfg_reject_broken(int early)
|
|||||||
|
|
||||||
for (i = 0; i < pci_mmcfg_config_num; i++) {
|
for (i = 0; i < pci_mmcfg_config_num; i++) {
|
||||||
int valid = 0;
|
int valid = 0;
|
||||||
u32 size = (cfg->end_bus_number + 1) << 20;
|
u64 addr, size;
|
||||||
|
|
||||||
cfg = &pci_mmcfg_config[i];
|
cfg = &pci_mmcfg_config[i];
|
||||||
|
addr = cfg->start_bus_number;
|
||||||
|
addr <<= 20;
|
||||||
|
addr += cfg->address;
|
||||||
|
size = cfg->end_bus_number + 1 - cfg->start_bus_number;
|
||||||
|
size <<= 20;
|
||||||
printk(KERN_NOTICE "PCI: MCFG configuration %d: base %lx "
|
printk(KERN_NOTICE "PCI: MCFG configuration %d: base %lx "
|
||||||
"segment %hu buses %u - %u\n",
|
"segment %hu buses %u - %u\n",
|
||||||
i, (unsigned long)cfg->address, cfg->pci_segment,
|
i, (unsigned long)cfg->address, cfg->pci_segment,
|
||||||
(unsigned int)cfg->start_bus_number,
|
(unsigned int)cfg->start_bus_number,
|
||||||
(unsigned int)cfg->end_bus_number);
|
(unsigned int)cfg->end_bus_number);
|
||||||
|
|
||||||
if (!early &&
|
if (!early)
|
||||||
is_acpi_reserved(cfg->address, cfg->address + size - 1)) {
|
valid = is_mmconf_reserved(is_acpi_reserved, addr, size, i, cfg, 0);
|
||||||
printk(KERN_NOTICE "PCI: MCFG area at %Lx reserved "
|
|
||||||
"in ACPI motherboard resources\n",
|
|
||||||
cfg->address);
|
|
||||||
valid = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (valid)
|
if (valid)
|
||||||
continue;
|
continue;
|
||||||
@@ -347,16 +383,11 @@ static void __init pci_mmcfg_reject_broken(int early)
|
|||||||
printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %Lx is not"
|
printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %Lx is not"
|
||||||
" reserved in ACPI motherboard resources\n",
|
" reserved in ACPI motherboard resources\n",
|
||||||
cfg->address);
|
cfg->address);
|
||||||
|
|
||||||
/* Don't try to do this check unless configuration
|
/* Don't try to do this check unless configuration
|
||||||
type 1 is available. how about type 2 ?*/
|
type 1 is available. how about type 2 ?*/
|
||||||
if (raw_pci_ops && e820_all_mapped(cfg->address,
|
if (raw_pci_ops)
|
||||||
cfg->address + size - 1,
|
valid = is_mmconf_reserved(e820_all_mapped, addr, size, i, cfg, 1);
|
||||||
E820_RESERVED)) {
|
|
||||||
printk(KERN_NOTICE
|
|
||||||
"PCI: MCFG area at %Lx reserved in E820\n",
|
|
||||||
cfg->address);
|
|
||||||
valid = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!valid)
|
if (!valid)
|
||||||
goto reject;
|
goto reject;
|
||||||
|
@@ -383,6 +383,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
|
|||||||
res->start = base;
|
res->start = base;
|
||||||
if (!res->end)
|
if (!res->end)
|
||||||
res->end = limit + 0xfff;
|
res->end = limit + 0xfff;
|
||||||
|
printk(KERN_INFO "PCI: bridge %s io port: [%llx, %llx]\n", pci_name(dev), res->start, res->end);
|
||||||
}
|
}
|
||||||
|
|
||||||
res = child->resource[1];
|
res = child->resource[1];
|
||||||
@@ -394,6 +395,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
|
|||||||
res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
|
res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
|
||||||
res->start = base;
|
res->start = base;
|
||||||
res->end = limit + 0xfffff;
|
res->end = limit + 0xfffff;
|
||||||
|
printk(KERN_INFO "PCI: bridge %s 32bit mmio: [%llx, %llx]\n", pci_name(dev), res->start, res->end);
|
||||||
}
|
}
|
||||||
|
|
||||||
res = child->resource[2];
|
res = child->resource[2];
|
||||||
@@ -429,6 +431,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
|
|||||||
res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH;
|
res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH;
|
||||||
res->start = base;
|
res->start = base;
|
||||||
res->end = limit + 0xfffff;
|
res->end = limit + 0xfffff;
|
||||||
|
printk(KERN_INFO "PCI: bridge %s %sbit mmio pref: [%llx, %llx]\n", pci_name(dev), (res->flags & PCI_PREF_RANGE_TYPE_64)?"64":"32",res->start, res->end);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -530,6 +530,36 @@ void __ref pci_bus_assign_resources(struct pci_bus *bus)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pci_bus_assign_resources);
|
EXPORT_SYMBOL(pci_bus_assign_resources);
|
||||||
|
|
||||||
|
static void pci_bus_dump_res(struct pci_bus *bus)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
|
||||||
|
struct resource *res = bus->resource[i];
|
||||||
|
if (!res)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
printk(KERN_INFO "bus: %02x index %x %s: [%llx, %llx]\n", bus->number, i, (res->flags & IORESOURCE_IO)? "io port":"mmio", res->start, res->end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pci_bus_dump_resources(struct pci_bus *bus)
|
||||||
|
{
|
||||||
|
struct pci_bus *b;
|
||||||
|
struct pci_dev *dev;
|
||||||
|
|
||||||
|
|
||||||
|
pci_bus_dump_res(bus);
|
||||||
|
|
||||||
|
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||||
|
b = dev->subordinate;
|
||||||
|
if (!b)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pci_bus_dump_resources(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void __init
|
void __init
|
||||||
pci_assign_unassigned_resources(void)
|
pci_assign_unassigned_resources(void)
|
||||||
{
|
{
|
||||||
@@ -545,4 +575,9 @@ pci_assign_unassigned_resources(void)
|
|||||||
pci_bus_assign_resources(bus);
|
pci_bus_assign_resources(bus);
|
||||||
pci_enable_bridges(bus);
|
pci_enable_bridges(bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* dump the resource on buses */
|
||||||
|
list_for_each_entry(bus, &pci_root_buses, node) {
|
||||||
|
pci_bus_dump_resources(bus);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user