diff options
Diffstat (limited to 'arch/ia64/sn/kernel/io_init.c')
-rw-r--r-- | arch/ia64/sn/kernel/io_init.c | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c index 783eb4323847..2f03e3f52b63 100644 --- a/arch/ia64/sn/kernel/io_init.c +++ b/arch/ia64/sn/kernel/io_init.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <asm/sn/simulator.h> | 21 | #include <asm/sn/simulator.h> |
22 | #include <asm/sn/tioca_provider.h> | 22 | #include <asm/sn/tioca_provider.h> |
23 | 23 | ||
24 | char master_baseio_wid; | ||
25 | nasid_t master_nasid = INVALID_NASID; /* Partition Master */ | 24 | nasid_t master_nasid = INVALID_NASID; /* Partition Master */ |
26 | 25 | ||
27 | struct slab_info { | 26 | struct slab_info { |
@@ -231,11 +230,13 @@ static void sn_pci_fixup_slot(struct pci_dev *dev) | |||
231 | { | 230 | { |
232 | int idx; | 231 | int idx; |
233 | int segment = 0; | 232 | int segment = 0; |
234 | uint64_t size; | ||
235 | struct sn_irq_info *sn_irq_info; | ||
236 | struct pci_dev *host_pci_dev; | ||
237 | int status = 0; | 233 | int status = 0; |
238 | struct pcibus_bussoft *bs; | 234 | struct pcibus_bussoft *bs; |
235 | struct pci_bus *host_pci_bus; | ||
236 | struct pci_dev *host_pci_dev; | ||
237 | struct sn_irq_info *sn_irq_info; | ||
238 | unsigned long size; | ||
239 | unsigned int bus_no, devfn; | ||
239 | 240 | ||
240 | dev->sysdata = kmalloc(sizeof(struct pcidev_info), GFP_KERNEL); | 241 | dev->sysdata = kmalloc(sizeof(struct pcidev_info), GFP_KERNEL); |
241 | if (SN_PCIDEV_INFO(dev) <= 0) | 242 | if (SN_PCIDEV_INFO(dev) <= 0) |
@@ -253,7 +254,7 @@ static void sn_pci_fixup_slot(struct pci_dev *dev) | |||
253 | (u64) __pa(SN_PCIDEV_INFO(dev)), | 254 | (u64) __pa(SN_PCIDEV_INFO(dev)), |
254 | (u64) __pa(sn_irq_info)); | 255 | (u64) __pa(sn_irq_info)); |
255 | if (status) | 256 | if (status) |
256 | BUG(); /* Cannot get platform pci device information information */ | 257 | BUG(); /* Cannot get platform pci device information */ |
257 | 258 | ||
258 | /* Copy over PIO Mapped Addresses */ | 259 | /* Copy over PIO Mapped Addresses */ |
259 | for (idx = 0; idx <= PCI_ROM_RESOURCE; idx++) { | 260 | for (idx = 0; idx <= PCI_ROM_RESOURCE; idx++) { |
@@ -275,15 +276,20 @@ static void sn_pci_fixup_slot(struct pci_dev *dev) | |||
275 | dev->resource[idx].parent = &iomem_resource; | 276 | dev->resource[idx].parent = &iomem_resource; |
276 | } | 277 | } |
277 | 278 | ||
278 | /* set up host bus linkages */ | 279 | /* Using the PROMs values for the PCI host bus, get the Linux |
279 | bs = SN_PCIBUS_BUSSOFT(dev->bus); | 280 | * PCI host_pci_dev struct and set up host bus linkages |
280 | host_pci_dev = | 281 | */ |
281 | pci_find_slot(SN_PCIDEV_INFO(dev)->pdi_slot_host_handle >> 32, | 282 | |
282 | SN_PCIDEV_INFO(dev)-> | 283 | bus_no = SN_PCIDEV_INFO(dev)->pdi_slot_host_handle >> 32; |
283 | pdi_slot_host_handle & 0xffffffff); | 284 | devfn = SN_PCIDEV_INFO(dev)->pdi_slot_host_handle & 0xffffffff; |
285 | host_pci_bus = pci_find_bus(pci_domain_nr(dev->bus), bus_no); | ||
286 | host_pci_dev = pci_get_slot(host_pci_bus, devfn); | ||
287 | |||
288 | SN_PCIDEV_INFO(dev)->host_pci_dev = host_pci_dev; | ||
284 | SN_PCIDEV_INFO(dev)->pdi_host_pcidev_info = | 289 | SN_PCIDEV_INFO(dev)->pdi_host_pcidev_info = |
285 | SN_PCIDEV_INFO(host_pci_dev); | 290 | SN_PCIDEV_INFO(host_pci_dev); |
286 | SN_PCIDEV_INFO(dev)->pdi_linux_pcidev = dev; | 291 | SN_PCIDEV_INFO(dev)->pdi_linux_pcidev = dev; |
292 | bs = SN_PCIBUS_BUSSOFT(dev->bus); | ||
287 | SN_PCIDEV_INFO(dev)->pdi_pcibus_info = bs; | 293 | SN_PCIDEV_INFO(dev)->pdi_pcibus_info = bs; |
288 | 294 | ||
289 | if (bs && bs->bs_asic_type < PCIIO_ASIC_MAX_TYPES) { | 295 | if (bs && bs->bs_asic_type < PCIIO_ASIC_MAX_TYPES) { |
@@ -297,6 +303,9 @@ static void sn_pci_fixup_slot(struct pci_dev *dev) | |||
297 | SN_PCIDEV_INFO(dev)->pdi_sn_irq_info = sn_irq_info; | 303 | SN_PCIDEV_INFO(dev)->pdi_sn_irq_info = sn_irq_info; |
298 | dev->irq = SN_PCIDEV_INFO(dev)->pdi_sn_irq_info->irq_irq; | 304 | dev->irq = SN_PCIDEV_INFO(dev)->pdi_sn_irq_info->irq_irq; |
299 | sn_irq_fixup(dev, sn_irq_info); | 305 | sn_irq_fixup(dev, sn_irq_info); |
306 | } else { | ||
307 | SN_PCIDEV_INFO(dev)->pdi_sn_irq_info = NULL; | ||
308 | kfree(sn_irq_info); | ||
300 | } | 309 | } |
301 | } | 310 | } |
302 | 311 | ||
@@ -403,11 +412,7 @@ static int __init sn_pci_init(void) | |||
403 | */ | 412 | */ |
404 | ia64_max_iommu_merge_mask = ~PAGE_MASK; | 413 | ia64_max_iommu_merge_mask = ~PAGE_MASK; |
405 | sn_fixup_ionodes(); | 414 | sn_fixup_ionodes(); |
406 | sn_irq = kmalloc(sizeof(struct sn_irq_info *) * NR_IRQS, GFP_KERNEL); | 415 | sn_irq_lh_init(); |
407 | if (sn_irq <= 0) | ||
408 | BUG(); /* Canno afford to run out of memory. */ | ||
409 | memset(sn_irq, 0, sizeof(struct sn_irq_info *) * NR_IRQS); | ||
410 | |||
411 | sn_init_cpei_timer(); | 416 | sn_init_cpei_timer(); |
412 | 417 | ||
413 | #ifdef CONFIG_PROC_FS | 418 | #ifdef CONFIG_PROC_FS |