source: libbsdport/bsd_eth_drivers/libbsdport/libbsdport.h @ 325ddf3

Last change on this file since 325ddf3 was 325ddf3, checked in by Till Straumann <strauman@…>, on Aug 5, 2009 at 9:27:09 PM

2009-08-05 Till Straumann <Till.Straumann@…>

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