diff options
Diffstat (limited to 'arch/x86/pci/common.c')
| -rw-r--r-- | arch/x86/pci/common.c | 133 | 
1 files changed, 17 insertions, 116 deletions
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 981c2dbd72c..059a76c2973 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c @@ -456,19 +456,25 @@ void __init dmi_check_pciprobe(void)  	dmi_check_system(pciprobe_dmi_table);  } -struct pci_bus *pcibios_scan_root(int busnum) +void pcibios_scan_root(int busnum)  { -	struct pci_bus *bus = NULL; +	struct pci_bus *bus; +	struct pci_sysdata *sd; +	LIST_HEAD(resources); -	while ((bus = pci_find_next_bus(bus)) != NULL) { -		if (bus->number == busnum) { -			/* Already scanned */ -			return bus; -		} +	sd = kzalloc(sizeof(*sd), GFP_KERNEL); +	if (!sd) { +		printk(KERN_ERR "PCI: OOM, skipping PCI bus %02x\n", busnum); +		return; +	} +	sd->node = x86_pci_root_bus_node(busnum); +	x86_pci_root_bus_resources(busnum, &resources); +	printk(KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n", busnum); +	bus = pci_scan_root_bus(NULL, busnum, &pci_root_ops, sd, &resources); +	if (!bus) { +		pci_free_resource_list(&resources); +		kfree(sd);  	} - -	return pci_scan_bus_on_node(busnum, &pci_root_ops, -					get_mp_bus_to_node(busnum));  }  void __init pcibios_set_cache_line_size(void) @@ -561,7 +567,6 @@ char * __init pcibios_setup(char *str)  		pci_probe |= PCI_PROBE_NOEARLY;  		return NULL;  	} -#ifndef CONFIG_X86_VISWS  	else if (!strcmp(str, "usepirqmask")) {  		pci_probe |= PCI_USE_PIRQ_MASK;  		return NULL; @@ -571,9 +576,7 @@ char * __init pcibios_setup(char *str)  	} else if (!strncmp(str, "lastbus=", 8)) {  		pcibios_last_bus = simple_strtol(str+8, NULL, 0);  		return NULL; -	} -#endif -	else if (!strcmp(str, "rom")) { +	} else if (!strcmp(str, "rom")) {  		pci_probe |= PCI_ASSIGN_ROMS;  		return NULL;  	} else if (!strcmp(str, "norom")) { @@ -677,105 +680,3 @@ int pci_ext_cfg_avail(void)  	else  		return 0;  } - -struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops, int node) -{ -	LIST_HEAD(resources); -	struct pci_bus *bus = NULL; -	struct pci_sysdata *sd; - -	/* -	 * Allocate per-root-bus (not per bus) arch-specific data. -	 * TODO: leak; this memory is never freed. -	 * It's arguable whether it's worth the trouble to care. -	 */ -	sd = kzalloc(sizeof(*sd), GFP_KERNEL); -	if (!sd) { -		printk(KERN_ERR "PCI: OOM, skipping PCI bus %02x\n", busno); -		return NULL; -	} -	sd->node = node; -	x86_pci_root_bus_resources(busno, &resources); -	printk(KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n", busno); -	bus = pci_scan_root_bus(NULL, busno, ops, sd, &resources); -	if (!bus) { -		pci_free_resource_list(&resources); -		kfree(sd); -	} - -	return bus; -} - -struct pci_bus *pci_scan_bus_with_sysdata(int busno) -{ -	return pci_scan_bus_on_node(busno, &pci_root_ops, -1); -} - -/* - * NUMA info for PCI busses - * - * Early arch code is responsible for filling in reasonable values here. - * A node id of "-1" means "use current node".  In other words, if a bus - * has a -1 node id, it's not tightly coupled to any particular chunk - * of memory (as is the case on some Nehalem systems). - */ -#ifdef CONFIG_NUMA - -#define BUS_NR 256 - -#ifdef CONFIG_X86_64 - -static int mp_bus_to_node[BUS_NR] = { -	[0 ... BUS_NR - 1] = -1 -}; - -void set_mp_bus_to_node(int busnum, int node) -{ -	if (busnum >= 0 &&  busnum < BUS_NR) -		mp_bus_to_node[busnum] = node; -} - -int get_mp_bus_to_node(int busnum) -{ -	int node = -1; - -	if (busnum < 0 || busnum > (BUS_NR - 1)) -		return node; - -	node = mp_bus_to_node[busnum]; - -	/* -	 * let numa_node_id to decide it later in dma_alloc_pages -	 * if there is no ram on that node -	 */ -	if (node != -1 && !node_online(node)) -		node = -1; - -	return node; -} - -#else /* CONFIG_X86_32 */ - -static int mp_bus_to_node[BUS_NR] = { -	[0 ... BUS_NR - 1] = -1 -}; - -void set_mp_bus_to_node(int busnum, int node) -{ -	if (busnum >= 0 &&  busnum < BUS_NR) -	mp_bus_to_node[busnum] = (unsigned char) node; -} - -int get_mp_bus_to_node(int busnum) -{ -	int node; - -	if (busnum < 0 || busnum > (BUS_NR - 1)) -		return 0; -	node = mp_bus_to_node[busnum]; -	return node; -} - -#endif /* CONFIG_X86_32 */ - -#endif /* CONFIG_NUMA */  | 
