[SPARC64]: Fix more of_device layer IRQ bugs, and correct PROMREG_MAX.
[pandora-kernel.git] / arch / sparc64 / kernel / pci_sun4v_asm.S
index fd2fe0e..6604fdb 100644 (file)
@@ -5,39 +5,25 @@
 
 #include <asm/hypervisor.h>
 
-       /* %o0: devhandle
-        * %o1: devino
-        *
-        * returns %o0: sysino
-        */
-       .globl  pci_sun4v_devino_to_sysino
-pci_sun4v_devino_to_sysino:
-       mov     %o1, %o2
-       mov     %o0, %o1
-       mov     HV_FAST_INTR_DEVINO2SYSINO, %o0
-       ta      HV_FAST_TRAP
-       retl
-        mov    %o1, %o0
-
        /* %o0: devhandle
         * %o1: tsbid
         * %o2: num ttes
         * %o3: io_attributes
         * %o4: io_page_list phys address
         *
-        * returns %o0: num ttes mapped
+        * returns %o0: -status if status was non-zero, else
+        *         %o0: num pages mapped
         */
        .globl  pci_sun4v_iommu_map
 pci_sun4v_iommu_map:
-       mov     %o4, %o5
-       mov     %o3, %o4
-       mov     %o2, %o3
-       mov     %o1, %o2
-       mov     %o0, %o1
-       mov     HV_FAST_PCI_IOMMU_MAP, %o0
+       mov     %o5, %g1
+       mov     HV_FAST_PCI_IOMMU_MAP, %o5
        ta      HV_FAST_TRAP
-       retl
-        mov    %o1, %o0
+       brnz,pn %o0, 1f
+        sub    %g0, %o0, %o0
+       mov     %o1, %o0
+1:     retl
+        nop
 
        /* %o0: devhandle
         * %o1: tsbid
@@ -47,10 +33,63 @@ pci_sun4v_iommu_map:
         */
        .globl  pci_sun4v_iommu_demap
 pci_sun4v_iommu_demap:
-       mov     %o2, %o3
-       mov     %o1, %o2
-       mov     %o0, %o1
-       mov     HV_FAST_PCI_IOMMU_DEMAP, %o0
+       mov     HV_FAST_PCI_IOMMU_DEMAP, %o5
        ta      HV_FAST_TRAP
        retl
         mov    %o1, %o0
+
+       /* %o0: devhandle
+        * %o1: tsbid
+        * %o2: &io_attributes
+        * %o3: &real_address
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_iommu_getmap
+pci_sun4v_iommu_getmap:
+       mov     %o2, %o4
+       mov     HV_FAST_PCI_IOMMU_GETMAP, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o4]
+       stx     %o2, [%o3]
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: pci_device
+        * %o2: pci_config_offset
+        * %o3: size
+        *
+        * returns %o0: data
+        *
+        * If there is an error, the data will be returned
+        * as all 1's.
+        */
+       .globl  pci_sun4v_config_get
+pci_sun4v_config_get:
+       mov     HV_FAST_PCI_CONFIG_GET, %o5
+       ta      HV_FAST_TRAP
+       brnz,a,pn %o1, 1f
+        mov    -1, %o2
+1:     retl
+        mov    %o2, %o0
+
+       /* %o0: devhandle
+        * %o1: pci_device
+        * %o2: pci_config_offset
+        * %o3: size
+        * %o4: data
+        *
+        * returns %o0: status
+        *
+        * status will be zero if the operation completed
+        * successfully, else -1 if not
+        */
+       .globl  pci_sun4v_config_put
+pci_sun4v_config_put:
+       mov     HV_FAST_PCI_CONFIG_PUT, %o5
+       ta      HV_FAST_TRAP
+       brnz,a,pn %o1, 1f
+        mov    -1, %o1
+1:     retl
+        mov    %o1, %o0