diff options
| -rw-r--r-- | arch/x86/pci/common.c | 41 | 
1 files changed, 41 insertions, 0 deletions
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index f7c8a399978..5fe75026ecc 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c @@ -22,6 +22,7 @@ unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2 |  unsigned int pci_early_dump_regs;  static int pci_bf_sort; +static int smbios_type_b1_flag;  int pci_routeirq;  int noioapicquirk;  #ifdef CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS @@ -185,6 +186,39 @@ static int __devinit set_bf_sort(const struct dmi_system_id *d)  	return 0;  } +static void __devinit read_dmi_type_b1(const struct dmi_header *dm, +				       void *private_data) +{ +	u8 *d = (u8 *)dm + 4; + +	if (dm->type != 0xB1) +		return; +	switch (((*(u32 *)d) >> 9) & 0x03) { +	case 0x00: +		printk(KERN_INFO "dmi type 0xB1 record - unknown flag\n"); +		break; +	case 0x01: /* set pci=bfsort */ +		smbios_type_b1_flag = 1; +		break; +	case 0x02: /* do not set pci=bfsort */ +		smbios_type_b1_flag = 2; +		break; +	default: +		break; +	} +} + +static int __devinit find_sort_method(const struct dmi_system_id *d) +{ +	dmi_walk(read_dmi_type_b1, NULL); + +	if (smbios_type_b1_flag == 1) { +		set_bf_sort(d); +		return 0; +	} +	return -1; +} +  /*   * Enable renumbering of PCI bus# ranges to reach all PCI busses (Cardbus)   */ @@ -213,6 +247,13 @@ static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {  	},  #endif		/* __i386__ */  	{ +		.callback = find_sort_method, +		.ident = "Dell System", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"), +		}, +	}, +	{  		.callback = set_bf_sort,  		.ident = "Dell PowerEdge 1950",  		.matches = {  |