diff options
Diffstat (limited to 'drivers/infiniband/hw/ehca/ehca_tools.h')
-rw-r--r-- | drivers/infiniband/hw/ehca/ehca_tools.h | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/ehca/ehca_tools.h b/drivers/infiniband/hw/ehca/ehca_tools.h new file mode 100644 index 000000000000..9f56bb846d93 --- /dev/null +++ b/drivers/infiniband/hw/ehca/ehca_tools.h | |||
@@ -0,0 +1,172 @@ | |||
1 | /* | ||
2 | * IBM eServer eHCA Infiniband device driver for Linux on POWER | ||
3 | * | ||
4 | * auxiliary functions | ||
5 | * | ||
6 | * Authors: Christoph Raisch <raisch@de.ibm.com> | ||
7 | * Hoang-Nam Nguyen <hnguyen@de.ibm.com> | ||
8 | * Khadija Souissi <souissik@de.ibm.com> | ||
9 | * Waleri Fomin <fomin@de.ibm.com> | ||
10 | * Heiko J Schick <schickhj@de.ibm.com> | ||
11 | * | ||
12 | * Copyright (c) 2005 IBM Corporation | ||
13 | * | ||
14 | * This source code is distributed under a dual license of GPL v2.0 and OpenIB | ||
15 | * BSD. | ||
16 | * | ||
17 | * OpenIB BSD License | ||
18 | * | ||
19 | * Redistribution and use in source and binary forms, with or without | ||
20 | * modification, are permitted provided that the following conditions are met: | ||
21 | * | ||
22 | * Redistributions of source code must retain the above copyright notice, this | ||
23 | * list of conditions and the following disclaimer. | ||
24 | * | ||
25 | * Redistributions in binary form must reproduce the above copyright notice, | ||
26 | * this list of conditions and the following disclaimer in the documentation | ||
27 | * and/or other materials | ||
28 | * provided with the distribution. | ||
29 | * | ||
30 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
31 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
32 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
33 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||
34 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
35 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
36 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | ||
37 | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER | ||
38 | * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
39 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
40 | * POSSIBILITY OF SUCH DAMAGE. | ||
41 | */ | ||
42 | |||
43 | |||
44 | #ifndef EHCA_TOOLS_H | ||
45 | #define EHCA_TOOLS_H | ||
46 | |||
47 | #include <linux/kernel.h> | ||
48 | #include <linux/spinlock.h> | ||
49 | #include <linux/delay.h> | ||
50 | #include <linux/idr.h> | ||
51 | #include <linux/kthread.h> | ||
52 | #include <linux/mm.h> | ||
53 | #include <linux/mman.h> | ||
54 | #include <linux/module.h> | ||
55 | #include <linux/moduleparam.h> | ||
56 | #include <linux/vmalloc.h> | ||
57 | #include <linux/version.h> | ||
58 | #include <linux/notifier.h> | ||
59 | #include <linux/cpu.h> | ||
60 | #include <linux/device.h> | ||
61 | |||
62 | #include <asm/abs_addr.h> | ||
63 | #include <asm/ibmebus.h> | ||
64 | #include <asm/io.h> | ||
65 | #include <asm/pgtable.h> | ||
66 | |||
67 | extern int ehca_debug_level; | ||
68 | |||
69 | #define ehca_dbg(ib_dev, format, arg...) \ | ||
70 | do { \ | ||
71 | if (unlikely(ehca_debug_level)) \ | ||
72 | dev_printk(KERN_DEBUG, (ib_dev)->dma_device, \ | ||
73 | "PU%04x EHCA_DBG:%s " format "\n", \ | ||
74 | get_paca()->paca_index, __FUNCTION__, \ | ||
75 | ## arg); \ | ||
76 | } while (0) | ||
77 | |||
78 | #define ehca_info(ib_dev, format, arg...) \ | ||
79 | dev_info((ib_dev)->dma_device, "PU%04x EHCA_INFO:%s " format "\n", \ | ||
80 | get_paca()->paca_index, __FUNCTION__, ## arg) | ||
81 | |||
82 | #define ehca_warn(ib_dev, format, arg...) \ | ||
83 | dev_warn((ib_dev)->dma_device, "PU%04x EHCA_WARN:%s " format "\n", \ | ||
84 | get_paca()->paca_index, __FUNCTION__, ## arg) | ||
85 | |||
86 | #define ehca_err(ib_dev, format, arg...) \ | ||
87 | dev_err((ib_dev)->dma_device, "PU%04x EHCA_ERR:%s " format "\n", \ | ||
88 | get_paca()->paca_index, __FUNCTION__, ## arg) | ||
89 | |||
90 | /* use this one only if no ib_dev available */ | ||
91 | #define ehca_gen_dbg(format, arg...) \ | ||
92 | do { \ | ||
93 | if (unlikely(ehca_debug_level)) \ | ||
94 | printk(KERN_DEBUG "PU%04x EHCA_DBG:%s " format "\n",\ | ||
95 | get_paca()->paca_index, __FUNCTION__, ## arg); \ | ||
96 | } while (0) | ||
97 | |||
98 | #define ehca_gen_warn(format, arg...) \ | ||
99 | do { \ | ||
100 | if (unlikely(ehca_debug_level)) \ | ||
101 | printk(KERN_INFO "PU%04x EHCA_WARN:%s " format "\n",\ | ||
102 | get_paca()->paca_index, __FUNCTION__, ## arg); \ | ||
103 | } while (0) | ||
104 | |||
105 | #define ehca_gen_err(format, arg...) \ | ||
106 | printk(KERN_ERR "PU%04x EHCA_ERR:%s " format "\n", \ | ||
107 | get_paca()->paca_index, __FUNCTION__, ## arg) | ||
108 | |||
109 | /** | ||
110 | * ehca_dmp - printk a memory block, whose length is n*8 bytes. | ||
111 | * Each line has the following layout: | ||
112 | * <format string> adr=X ofs=Y <8 bytes hex> <8 bytes hex> | ||
113 | */ | ||
114 | #define ehca_dmp(adr, len, format, args...) \ | ||
115 | do { \ | ||
116 | unsigned int x; \ | ||
117 | unsigned int l = (unsigned int)(len); \ | ||
118 | unsigned char *deb = (unsigned char*)(adr); \ | ||
119 | for (x = 0; x < l; x += 16) { \ | ||
120 | printk("EHCA_DMP:%s" format \ | ||
121 | " adr=%p ofs=%04x %016lx %016lx\n", \ | ||
122 | __FUNCTION__, ##args, deb, x, \ | ||
123 | *((u64 *)&deb[0]), *((u64 *)&deb[8])); \ | ||
124 | deb += 16; \ | ||
125 | } \ | ||
126 | } while (0) | ||
127 | |||
128 | /* define a bitmask, little endian version */ | ||
129 | #define EHCA_BMASK(pos,length) (((pos)<<16)+(length)) | ||
130 | |||
131 | /* define a bitmask, the ibm way... */ | ||
132 | #define EHCA_BMASK_IBM(from,to) (((63-to)<<16)+((to)-(from)+1)) | ||
133 | |||
134 | /* internal function, don't use */ | ||
135 | #define EHCA_BMASK_SHIFTPOS(mask) (((mask)>>16)&0xffff) | ||
136 | |||
137 | /* internal function, don't use */ | ||
138 | #define EHCA_BMASK_MASK(mask) (0xffffffffffffffffULL >> ((64-(mask))&0xffff)) | ||
139 | |||
140 | /** | ||
141 | * EHCA_BMASK_SET - return value shifted and masked by mask | ||
142 | * variable|=EHCA_BMASK_SET(MY_MASK,0x4711) ORs the bits in variable | ||
143 | * variable&=~EHCA_BMASK_SET(MY_MASK,-1) clears the bits from the mask | ||
144 | * in variable | ||
145 | */ | ||
146 | #define EHCA_BMASK_SET(mask,value) \ | ||
147 | ((EHCA_BMASK_MASK(mask) & ((u64)(value)))<<EHCA_BMASK_SHIFTPOS(mask)) | ||
148 | |||
149 | /** | ||
150 | * EHCA_BMASK_GET - extract a parameter from value by mask | ||
151 | */ | ||
152 | #define EHCA_BMASK_GET(mask,value) \ | ||
153 | (EHCA_BMASK_MASK(mask)& (((u64)(value))>>EHCA_BMASK_SHIFTPOS(mask))) | ||
154 | |||
155 | |||
156 | /* Converts ehca to ib return code */ | ||
157 | static inline int ehca2ib_return_code(u64 ehca_rc) | ||
158 | { | ||
159 | switch (ehca_rc) { | ||
160 | case H_SUCCESS: | ||
161 | return 0; | ||
162 | case H_BUSY: | ||
163 | return -EBUSY; | ||
164 | case H_NO_MEM: | ||
165 | return -ENOMEM; | ||
166 | default: | ||
167 | return -EINVAL; | ||
168 | } | ||
169 | } | ||
170 | |||
171 | |||
172 | #endif /* EHCA_TOOLS_H */ | ||