Resync with broadcom drivers 5.100.138.20 and utilities.
[tomato.git] / release / src-rt / include / cfe_osl.h
blob7ba21a68d1de4e819a410fcc48978e4477c13f0e
1 /*
2 * CFE boot loader OS Abstraction Layer.
4 * Copyright (C) 2010, Broadcom Corporation
5 * All Rights Reserved.
6 *
7 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
8 * the contents of this file may not be disclosed to third parties, copied
9 * or duplicated in any form, in whole or in part, without the prior
10 * written permission of Broadcom Corporation.
12 * $Id: cfe_osl.h,v 1.60.12.1 2010-05-23 18:14:46 Exp $
15 #ifndef _cfe_osl_h_
16 #define _cfe_osl_h_
18 #include <lib_types.h>
19 #include <lib_string.h>
20 #include <lib_printf.h>
21 #include <lib_malloc.h>
22 #include <cpu_config.h>
23 #include <cfe_timer.h>
24 #include <cfe_iocb.h>
25 #include <cfe_devfuncs.h>
26 #include <addrspace.h>
28 #include <typedefs.h>
30 /* pick up osl required snprintf/vsnprintf */
31 #include <bcmstdlib.h>
33 /* assert and panic */
34 #ifdef BCMDBG_ASSERT
35 #define ASSERT(exp) \
36 do { if (!(exp)) osl_assert(#exp, __FILE__, __LINE__); } while (0)
37 extern void osl_assert(char *exp, char *file, int line);
38 #else /* BCMDBG_ASSERT */
39 #define ASSERT(exp) do {} while (0)
40 #endif /* BCMDBG_ASSERT */
42 /* PCMCIA attribute space access macros */
43 #define OSL_PCMCIA_READ_ATTR(osh, offset, buf, size) \
44 bzero(buf, size)
45 #define OSL_PCMCIA_WRITE_ATTR(osh, offset, buf, size) \
46 do {} while (0)
48 /* PCI configuration space access macros */
49 #define OSL_PCI_READ_CONFIG(loc, offset, size) \
50 (offset == 8 ? 0 : 0xffffffff)
51 #define OSL_PCI_WRITE_CONFIG(loc, offset, size, val) \
52 do {(void)(loc); (void)(offset); (void)(size);(void)(val);} while (0)
54 /* PCI device bus # and slot # */
55 #define OSL_PCI_BUS(osh) (0)
56 #define OSL_PCI_SLOT(osh) (0)
58 /* register access macros */
59 #ifdef IL_BIGENDIAN
60 #ifdef BCMHND74K
61 #define wreg32(r, v) (*(volatile uint32 *)((ulong)(r) ^ 4) = (uint32)(v))
62 #define rreg32(r) (*(volatile uint32 *)((ulong)(r) ^ 4))
63 #define wreg16(r, v) (*(volatile uint16 *)((ulong)(r) ^ 6) = (uint16)(v))
64 #define rreg16(r) (*(volatile uint16 *)((ulong)(r) ^ 6))
65 #define wreg8(r, v) (*(volatile uint8 *)((ulong)(r) ^ 7) = (uint8)(v))
66 #define rreg8(r) (*(volatile uint8 *)((ulong)(r) ^ 7))
67 #else /* !74K, bcm33xx */
68 #define wreg32(r, v) (*(volatile uint32*)(r) = (uint32)(v))
69 #define rreg32(r) (*(volatile uint32*)(r))
70 #define wreg16(r, v) (*(volatile uint16*)((ulong)(r) ^ 2) = (uint16)(v))
71 #define rreg16(r) (*(volatile uint16*)((ulong)(r) ^ 2))
72 #define wreg8(r, v) (*(volatile uint8*)((ulong)(r) ^ 3) = (uint8)(v))
73 #define rreg8(r) (*(volatile uint8*)((ulong)(r) ^ 3))
74 #endif /* BCMHND74K */
75 #else /* !IL_BIGENDIAN */
76 #define wreg32(r, v) (*(volatile uint32*)(r) = (uint32)(v))
77 #define rreg32(r) (*(volatile uint32*)(r))
78 #define wreg16(r, v) (*(volatile uint16*)(r) = (uint16)(v))
79 #define rreg16(r) (*(volatile uint16*)(r))
80 #define wreg8(r, v) (*(volatile uint8*)(r) = (uint8)(v))
81 #define rreg8(r) (*(volatile uint8*)(r))
82 #endif /* IL_BIGENDIAN */
83 #define R_REG(osh, r) ({ \
84 __typeof(*(r)) __osl_v; \
85 switch (sizeof(*(r))) { \
86 case sizeof(uint8): __osl_v = rreg8((void *)(r)); break; \
87 case sizeof(uint16): __osl_v = rreg16((void *)(r)); break; \
88 case sizeof(uint32): __osl_v = rreg32((void *)(r)); break; \
89 } \
90 __osl_v; \
92 #define W_REG(osh, r, v) do { \
93 switch (sizeof(*(r))) { \
94 case sizeof(uint8): wreg8((void *)(r), (v)); break; \
95 case sizeof(uint16): wreg16((void *)(r), (v)); break; \
96 case sizeof(uint32): wreg32((void *)(r), (v)); break; \
97 } \
98 } while (0)
99 #define AND_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) & (v))
100 #define OR_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) | (v))
102 /* bcopy, bcmp, and bzero */
103 #define bcmp(b1, b2, len) lib_memcmp((b1), (b2), (len))
104 #define memmove(dest, src, n) lib_memcpy((dest), (src), (n))
106 struct osl_info {
107 void *pdev;
108 pktfree_cb_fn_t tx_fn;
109 void *tx_ctx;
112 extern osl_t *osl_attach(void *pdev);
113 extern void osl_detach(osl_t *osh);
115 #define PKTFREESETCB(osh, _tx_fn, _tx_ctx) \
116 do { \
117 osh->tx_fn = _tx_fn; \
118 osh->tx_ctx = _tx_ctx; \
119 } while (0)
121 /* general purpose memory allocation */
122 #define MALLOC(osh, size) KMALLOC((size), 0)
123 #define MFREE(osh, addr, size) KFREE((addr))
124 #define MALLOCED(osh) (0)
125 #define MALLOC_DUMP(osh, b)
126 #define MALLOC_FAILED(osh) (0)
128 /* uncached/cached virtual address */
129 #ifdef __mips__
130 #define OSL_UNCACHED(a) ((void *)UNCADDR(PHYSADDR((ulong)(a))))
131 #define OSL_CACHED(a) ((void *)KERNADDR(PHYSADDR((ulong)(a))))
132 #else
133 #define OSL_UNCACHED(a) (a)
134 #define OSL_CACHED(a) (a)
135 #endif
138 #ifdef __mips__
139 #define OSL_PREF_RANGE_LD(va, sz) prefetch_range_PREF_LOAD_RETAINED(va, sz)
140 #define OSL_PREF_RANGE_ST(va, sz) prefetch_range_PREF_STORE_RETAINED(va, sz)
141 #else /* __mips__ */
142 #define OSL_PREF_RANGE_LD(va, sz)
143 #define OSL_PREF_RANGE_ST(va, sz)
144 #endif /* __mips__ */
146 /* host/bus architecture-specific address byte swap */
147 #define BUS_SWAP32(v) (v)
149 /* get processor cycle count */
150 #define OSL_GETCYCLES(x) ((x) = 0)
152 /* microsecond delay */
153 #define OSL_DELAY(usec) cfe_usleep((cfe_cpu_speed/CPUCFG_CYCLESPERCPUTICK/1000000*(usec)))
155 #define OSL_ERROR(bcmerror) osl_error(bcmerror)
157 /* map/unmap physical to virtual I/O */
158 #define REG_MAP(pa, size) ((void*)UNCADDR(PHYSADDR((ulong)(pa))))
159 #define REG_UNMAP(va) do {} while (0)
161 /* dereference an address that may cause a bus exception */
162 #define BUSPROBE(val, addr) osl_busprobe(&(val), (uint32)(addr))
163 extern int osl_busprobe(uint32 *val, uint32 addr);
165 /* allocate/free shared (dma-able) consistent (uncached) memory */
166 #define DMA_CONSISTENT_ALIGN 4096 /* 4k alignment */
167 #define DMA_ALLOC_CONSISTENT(osh, size, align, tot, pap, dmah) \
168 osl_dma_alloc_consistent((size), (align), (tot), (pap))
169 #define DMA_FREE_CONSISTENT(osh, va, size, pa, dmah) \
170 osl_dma_free_consistent((void*)(va))
171 extern void *osl_dma_alloc_consistent(uint size, uint16 align_bits, uint *alloced, ulong *pap);
172 extern void osl_dma_free_consistent(void *va);
174 /* map/unmap direction */
175 #define DMA_TX 1 /* TX direction for DMA */
176 #define DMA_RX 2 /* RX direction for DMA */
178 /* map/unmap shared (dma-able) memory */
179 #define DMA_MAP(osh, va, size, direction, lb, dmah) ({ \
180 cfe_flushcache(CFE_CACHE_FLUSH_D); \
181 PHYSADDR((ulong)(va)); \
183 #define DMA_UNMAP(osh, pa, size, direction, p, dmah) \
184 do {} while (0)
186 /* API for DMA addressing capability */
187 #define OSL_DMADDRWIDTH(osh, addrwidth) do {} while (0)
189 /* shared (dma-able) memory access macros */
190 #if defined(IL_BIGENDIAN) && defined(BCMHND74K)
191 #define R_SM(r) (*(uint32 *)((ulong)(r)^4))
192 #define W_SM(r, v) (*(uint32 *)((ulong)(r)^4) = (uint32)(v))
193 #else /* !IL_BIGENDIAN || !BCMHND74K */
194 #define R_SM(r) *(r)
195 #define W_SM(r, v) (*(r) = (v))
196 #endif /* IL_BIGENDIAN && BCMHND74K */
197 #define BZERO_SM(r, len) lib_memset((r), '\0', (len))
199 /* generic packet structure */
200 #define LBUFSZ 4096 /* Size of Lbuf - 4k */
201 #define LBDATASZ (LBUFSZ - sizeof(struct lbuf))
202 struct lbuf {
203 struct lbuf *next; /* pointer to next lbuf if in a chain */
204 struct lbuf *link; /* pointer to next lbuf if in a list */
205 uchar *head; /* start of buffer */
206 uchar *end; /* end of buffer */
207 uchar *data; /* start of data */
208 uchar *tail; /* end of data */
209 uint len; /* nbytes of data */
210 uchar pkttag[OSL_PKTTAG_SZ]; /* pkttag area */
213 #define PKTBUFSZ 2048 /* largest reasonable packet buffer, driver uses for ethernet MTU */
215 /* packet primitives */
216 #define PKTGET(osh, len, send) ((void*)osl_pktget((len)))
217 #define PKTFREE(osh, lb, send) osl_pktfree((osh), (struct lbuf*)(lb), (send))
218 #define PKTDATA(osh, lb) (((struct lbuf*)(lb))->data)
219 #define PKTLEN(osh, lb) (((struct lbuf*)(lb))->len)
220 #define PKTHEADROOM(osh, lb) (PKTDATA(osh, lb)-(((struct lbuf*)(lb))->head))
221 #define PKTTAILROOM(osh, lb) ((((struct lbuf*)(lb))->end)-(((struct lbuf*)(lb))->tail))
222 #define PKTNEXT(osh, lb) (((struct lbuf*)(lb))->next)
223 #define PKTSETNEXT(osh, lb, x) (((struct lbuf*)(lb))->next = (struct lbuf*)(x))
224 #define PKTSETLEN(osh, lb, len) osl_pktsetlen((struct lbuf*)(lb), (len))
225 #define PKTPUSH(osh, lb, bytes) osl_pktpush((struct lbuf*)(lb), (bytes))
226 #define PKTPULL(osh, lb, bytes) osl_pktpull((struct lbuf*)(lb), (bytes))
227 #define PKTDUP(osh, lb) osl_pktdup((struct lbuf*)(lb))
228 #define PKTTAG(lb) (((void *) ((struct lbuf *)(lb))->pkttag))
229 #define PKTLINK(lb) (((struct lbuf*)(lb))->link)
230 #define PKTSETLINK(lb, x) (((struct lbuf*)(lb))->link = (struct lbuf*)(x))
231 #define PKTPRIO(lb) (0)
232 #define PKTSETPRIO(lb, x) do {} while (0)
233 #define PKTFRMNATIVE(buffer, lb) osl_pkt_frmnative((buffer), (struct lbuf *)(lb))
234 #define PKTTONATIVE(lb, buffer) osl_pkt_tonative((lb), (buffer))
235 #define PKTSHARED(lb) (0)
236 #define PKTALLOCED(osh) (0)
237 #define PKTSETPOOL(osh, lb, x, y) do {} while (0)
238 #define PKTPOOL(osh, lb) FALSE
239 #define PKTLIST_DUMP(osh, buf)
241 extern void osl_pkt_frmnative(iocb_buffer_t *buffer, struct lbuf *lb);
242 extern void osl_pkt_tonative(struct lbuf* lb, iocb_buffer_t *buffer);
243 extern struct lbuf *osl_pktget(uint len);
244 extern void osl_pktfree(osl_t *osh, struct lbuf *lb, bool send);
245 extern void osl_pktsetlen(struct lbuf *lb, uint len);
246 extern uchar *osl_pktpush(struct lbuf *lb, uint bytes);
247 extern uchar *osl_pktpull(struct lbuf *lb, uint bytes);
248 extern struct lbuf *osl_pktdup(struct lbuf *lb);
249 extern int osl_error(int bcmerror);
251 /* Global ASSERT type */
252 extern uint32 g_assert_type;
254 #endif /* _cfe_osl_h_ */