xref: /illumos-gate/usr/src/uts/common/io/bnxe/577xx/drivers/common/include/utils.h (revision d14abf155341d55053c76eeec58b787a456b753b)
1*d14abf15SRobert Mustacchi /*******************************************************************************
2*d14abf15SRobert Mustacchi  * CDDL HEADER START
3*d14abf15SRobert Mustacchi  *
4*d14abf15SRobert Mustacchi  * The contents of this file are subject to the terms of the
5*d14abf15SRobert Mustacchi  * Common Development and Distribution License (the "License").
6*d14abf15SRobert Mustacchi  * You may not use this file except in compliance with the License.
7*d14abf15SRobert Mustacchi  *
8*d14abf15SRobert Mustacchi  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*d14abf15SRobert Mustacchi  * or http://www.opensolaris.org/os/licensing.
10*d14abf15SRobert Mustacchi  * See the License for the specific language governing permissions
11*d14abf15SRobert Mustacchi  * and limitations under the License.
12*d14abf15SRobert Mustacchi  *
13*d14abf15SRobert Mustacchi  * When distributing Covered Code, include this CDDL HEADER in each
14*d14abf15SRobert Mustacchi  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*d14abf15SRobert Mustacchi  * If applicable, add the following below this CDDL HEADER, with the
16*d14abf15SRobert Mustacchi  * fields enclosed by brackets "[]" replaced with your own identifying
17*d14abf15SRobert Mustacchi  * information: Portions Copyright [yyyy] [name of copyright owner]
18*d14abf15SRobert Mustacchi  *
19*d14abf15SRobert Mustacchi  * CDDL HEADER END
20*d14abf15SRobert Mustacchi  *
21*d14abf15SRobert Mustacchi  * Copyright 2014 QLogic Corporation
22*d14abf15SRobert Mustacchi  * The contents of this file are subject to the terms of the
23*d14abf15SRobert Mustacchi  * QLogic End User License (the "License").
24*d14abf15SRobert Mustacchi  * You may not use this file except in compliance with the License.
25*d14abf15SRobert Mustacchi  *
26*d14abf15SRobert Mustacchi  * You can obtain a copy of the License at
27*d14abf15SRobert Mustacchi  * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
28*d14abf15SRobert Mustacchi  * QLogic_End_User_Software_License.txt
29*d14abf15SRobert Mustacchi  * See the License for the specific language governing permissions
30*d14abf15SRobert Mustacchi  * and limitations under the License.
31*d14abf15SRobert Mustacchi  *
32*d14abf15SRobert Mustacchi  *
33*d14abf15SRobert Mustacchi  * Module Description:
34*d14abf15SRobert Mustacchi  *  This file should include pure ANSI C defines
35*d14abf15SRobert Mustacchi  *
36*d14abf15SRobert Mustacchi  * History:
37*d14abf15SRobert Mustacchi  *    04/03/07 Alon Elhanani        Inception.
38*d14abf15SRobert Mustacchi  ******************************************************************************/
39*d14abf15SRobert Mustacchi 
40*d14abf15SRobert Mustacchi #ifndef __utils_h__
41*d14abf15SRobert Mustacchi #define __utils_h__
42*d14abf15SRobert Mustacchi 
43*d14abf15SRobert Mustacchi #ifndef BITS_PER_BYTE
44*d14abf15SRobert Mustacchi #define BITS_PER_BYTE                        (8)
45*d14abf15SRobert Mustacchi #endif //BITS_PER_BYTE
46*d14abf15SRobert Mustacchi /*
47*d14abf15SRobert Mustacchi XXX_FLAGS
48*d14abf15SRobert Mustacchi bitwise flags operations, for readability of the code
49*d14abf15SRobert Mustacchi */
50*d14abf15SRobert Mustacchi 
51*d14abf15SRobert Mustacchi // get specific flags
52*d14abf15SRobert Mustacchi #define GET_FLAGS(flags,bits)                   ((flags) & (bits))
53*d14abf15SRobert Mustacchi #define GET_FLAGS_WITH_OFFSET(flags,bits,offset)    (((flags) & (bits)) >> (offset))
54*d14abf15SRobert Mustacchi // set specific flags
55*d14abf15SRobert Mustacchi #define SET_FLAGS(flags,bits)                   ((flags) |= (bits))
56*d14abf15SRobert Mustacchi // reset specific flags
57*d14abf15SRobert Mustacchi #define RESET_FLAGS(flags,bits)                 ((flags) &= ~(bits))
58*d14abf15SRobert Mustacchi // clear flags
59*d14abf15SRobert Mustacchi #define CLEAR_FLAGS(flags)                      ((flags)=0)
60*d14abf15SRobert Mustacchi 
61*d14abf15SRobert Mustacchi // macros for a single bit
62*d14abf15SRobert Mustacchi #define SET_BIT( _bits, _val )   SET_FLAGS  ( _bits,   (0x1ULL << _val) )
63*d14abf15SRobert Mustacchi #define RESET_BIT( _bits, _val ) RESET_FLAGS( _bits,   (0x1ULL << _val) )
64*d14abf15SRobert Mustacchi #define GET_BIT( _bits, _val )   GET_FLAGS  ( _bits,   (0x1ULL << _val) )
65*d14abf15SRobert Mustacchi 
66*d14abf15SRobert Mustacchi /**
67*d14abf15SRobert Mustacchi  * \brief offset of byte next to specified struct member
68*d14abf15SRobert Mustacchi  *
69*d14abf15SRobert Mustacchi  * Find the size of the structure members, up-to and including
70*d14abf15SRobert Mustacchi  * the specified meber (_m).
71*d14abf15SRobert Mustacchi  *
72*d14abf15SRobert Mustacchi  * \param _s            structure type
73*d14abf15SRobert Mustacchi  * \param _m            struct member
74*d14abf15SRobert Mustacchi  */
75*d14abf15SRobert Mustacchi 
76*d14abf15SRobert Mustacchi #define LAST_BYTE_OF(_s,_m)   (OFFSETOF(_s,_m)+sizeof( ((_s *)0)->_m))
77*d14abf15SRobert Mustacchi 
78*d14abf15SRobert Mustacchi /*
79*d14abf15SRobert Mustacchi ARRSIZE:
80*d14abf15SRobert Mustacchi used to calcualte item count of an array
81*d14abf15SRobert Mustacchi this macro is used to prevent compile warning for unreferenced parametes
82*d14abf15SRobert Mustacchi */
83*d14abf15SRobert Mustacchi #ifndef ARRSIZE
84*d14abf15SRobert Mustacchi #define ARRSIZE(a)                   (sizeof(a)/sizeof((a)[0]))
85*d14abf15SRobert Mustacchi #endif // ARRSIZE
86*d14abf15SRobert Mustacchi 
87*d14abf15SRobert Mustacchi /*
88*d14abf15SRobert Mustacchi UNREFERENCED_PARAMETER
89*d14abf15SRobert Mustacchi this macro is used to prevent compile warning for unreferenced parametes
90*d14abf15SRobert Mustacchi */
91*d14abf15SRobert Mustacchi #ifndef UNREFERENCED_PARAMETER_
92*d14abf15SRobert Mustacchi #define UNREFERENCED_PARAMETER_(P)\
93*d14abf15SRobert Mustacchi     /*lint -save -e527 -e530 */  \
94*d14abf15SRobert Mustacchi     { \
95*d14abf15SRobert Mustacchi         (P) = (P); \
96*d14abf15SRobert Mustacchi     }
97*d14abf15SRobert Mustacchi #endif // UNREFERENCED_PARAMETER_
98*d14abf15SRobert Mustacchi 
99*d14abf15SRobert Mustacchi 
100*d14abf15SRobert Mustacchi /*
101*d14abf15SRobert Mustacchi ASSERT_STATIC
102*d14abf15SRobert Mustacchi this macro is used to raise COMPILE time assertions
103*d14abf15SRobert Mustacchi e.g: ASSERT_STATIC( sizeof(S08) == 1 )
104*d14abf15SRobert Mustacchi relevant errors that compilers gives in such case:
105*d14abf15SRobert Mustacchi build.exe (MS)     - "error  C2196: case value '0' already used"
106*d14abf15SRobert Mustacchi WMAKE.exe (Watcom) - "Error! E1039: Duplicate case value '0' found"
107*d14abf15SRobert Mustacchi */
108*d14abf15SRobert Mustacchi #ifndef ASSERT_STATIC
109*d14abf15SRobert Mustacchi #define ASSERT_STATIC(cond) \
110*d14abf15SRobert Mustacchi     {   \
111*d14abf15SRobert Mustacchi         const unsigned char dummy_zero = 0 ; \
112*d14abf15SRobert Mustacchi         switch(dummy_zero){case 0:case (cond):;} \
113*d14abf15SRobert Mustacchi     }
114*d14abf15SRobert Mustacchi #ifdef __SUNPRO_C /* Sun's cc can't deal with this clever hack */
115*d14abf15SRobert Mustacchi #undef ASSERT_STATIC
116*d14abf15SRobert Mustacchi #define ASSERT_STATIC(cond)
117*d14abf15SRobert Mustacchi #endif
118*d14abf15SRobert Mustacchi #endif // ASSERT_STATIC(cond)
119*d14abf15SRobert Mustacchi 
120*d14abf15SRobert Mustacchi /*
121*d14abf15SRobert Mustacchi RANGE
122*d14abf15SRobert Mustacchi this macro is used to check that a certain variable is within a given range
123*d14abf15SRobert Mustacchi e.g: RANGE_INCLUDE(a, 10, 100)    - is the following true : 10<=a<=100
124*d14abf15SRobert Mustacchi */
125*d14abf15SRobert Mustacchi #define IN_RANGE(_var, _min, _max)  ( ((_var) >= (_min)) && ((_var) <= (_max)) )
126*d14abf15SRobert Mustacchi 
127*d14abf15SRobert Mustacchi /*
128*d14abf15SRobert Mustacchi IS_DIGIT
129*d14abf15SRobert Mustacchi this macro is used to check that a char is a digit
130*d14abf15SRobert Mustacchi example IS_DIGIT('4') - is '4' a digit will return TRUE.
131*d14abf15SRobert Mustacchi */
132*d14abf15SRobert Mustacchi #ifndef IS_DIGIT
133*d14abf15SRobert Mustacchi #define IS_DIGIT(c) ( ((c) >= '0') && ((c) <= '9') )
134*d14abf15SRobert Mustacchi #endif
135*d14abf15SRobert Mustacchi 
136*d14abf15SRobert Mustacchi /*
137*d14abf15SRobert Mustacchi Define standard min and max macros
138*d14abf15SRobert Mustacchi */
139*d14abf15SRobert Mustacchi #ifndef min
140*d14abf15SRobert Mustacchi #define min(a,b) (((a) < (b)) ? (a) : (b))
141*d14abf15SRobert Mustacchi #endif
142*d14abf15SRobert Mustacchi 
143*d14abf15SRobert Mustacchi #if defined(__LINUX) || defined(USER_LINUX)
144*d14abf15SRobert Mustacchi #undef max
145*d14abf15SRobert Mustacchi #endif // LINUX
146*d14abf15SRobert Mustacchi 
147*d14abf15SRobert Mustacchi #ifndef max
148*d14abf15SRobert Mustacchi #define max(a,b) (((a) > (b)) ? (a) : (b))
149*d14abf15SRobert Mustacchi #endif // !max
150*d14abf15SRobert Mustacchi 
151*d14abf15SRobert Mustacchi #if defined(__LINUX) || defined(USER_LINUX)
152*d14abf15SRobert Mustacchi #undef DIV_ROUND_UP_BITS
153*d14abf15SRobert Mustacchi #endif // LINUX
154*d14abf15SRobert Mustacchi // Round up a divied operation more optimal way base on bits.
155*d14abf15SRobert Mustacchi // It is the same opration as d == (1<<bits).
156*d14abf15SRobert Mustacchi // DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
157*d14abf15SRobert Mustacchi #ifndef BITS_ROUND_UP
158*d14abf15SRobert Mustacchi #define DIV_ROUND_UP_BITS(n,bits) (((n) + (1 << (bits)) - 1) >> (bits))
159*d14abf15SRobert Mustacchi #endif
160*d14abf15SRobert Mustacchi /*
161*d14abf15SRobert Mustacchi Define for pragma message output with file name and line number
162*d14abf15SRobert Mustacchi usage: #pragma message (MSGSTR("blah blah blah"))
163*d14abf15SRobert Mustacchi */
164*d14abf15SRobert Mustacchi #define _STR(x) #x
165*d14abf15SRobert Mustacchi #define _STR2(x) _STR(x)
166*d14abf15SRobert Mustacchi #define MSGSTR(msg) __FILE__ "(" _STR2(__LINE__)"): message - " ##msg
167*d14abf15SRobert Mustacchi 
168*d14abf15SRobert Mustacchi 
169*d14abf15SRobert Mustacchi #ifndef POWER_OF_2
170*d14abf15SRobert Mustacchi // known algorithm
171*d14abf15SRobert Mustacchi #define POWER_OF_2(x)       ((0 != x) && (0 == (x &(x-1))))
172*d14abf15SRobert Mustacchi #endif // !POWER_OF_2
173*d14abf15SRobert Mustacchi 
174*d14abf15SRobert Mustacchi 
175*d14abf15SRobert Mustacchi 
176*d14abf15SRobert Mustacchi #ifndef FAST_PATH_MODULO
177*d14abf15SRobert Mustacchi // a = b (mod n)
178*d14abf15SRobert Mustacchi // If a==b the compiler will omit the last line.
179*d14abf15SRobert Mustacchi #define FAST_PATH_MODULO(a,b,n)     \
180*d14abf15SRobert Mustacchi     do                              \
181*d14abf15SRobert Mustacchi     {                               \
182*d14abf15SRobert Mustacchi         while ((b) > ((n) -1))      \
183*d14abf15SRobert Mustacchi             (b) = (b) - (n);        \
184*d14abf15SRobert Mustacchi         (a)=(b);                    \
185*d14abf15SRobert Mustacchi     }                               \
186*d14abf15SRobert Mustacchi     while(0)
187*d14abf15SRobert Mustacchi #endif // !FAST_PATH_MODULO
188*d14abf15SRobert Mustacchi 
189*d14abf15SRobert Mustacchi #ifndef MINCHAR
190*d14abf15SRobert Mustacchi #define MINCHAR     0x80
191*d14abf15SRobert Mustacchi #endif
192*d14abf15SRobert Mustacchi #ifndef MAXCHAR
193*d14abf15SRobert Mustacchi #define MAXCHAR     0x7f
194*d14abf15SRobert Mustacchi #endif
195*d14abf15SRobert Mustacchi #ifndef MINSHORT
196*d14abf15SRobert Mustacchi #define MINSHORT    0x8000
197*d14abf15SRobert Mustacchi #endif
198*d14abf15SRobert Mustacchi #ifndef MAXSHORT
199*d14abf15SRobert Mustacchi #define MAXSHORT    0x7fff
200*d14abf15SRobert Mustacchi #endif
201*d14abf15SRobert Mustacchi #ifndef MINLONG
202*d14abf15SRobert Mustacchi #define MINLONG     0x80000000
203*d14abf15SRobert Mustacchi #endif
204*d14abf15SRobert Mustacchi #ifndef MAXLONG
205*d14abf15SRobert Mustacchi #define MAXLONG     0x7fffffff
206*d14abf15SRobert Mustacchi #endif
207*d14abf15SRobert Mustacchi #ifndef MAXBYTE
208*d14abf15SRobert Mustacchi #define MAXBYTE     0xff
209*d14abf15SRobert Mustacchi #endif
210*d14abf15SRobert Mustacchi #ifndef MAXWORD
211*d14abf15SRobert Mustacchi #define MAXWORD     0xffff
212*d14abf15SRobert Mustacchi #endif
213*d14abf15SRobert Mustacchi #ifndef MAXDWORD
214*d14abf15SRobert Mustacchi #define MAXDWORD    0xffffffff
215*d14abf15SRobert Mustacchi #endif
216*d14abf15SRobert Mustacchi 
217*d14abf15SRobert Mustacchi #define CLEAR_MSB32(_val32) (_val32 & MAXLONG)
218*d14abf15SRobert Mustacchi 
219*d14abf15SRobert Mustacchi // Calculate the size of a field in a structure of type type, without
220*d14abf15SRobert Mustacchi // knowing or stating the type of the field.
221*d14abf15SRobert Mustacchi // based on NTDDK RTL_FIELD_SIZE
222*d14abf15SRobert Mustacchi #ifndef FIELD_SIZE
223*d14abf15SRobert Mustacchi #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
224*d14abf15SRobert Mustacchi #endif
225*d14abf15SRobert Mustacchi 
226*d14abf15SRobert Mustacchi #endif /* __utils_h__ */
227