[IA64-SGI] fix sn_pci_legacy_read/fix sn_pci_legacy_write
authorMark Maule <maule@sgi.com>
Fri, 23 Sep 2005 17:31:53 +0000 (12:31 -0500)
committerTony Luck <tony.luck@intel.com>
Fri, 23 Sep 2005 18:21:59 +0000 (11:21 -0700)
This patch adds a #define for SN_SAL_IOIF_PCI_SAFE and makes that the
preferred method of implementing sn_pci_legacy_read() and
sn_pci_legacy_write().

This SAL call has been present in SGI proms since version 4.10.  If the
SN_SAL_IOIF_PCI_SAFE call fails, revert to the previous code for compatability
with older proms.

Signed-off-by: Mark Maule <maule@sgi.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
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;
 {
        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;
 
        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;
        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;
 
        if (!SN_PCIBUS_BUSSOFT(bus)) {
                ret = -ENODEV;
index fea35b33d4e485f835cbfd678121f053f4a925f2..b2d32837723f609572666afcb074bf9f4d4fcaa9 100644 (file)
@@ -67,7 +67,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_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
 #define  SN_SAL_IOIF_SLOT_ENABLE                  0x02000053
 #define  SN_SAL_IOIF_SLOT_DISABLE                 0x02000054
 #define  SN_SAL_IOIF_GET_HUBDEV_INFO              0x02000055