aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/sn/kernel/io_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/ia64/sn/kernel/io_init.c')
-rw-r--r--arch/ia64/sn/kernel/io_init.c39
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
24char master_baseio_wid;
25nasid_t master_nasid = INVALID_NASID; /* Partition Master */ 24nasid_t master_nasid = INVALID_NASID; /* Partition Master */
26 25
27struct slab_info { 26struct 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