[SPARC64]: Add sun4v_cpu_qconf() hypervisor call.
authorDavid S. Miller <davem@sunset.davemloft.net>
Thu, 16 Feb 2006 22:26:53 +0000 (14:26 -0800)
committerDavid S. Miller <davem@sunset.davemloft.net>
Mon, 20 Mar 2006 09:13:16 +0000 (01:13 -0800)
Call it from register_one_mondo().

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc64/kernel/entry.S
arch/sparc64/kernel/irq.c
include/asm-sparc64/hypervisor.h

index bf40b065bcc0a2b68b03933a60df2974e68e063f..f5c8a293979fe77df5dcf721318835a133a2c382 100644 (file)
@@ -1772,3 +1772,15 @@ sun4v_intr_settarget:
        retl
         nop
 
+       /* %o0: type
+        * %o1: queue paddr
+        * %o2: num queue entries
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_cpu_qconf
+sun4v_cpu_qconf:
+       mov     HV_FAST_CPU_QCONF, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
index 4d9931d124ab35df38c31a66c7703c6f79529aea..e1729e5189a38a0eaefba9ba0488f6c93fc96136 100644 (file)
@@ -939,25 +939,13 @@ void init_irqwork_curcpu(void)
 
 static void __cpuinit register_one_mondo(unsigned long paddr, unsigned long type)
 {
-       register unsigned long func __asm__("%o5");
-       register unsigned long arg0 __asm__("%o0");
-       register unsigned long arg1 __asm__("%o1");
-       register unsigned long arg2 __asm__("%o2");
-
-       func = HV_FAST_CPU_QCONF;
-       arg0 = type;
-       arg1 = paddr;
-       arg2 = 128; /* XXX Implied by Niagara queue offsets. XXX */
-       __asm__ __volatile__("ta        %8"
-                            : "=&r" (func), "=&r" (arg0),
-                              "=&r" (arg1), "=&r" (arg2)
-                            : "0" (func), "1" (arg0),
-                              "2" (arg1), "3" (arg2),
-                              "i" (HV_FAST_TRAP));
-
-       if (arg0 != HV_EOK) {
-               prom_printf("SUN4V: cpu_qconf(%lu) failed with error %lu\n",
-                           type, func);
+       unsigned long num_entries = 128;
+       unsigned long status;
+
+       status = sun4v_cpu_qconf(type, paddr, num_entries);
+       if (status != HV_EOK) {
+               prom_printf("SUN4V: sun4v_cpu_qconf(%lu:%lx:%lu) failed, "
+                           "err %lu\n", type, paddr, num_entries, status);
                prom_halt();
        }
 }
index f14992ab7fec7b2f807c8fabc1981607a4b170cc..cd5fbcd9556e1cb979f586876c735b753d6793cb 100644 (file)
 #define  HV_CPU_QUEUE_RES_ERROR                 0x3e
 #define  HV_CPU_QUEUE_NONRES_ERROR      0x3f
 
+#ifndef __ASSEMBLY__
+extern unsigned long sun4v_cpu_qconf(unsigned long type,
+                                    unsigned long queue_paddr,
+                                    unsigned long num_queue_entries);
+#endif
+
 /* cpu_qinfo()
  * TRAP:       HV_FAST_TRAP
  * FUNCTION:   HV_FAST_CPU_QINFO