]>
Commit | Line | Data |
---|---|---|
fab97220 HS |
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 | ||
28db6beb | 62 | #include <asm/atomic.h> |
fab97220 HS |
63 | #include <asm/abs_addr.h> |
64 | #include <asm/ibmebus.h> | |
65 | #include <asm/io.h> | |
66 | #include <asm/pgtable.h> | |
04d03bc5 | 67 | #include <asm/hvcall.h> |
fab97220 HS |
68 | |
69 | extern int ehca_debug_level; | |
70 | ||
71 | #define ehca_dbg(ib_dev, format, arg...) \ | |
72 | do { \ | |
73 | if (unlikely(ehca_debug_level)) \ | |
74 | dev_printk(KERN_DEBUG, (ib_dev)->dma_device, \ | |
75 | "PU%04x EHCA_DBG:%s " format "\n", \ | |
33718363 | 76 | raw_smp_processor_id(), __func__, \ |
fab97220 HS |
77 | ## arg); \ |
78 | } while (0) | |
79 | ||
80 | #define ehca_info(ib_dev, format, arg...) \ | |
81 | dev_info((ib_dev)->dma_device, "PU%04x EHCA_INFO:%s " format "\n", \ | |
33718363 | 82 | raw_smp_processor_id(), __func__, ## arg) |
fab97220 HS |
83 | |
84 | #define ehca_warn(ib_dev, format, arg...) \ | |
85 | dev_warn((ib_dev)->dma_device, "PU%04x EHCA_WARN:%s " format "\n", \ | |
33718363 | 86 | raw_smp_processor_id(), __func__, ## arg) |
fab97220 HS |
87 | |
88 | #define ehca_err(ib_dev, format, arg...) \ | |
89 | dev_err((ib_dev)->dma_device, "PU%04x EHCA_ERR:%s " format "\n", \ | |
33718363 | 90 | raw_smp_processor_id(), __func__, ## arg) |
fab97220 HS |
91 | |
92 | /* use this one only if no ib_dev available */ | |
93 | #define ehca_gen_dbg(format, arg...) \ | |
94 | do { \ | |
95 | if (unlikely(ehca_debug_level)) \ | |
2b94397a | 96 | printk(KERN_DEBUG "PU%04x EHCA_DBG:%s " format "\n", \ |
33718363 | 97 | raw_smp_processor_id(), __func__, ## arg); \ |
fab97220 HS |
98 | } while (0) |
99 | ||
100 | #define ehca_gen_warn(format, arg...) \ | |
86dce445 | 101 | printk(KERN_INFO "PU%04x EHCA_WARN:%s " format "\n", \ |
33718363 | 102 | raw_smp_processor_id(), __func__, ## arg) |
fab97220 HS |
103 | |
104 | #define ehca_gen_err(format, arg...) \ | |
105 | printk(KERN_ERR "PU%04x EHCA_ERR:%s " format "\n", \ | |
33718363 | 106 | raw_smp_processor_id(), __func__, ## arg) |
fab97220 HS |
107 | |
108 | /** | |
109 | * ehca_dmp - printk a memory block, whose length is n*8 bytes. | |
110 | * Each line has the following layout: | |
111 | * <format string> adr=X ofs=Y <8 bytes hex> <8 bytes hex> | |
112 | */ | |
113 | #define ehca_dmp(adr, len, format, args...) \ | |
2b94397a HNN |
114 | do { \ |
115 | unsigned int x; \ | |
fab97220 | 116 | unsigned int l = (unsigned int)(len); \ |
2b94397a | 117 | unsigned char *deb = (unsigned char *)(adr); \ |
fab97220 | 118 | for (x = 0; x < l; x += 16) { \ |
2b94397a | 119 | printk(KERN_INFO "EHCA_DMP:%s " format \ |
fab97220 | 120 | " adr=%p ofs=%04x %016lx %016lx\n", \ |
33718363 | 121 | __func__, ##args, deb, x, \ |
fab97220 HS |
122 | *((u64 *)&deb[0]), *((u64 *)&deb[8])); \ |
123 | deb += 16; \ | |
124 | } \ | |
125 | } while (0) | |
126 | ||
127 | /* define a bitmask, little endian version */ | |
2b94397a | 128 | #define EHCA_BMASK(pos, length) (((pos) << 16) + (length)) |
fab97220 HS |
129 | |
130 | /* define a bitmask, the ibm way... */ | |
2b94397a | 131 | #define EHCA_BMASK_IBM(from, to) (((63 - to) << 16) + ((to) - (from) + 1)) |
fab97220 HS |
132 | |
133 | /* internal function, don't use */ | |
2b94397a | 134 | #define EHCA_BMASK_SHIFTPOS(mask) (((mask) >> 16) & 0xffff) |
fab97220 HS |
135 | |
136 | /* internal function, don't use */ | |
2b94397a | 137 | #define EHCA_BMASK_MASK(mask) (~0ULL >> ((64 - (mask)) & 0xffff)) |
fab97220 HS |
138 | |
139 | /** | |
140 | * EHCA_BMASK_SET - return value shifted and masked by mask | |
141 | * variable|=EHCA_BMASK_SET(MY_MASK,0x4711) ORs the bits in variable | |
142 | * variable&=~EHCA_BMASK_SET(MY_MASK,-1) clears the bits from the mask | |
143 | * in variable | |
144 | */ | |
2b94397a HNN |
145 | #define EHCA_BMASK_SET(mask, value) \ |
146 | ((EHCA_BMASK_MASK(mask) & ((u64)(value))) << EHCA_BMASK_SHIFTPOS(mask)) | |
fab97220 HS |
147 | |
148 | /** | |
149 | * EHCA_BMASK_GET - extract a parameter from value by mask | |
150 | */ | |
2b94397a HNN |
151 | #define EHCA_BMASK_GET(mask, value) \ |
152 | (EHCA_BMASK_MASK(mask) & (((u64)(value)) >> EHCA_BMASK_SHIFTPOS(mask))) | |
fab97220 | 153 | |
fab97220 | 154 | /* Converts ehca to ib return code */ |
51d2bfbd | 155 | int ehca2ib_return_code(u64 ehca_rc); |
fab97220 HS |
156 | |
157 | #endif /* EHCA_TOOLS_H */ |