source: libbsdport/bsd_eth_drivers/libbsdport/libbsdport.h @ 89376b7

B_20100615baselibbsdport-4-10-branch initial
Last change on this file since 89376b7 was 89376b7, checked in by Joel Sherrill <joel.sherrill@…>, on Feb 19, 2009 at 7:55:40 PM

Initial import.

  • Property mode set to 100644
File size: 8.0 KB
Line 
1#ifndef RTEMS_COMPAT_DEFS_H
2#define RTEMS_COMPAT_DEFS_H
3
4#include <rtems.h>
5#include <sys/param.h>
6
7#define _KERNEL
8#include <rtems/rtems_bsdnet.h>
9#include <rtems/rtems_bsdnet_internal.h>
10
11#include <inttypes.h>
12#include <string.h>
13
14#include <sys/systm.h>
15#include <sys/errno.h>
16#include <sys/mbuf.h>
17
18#include <rtems/bspIo.h>
19#include <rtems/pci.h>
20#include <rtems/irq.h>
21
22#include <devicet.h>
23
24#include <bsp/rtems_verscheck.h>
25
26/*
27#include <rtems/rtems_mii_ioctl.h>
28*/
29
30
31
32#include <rtems_udelay.h>
33
34#ifndef bswap32
35#define bswap32(_x) CPU_swap_u32(_x)
36#endif
37
38#if defined(__LITTLE_ENDIAN__) || defined(__i386__)
39static inline uint16_t  htole16(uint16_t  v) { return v; }
40static inline uint32_t  htole32(uint32_t  v) { return v; }
41static inline uint64_t  htole64(uint64_t  v) { return v; }
42static inline uint16_t  le16toh(uint16_t  v) { return v; }
43static inline uint32_t  le32toh(uint32_t  v) { return v; }
44static inline uint64_t  le64toh(uint64_t  v) { return v; }
45
46#ifdef __i386__
47
48#ifdef __SSE__
49static inline void membarrier_r()  { asm volatile("lfence":::"memory"); }
50static inline void membarrier_rw() { asm volatile("mfence":::"memory"); }
51/* Current x86 CPUs always do in-order stores - prevent the compiler from reordering, neverthelesss */
52static inline void membarrier_w()  { asm volatile(/*"sfence"*/"":::"memory"); }
53#else
54static inline void membarrier_r()  { asm volatile("lock; addl $0,0(%%esp)":::"memory"); }
55static inline void membarrier_rw() { asm volatile("lock; addl $0,0(%%esp)":::"memory"); }
56/* Current x86 CPUs always do in-order stores - prevent the compiler from reordering, neverthelesss */
57static inline void membarrier_w()  { asm volatile(/*"lock; addl $0,0(%%esp)"*/"":::"memory"); }
58#endif
59
60#endif
61
62#elif defined(__BIG_ENDIAN__)
63#ifdef __PPC__
64#include <libcpu/byteorder.h>
65
66/* Note the 'may_alias' constructs. They are
67 * a safeguard agains the alias rule should the
68 * pointer argument of st_leXX change (again) in
69 * the future (and it should be safe to use older
70 * versions of 'byteorder.h'
71 */
72
73static inline uint16_t
74htole16(uint16_t v)
75{
76uint16_t rval __attribute__((may_alias));
77        st_le16((volatile uint16_t*)&rval,v);
78        return rval;
79}
80
81static inline uint16_t
82le16toh(uint16_t v)
83{
84uint16_t vv __attribute__((may_alias)) = v;
85        return ld_le16((volatile uint16_t*)&vv);
86}
87
88static inline uint32_t
89htole32(uint32_t v)
90{
91uint32_t rval __attribute__((may_alias));
92        st_le32((volatile libbsdport_u32_t*)&rval,v);
93        return rval;
94}
95
96static inline uint32_t
97le32toh(uint32_t v)
98{
99uint32_t vv __attribute__((may_alias)) = v;
100        return ld_le32((volatile libbsdport_u32_t*)&vv);
101}
102
103/* Compiler generated floating point instructions for this
104 * and rtems_bsdnet_newproc()-generated tasks are non-FP
105 * :-(
106 */
107static inline uint64_t
108htole64(uint64_t  v) 
109{
110union {
111        libbsdport_u32_t tmp[2] __attribute__((may_alias));
112        uint64_t rval   __attribute__((may_alias));
113} u;
114
115        st_le32( &u.tmp[0], (unsigned)(v&0xffffffff) );
116        st_le32( &u.tmp[1], (unsigned)((v>>32)&0xffffffff) );
117
118        return u.rval;
119}
120
121static inline void membarrier_r()  { asm volatile("sync":::"memory"); }
122
123static inline void membarrier_rw() { asm volatile("sync":::"memory"); }
124
125static inline void membarrier_w()  { asm volatile("eieio":::"memory"); }
126
127#else
128#error "need htoleXX() implementation for this CPU arch"
129#endif
130
131#else
132#error "Unknown CPU endianness"
133#endif
134
135#include <mutex.h>
136#include <callout.h>
137
138#ifndef PCIR_BAR
139#define PCIR_BAR(x) (0x10+4*(x))
140#endif
141
142#ifndef PCIR_COMMAND
143#define PCIR_COMMAND            PCI_COMMAND
144#endif
145
146#ifndef PCIR_REVID
147#define PCIR_REVID                      PCI_REVISION_ID
148#endif
149
150#ifndef PCIR_SUBVEND_0
151#define PCIR_SUBVEND_0          PCI_SUBSYSTEM_VENDOR_ID
152#endif
153
154#ifndef PCIR_SUBDEV_0
155#define PCIR_SUBDEV_0           PCI_SUBSYSTEM_ID
156#endif
157
158#ifndef PCIR_CIS
159#define PCIR_CIS                        PCI_CARDBUS_CIS
160#endif
161
162#ifndef PCIM_CMD_BUSMASTEREN
163#define PCIM_CMD_BUSMASTEREN PCI_COMMAND_MASTER
164#endif
165
166#ifndef PCIM_CMD_MEMEN
167#define PCIM_CMD_MEMEN          PCI_COMMAND_MEMORY
168#endif
169
170#ifndef PCIM_CMD_PORTEN
171#define PCIM_CMD_PORTEN         PCI_COMMAND_IO
172#endif
173
174#ifndef PCIR_CAP_PTR
175#define PCIR_CAP_PTR 0x34
176#endif
177
178#ifndef PCIR_POWER_STATUS
179#define PCIR_POWER_STATUS 0x4
180#endif
181
182#ifndef PCIM_PSTAT_PME
183#define PCIM_PSTAT_PME       0x8000
184#endif
185
186#ifndef PCIM_PSTAT_PMEENABLE
187#define PCIM_PSTAT_PMEENABLE 0x0100
188#endif
189
190#ifndef PCIY_PMG
191#define PCIY_PMG             0x01
192#endif
193
194#ifndef PCI_RF_DENSE
195#define PCI_RF_DENSE         0
196#endif
197
198static inline uint32_t
199pci_read_config(device_t dev, unsigned reg, int width)
200{
201        switch ( width ) {
202                default:
203                case 4:
204                        {
205                                libbsdport_u32_t v;
206                                pci_read_config_dword(dev->bushdr.pci.bus, dev->bushdr.pci.dev, dev->bushdr.pci.fun, reg, &v);
207                                return v;
208                        }
209                case 2:
210                        {
211                                uint16_t v;
212                                pci_read_config_word(dev->bushdr.pci.bus, dev->bushdr.pci.dev, dev->bushdr.pci.fun, reg, &v);
213                                return (uint32_t)v;
214                        }       
215                case 1:
216                        {
217                                uint8_t v;
218                                pci_read_config_byte(dev->bushdr.pci.bus, dev->bushdr.pci.dev, dev->bushdr.pci.fun, reg, &v);
219                                return (uint32_t)v;
220                        }
221        }
222}
223
224static inline void
225pci_write_config(device_t dev, unsigned reg, uint32_t val, int width)
226{
227        switch ( width ) {
228                default:
229                case 4:
230                        {
231                                pci_write_config_dword(dev->bushdr.pci.bus, dev->bushdr.pci.dev, dev->bushdr.pci.fun, reg, val);
232                        }
233                case 2:
234                        {
235                                pci_write_config_word(dev->bushdr.pci.bus, dev->bushdr.pci.dev, dev->bushdr.pci.fun, reg, val);
236                        }       
237                case 1:
238                        {
239                                pci_write_config_byte(dev->bushdr.pci.bus, dev->bushdr.pci.dev, dev->bushdr.pci.fun, reg, val);
240                        }
241        }
242}
243
244
245static inline uint16_t
246pci_get_vendor(device_t dev)
247{
248        return pci_read_config(dev, PCI_VENDOR_ID, 2);
249}
250
251static inline uint16_t
252pci_get_device(device_t dev)
253{
254        return pci_read_config(dev, PCI_DEVICE_ID, 2);
255}
256
257static inline uint16_t
258pci_get_subvendor(device_t dev)
259{
260        return pci_read_config(dev, PCIR_SUBVEND_0, 2);
261}
262
263static inline uint16_t
264pci_get_subdevice(device_t dev)
265{
266        return pci_read_config(dev, PCIR_SUBDEV_0, 2);
267}
268
269static inline void
270pci_enable_busmaster(device_t dev)
271{
272        pci_write_config(
273                dev,
274                PCI_COMMAND,
275                pci_read_config(dev, PCI_COMMAND, 2) | PCI_COMMAND_MASTER,
276                2
277        );
278}
279
280static inline void
281pci_enable_io(device_t dev, int space)
282{
283        pci_write_config(
284                dev,
285                PCI_COMMAND,
286                pci_read_config(dev, PCI_COMMAND, 2) | space,
287                2
288        );
289}
290
291static inline void
292pci_disable_io(device_t dev, int space)
293{
294        pci_write_config(
295                dev,
296                PCI_COMMAND,
297                pci_read_config(dev, PCI_COMMAND, 2) & ~space,
298                2
299        );
300}
301
302
303
304/* MSI / MSIX not supported */
305static inline int
306pci_msi_count(device_t dev) { return 0; }
307
308static inline int
309pci_alloc_msi(device_t dev, int *pval) { return -1; }
310
311static inline int
312pci_alloc_msix(device_t dev, int *pval) { return -1; }
313
314static inline void
315pci_release_msi(device_t dev) { }
316
317
318
319
320#define IFQ_DRV_IS_EMPTY(q) (0 == (q)->ifq_head)
321#define IFQ_DRV_DEQUEUE(q,m) IF_DEQUEUE((q),(m))
322#define IFQ_DRV_PREPEND(q,m) IF_PREPEND((q),(m))
323
324#define ifq_drv_maxlen ifq_maxlen
325#define IFQ_SET_MAXLEN(q, len) do {} while (0)
326#define IFQ_SET_READY(q)       do {} while (0)
327
328#define ETHER_BPF_MTAP(ifp, m) do {} while (0)
329#define BPF_MTAP(ifp, m)       do {} while (0)
330
331#define IF_LLADDR(ifp)  (((struct arpcom *)(ifp))->ac_enaddr)
332
333#define if_link_state_change(ifp, state) do {} while (0)
334
335/* if_name should probably be const char * but isn't */
336#define if_initname(ifp, name, unit) \
337        do { (ifp)->if_name = (char*)(name); (ifp)->if_unit = (unit); } while (0)
338
339struct ifnet * if_alloc(int type);
340
341void if_free(struct ifnet *ifp);
342
343#define if_printf(ifp,args...)  do { printf("%s: ",(ifp)->if_name); printf(args); } while (0)
344
345void *
346contigmalloc(
347        unsigned long size,
348        int type,
349        int flags,
350        unsigned long lo,
351        unsigned long hi,
352        unsigned long align,
353        unsigned long bound);
354
355void
356contigfree(void *ptr, size_t size, int type);
357
358/* locking is handled by 'super-lock' outside driver; watch for link intr task, though */
359#define NET_LOCK_GIANT()        do {} while (0)
360#define NET_UNLOCK_GIANT()      do {} while (0)
361
362#define KASSERT(cond, msg...)   \
363        do { \
364        if ( ! (cond) ) { \
365                rtems_panic msg;  \
366        } \
367        } while (0)
368
369#define __FBSDID(x)
370#define MODULE_DEPEND(x1,x2,x3,x4,x5)
371
372#define mii_mediachg(mii) do {} while (0)
373
374void *
375real_libc_malloc(size_t);
376
377void
378real_libc_free(void*);
379
380#endif
Note: See TracBrowser for help on using the repository browser.