Home | History | Annotate | Download | only in include
      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