Pull sn_pci_legacy_read-write into release branch
authorTony Luck <tony.luck@intel.com>
Fri, 28 Oct 2005 20:23:50 +0000 (13:23 -0700)
committerTony Luck <tony.luck@intel.com>
Fri, 28 Oct 2005 20:23:50 +0000 (13:23 -0700)
arch/ia64/sn/pci/pci_dma.c
include/asm-ia64/sn/sn_sal.h

index 0e4b9ad9ef0250f2a1898dcae7c4a79c6a4f4bcc..abdf6eea6ac8a3b075dc9d741e22d4787e3e99e7 100644 (file)
@@ -326,6 +326,29 @@ int sn_pci_legacy_read(struct pci_bus *bus, u16 port, u32 *val, u8 size)
 {
        unsigned long addr;
        int ret;
+       struct ia64_sal_retval isrv;
+
+       /*
+        * First, try the SN_SAL_IOIF_PCI_SAFE SAL call which can work
+        * around hw issues at the pci bus level.  SGI proms older than
+        * 4.10 don't implment this.
+        */
+
+       SAL_CALL(isrv, SN_SAL_IOIF_PCI_SAFE,
+               pci_domain_nr(bus), bus->number,
+               0, /* io */
+               0, /* read */
+               port, size, __pa(val));
+
+       if (isrv.status == 0)
+               return size;
+
+       /*
+        * If the above failed, retry using the SAL_PROBE call which should
+        * be present in all proms (but which cannot work round PCI chipset
+        * bugs).  This code is retained for compatability with old
+        * pre-4.10 proms, and should be removed at some point in the future.
+        */
 
        if (!SN_PCIBUS_BUSSOFT(bus))
                return -ENODEV;
@@ -349,6 +372,29 @@ int sn_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size)
        int ret = size;
        unsigned long paddr;
        unsigned long *addr;
+       struct ia64_sal_retval isrv;
+
+       /*
+        * First, try the SN_SAL_IOIF_PCI_SAFE SAL call which can work
+        * around hw issues at the pci bus level.  SGI proms older than
+        * 4.10 don't implment this.
+        */
+
+       SAL_CALL(isrv, SN_SAL_IOIF_PCI_SAFE,
+               pci_domain_nr(bus), bus->number,
+               0, /* io */
+               1, /* write */
+               port, size, __pa(&val));
+
+       if (isrv.status == 0)
+               return size;
+
+       /*
+        * If the above failed, retry using the SAL_PROBE call which should
+        * be present in all proms (but which cannot work round PCI chipset
+        * bugs).  This code is retained for compatability with old
+        * pre-4.10 proms, and should be removed at some point in the future.
+        */
 
        if (!SN_PCIBUS_BUSSOFT(bus)) {
                ret = -ENODEV;
index 34f3127e44161ccf1ebbb93be06b99bdfa7a8475..92df48a0412fbe748267449179f94a370cc1c618 100644 (file)
@@ -68,7 +68,7 @@
 #define  SN_SAL_IOIF_INTERRUPT                    0x0200004a
 #define  SN_SAL_HWPERF_OP                         0x02000050   // lock
 #define  SN_SAL_IOIF_ERROR_INTERRUPT              0x02000051
-
+#define  SN_SAL_IOIF_PCI_SAFE                     0x02000052
 #define  SN_SAL_IOIF_SLOT_ENABLE                  0x02000053
 #define  SN_SAL_IOIF_SLOT_DISABLE                 0x02000054
 #define  SN_SAL_IOIF_GET_HUBDEV_INFO              0x02000055