xref: /OK3568_Linux_fs/external/rkwifibt/drivers/infineon/include/bcmdefs.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Misc system wide definitions
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Copyright (C) 1999-2017, Broadcom Corporation
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
9*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
10*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
11*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
12*4882a593Smuzhiyun  * following added to such license:
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
15*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
16*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
17*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
18*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
19*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
20*4882a593Smuzhiyun  * modifications of the software.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  *      Notwithstanding the above, under no circumstances may you combine this
23*4882a593Smuzhiyun  * software in any way with any other Broadcom software provided under a license
24*4882a593Smuzhiyun  * other than the GPL, without Broadcom's express prior written consent.
25*4882a593Smuzhiyun  *
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Open:>>
28*4882a593Smuzhiyun  *
29*4882a593Smuzhiyun  * $Id: bcmdefs.h 700870 2017-05-22 19:05:22Z $
30*4882a593Smuzhiyun  */
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #ifndef	_bcmdefs_h_
33*4882a593Smuzhiyun #define	_bcmdefs_h_
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /*
36*4882a593Smuzhiyun  * One doesn't need to include this file explicitly, gets included automatically if
37*4882a593Smuzhiyun  * typedefs.h is included.
38*4882a593Smuzhiyun  */
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /* Use BCM_REFERENCE to suppress warnings about intentionally-unused function
41*4882a593Smuzhiyun  * arguments or local variables.
42*4882a593Smuzhiyun  */
43*4882a593Smuzhiyun #define BCM_REFERENCE(data)	((void)(data))
44*4882a593Smuzhiyun #include <linux/compiler.h>
45*4882a593Smuzhiyun /* Allow for suppressing unused variable warnings. */
46*4882a593Smuzhiyun #ifdef __GNUC__
47*4882a593Smuzhiyun #define UNUSED_VAR     __attribute__ ((unused))
48*4882a593Smuzhiyun #else
49*4882a593Smuzhiyun #define UNUSED_VAR
50*4882a593Smuzhiyun #endif // endif
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /* GNU GCC 4.6+ supports selectively turning off a warning.
53*4882a593Smuzhiyun  * Define these diagnostic macros to help suppress cast-qual warning
54*4882a593Smuzhiyun  * until all the work can be done to fix the casting issues.
55*4882a593Smuzhiyun  */
56*4882a593Smuzhiyun #if (defined(__GNUC__) && defined(STRICT_GCC_WARNINGS) && (__GNUC__ > 4 || (__GNUC__ == \
57*4882a593Smuzhiyun 	4 && __GNUC_MINOR__ >= 6)))
58*4882a593Smuzhiyun #define GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST()              \
59*4882a593Smuzhiyun 	_Pragma("GCC diagnostic push")			 \
60*4882a593Smuzhiyun 	_Pragma("GCC diagnostic ignored \"-Wcast-qual\"")
61*4882a593Smuzhiyun #define GCC_DIAGNOSTIC_POP()                             \
62*4882a593Smuzhiyun 	_Pragma("GCC diagnostic pop")
63*4882a593Smuzhiyun #else
64*4882a593Smuzhiyun #define GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST()
65*4882a593Smuzhiyun #define GCC_DIAGNOSTIC_POP()
66*4882a593Smuzhiyun #endif   /* Diagnostic macros not defined */
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* Support clang for MACOSX compiler */
69*4882a593Smuzhiyun #ifdef __clang__
70*4882a593Smuzhiyun #define CLANG_DIAGNOSTIC_PUSH_SUPPRESS_CAST()              \
71*4882a593Smuzhiyun 	_Pragma("clang diagnostic push")			 \
72*4882a593Smuzhiyun 	_Pragma("clang diagnostic ignored \"-Wcast-qual\"")
73*4882a593Smuzhiyun #define CLANG_DIAGNOSTIC_PUSH_SUPPRESS_FORMAT()              \
74*4882a593Smuzhiyun 	_Pragma("clang diagnostic push")             \
75*4882a593Smuzhiyun 	_Pragma("clang diagnostic ignored \"-Wformat-nonliteral\"")
76*4882a593Smuzhiyun #define CLANG_DIAGNOSTIC_POP()              \
77*4882a593Smuzhiyun 	_Pragma("clang diagnostic pop")
78*4882a593Smuzhiyun #else
79*4882a593Smuzhiyun #define CLANG_DIAGNOSTIC_PUSH_SUPPRESS_CAST()
80*4882a593Smuzhiyun #define CLANG_DIAGNOSTIC_PUSH_SUPPRESS_FORMAT()
81*4882a593Smuzhiyun #define CLANG_DIAGNOSTIC_POP()
82*4882a593Smuzhiyun #endif // endif
83*4882a593Smuzhiyun /* Compile-time assert can be used in place of ASSERT if the expression evaluates
84*4882a593Smuzhiyun  * to a constant at compile time.
85*4882a593Smuzhiyun  */
86*4882a593Smuzhiyun #if (__GNUC__ <= 4 && __GNUC_MINOR__ >= 4)
87*4882a593Smuzhiyun #define STATIC_ASSERT(expr) { \
88*4882a593Smuzhiyun 	/* Make sure the expression is constant. */ \
89*4882a593Smuzhiyun 	typedef enum { _STATIC_ASSERT_NOT_CONSTANT = (expr) } _static_assert_e UNUSED_VAR; \
90*4882a593Smuzhiyun 	/* Make sure the expression is true. */ \
91*4882a593Smuzhiyun 	typedef char STATIC_ASSERT_FAIL[(expr) ? 1 : -1] UNUSED_VAR; \
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun #else
94*4882a593Smuzhiyun #define STATIC_ASSERT(expr)	compiletime_assert(expr, "Compile time condition failure");
95*4882a593Smuzhiyun #endif /* __GNUC__ <= 4 && __GNUC_MINOR__ >= 4 */
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun /* Reclaiming text and data :
98*4882a593Smuzhiyun  * The following macros specify special linker sections that can be reclaimed
99*4882a593Smuzhiyun  * after a system is considered 'up'.
100*4882a593Smuzhiyun  * BCMATTACHFN is also used for detach functions (it's not worth having a BCMDETACHFN,
101*4882a593Smuzhiyun  * as in most cases, the attach function calls the detach function to clean up on error).
102*4882a593Smuzhiyun  */
103*4882a593Smuzhiyun #if defined(BCM_RECLAIM)
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun extern bool bcm_reclaimed;
106*4882a593Smuzhiyun extern bool bcm_attach_part_reclaimed;
107*4882a593Smuzhiyun extern bool bcm_preattach_part_reclaimed;
108*4882a593Smuzhiyun extern bool bcm_postattach_part_reclaimed;
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun #define RECLAIMED()			(bcm_reclaimed)
111*4882a593Smuzhiyun #define ATTACH_PART_RECLAIMED()		(bcm_attach_part_reclaimed)
112*4882a593Smuzhiyun #define PREATTACH_PART_RECLAIMED()	(bcm_preattach_part_reclaimed)
113*4882a593Smuzhiyun #define POSTATTACH_PART_RECLAIMED()	(bcm_postattach_part_reclaimed)
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun #if defined(BCM_RECLAIM_ATTACH_FN_DATA)
116*4882a593Smuzhiyun #define _data	__attribute__ ((__section__ (".dataini2." #_data))) _data
117*4882a593Smuzhiyun #define _fn	__attribute__ ((__section__ (".textini2." #_fn), noinline)) _fn
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun /* Relocate attach symbols to save-restore region to increase pre-reclaim heap size. */
120*4882a593Smuzhiyun #define BCM_SRM_ATTACH_DATA(_data)    __attribute__ ((__section__ (".datasrm." #_data))) _data
121*4882a593Smuzhiyun #define BCM_SRM_ATTACH_FN(_fn)        __attribute__ ((__section__ (".textsrm." #_fn), noinline)) _fn
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun #ifndef PREATTACH_NORECLAIM
124*4882a593Smuzhiyun #define BCMPREATTACHDATA(_data)	__attribute__ ((__section__ (".dataini3." #_data))) _data
125*4882a593Smuzhiyun #define BCMPREATTACHFN(_fn)	__attribute__ ((__section__ (".textini3." #_fn), noinline)) _fn
126*4882a593Smuzhiyun #else
127*4882a593Smuzhiyun #define BCMPREATTACHDATA(_data)	__attribute__ ((__section__ (".dataini2." #_data))) _data
128*4882a593Smuzhiyun #define BCMPREATTACHFN(_fn)	__attribute__ ((__section__ (".textini2." #_fn), noinline)) _fn
129*4882a593Smuzhiyun #endif /* PREATTACH_NORECLAIM  */
130*4882a593Smuzhiyun #define BCMPOSTATTACHDATA(_data)	__attribute__ ((__section__ (".dataini5." #_data))) _data
131*4882a593Smuzhiyun #define BCMPOSTATTACHFN(_fn)	__attribute__ ((__section__ (".textini5." #_fn), noinline)) _fn
132*4882a593Smuzhiyun #else  /* BCM_RECLAIM_ATTACH_FN_DATA  */
133*4882a593Smuzhiyun #define _data	_data
134*4882a593Smuzhiyun #define _fn	_fn
135*4882a593Smuzhiyun #define BCMPREATTACHDATA(_data)	_data
136*4882a593Smuzhiyun #define BCMPREATTACHFN(_fn)	_fn
137*4882a593Smuzhiyun #define BCMPOSTATTACHDATA(_data)	_data
138*4882a593Smuzhiyun #define BCMPOSTATTACHFN(_fn)	_fn
139*4882a593Smuzhiyun #endif /* BCM_RECLAIM_ATTACH_FN_DATA  */
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun #ifdef BCMDBG_SR
142*4882a593Smuzhiyun /*
143*4882a593Smuzhiyun  * Don't reclaim so we can compare SR ASM
144*4882a593Smuzhiyun  */
145*4882a593Smuzhiyun #define BCMPREATTACHDATASR(_data)	_data
146*4882a593Smuzhiyun #define BCMPREATTACHFNSR(_fn)		_fn
147*4882a593Smuzhiyun #define BCMATTACHDATASR(_data)		_data
148*4882a593Smuzhiyun #define BCMATTACHFNSR(_fn)		_fn
149*4882a593Smuzhiyun #else
150*4882a593Smuzhiyun #define BCMPREATTACHDATASR(_data)	BCMPREATTACHDATA(_data)
151*4882a593Smuzhiyun #define BCMPREATTACHFNSR(_fn)		BCMPREATTACHFN(_fn)
152*4882a593Smuzhiyun #define BCMATTACHDATASR(_data)		_data
153*4882a593Smuzhiyun #define BCMATTACHFNSR(_fn)		_fn
154*4882a593Smuzhiyun #endif // endif
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun #if defined(BCM_RECLAIM_INIT_FN_DATA)
157*4882a593Smuzhiyun #define _data	__attribute__ ((__section__ (".dataini1." #_data))) _data
158*4882a593Smuzhiyun #define _fn		__attribute__ ((__section__ (".textini1." #_fn), noinline)) _fn
159*4882a593Smuzhiyun #define CONST
160*4882a593Smuzhiyun #else /* BCM_RECLAIM_INIT_FN_DATA  */
161*4882a593Smuzhiyun #define _data	_data
162*4882a593Smuzhiyun #define _fn		_fn
163*4882a593Smuzhiyun #ifndef CONST
164*4882a593Smuzhiyun #define CONST	const
165*4882a593Smuzhiyun #endif // endif
166*4882a593Smuzhiyun #endif /* BCM_RECLAIM_INIT_FN_DATA  */
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /* Non-manufacture or internal attach function/dat */
169*4882a593Smuzhiyun #define	BCMNMIATTACHFN(_fn)	_fn
170*4882a593Smuzhiyun #define	BCMNMIATTACHDATA(_data)	_data
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun #if defined(BCM_CISDUMP_NO_RECLAIM)
173*4882a593Smuzhiyun #define	BCMCISDUMPATTACHFN(_fn)		_fn
174*4882a593Smuzhiyun #define	BCMCISDUMPATTACHDATA(_data)	_data
175*4882a593Smuzhiyun #else
176*4882a593Smuzhiyun #define	BCMCISDUMPATTACHFN(_fn)		BCMNMIATTACHFN(_fn)
177*4882a593Smuzhiyun #define	BCMCISDUMPATTACHDATA(_data)	BCMNMIATTACHDATA(_data)
178*4882a593Smuzhiyun #endif // endif
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun /* SROM with OTP support */
181*4882a593Smuzhiyun #if defined(BCMOTPSROM)
182*4882a593Smuzhiyun #define	BCMSROMATTACHFN(_fn)		_fn
183*4882a593Smuzhiyun #define	BCMSROMATTACHDATA(_data)	_data
184*4882a593Smuzhiyun #else
185*4882a593Smuzhiyun #define	BCMSROMATTACHFN(_fn)		BCMNMIATTACHFN(_fn)
186*4882a593Smuzhiyun #define	BCMSROMATTACHDATA(_data)	BCMNMIATTACHFN(_data)
187*4882a593Smuzhiyun #endif	/* BCMOTPSROM */
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun #if defined(BCM_CISDUMP_NO_RECLAIM)
190*4882a593Smuzhiyun #define	BCMSROMCISDUMPATTACHFN(_fn)	_fn
191*4882a593Smuzhiyun #define	BCMSROMCISDUMPATTACHDATA(_data)	_data
192*4882a593Smuzhiyun #else
193*4882a593Smuzhiyun #define	BCMSROMCISDUMPATTACHFN(_fn)	BCMSROMATTACHFN(_fn)
194*4882a593Smuzhiyun #define	BCMSROMCISDUMPATTACHDATA(_data)	BCMSROMATTACHDATA(_data)
195*4882a593Smuzhiyun #endif /* BCM_CISDUMP_NO_RECLAIM */
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun #ifdef BCMNODOWN
198*4882a593Smuzhiyun #define _fn	_fn
199*4882a593Smuzhiyun #else
200*4882a593Smuzhiyun #define _fn	_fn
201*4882a593Smuzhiyun #endif // endif
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun #else /* BCM_RECLAIM */
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun #define bcm_reclaimed			(1)
206*4882a593Smuzhiyun #define bcm_attach_part_reclaimed	(1)
207*4882a593Smuzhiyun #define bcm_preattach_part_reclaimed	(1)
208*4882a593Smuzhiyun #define bcm_postattach_part_reclaimed	(1)
209*4882a593Smuzhiyun #define _data		_data
210*4882a593Smuzhiyun #define _fn		_fn
211*4882a593Smuzhiyun #define BCM_SRM_ATTACH_DATA(_data)	_data
212*4882a593Smuzhiyun #define BCM_SRM_ATTACH_FN(_fn)		_fn
213*4882a593Smuzhiyun #define BCMPREATTACHDATA(_data)		_data
214*4882a593Smuzhiyun #define BCMPREATTACHFN(_fn)		_fn
215*4882a593Smuzhiyun #define BCMPOSTATTACHDATA(_data)	_data
216*4882a593Smuzhiyun #define BCMPOSTATTACHFN(_fn)		_fn
217*4882a593Smuzhiyun #define _data		_data
218*4882a593Smuzhiyun #define _fn			_fn
219*4882a593Smuzhiyun #define _fn		_fn
220*4882a593Smuzhiyun #define	BCMNMIATTACHFN(_fn)		_fn
221*4882a593Smuzhiyun #define	BCMNMIATTACHDATA(_data)		_data
222*4882a593Smuzhiyun #define	BCMSROMATTACHFN(_fn)		_fn
223*4882a593Smuzhiyun #define	BCMSROMATTACHDATA(_data)	_data
224*4882a593Smuzhiyun #define BCMPREATTACHFNSR(_fn)		_fn
225*4882a593Smuzhiyun #define BCMPREATTACHDATASR(_data)	_data
226*4882a593Smuzhiyun #define BCMATTACHFNSR(_fn)		_fn
227*4882a593Smuzhiyun #define BCMATTACHDATASR(_data)		_data
228*4882a593Smuzhiyun #define	BCMSROMATTACHFN(_fn)		_fn
229*4882a593Smuzhiyun #define	BCMSROMATTACHDATA(_data)	_data
230*4882a593Smuzhiyun #define	BCMCISDUMPATTACHFN(_fn)		_fn
231*4882a593Smuzhiyun #define	BCMCISDUMPATTACHDATA(_data)	_data
232*4882a593Smuzhiyun #define	BCMSROMCISDUMPATTACHFN(_fn)	_fn
233*4882a593Smuzhiyun #define	BCMSROMCISDUMPATTACHDATA(_data)	_data
234*4882a593Smuzhiyun #define CONST				const
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun #define RECLAIMED()			(bcm_reclaimed)
237*4882a593Smuzhiyun #define ATTACH_PART_RECLAIMED()		(bcm_attach_part_reclaimed)
238*4882a593Smuzhiyun #define PREATTACH_PART_RECLAIMED()	(bcm_preattach_part_reclaimed)
239*4882a593Smuzhiyun #define POSTATTACH_PART_RECLAIMED()	(bcm_postattach_part_reclaimed)
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun #endif /* BCM_RECLAIM */
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun #define BCMUCODEDATA(_data)		_data
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun #if defined(BCM_DMA_CT) && !defined(BCM_DMA_CT_DISABLED)
246*4882a593Smuzhiyun #define BCMUCODEFN(_fn)			_fn
247*4882a593Smuzhiyun #else
248*4882a593Smuzhiyun #define BCMUCODEFN(_fn)			_fn
249*4882a593Smuzhiyun #endif /* BCM_DMA_CT */
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun #if !defined STB
252*4882a593Smuzhiyun #if defined(BCM47XX) && defined(__ARM_ARCH_7A__) && !defined(OEM_ANDROID)
253*4882a593Smuzhiyun #define BCM47XX_CA9
254*4882a593Smuzhiyun #else
255*4882a593Smuzhiyun #undef BCM47XX_CA9
256*4882a593Smuzhiyun #endif /* BCM47XX && __ARM_ARCH_7A__ && !OEM_ANDROID */
257*4882a593Smuzhiyun #endif /* STB */
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun /* BCMFASTPATH Related Macro defines
260*4882a593Smuzhiyun */
261*4882a593Smuzhiyun #ifndef BCMFASTPATH
262*4882a593Smuzhiyun #if defined(STB)
263*4882a593Smuzhiyun #define BCMFASTPATH		__attribute__ ((__section__ (".text.fastpath")))
264*4882a593Smuzhiyun #define BCMFASTPATH_HOST	__attribute__ ((__section__ (".text.fastpath_host")))
265*4882a593Smuzhiyun #else /* mips || BCM47XX_CA9 || STB */
266*4882a593Smuzhiyun #define BCMFASTPATH
267*4882a593Smuzhiyun #define BCMFASTPATH_HOST
268*4882a593Smuzhiyun #endif // endif
269*4882a593Smuzhiyun #endif /* BCMFASTPATH */
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun /* Use the BCMRAMFN() macro to tag functions in source that must be included in RAM (excluded from
272*4882a593Smuzhiyun  * ROM). This should eliminate the need to manually specify these functions in the ROM config file.
273*4882a593Smuzhiyun  * It should only be used in special cases where the function must be in RAM for *all* ROM-based
274*4882a593Smuzhiyun  * chips.
275*4882a593Smuzhiyun  */
276*4882a593Smuzhiyun 	#define BCMRAMFN(_fn)	_fn
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun /* Use BCMSPECSYM() macro to tag symbols going to a special output section in the binary. */
279*4882a593Smuzhiyun #define BCMSPECSYM(_sym)	__attribute__ ((__section__ (".special." #_sym))) _sym
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun #define STATIC	static
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun /* Bus types */
284*4882a593Smuzhiyun #define	SI_BUS			0	/* SOC Interconnect */
285*4882a593Smuzhiyun #define	PCI_BUS			1	/* PCI target */
286*4882a593Smuzhiyun #define	PCMCIA_BUS		2	/* PCMCIA target */
287*4882a593Smuzhiyun #define SDIO_BUS		3	/* SDIO target */
288*4882a593Smuzhiyun #define JTAG_BUS		4	/* JTAG */
289*4882a593Smuzhiyun #define USB_BUS			5	/* USB (does not support R/W REG) */
290*4882a593Smuzhiyun #define SPI_BUS			6	/* gSPI target */
291*4882a593Smuzhiyun #define RPC_BUS			7	/* RPC target */
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun /* Allows size optimization for single-bus image */
294*4882a593Smuzhiyun #ifdef BCMBUSTYPE
295*4882a593Smuzhiyun #define BUSTYPE(bus)	(BCMBUSTYPE)
296*4882a593Smuzhiyun #else
297*4882a593Smuzhiyun #define BUSTYPE(bus)	(bus)
298*4882a593Smuzhiyun #endif // endif
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun #ifdef BCMBUSCORETYPE
301*4882a593Smuzhiyun #define BUSCORETYPE(ct)		(BCMBUSCORETYPE)
302*4882a593Smuzhiyun #else
303*4882a593Smuzhiyun #define BUSCORETYPE(ct)		(ct)
304*4882a593Smuzhiyun #endif // endif
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun /* Allows size optimization for single-backplane image */
307*4882a593Smuzhiyun #ifdef BCMCHIPTYPE
308*4882a593Smuzhiyun #define CHIPTYPE(bus)	(BCMCHIPTYPE)
309*4882a593Smuzhiyun #else
310*4882a593Smuzhiyun #define CHIPTYPE(bus)	(bus)
311*4882a593Smuzhiyun #endif // endif
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun /* Allows size optimization for SPROM support */
314*4882a593Smuzhiyun #if defined(BCMSPROMBUS)
315*4882a593Smuzhiyun #define SPROMBUS	(BCMSPROMBUS)
316*4882a593Smuzhiyun #elif defined(SI_PCMCIA_SROM)
317*4882a593Smuzhiyun #define SPROMBUS	(PCMCIA_BUS)
318*4882a593Smuzhiyun #else
319*4882a593Smuzhiyun #define SPROMBUS	(PCI_BUS)
320*4882a593Smuzhiyun #endif // endif
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun /* Allows size optimization for single-chip image */
323*4882a593Smuzhiyun #ifdef BCMCHIPID
324*4882a593Smuzhiyun #define CHIPID(chip)	(BCMCHIPID)
325*4882a593Smuzhiyun #else
326*4882a593Smuzhiyun #define CHIPID(chip)	(chip)
327*4882a593Smuzhiyun #endif // endif
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun #ifdef BCMCHIPREV
330*4882a593Smuzhiyun #define CHIPREV(rev)	(BCMCHIPREV)
331*4882a593Smuzhiyun #else
332*4882a593Smuzhiyun #define CHIPREV(rev)	(rev)
333*4882a593Smuzhiyun #endif // endif
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun #ifdef BCMPCIEREV
336*4882a593Smuzhiyun #define PCIECOREREV(rev)	(BCMPCIEREV)
337*4882a593Smuzhiyun #else
338*4882a593Smuzhiyun #define PCIECOREREV(rev)	(rev)
339*4882a593Smuzhiyun #endif // endif
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun #ifdef BCMPMUREV
342*4882a593Smuzhiyun #define PMUREV(rev)	(BCMPMUREV)
343*4882a593Smuzhiyun #else
344*4882a593Smuzhiyun #define PMUREV(rev)	(rev)
345*4882a593Smuzhiyun #endif // endif
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun #ifdef BCMCCREV
348*4882a593Smuzhiyun #define CCREV(rev)	(BCMCCREV)
349*4882a593Smuzhiyun #else
350*4882a593Smuzhiyun #define CCREV(rev)	(rev)
351*4882a593Smuzhiyun #endif // endif
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun #ifdef BCMGCIREV
354*4882a593Smuzhiyun #define GCIREV(rev)	(BCMGCIREV)
355*4882a593Smuzhiyun #else
356*4882a593Smuzhiyun #define GCIREV(rev)	(rev)
357*4882a593Smuzhiyun #endif // endif
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun #ifdef BCMCR4REV
360*4882a593Smuzhiyun #define CR4REV		(BCMCR4REV)
361*4882a593Smuzhiyun #endif // endif
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun /* Defines for DMA Address Width - Shared between OSL and HNDDMA */
364*4882a593Smuzhiyun #define DMADDR_MASK_32 0x0		/* Address mask for 32-bits */
365*4882a593Smuzhiyun #define DMADDR_MASK_30 0xc0000000	/* Address mask for 30-bits */
366*4882a593Smuzhiyun #define DMADDR_MASK_26 0xFC000000	/* Address maks for 26-bits */
367*4882a593Smuzhiyun #define DMADDR_MASK_0  0xffffffff	/* Address mask for 0-bits (hi-part) */
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun #define	DMADDRWIDTH_26  26 /* 26-bit addressing capability */
370*4882a593Smuzhiyun #define	DMADDRWIDTH_30  30 /* 30-bit addressing capability */
371*4882a593Smuzhiyun #define	DMADDRWIDTH_32  32 /* 32-bit addressing capability */
372*4882a593Smuzhiyun #define	DMADDRWIDTH_63  63 /* 64-bit addressing capability */
373*4882a593Smuzhiyun #define	DMADDRWIDTH_64  64 /* 64-bit addressing capability */
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun typedef struct {
376*4882a593Smuzhiyun 	uint32 loaddr;
377*4882a593Smuzhiyun 	uint32 hiaddr;
378*4882a593Smuzhiyun } dma64addr_t;
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun #define PHYSADDR64HI(_pa) ((_pa).hiaddr)
381*4882a593Smuzhiyun #define PHYSADDR64HISET(_pa, _val) \
382*4882a593Smuzhiyun 	do { \
383*4882a593Smuzhiyun 		(_pa).hiaddr = (_val);		\
384*4882a593Smuzhiyun 	} while (0)
385*4882a593Smuzhiyun #define PHYSADDR64LO(_pa) ((_pa).loaddr)
386*4882a593Smuzhiyun #define PHYSADDR64LOSET(_pa, _val) \
387*4882a593Smuzhiyun 	do { \
388*4882a593Smuzhiyun 		(_pa).loaddr = (_val);		\
389*4882a593Smuzhiyun 	} while (0)
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun #ifdef BCMDMA64OSL
392*4882a593Smuzhiyun typedef dma64addr_t dmaaddr_t;
393*4882a593Smuzhiyun #define PHYSADDRHI(_pa) PHYSADDR64HI(_pa)
394*4882a593Smuzhiyun #define PHYSADDRHISET(_pa, _val) PHYSADDR64HISET(_pa, _val)
395*4882a593Smuzhiyun #define PHYSADDRLO(_pa)  PHYSADDR64LO(_pa)
396*4882a593Smuzhiyun #define PHYSADDRLOSET(_pa, _val) PHYSADDR64LOSET(_pa, _val)
397*4882a593Smuzhiyun #define PHYSADDRTOULONG(_pa, _ulong) \
398*4882a593Smuzhiyun 	do { \
399*4882a593Smuzhiyun 		_ulong = ((unsigned long long)(_pa).hiaddr << 32) | ((_pa).loaddr); \
400*4882a593Smuzhiyun 	} while (0)
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun #else
403*4882a593Smuzhiyun typedef unsigned long dmaaddr_t;
404*4882a593Smuzhiyun #define PHYSADDRHI(_pa) (0)
405*4882a593Smuzhiyun #define PHYSADDRHISET(_pa, _val)
406*4882a593Smuzhiyun #define PHYSADDRLO(_pa) ((_pa))
407*4882a593Smuzhiyun #define PHYSADDRLOSET(_pa, _val) \
408*4882a593Smuzhiyun 	do { \
409*4882a593Smuzhiyun 		(_pa) = (_val);			\
410*4882a593Smuzhiyun 	} while (0)
411*4882a593Smuzhiyun #endif /* BCMDMA64OSL */
412*4882a593Smuzhiyun #define PHYSADDRISZERO(_pa) (PHYSADDRLO(_pa) == 0 && PHYSADDRHI(_pa) == 0)
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun /* One physical DMA segment */
415*4882a593Smuzhiyun typedef struct  {
416*4882a593Smuzhiyun 	dmaaddr_t addr;
417*4882a593Smuzhiyun 	uint32	  length;
418*4882a593Smuzhiyun } hnddma_seg_t;
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun #define MAX_DMA_SEGS 8
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun typedef struct {
423*4882a593Smuzhiyun 	void *oshdmah; /* Opaque handle for OSL to store its information */
424*4882a593Smuzhiyun 	uint origsize; /* Size of the virtual packet */
425*4882a593Smuzhiyun 	uint nsegs;
426*4882a593Smuzhiyun 	hnddma_seg_t segs[MAX_DMA_SEGS];
427*4882a593Smuzhiyun } hnddma_seg_map_t;
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun /* packet headroom necessary to accommodate the largest header in the system, (i.e TXOFF).
430*4882a593Smuzhiyun  * By doing, we avoid the need  to allocate an extra buffer for the header when bridging to WL.
431*4882a593Smuzhiyun  * There is a compile time check in wlc.c which ensure that this value is at least as big
432*4882a593Smuzhiyun  * as TXOFF. This value is used in dma_rxfill (hnddma.c).
433*4882a593Smuzhiyun  */
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun #if defined(BCM_RPC_NOCOPY) || defined(BCM_RCP_TXNOCOPY)
436*4882a593Smuzhiyun /* add 40 bytes to allow for extra RPC header and info  */
437*4882a593Smuzhiyun #define BCMEXTRAHDROOM 260
438*4882a593Smuzhiyun #else /* BCM_RPC_NOCOPY || BCM_RPC_TXNOCOPY */
439*4882a593Smuzhiyun #if defined(STB)
440*4882a593Smuzhiyun #define BCMEXTRAHDROOM 224
441*4882a593Smuzhiyun #else
442*4882a593Smuzhiyun #define BCMEXTRAHDROOM 204
443*4882a593Smuzhiyun #endif // endif
444*4882a593Smuzhiyun #endif /* BCM_RPC_NOCOPY || BCM_RPC_TXNOCOPY */
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun /* Packet alignment for most efficient SDIO (can change based on platform) */
447*4882a593Smuzhiyun #ifndef SDALIGN
448*4882a593Smuzhiyun #define SDALIGN	32
449*4882a593Smuzhiyun #endif // endif
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun /* Headroom required for dongle-to-host communication.  Packets allocated
452*4882a593Smuzhiyun  * locally in the dongle (e.g. for CDC ioctls or RNDIS messages) should
453*4882a593Smuzhiyun  * leave this much room in front for low-level message headers which may
454*4882a593Smuzhiyun  * be needed to get across the dongle bus to the host.  (These messages
455*4882a593Smuzhiyun  * don't go over the network, so room for the full WL header above would
456*4882a593Smuzhiyun  * be a waste.).
457*4882a593Smuzhiyun */
458*4882a593Smuzhiyun #define BCMDONGLEHDRSZ 12
459*4882a593Smuzhiyun #define BCMDONGLEPADSZ 16
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun #define BCMDONGLEOVERHEAD	(BCMDONGLEHDRSZ + BCMDONGLEPADSZ)
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun #if defined(NO_BCMDBG_ASSERT)
464*4882a593Smuzhiyun # undef BCMDBG_ASSERT
465*4882a593Smuzhiyun # undef BCMASSERT_LOG
466*4882a593Smuzhiyun #endif // endif
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun #if defined(BCMASSERT_LOG)
469*4882a593Smuzhiyun #define BCMASSERT_SUPPORT
470*4882a593Smuzhiyun #endif // endif
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun /* Macros for doing definition and get/set of bitfields
473*4882a593Smuzhiyun  * Usage example, e.g. a three-bit field (bits 4-6):
474*4882a593Smuzhiyun  *    #define <NAME>_M	BITFIELD_MASK(3)
475*4882a593Smuzhiyun  *    #define <NAME>_S	4
476*4882a593Smuzhiyun  * ...
477*4882a593Smuzhiyun  *    regval = R_REG(osh, &regs->regfoo);
478*4882a593Smuzhiyun  *    field = GFIELD(regval, <NAME>);
479*4882a593Smuzhiyun  *    regval = SFIELD(regval, <NAME>, 1);
480*4882a593Smuzhiyun  *    W_REG(osh, &regs->regfoo, regval);
481*4882a593Smuzhiyun  */
482*4882a593Smuzhiyun #define BITFIELD_MASK(width) \
483*4882a593Smuzhiyun 		(((unsigned)1 << (width)) - 1)
484*4882a593Smuzhiyun #define GFIELD(val, field) \
485*4882a593Smuzhiyun 		(((val) >> field ## _S) & field ## _M)
486*4882a593Smuzhiyun #define SFIELD(val, field, bits) \
487*4882a593Smuzhiyun 		(((val) & (~(field ## _M << field ## _S))) | \
488*4882a593Smuzhiyun 		 ((unsigned)(bits) << field ## _S))
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun /* define BCMSMALL to remove misc features for memory-constrained environments */
491*4882a593Smuzhiyun #ifdef BCMSMALL
492*4882a593Smuzhiyun #undef	BCMSPACE
493*4882a593Smuzhiyun #define bcmspace	FALSE	/* if (bcmspace) code is discarded */
494*4882a593Smuzhiyun #else
495*4882a593Smuzhiyun #define	BCMSPACE
496*4882a593Smuzhiyun #define bcmspace	TRUE	/* if (bcmspace) code is retained */
497*4882a593Smuzhiyun #endif // endif
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun /* Max. nvram variable table size */
500*4882a593Smuzhiyun #ifndef MAXSZ_NVRAM_VARS
501*4882a593Smuzhiyun #ifdef LARGE_NVRAM_MAXSZ
502*4882a593Smuzhiyun #define MAXSZ_NVRAM_VARS	(LARGE_NVRAM_MAXSZ * 2)
503*4882a593Smuzhiyun #else
504*4882a593Smuzhiyun #define LARGE_NVRAM_MAXSZ	8192
505*4882a593Smuzhiyun #define MAXSZ_NVRAM_VARS	(LARGE_NVRAM_MAXSZ * 2)
506*4882a593Smuzhiyun #endif /* LARGE_NVRAM_MAXSZ */
507*4882a593Smuzhiyun #endif /* !MAXSZ_NVRAM_VARS */
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun /* ROM_ENAB_RUNTIME_CHECK may be set based upon the #define below (for ROM builds). It may also
510*4882a593Smuzhiyun  * be defined via makefiles (e.g. ROM auto abandon unoptimized compiles).
511*4882a593Smuzhiyun  */
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun #ifdef BCMLFRAG /* BCMLFRAG support enab macros  */
514*4882a593Smuzhiyun 	extern bool _bcmlfrag;
515*4882a593Smuzhiyun 	#if defined(ROM_ENAB_RUNTIME_CHECK) || !defined(DONGLEBUILD)
516*4882a593Smuzhiyun 		#define BCMLFRAG_ENAB() (_bcmlfrag)
517*4882a593Smuzhiyun 	#elif defined(BCMLFRAG_DISABLED)
518*4882a593Smuzhiyun 		#define BCMLFRAG_ENAB()	(0)
519*4882a593Smuzhiyun 	#else
520*4882a593Smuzhiyun 		#define BCMLFRAG_ENAB()	(1)
521*4882a593Smuzhiyun 	#endif
522*4882a593Smuzhiyun #else
523*4882a593Smuzhiyun 	#define BCMLFRAG_ENAB()		(0)
524*4882a593Smuzhiyun #endif /* BCMLFRAG_ENAB */
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun #ifdef BCMPCIEDEV /* BCMPCIEDEV support enab macros */
527*4882a593Smuzhiyun extern bool _pciedevenab;
528*4882a593Smuzhiyun 	#if defined(ROM_ENAB_RUNTIME_CHECK)
529*4882a593Smuzhiyun 		#define BCMPCIEDEV_ENAB() (_pciedevenab)
530*4882a593Smuzhiyun 	#elif defined(BCMPCIEDEV_ENABLED)
531*4882a593Smuzhiyun 		#define BCMPCIEDEV_ENAB()	1
532*4882a593Smuzhiyun 	#else
533*4882a593Smuzhiyun 		#define BCMPCIEDEV_ENAB()	0
534*4882a593Smuzhiyun 	#endif
535*4882a593Smuzhiyun #else
536*4882a593Smuzhiyun 	#define BCMPCIEDEV_ENAB()	0
537*4882a593Smuzhiyun #endif /* BCMPCIEDEV */
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun #ifdef BCMRESVFRAGPOOL /* BCMRESVFRAGPOOL support enab macros */
540*4882a593Smuzhiyun extern bool _resvfragpool_enab;
541*4882a593Smuzhiyun 	#if defined(ROM_ENAB_RUNTIME_CHECK) || !defined(DONGLEBUILD)
542*4882a593Smuzhiyun 		#define  BCMRESVFRAGPOOL_ENAB() (_resvfragpool_enab)
543*4882a593Smuzhiyun 	#elif defined(BCMRESVFRAGPOOL_ENABLED)
544*4882a593Smuzhiyun 		#define BCMRESVFRAGPOOL_ENAB()	1
545*4882a593Smuzhiyun 	#else
546*4882a593Smuzhiyun 		#define BCMRESVFRAGPOOL_ENAB()	0
547*4882a593Smuzhiyun 	#endif
548*4882a593Smuzhiyun #else
549*4882a593Smuzhiyun 	#define BCMRESVFRAGPOOL_ENAB()	0
550*4882a593Smuzhiyun #endif /* BCMPCIEDEV */
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun 	#define BCMSDIODEV_ENAB()	0
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun /* Max size for reclaimable NVRAM array */
555*4882a593Smuzhiyun #ifdef DL_NVRAM
556*4882a593Smuzhiyun #define NVRAM_ARRAY_MAXSIZE	DL_NVRAM
557*4882a593Smuzhiyun #else
558*4882a593Smuzhiyun #define NVRAM_ARRAY_MAXSIZE	MAXSZ_NVRAM_VARS
559*4882a593Smuzhiyun #endif /* DL_NVRAM */
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun extern uint32 gFWID;
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun #ifdef BCMFRWDPOOLREORG /* BCMFRWDPOOLREORG support enab macros  */
564*4882a593Smuzhiyun 	extern bool _bcmfrwdpoolreorg;
565*4882a593Smuzhiyun 	#if defined(ROM_ENAB_RUNTIME_CHECK) || !defined(DONGLEBUILD)
566*4882a593Smuzhiyun 		#define BCMFRWDPOOLREORG_ENAB() (_bcmfrwdpoolreorg)
567*4882a593Smuzhiyun 	#elif defined(BCMFRWDPOOLREORG_DISABLED)
568*4882a593Smuzhiyun 		#define BCMFRWDPOOLREORG_ENAB()	(0)
569*4882a593Smuzhiyun 	#else
570*4882a593Smuzhiyun 		#define BCMFRWDPOOLREORG_ENAB()	(1)
571*4882a593Smuzhiyun 	#endif
572*4882a593Smuzhiyun #else
573*4882a593Smuzhiyun 	#define BCMFRWDPOOLREORG_ENAB()		(0)
574*4882a593Smuzhiyun #endif /* BCMFRWDPOOLREORG */
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun #ifdef BCMPOOLRECLAIM /* BCMPOOLRECLAIM support enab macros  */
577*4882a593Smuzhiyun 	extern bool _bcmpoolreclaim;
578*4882a593Smuzhiyun 	#if defined(ROM_ENAB_RUNTIME_CHECK) || !defined(DONGLEBUILD)
579*4882a593Smuzhiyun 		#define BCMPOOLRECLAIM_ENAB() (_bcmpoolreclaim)
580*4882a593Smuzhiyun 	#elif defined(BCMPOOLRECLAIM_DISABLED)
581*4882a593Smuzhiyun 		#define BCMPOOLRECLAIM_ENAB()	(0)
582*4882a593Smuzhiyun 	#else
583*4882a593Smuzhiyun 		#define BCMPOOLRECLAIM_ENAB()	(1)
584*4882a593Smuzhiyun 	#endif
585*4882a593Smuzhiyun #else
586*4882a593Smuzhiyun 	#define BCMPOOLRECLAIM_ENAB()		(0)
587*4882a593Smuzhiyun #endif /* BCMPOOLRECLAIM */
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun /* Chip related low power flags (lpflags) */
590*4882a593Smuzhiyun 
591*4882a593Smuzhiyun #ifndef PAD
592*4882a593Smuzhiyun #define _PADLINE(line)  pad ## line
593*4882a593Smuzhiyun #define _XSTR(line)     _PADLINE(line)
594*4882a593Smuzhiyun #define PAD             _XSTR(__LINE__)
595*4882a593Smuzhiyun #endif // endif
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun #ifndef FRAG_HEADROOM
598*4882a593Smuzhiyun #define FRAG_HEADROOM	224	/* In absence of SFD, use default headroom of 224 */
599*4882a593Smuzhiyun #endif // endif
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun #define MODULE_DETACH(var, detach_func)\
602*4882a593Smuzhiyun 	if (var) { \
603*4882a593Smuzhiyun 		detach_func(var); \
604*4882a593Smuzhiyun 		(var) = NULL; \
605*4882a593Smuzhiyun 	}
606*4882a593Smuzhiyun #define MODULE_DETACH_2(var1, var2, detach_func) detach_func(var1, var2)
607*4882a593Smuzhiyun #define MODULE_DETACH_TYPECASTED(var, detach_func) detach_func(var)
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun /* When building ROML image use runtime conditional to cause the compiler
610*4882a593Smuzhiyun  * to compile everything but not to complain "defined but not used"
611*4882a593Smuzhiyun  * as #ifdef would cause at the callsites.
612*4882a593Smuzhiyun  * In the end functions called under if (0) {} will not be linked
613*4882a593Smuzhiyun  * into the final binary if they're not called from other places either.
614*4882a593Smuzhiyun  */
615*4882a593Smuzhiyun #define BCM_ATTACH_REF_DECL()
616*4882a593Smuzhiyun #define BCM_ATTACH_REF()	(1)
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun /* Const in ROM else normal data in RAM */
619*4882a593Smuzhiyun #if defined(ROM_ENAB_RUNTIME_CHECK)
620*4882a593Smuzhiyun 	#define ROMCONST	CONST
621*4882a593Smuzhiyun #else
622*4882a593Smuzhiyun 	#define ROMCONST
623*4882a593Smuzhiyun #endif // endif
624*4882a593Smuzhiyun 
625*4882a593Smuzhiyun #endif /* _bcmdefs_h_ */
626