source: libbsdport/bsd_eth_drivers/libbsdport/libbsdport.h @ a8bf95d

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