diff options
Diffstat (limited to 'bsd_eth_drivers/libbsdport/bus.h')
-rw-r--r-- | bsd_eth_drivers/libbsdport/bus.h | 121 |
1 files changed, 118 insertions, 3 deletions
diff --git a/bsd_eth_drivers/libbsdport/bus.h b/bsd_eth_drivers/libbsdport/bus.h index 19cb24f..e4a9d29 100644 --- a/bsd_eth_drivers/libbsdport/bus.h +++ b/bsd_eth_drivers/libbsdport/bus.h @@ -17,6 +17,12 @@ typedef enum { struct resource; +struct resource_spec { + int type; + int rid; + int flags; +}; + typedef bus_addr_t bus_space_handle_t; /* The 'bus_space_xxx()' inlines can be helped if the @@ -59,7 +65,6 @@ bus_space_write_##nwidth(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, *(volatile type __attribute__((may_alias)) *)(h+o) = v; \ }\ } - BUS_SPACE_DECL(u_int32_t, long, 4) BUS_SPACE_DECL(u_int16_t, word, 2) BUS_SPACE_DECL(u_int8_t, byte, 1) @@ -115,6 +120,8 @@ BUS_SPACE_DECL(u_int8_t, byte, 1, 8) #error "Missing definitions of bus_space_XXX() for this CPU architecture" #endif +#define bus_space_write_stream_4(_t, _h, _o, _v) \ + bus_space_write_4(_t, _h, _o, htole32(_v)) #undef BUS_SPACE_DECL @@ -140,10 +147,17 @@ BUS_SPACE_DECL(u_int8_t, byte, 1, 8) /* flags (1<<31) means unsupported */ #define RF_ACTIVE (1<<1) #define RF_SHAREABLE (1<<2) +#define RF_OPTIONAL (1<<3) struct resource * bus_alloc_resource_any(device_t dev, int type, int *prid, unsigned flags); +int +bus_alloc_resources(device_t dev, struct resource_spec *rs, struct resource **res); + +void +bus_release_resources(device_t dev, const struct resource_spec *rs, struct resource **res); + #define FILTER_STRAY 1 #define FILTER_HANDLED 0 @@ -157,6 +171,29 @@ bus_setup_intr(device_t dev, struct resource *r, int flags, driver_filter_t filt #define INTR_MPSAFE 0 #define INTR_TYPE_NET 0 +/* + * INTR_FAST handlers are already more like 'filters', + * i.e., they disable interrupts and schedule work + * on a task queue. + * + * During porting the fast handler has to be slightly + * rewritten (must return an int value, FILTER_HANDLED + * if a valid IRQ was detected and work has been scheduled + * and FILTER_STRAY if this device didn't interrupt). + * + * You need to then remove INTR_FAST from the flags, + * pass the converted handler as the 'filter' argument + * and a NULL handler argument to bus_setup_intr(). + * + */ +extern int __INTR_FAST() __attribute__(( + error("\n\n==> you need to convert bus_setup_intr(INTR_FAST) to new API;\n" + " consult <sys/bus.h>\n\n") +)); + +/* Barf at compile time if they try to use INTR_FAST */ +#define INTR_FAST (__INTR_FAST()) + int bus_teardown_intr(device_t dev, struct resource *r, void *cookiep); @@ -177,6 +214,37 @@ rman_get_bushandle(struct resource *r); bus_space_tag_t rman_get_bustag(struct resource *r); +/* Newer API (releng 7_1) */ +static inline u_int8_t bus_read_1(struct resource *r, bus_size_t o) +{ + return bus_space_read_1(rman_get_bustag(r), rman_get_bushandle(r), o); +} + +static inline u_int16_t bus_read_2(struct resource *r, bus_size_t o) +{ + return bus_space_read_2(rman_get_bustag(r), rman_get_bushandle(r), o); +} + +static inline u_int32_t bus_read_4(struct resource *r, bus_size_t o) +{ + return bus_space_read_4(rman_get_bustag(r), rman_get_bushandle(r), o); +} + +static inline void bus_write_1(struct resource *r, bus_size_t o, u_int8_t v) +{ + bus_space_write_1(rman_get_bustag(r), rman_get_bushandle(r), o, v); +} + +static inline void bus_write_2(struct resource *r, bus_size_t o, u_int16_t v) +{ + bus_space_write_2(rman_get_bustag(r), rman_get_bushandle(r), o, v); +} + +static inline void bus_write_4(struct resource *r, bus_size_t o, u_int32_t v) +{ + bus_space_write_4(rman_get_bustag(r), rman_get_bushandle(r), o, v); +} + #ifndef BUS_DMA_NOWAIT /* ignored anyways */ #define BUS_DMA_NOWAIT 0 @@ -192,6 +260,20 @@ rman_get_bustag(struct resource *r); #define BUS_DMA_COHERENT 0 #endif +#ifndef BUS_DMA_ZERO +/* ignored anyways */ +#define BUS_DMA_ZERO 0 +#endif + +#ifndef BUS_DMA_ALLOCNOW +/* ignored anyways */ +#define BUS_DMA_ALLOCNOW 0 +#endif + +#ifndef BUS_DMA_ZERO +#define BUS_DMA_ZERO 1 +#endif + /* unused */ #ifndef BUS_SPACE_MAXADDR #define BUS_SPACE_MAXADDR 0xdeadbeef @@ -223,6 +305,12 @@ typedef void *bus_dmamap_t; int bus_dma_tag_create(void *parent, unsigned alignment, unsigned bounds, uint32_t lowadd, uint32_t hiaddr, void (*filter)(void*), void *filterarg, unsigned maxsize, int nsegs, unsigned maxsegsize, unsigned flags, void (*lockfunc)(void*), void *lockarg, bus_dma_tag_t *ptag); +/* Dummy NULL fcn pointer */ +#define busdma_lock_mutex 0 + +extern uint32_t __busdma_dummy_Giant; +#define Giant __busdma_dummy_Giant + void bus_dma_tag_destroy(bus_dma_tag_t tag); @@ -265,10 +353,10 @@ bus_get_dma_tag(device_t dev) return 0; } -typedef void bus_dmamap_callback_t (void *, bus_dma_segment_t *, int, int); +typedef void bus_dmamap_callback_t (void *arg, bus_dma_segment_t *segs, int nseg, int error); static inline int -bus_dmamap_load(bus_dma_tag_t tag, bus_dmamap_t map, caddr_t vaddr, bus_size_t size, void (*cb)(void *arg, bus_dma_segment_t *segs, int nseg, int error), void *arg, unsigned flags) +bus_dmamap_load(bus_dma_tag_t tag, bus_dmamap_t map, void *vaddr, bus_size_t size, bus_dmamap_callback_t cb, void *arg, unsigned flags) { bus_dma_segment_t segs[1]; segs[0].ds_addr = CPU2BUSADDR(vaddr); @@ -277,6 +365,28 @@ bus_dma_segment_t segs[1]; return 0; } +typedef void bus_dmamap_callback2_t (void *arg, bus_dma_segment_t *segs, int nsegs, bus_size_t mapsize, int error); + +static inline int +bus_dmamap_load_mbuf(bus_dma_tag_t tag, bus_dmamap_t map, struct mbuf *m_head, bus_dmamap_callback2_t cb, void *arg, unsigned flags) +{ +/* hopefully there's enough stack ... */ +bus_dma_segment_t segs[tag->maxsegs]; +struct mbuf *m; +int n; +bus_size_t sz; + for ( m=m_head, sz=0, n=0; m; m=m->m_next, n++ ) { + if ( n >= tag->maxsegs ) { + cb(arg, segs, n, sz, EFBIG); + return EFBIG; + } + segs[n].ds_addr = CPU2BUSADDR(mtod(m, unsigned)); + sz += (segs[n].ds_len = m->m_len); + } + cb(arg, segs, n, sz, 0); + return 0; +} + #define bus_dmamap_unload(tag, map) do {} while (0) /* should we do something if we have no HW snooping ? */ @@ -285,4 +395,9 @@ bus_dma_segment_t segs[1]; #define bus_dmamap_create(tag, flags, pmap) ( *(pmap) = 0, 0 ) #define bus_dmamap_destroy(tag, map) do {} while (0) +int +resource_int_value(const char *name, int unit, const char *resname, int *result); +int +resource_long_value(const char *name, int unit, const char *resname, long *result); + #endif |