1 /*
2  * Misc system wide definitions
3  *
4  * Copyright (C) 1999-2013, Broadcom Corporation
5  *
6  * Permission to use, copy, modify, and/or distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
13  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
15  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
16  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  *
18  * $Id: bcmdefs.h 381895 2013-01-30 07:06:40Z $
19  */
20 
21 #ifndef	_bcmdefs_h_
22 #define	_bcmdefs_h_
23 
24 /*
25  * One doesn't need to include this file explicitly, gets included automatically if
26  * typedefs.h is included.
27  */
28 
29 /* Use BCM_REFERENCE to suppress warnings about intentionally-unused function
30  * arguments or local variables.
31  */
32 #define BCM_REFERENCE(data)	((void)(data))
33 
34 /* Compile-time assert can be used in place of ASSERT if the expression evaluates
35  * to a constant at compile time.
36  */
37 #define STATIC_ASSERT(expr) { \
38 	/* Make sure the expression is constant. */ \
39 	typedef enum { _STATIC_ASSERT_NOT_CONSTANT = (expr) } _static_assert_e; \
40 	/* Make sure the expression is true. */ \
41 	typedef char STATIC_ASSERT_FAIL[(expr) ? 1 : -1]; \
42 }
43 
44 /* Reclaiming text and data :
45  * The following macros specify special linker sections that can be reclaimed
46  * after a system is considered 'up'.
47  * BCMATTACHFN is also used for detach functions (it's not worth having a BCMDETACHFN,
48  * as in most cases, the attach function calls the detach function to clean up on error).
49  */
50 
51 #define bcmreclaimed 		0
52 #define _data	_data
53 #define _fn	_fn
54 #define BCMPREATTACHDATA(_data)	_data
55 #define BCMPREATTACHFN(_fn)	_fn
56 #define _data	_data
57 #define _fn		_fn
58 #define _fn	_fn
59 #define	BCMNMIATTACHFN(_fn)	_fn
60 #define	BCMNMIATTACHDATA(_data)	_data
61 #define CONST	const
62 #if defined(__ARM_ARCH_7A__)
63 #define BCM47XX_CA9
64 #else
65 #undef BCM47XX_CA9
66 #endif
67 #ifndef BCMFASTPATH
68 #if defined(BCM47XX_CA9)
69 #define BCMFASTPATH		__attribute__ ((__section__ (".text.fastpath")))
70 #define BCMFASTPATH_HOST	__attribute__ ((__section__ (".text.fastpath_host")))
71 #else
72 #define BCMFASTPATH
73 #define BCMFASTPATH_HOST
74 #endif
75 #endif /* BCMFASTPATH */
76 
77 
78 /* Put some library data/code into ROM to reduce RAM requirements */
79 #define _data	_data
80 #define BCMROMDAT_NAME(_data)	_data
81 #define _fn		_fn
82 #define _fn	_fn
83 #define STATIC	static
84 #define BCMROMDAT_ARYSIZ(data)	ARRAYSIZE(data)
85 #define BCMROMDAT_SIZEOF(data)	sizeof(data)
86 #define BCMROMDAT_APATCH(data)
87 #define BCMROMDAT_SPATCH(data)
88 
89 /* Bus types */
90 #define	SI_BUS			0	/* SOC Interconnect */
91 #define	PCI_BUS			1	/* PCI target */
92 #define	PCMCIA_BUS		2	/* PCMCIA target */
93 #define SDIO_BUS		3	/* SDIO target */
94 #define JTAG_BUS		4	/* JTAG */
95 #define USB_BUS			5	/* USB (does not support R/W REG) */
96 #define SPI_BUS			6	/* gSPI target */
97 #define RPC_BUS			7	/* RPC target */
98 
99 /* Allows size optimization for single-bus image */
100 #ifdef BCMBUSTYPE
101 #define BUSTYPE(bus) 	(BCMBUSTYPE)
102 #else
103 #define BUSTYPE(bus) 	(bus)
104 #endif
105 
106 /* Allows size optimization for single-backplane image */
107 #ifdef BCMCHIPTYPE
108 #define CHIPTYPE(bus) 	(BCMCHIPTYPE)
109 #else
110 #define CHIPTYPE(bus) 	(bus)
111 #endif
112 
113 
114 /* Allows size optimization for SPROM support */
115 #if defined(BCMSPROMBUS)
116 #define SPROMBUS	(BCMSPROMBUS)
117 #elif defined(SI_PCMCIA_SROM)
118 #define SPROMBUS	(PCMCIA_BUS)
119 #else
120 #define SPROMBUS	(PCI_BUS)
121 #endif
122 
123 /* Allows size optimization for single-chip image */
124 #ifdef BCMCHIPID
125 #define CHIPID(chip)	(BCMCHIPID)
126 #else
127 #define CHIPID(chip)	(chip)
128 #endif
129 
130 #ifdef BCMCHIPREV
131 #define CHIPREV(rev)	(BCMCHIPREV)
132 #else
133 #define CHIPREV(rev)	(rev)
134 #endif
135 
136 /* Defines for DMA Address Width - Shared between OSL and HNDDMA */
137 #define DMADDR_MASK_32 0x0		/* Address mask for 32-bits */
138 #define DMADDR_MASK_30 0xc0000000	/* Address mask for 30-bits */
139 #define DMADDR_MASK_0  0xffffffff	/* Address mask for 0-bits (hi-part) */
140 
141 #define	DMADDRWIDTH_30  30 /* 30-bit addressing capability */
142 #define	DMADDRWIDTH_32  32 /* 32-bit addressing capability */
143 #define	DMADDRWIDTH_63  63 /* 64-bit addressing capability */
144 #define	DMADDRWIDTH_64  64 /* 64-bit addressing capability */
145 
146 #ifdef BCMDMA64OSL
147 typedef struct {
148 	uint32 loaddr;
149 	uint32 hiaddr;
150 } dma64addr_t;
151 
152 typedef dma64addr_t dmaaddr_t;
153 #define PHYSADDRHI(_pa) ((_pa).hiaddr)
154 #define PHYSADDRHISET(_pa, _val) \
155 	do { \
156 		(_pa).hiaddr = (_val);		\
157 	} while (0)
158 #define PHYSADDRLO(_pa) ((_pa).loaddr)
159 #define PHYSADDRLOSET(_pa, _val) \
160 	do { \
161 		(_pa).loaddr = (_val);		\
162 	} while (0)
163 
164 #else
165 typedef unsigned long dmaaddr_t;
166 #define PHYSADDRHI(_pa) (0)
167 #define PHYSADDRHISET(_pa, _val)
168 #define PHYSADDRLO(_pa) ((_pa))
169 #define PHYSADDRLOSET(_pa, _val) \
170 	do { \
171 		(_pa) = (_val);			\
172 	} while (0)
173 #endif /* BCMDMA64OSL */
174 
175 /* One physical DMA segment */
176 typedef struct  {
177 	dmaaddr_t addr;
178 	uint32	  length;
179 } hnddma_seg_t;
180 
181 #define MAX_DMA_SEGS 4
182 
183 
184 typedef struct {
185 	void *oshdmah; /* Opaque handle for OSL to store its information */
186 	uint origsize; /* Size of the virtual packet */
187 	uint nsegs;
188 	hnddma_seg_t segs[MAX_DMA_SEGS];
189 } hnddma_seg_map_t;
190 
191 
192 /* packet headroom necessary to accommodate the largest header in the system, (i.e TXOFF).
193  * By doing, we avoid the need  to allocate an extra buffer for the header when bridging to WL.
194  * There is a compile time check in wlc.c which ensure that this value is at least as big
195  * as TXOFF. This value is used in dma_rxfill (hnddma.c).
196  */
197 
198 #if defined(BCM_RPC_NOCOPY) || defined(BCM_RCP_TXNOCOPY)
199 /* add 40 bytes to allow for extra RPC header and info  */
200 #define BCMEXTRAHDROOM 260
201 #else /* BCM_RPC_NOCOPY || BCM_RPC_TXNOCOPY */
202 #if defined(BCM47XX_CA9)
203 #define BCMEXTRAHDROOM 224
204 #else
205 #define BCMEXTRAHDROOM 204
206 #endif /* linux && BCM47XX_CA9 */
207 #endif /* BCM_RPC_NOCOPY || BCM_RPC_TXNOCOPY */
208 
209 /* Packet alignment for most efficient SDIO (can change based on platform) */
210 #ifndef SDALIGN
211 #define SDALIGN	32
212 #endif
213 
214 /* Headroom required for dongle-to-host communication.  Packets allocated
215  * locally in the dongle (e.g. for CDC ioctls or RNDIS messages) should
216  * leave this much room in front for low-level message headers which may
217  * be needed to get across the dongle bus to the host.  (These messages
218  * don't go over the network, so room for the full WL header above would
219  * be a waste.).
220 */
221 #define BCMDONGLEHDRSZ 12
222 #define BCMDONGLEPADSZ 16
223 
224 #define BCMDONGLEOVERHEAD	(BCMDONGLEHDRSZ + BCMDONGLEPADSZ)
225 
226 
227 #if defined(NO_BCMDBG_ASSERT)
228 # undef BCMDBG_ASSERT
229 # undef BCMASSERT_LOG
230 #endif
231 
232 #if defined(BCMASSERT_LOG)
233 #define BCMASSERT_SUPPORT
234 #endif
235 
236 /* Macros for doing definition and get/set of bitfields
237  * Usage example, e.g. a three-bit field (bits 4-6):
238  *    #define <NAME>_M	BITFIELD_MASK(3)
239  *    #define <NAME>_S	4
240  * ...
241  *    regval = R_REG(osh, &regs->regfoo);
242  *    field = GFIELD(regval, <NAME>);
243  *    regval = SFIELD(regval, <NAME>, 1);
244  *    W_REG(osh, &regs->regfoo, regval);
245  */
246 #define BITFIELD_MASK(width) \
247 		(((unsigned)1 << (width)) - 1)
248 #define GFIELD(val, field) \
249 		(((val) >> field ## _S) & field ## _M)
250 #define SFIELD(val, field, bits) \
251 		(((val) & (~(field ## _M << field ## _S))) | \
252 		 ((unsigned)(bits) << field ## _S))
253 
254 /* define BCMSMALL to remove misc features for memory-constrained environments */
255 #ifdef BCMSMALL
256 #undef	BCMSPACE
257 #define bcmspace	FALSE	/* if (bcmspace) code is discarded */
258 #else
259 #define	BCMSPACE
260 #define bcmspace	TRUE	/* if (bcmspace) code is retained */
261 #endif
262 
263 /* Max. nvram variable table size */
264 #define	MAXSZ_NVRAM_VARS	4096
265 
266 
267 /* Max size for reclaimable NVRAM array */
268 #ifdef DL_NVRAM
269 #define NVRAM_ARRAY_MAXSIZE	DL_NVRAM
270 #else
271 #define NVRAM_ARRAY_MAXSIZE	MAXSZ_NVRAM_VARS
272 #endif /* DL_NVRAM */
273 
274 #ifdef BCMUSBDEV_ENABLED
275 extern uint32 gFWID;
276 #endif
277 
278 #endif /* _bcmdefs_h_ */
279