Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 48411
b: refs/heads/master
c: 26054ed
h: refs/heads/master
i:
  48409: 1803693
  48407: 2b4d897
v: v3
  • Loading branch information
OGAWA Hirofumi authored and Andi Kleen committed Feb 13, 2007
1 parent 2256a46 commit eb0ffab
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 21 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 56829d1982b6f1150553c049d372728b9eda5aec
refs/heads/master: 26054ed02bb20f5b2e02d92cb6f0be0e2b0196d5
51 changes: 31 additions & 20 deletions trunk/arch/i386/pci/mmconfig-shared.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,9 +191,16 @@ static void __init pci_mmcfg_insert_resources(void)
}
}

static void __init pci_mmcfg_reject_broken(void)
static void __init pci_mmcfg_reject_broken(int type)
{
typeof(pci_mmcfg_config[0]) *cfg = &pci_mmcfg_config[0];
typeof(pci_mmcfg_config[0]) *cfg;

if ((pci_mmcfg_config_num == 0) ||
(pci_mmcfg_config == NULL) ||
(pci_mmcfg_config[0].address == 0))
return;

cfg = &pci_mmcfg_config[0];

/*
* Handle more broken MCFG tables on Asus etc.
Expand All @@ -202,13 +209,29 @@ static void __init pci_mmcfg_reject_broken(void)
if (pci_mmcfg_config_num == 1 &&
cfg->pci_segment == 0 &&
(cfg->start_bus_number | cfg->end_bus_number) == 0) {
kfree(pci_mmcfg_config);
pci_mmcfg_config = NULL;
pci_mmcfg_config_num = 0;

printk(KERN_ERR "PCI: start and end of bus number is 0. "
"Rejected as broken MCFG.");
"Rejected as broken MCFG.\n");
goto reject;
}

/*
* Only do this check when type 1 works. If it doesn't work
* assume we run on a Mac and always use MCFG
*/
if (type == 1 && !e820_all_mapped(cfg->address,
cfg->address + MMCONFIG_APER_MIN,
E820_RESERVED)) {
printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %Lx is not"
" E820-reserved\n", cfg->address);
goto reject;
}
return;

reject:
printk(KERN_ERR "PCI: Not using MMCONFIG.\n");
kfree(pci_mmcfg_config);
pci_mmcfg_config = NULL;
pci_mmcfg_config_num = 0;
}

void __init pci_mmcfg_init(int type)
Expand All @@ -223,26 +246,14 @@ void __init pci_mmcfg_init(int type)

if (!known_bridge) {
acpi_table_parse(ACPI_SIG_MCFG, acpi_parse_mcfg);
pci_mmcfg_reject_broken();
pci_mmcfg_reject_broken(type);
}

if ((pci_mmcfg_config_num == 0) ||
(pci_mmcfg_config == NULL) ||
(pci_mmcfg_config[0].address == 0))
return;

/* Only do this check when type 1 works. If it doesn't work
assume we run on a Mac and always use MCFG */
if (type == 1 && !known_bridge &&
!e820_all_mapped(pci_mmcfg_config[0].address,
pci_mmcfg_config[0].address + MMCONFIG_APER_MIN,
E820_RESERVED)) {
printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %Lx is not E820-reserved\n",
pci_mmcfg_config[0].address);
printk(KERN_ERR "PCI: Not using MMCONFIG.\n");
return;
}

if (pci_mmcfg_arch_init()) {
if (type == 1)
unreachable_devices();
Expand Down

0 comments on commit eb0ffab

Please sign in to comment.