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