]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - arch/ia64/sn/pci/pcibr/pcibr_provider.c
[IA64] Tollhouse HP: IA64 arch changes
[net-next-2.6.git] / arch / ia64 / sn / pci / pcibr / pcibr_provider.c
index e328e948175d9e3f69795176318864b883b1fe32..ab1211ef01766248898c1fcb1a47f204a2ef93f8 100644 (file)
@@ -23,14 +23,16 @@ int
 sal_pcibr_slot_enable(struct pcibus_info *soft, int device, void *resp)
 {
        struct ia64_sal_retval ret_stuff;
-       uint64_t busnum;
+       u64 busnum;
+       u64 segment;
 
        ret_stuff.status = 0;
        ret_stuff.v0 = 0;
 
+       segment = soft->pbi_buscommon.bs_persist_segment;
        busnum = soft->pbi_buscommon.bs_persist_busnum;
-       SAL_CALL_NOLOCK(ret_stuff, (u64) SN_SAL_IOIF_SLOT_ENABLE, (u64) busnum,
-                       (u64) device, (u64) resp, 0, 0, 0, 0);
+       SAL_CALL_NOLOCK(ret_stuff, (u64) SN_SAL_IOIF_SLOT_ENABLE, segment,
+                       busnum, (u64) device, (u64) resp, 0, 0, 0);
 
        return (int)ret_stuff.v0;
 }
@@ -40,15 +42,17 @@ sal_pcibr_slot_disable(struct pcibus_info *soft, int device, int action,
                       void *resp)
 {
        struct ia64_sal_retval ret_stuff;
-       uint64_t busnum;
+       u64 busnum;
+       u64 segment;
 
        ret_stuff.status = 0;
        ret_stuff.v0 = 0;
 
+       segment = soft->pbi_buscommon.bs_persist_segment;
        busnum = soft->pbi_buscommon.bs_persist_busnum;
        SAL_CALL_NOLOCK(ret_stuff, (u64) SN_SAL_IOIF_SLOT_DISABLE,
-                       (u64) busnum, (u64) device, (u64) action,
-                       (u64) resp, 0, 0, 0);
+                       segment, busnum, (u64) device, (u64) action,
+                       (u64) resp, 0, 0);
 
        return (int)ret_stuff.v0;
 }
@@ -56,7 +60,7 @@ sal_pcibr_slot_disable(struct pcibus_info *soft, int device, int action,
 static int sal_pcibr_error_interrupt(struct pcibus_info *soft)
 {
        struct ia64_sal_retval ret_stuff;
-       uint64_t busnum;
+       u64 busnum;
        int segment;
        ret_stuff.status = 0;
        ret_stuff.v0 = 0;
@@ -70,6 +74,22 @@ static int sal_pcibr_error_interrupt(struct pcibus_info *soft)
        return (int)ret_stuff.v0;
 }
 
+u16 sn_ioboard_to_pci_bus(struct pci_bus *pci_bus)
+{
+       s64 rc;
+       u16 ioboard;
+       nasid_t nasid = NASID_GET(SN_PCIBUS_BUSSOFT(pci_bus)->bs_base);
+
+       rc = ia64_sn_sysctl_ioboard_get(nasid, &ioboard);
+       if (rc) {
+               printk(KERN_WARNING "ia64_sn_sysctl_ioboard_get failed: %ld\n",
+                      rc);
+               return 0;
+       }
+
+       return ioboard;
+}
+
 /* 
  * PCI Bridge Error interrupt handler.  Gets invoked whenever a PCI 
  * bridge sends an error interrupt.
@@ -159,9 +179,12 @@ pcibr_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
        /* Setup the PMU ATE map */
        soft->pbi_int_ate_resource.lowest_free_index = 0;
        soft->pbi_int_ate_resource.ate =
-           kmalloc(soft->pbi_int_ate_size * sizeof(uint64_t), GFP_KERNEL);
-       memset(soft->pbi_int_ate_resource.ate, 0,
-              (soft->pbi_int_ate_size * sizeof(uint64_t)));
+           kzalloc(soft->pbi_int_ate_size * sizeof(u64), GFP_KERNEL);
+
+       if (!soft->pbi_int_ate_resource.ate) {
+               kfree(soft);
+               return NULL;
+       }
 
        if (prom_bussoft->bs_asic_type == PCIIO_ASIC_TYPE_TIOCP) {
                /* TIO PCI Bridge: find nearest node with CPUs */
@@ -203,7 +226,7 @@ void pcibr_target_interrupt(struct sn_irq_info *sn_irq_info)
        struct pcidev_info *pcidev_info;
        struct pcibus_info *pcibus_info;
        int bit = sn_irq_info->irq_int_bit;
-       uint64_t xtalk_addr = sn_irq_info->irq_xtalkaddr;
+       u64 xtalk_addr = sn_irq_info->irq_xtalkaddr;
 
        pcidev_info = (struct pcidev_info *)sn_irq_info->irq_pciioinfo;
        if (pcidev_info) {
@@ -248,3 +271,4 @@ pcibr_init_provider(void)
 
 EXPORT_SYMBOL_GPL(sal_pcibr_slot_enable);
 EXPORT_SYMBOL_GPL(sal_pcibr_slot_disable);
+EXPORT_SYMBOL_GPL(sn_ioboard_to_pci_bus);