diff options
Diffstat (limited to 'arch/x86/pci/bus_numa.c')
| -rw-r--r-- | arch/x86/pci/bus_numa.c | 69 | 
1 files changed, 47 insertions, 22 deletions
diff --git a/arch/x86/pci/bus_numa.c b/arch/x86/pci/bus_numa.c index fd3f65510e9..306579f7d0f 100644 --- a/arch/x86/pci/bus_numa.c +++ b/arch/x86/pci/bus_numa.c @@ -4,35 +4,38 @@  #include "bus_numa.h" -int pci_root_num; -struct pci_root_info pci_root_info[PCI_ROOT_NR]; +LIST_HEAD(pci_root_infos); -void x86_pci_root_bus_resources(int bus, struct list_head *resources) +static struct pci_root_info *x86_find_pci_root_info(int bus)  { -	int i; -	int j;  	struct pci_root_info *info; -	if (!pci_root_num) -		goto default_resources; +	if (list_empty(&pci_root_infos)) +		return NULL; -	for (i = 0; i < pci_root_num; i++) { -		if (pci_root_info[i].bus_min == bus) -			break; -	} +	list_for_each_entry(info, &pci_root_infos, list) +		if (info->bus_min == bus) +			return info; + +	return NULL; +} -	if (i == pci_root_num) +void x86_pci_root_bus_resources(int bus, struct list_head *resources) +{ +	struct pci_root_info *info = x86_find_pci_root_info(bus); +	struct pci_root_res *root_res; + +	if (!info)  		goto default_resources;  	printk(KERN_DEBUG "PCI: root bus %02x: hardware-probed resources\n",  	       bus); -	info = &pci_root_info[i]; -	for (j = 0; j < info->res_num; j++) { +	list_for_each_entry(root_res, &info->resources, list) {  		struct resource *res;  		struct resource *root; -		res = &info->res[j]; +		res = &root_res->res;  		pci_add_resource(resources, res);  		if (res->flags & IORESOURCE_IO)  			root = &ioport_resource; @@ -53,11 +56,32 @@ default_resources:  	pci_add_resource(resources, &iomem_resource);  } +struct pci_root_info __init *alloc_pci_root_info(int bus_min, int bus_max, +						 int node, int link) +{ +	struct pci_root_info *info; + +	info = kzalloc(sizeof(*info), GFP_KERNEL); + +	if (!info) +		return info; + +	INIT_LIST_HEAD(&info->resources); +	info->bus_min = bus_min; +	info->bus_max = bus_max; +	info->node = node; +	info->link = link; + +	list_add_tail(&info->list, &pci_root_infos); + +	return info; +} +  void __devinit update_res(struct pci_root_info *info, resource_size_t start,  			  resource_size_t end, unsigned long flags, int merge)  { -	int i;  	struct resource *res; +	struct pci_root_res *root_res;  	if (start > end)  		return; @@ -69,11 +93,11 @@ void __devinit update_res(struct pci_root_info *info, resource_size_t start,  		goto addit;  	/* try to merge it with old one */ -	for (i = 0; i < info->res_num; i++) { +	list_for_each_entry(root_res, &info->resources, list) {  		resource_size_t final_start, final_end;  		resource_size_t common_start, common_end; -		res = &info->res[i]; +		res = &root_res->res;  		if (res->flags != flags)  			continue; @@ -93,14 +117,15 @@ void __devinit update_res(struct pci_root_info *info, resource_size_t start,  addit:  	/* need to add that */ -	if (info->res_num >= RES_NUM) +	root_res = kzalloc(sizeof(*root_res), GFP_KERNEL); +	if (!root_res)  		return; -	res = &info->res[info->res_num]; +	res = &root_res->res;  	res->name = info->name;  	res->flags = flags;  	res->start = start;  	res->end = end; -	res->child = NULL; -	info->res_num++; + +	list_add_tail(&root_res->list, &info->resources);  }  |