[openfabrics-ewg] [PATCH] ehca backport for kernel 2.6.16

Hoang-Nam Nguyen hnguyen at de.ibm.com
Mon Sep 18 09:28:52 PDT 2006


Hi,
below is hvcall patch, which is required in order to compile/build ehca 
device driver on kernel 2.6.16, ppc64/powerpc.
I did commit it into svn contrib/ibm/gen2/backport/2.6.16.
Thanks!
Nam Nguyen


Signed-off-by Hoang-Nam Nguyen <hnguyen at de.ibm.com>
---


 hvcall.h |  232 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 232 insertions(+)


diff -Nurp linux-2.6.16_orig/drivers/infiniband/include/asm/hvcall.h linux-2.6.16_work/drivers/infiniband/include/asm/hvcall.h
--- linux-2.6.16_orig/drivers/infiniband/include/asm/hvcall.h   1969-12-31 16:00:00.000000000 -0800
+++ linux-2.6.16_work/drivers/infiniband/include/asm/hvcall.h   2006-09-18 02:14:19.000000000 -0700
@@ -0,0 +1,232 @@
+#ifndef ASM_HVCALL_BACKPORT_2616_H
+#define ASM_HVCALL_BACKPORT_2616_H
+
+#include_next <asm/hvcall.h>
+
+#ifdef __KERNEL__
+
+#define H_SUCCESS               H_Success
+#define H_BUSY                  H_Busy
+#define H_CONSTRAINED           H_Constrained
+#define H_PAGE_REGISTERED       15
+
+#define H_PARAMETER             H_Parameter
+#define H_NO_MEM                H_NoMem
+#define H_RESOURCE              H_Resource
+#define H_HARDWARE              H_Hardware
+#define H_ADAPTER_PARM          -17
+#define H_RH_PARM               -18
+#define H_RT_PARM               -22
+#define H_MLENGTH_PARM          -27
+#define H_MEM_PARM              -28
+#define H_MEM_ACCESS_PARM       -29
+#define H_ALIAS_EXIST           -39
+#define H_TABLE_FULL            -41
+#define H_NOT_ENOUGH_RESOURCES  -44
+#define H_R_STATE               -45
+
+#define H_CB_ALIGNMENT          4096
+
+#define H_RESET_EVENTS          0x15C
+#define H_ALLOC_RESOURCE        0x160
+#define H_FREE_RESOURCE         0x164
+#define H_MODIFY_QP             0x168
+#define H_QUERY_QP              0x16C
+#define H_REREGISTER_PMR        0x170
+#define H_REGISTER_SMR          0x174
+#define H_QUERY_MR              0x178
+#define H_QUERY_MW              0x17C
+#define H_QUERY_HCA             0x180
+#define H_QUERY_PORT            0x184
+#define H_MODIFY_PORT           0x188
+#define H_DEFINE_AQP1           0x18C
+#define H_DEFINE_AQP0           0x194
+#define H_RESIZE_MR             0x198
+#define H_ATTACH_MCQP           0x19C
+#define H_DETACH_MCQP           0x1A0
+#define H_REGISTER_RPAGES       0x1AC
+#define H_DISABLE_AND_GETC      0x1B0
+#define H_ERROR_DATA            0x1B4
+#define H_QUERY_INT_STATE       0x1E4
+
+#define H_LONG_BUSY_ORDER_1_MSEC   H_LongBusyOrder1msec
+#define H_LONG_BUSY_ORDER_10_MSEC  H_LongBusyOrder10msec
+#define H_LONG_BUSY_ORDER_100_MSEC H_LongBusyOrder100msec
+#define H_LONG_BUSY_ORDER_1_SEC    H_LongBusyOrder1sec
+#define H_LONG_BUSY_ORDER_10_SEC   H_LongBusyOrder10sec
+#define H_LONG_BUSY_ORDER_100_SEC  H_LongBusyOrder100sec
+#define H_IS_LONG_BUSY(x) ((x >= H_LongBusyStartRange) && (x <= H_LongBusyEndRange))
+
+
+#ifndef __ASSEMBLY__
+#include <linux/kernel.h>
+inline static long plpar_hcall_7arg_7ret(unsigned long opcode,
+                                        unsigned long arg1,    /* <R4  */
+                                        unsigned long arg2,    /* <R5  */
+                                        unsigned long arg3,    /* <R6  */
+                                        unsigned long arg4,    /* <R7  */
+                                        unsigned long arg5,    /* <R8  */
+                                        unsigned long arg6,    /* <R9  */
+                                        unsigned long arg7,    /* <R10 */
+                                        unsigned long *out1,   /* <R4  */
+                                        unsigned long *out2,   /* <R5  */
+                                        unsigned long *out3,   /* <R6  */
+                                        unsigned long *out4,   /* <R7  */
+                                        unsigned long *out5,   /* <R8  */
+                                        unsigned long *out6,   /* <R9  */
+                                        unsigned long *out7    /* <R10 */
+    )
+{
+       unsigned long regs[11] = {opcode,
+                                 arg1, arg2, arg3, arg4, arg5, arg6, arg7};
+
+       __asm__ __volatile__("mr 3,%10\n"
+                            "mr 4,%11\n"
+                            "mr 5,%12\n"
+                            "mr 6,%13\n"
+                            "mr 7,%14\n"
+                            "mr 8,%15\n"
+                            "mr 9,%16\n"
+                            "mr 10,%17\n"
+                            "mr 11,%18\n"
+                            "mr 12,%19\n"
+                            ".long 0x44000022\n"
+                            "mr %0,3\n"
+                            "mr %1,4\n"
+                            "mr %2,5\n"
+                            "mr %3,6\n"
+                            "mr %4,7\n"
+                            "mr %5,8\n"
+                            "mr %6,9\n"
+                            "mr %7,10\n"
+                            "mr %8,11\n"
+                            "mr %9,12\n":"=r"(regs[0]),
+                            "=r"(regs[1]), "=r"(regs[2]),
+                            "=r"(regs[3]), "=r"(regs[4]),
+                            "=r"(regs[5]), "=r"(regs[6]),
+                            "=r"(regs[7]), "=r"(regs[8]),
+                            "=r"(regs[9])
+                            :"r"(regs[0]), "r"(regs[1]),
+                            "r"(regs[2]), "r"(regs[3]),
+                            "r"(regs[4]), "r"(regs[5]),
+                            "r"(regs[6]), "r"(regs[7]),
+                            "r"(regs[8]), "r"(regs[9])
+                            :"r0", "r2", "r3", "r4", "r5", "r6", "r7",
+                            "r8", "r9", "r10", "r11", "r12", "cc",
+                            "xer", "ctr", "lr", "cr0", "cr1", "cr5",
+                            "cr6", "cr7");
+       *out1 = regs[1];
+       *out2 = regs[2];
+       *out3 = regs[3];
+       *out4 = regs[4];
+       *out5 = regs[5];
+       *out6 = regs[6];
+       *out7 = regs[7];
+
+
+       if (!H_isLongBusy(regs[0]) && regs[0] < 0) {
+               printk(KERN_ERR "HCALL77_IN r3=%lx r4=%lx r5=%lx r6=%lx "
+                      "r7=%lx r8=%lx r9=%lx r10=%lx",
+                      opcode, arg1, arg2, arg3,
+                      arg4, arg5, arg6, arg7);
+               printk(KERN_ERR "HCALL77_OUT r3=%lx r4=%lx r5=%lx "
+                      "r6=%lx r7=%lx r8=%lx r9=%lx r10=%lx ",
+                      regs[0], regs[1],
+                      regs[2], regs[3],
+                      regs[4], regs[5],
+                      regs[6], regs[7]);
+       }
+       return regs[0];
+}
+
+inline static long plpar_hcall_9arg_9ret(unsigned long opcode,
+                                        unsigned long arg1,    /* <R4  */
+                                        unsigned long arg2,    /* <R5  */
+                                        unsigned long arg3,    /* <R6  */
+                                        unsigned long arg4,    /* <R7  */
+                                        unsigned long arg5,    /* <R8  */
+                                        unsigned long arg6,    /* <R9  */
+                                        unsigned long arg7,    /* <R10 */
+                                        unsigned long arg8,    /* <R11 */
+                                        unsigned long arg9,    /* <R12 */
+                                        unsigned long *out1,   /* <R4  */
+                                        unsigned long *out2,   /* <R5  */
+                                        unsigned long *out3,   /* <R6  */
+                                        unsigned long *out4,   /* <R7  */
+                                        unsigned long *out5,   /* <R8  */
+                                        unsigned long *out6,   /* <R9  */
+                                        unsigned long *out7,   /* <R10 */
+                                        unsigned long *out8,   /* <R11 */
+                                        unsigned long *out9    /* <R12 */
+    )
+{
+       unsigned long regs[11] = {opcode,
+                                 arg1, arg2, arg3, arg4, arg5, arg6, arg7,
+                                 arg8, arg9};
+
+       __asm__ __volatile__("mr 3,%10\n"
+                            "mr 4,%11\n"
+                            "mr 5,%12\n"
+                            "mr 6,%13\n"
+                            "mr 7,%14\n"
+                            "mr 8,%15\n"
+                            "mr 9,%16\n"
+                            "mr 10,%17\n"
+                            "mr 11,%18\n"
+                            "mr 12,%19\n"
+                            ".long 0x44000022\n"
+                            "mr %0,3\n"
+                            "mr %1,4\n"
+                            "mr %2,5\n"
+                            "mr %3,6\n"
+                            "mr %4,7\n"
+                            "mr %5,8\n"
+                            "mr %6,9\n"
+                            "mr %7,10\n"
+                            "mr %8,11\n"
+                            "mr %9,12\n":"=r"(regs[0]),
+                            "=r"(regs[1]), "=r"(regs[2]),
+                            "=r"(regs[3]), "=r"(regs[4]),
+                            "=r"(regs[5]), "=r"(regs[6]),
+                            "=r"(regs[7]), "=r"(regs[8]),
+                            "=r"(regs[9])
+                            :"r"(regs[0]), "r"(regs[1]),
+                            "r"(regs[2]), "r"(regs[3]),
+                            "r"(regs[4]), "r"(regs[5]),
+                            "r"(regs[6]), "r"(regs[7]),
+                            "r"(regs[8]), "r"(regs[9])
+                            :"r0", "r2", "r3", "r4", "r5", "r6", "r7",
+                            "r8", "r9", "r10", "r11", "r12", "cc",
+                            "xer", "ctr", "lr", "cr0", "cr1", "cr5",
+                            "cr6", "cr7");
+       *out1 = regs[1];
+       *out2 = regs[2];
+       *out3 = regs[3];
+       *out4 = regs[4];
+       *out5 = regs[5];
+       *out6 = regs[6];
+       *out7 = regs[7];
+       *out8 = regs[8];
+       *out9 = regs[9];
+
+       if (!H_isLongBusy(regs[0]) && regs[0] < 0) {
+               printk(KERN_ERR "HCALL99_IN r3=%lx r4=%lx r5=%lx r6=%lx "
+                      "r7=%lx r8=%lx r9=%lx r10=%lx "
+                      "r11=%lx r12=%lx",
+                      opcode, arg1, arg2, arg3,
+                      arg4, arg5, arg6, arg7,
+                      arg8, arg9);
+               printk(KERN_ERR "HCALL99_OUT r3=%lx r4=%lx r5=%lx "
+                      "r6=%lx r7=%lx r8=%lx r9=%lx r10=%lx "
+                      "r11=%lx r12=lx",
+                      regs[0], regs[1],
+                      regs[2], regs[3],
+                      regs[4], regs[5],
+                      regs[6], regs[7],
+                      regs[8]);
+       }
+       return regs[0];
+}
+
+#endif /* __ASSEMBLY__ */
+#endif /* __KERNEL__ */
+#endif




More information about the ewg mailing list