#ifndef _RISCV_BUS_DEFS_H_
#define _RISCV_BUS_DEFS_H_
typedef paddr_t bus_addr_t;
typedef u_long bus_size_t;
#define PRIxBUSADDR PRIxPADDR
#define PRIxBUSSIZE "lx"
#define PRIuBUSSIZE "lu"
typedef struct bus_space *bus_space_tag_t;
typedef uintptr_t bus_space_handle_t;
#define PRIxBSH PRIxPTR
#define BUS_SPACE_MAP_BUS1 __BIT(8)
#define BUS_SPACE_MAP_BUS2 __BIT(9)
#define BUS_SPACE_MAP_BUS3 __BIT(10)
#define BUS_SPACE_MAP_BUS4 __BIT(11)
#define _RISCV_BUS_SPACE_MAP_STRONGLY_ORDERED BUS_SPACE_MAP_BUS1
struct bus_space {
void *bs_cookie;
int bs_stride;
int bs_flags;
int (*bs_map)(void *, bus_addr_t, bus_size_t,
int, bus_space_handle_t *);
void (*bs_unmap)(void *, bus_space_handle_t,
bus_size_t);
int (*bs_subregion)(void *, bus_space_handle_t,
bus_size_t, bus_size_t, bus_space_handle_t *);
int (*bs_alloc)(void *, bus_addr_t, bus_addr_t,
bus_size_t, bus_size_t, bus_size_t, int,
bus_addr_t *, bus_space_handle_t *);
void (*bs_free)(void *, bus_space_handle_t,
bus_size_t);
void * (*bs_vaddr)(void *, bus_space_handle_t);
paddr_t (*bs_mmap)(void *, bus_addr_t, off_t, int, int);
void (*bs_barrier)(void *, bus_space_handle_t,
bus_size_t, bus_size_t, int);
uint8_t (*bs_r_1)(void *, bus_space_handle_t,
bus_size_t);
uint16_t (*bs_r_2)(void *, bus_space_handle_t,
bus_size_t);
uint32_t (*bs_r_4)(void *, bus_space_handle_t,
bus_size_t);
uint64_t (*bs_r_8)(void *, bus_space_handle_t,
bus_size_t);
void (*bs_rm_1)(void *, bus_space_handle_t,
bus_size_t, uint8_t *, bus_size_t);
void (*bs_rm_2)(void *, bus_space_handle_t,
bus_size_t, uint16_t *, bus_size_t);
void (*bs_rm_4)(void *, bus_space_handle_t,
bus_size_t, uint32_t *, bus_size_t);
void (*bs_rm_8)(void *, bus_space_handle_t,
bus_size_t, uint64_t *, bus_size_t);
void (*bs_rr_1)(void *, bus_space_handle_t,
bus_size_t, uint8_t *, bus_size_t);
void (*bs_rr_2)(void *, bus_space_handle_t,
bus_size_t, uint16_t *, bus_size_t);
void (*bs_rr_4)(void *, bus_space_handle_t,
bus_size_t, uint32_t *, bus_size_t);
void (*bs_rr_8)(void *, bus_space_handle_t,
bus_size_t, uint64_t *, bus_size_t);
void (*bs_w_1)(void *, bus_space_handle_t,
bus_size_t, uint8_t);
void (*bs_w_2)(void *, bus_space_handle_t,
bus_size_t, uint16_t);
void (*bs_w_4)(void *, bus_space_handle_t,
bus_size_t, uint32_t);
void (*bs_w_8)(void *, bus_space_handle_t,
bus_size_t, uint64_t);
void (*bs_wm_1)(void *, bus_space_handle_t,
bus_size_t, const uint8_t *, bus_size_t);
void (*bs_wm_2)(void *, bus_space_handle_t,
bus_size_t, const uint16_t *, bus_size_t);
void (*bs_wm_4)(void *, bus_space_handle_t,
bus_size_t, const uint32_t *, bus_size_t);
void (*bs_wm_8)(void *, bus_space_handle_t,
bus_size_t, const uint64_t *, bus_size_t);
void (*bs_wr_1)(void *, bus_space_handle_t,
bus_size_t, const uint8_t *, bus_size_t);
void (*bs_wr_2)(void *, bus_space_handle_t,
bus_size_t, const uint16_t *, bus_size_t);
void (*bs_wr_4)(void *, bus_space_handle_t,
bus_size_t, const uint32_t *, bus_size_t);
void (*bs_wr_8)(void *, bus_space_handle_t,
bus_size_t, const uint64_t *, bus_size_t);
void (*bs_sm_1)(void *, bus_space_handle_t,
bus_size_t, uint8_t, bus_size_t);
void (*bs_sm_2)(void *, bus_space_handle_t,
bus_size_t, uint16_t, bus_size_t);
void (*bs_sm_4)(void *, bus_space_handle_t,
bus_size_t, uint32_t, bus_size_t);
void (*bs_sm_8)(void *, bus_space_handle_t,
bus_size_t, uint64_t, bus_size_t);
void (*bs_sr_1)(void *, bus_space_handle_t,
bus_size_t, uint8_t, bus_size_t);
void (*bs_sr_2)(void *, bus_space_handle_t,
bus_size_t, uint16_t, bus_size_t);
void (*bs_sr_4)(void *, bus_space_handle_t,
bus_size_t, uint32_t, bus_size_t);
void (*bs_sr_8)(void *, bus_space_handle_t,
bus_size_t, uint64_t, bus_size_t);
void (*bs_c_1)(void *, bus_space_handle_t, bus_size_t,
bus_space_handle_t, bus_size_t, bus_size_t);
void (*bs_c_2)(void *, bus_space_handle_t, bus_size_t,
bus_space_handle_t, bus_size_t, bus_size_t);
void (*bs_c_4)(void *, bus_space_handle_t, bus_size_t,
bus_space_handle_t, bus_size_t, bus_size_t);
void (*bs_c_8)(void *, bus_space_handle_t, bus_size_t,
bus_space_handle_t, bus_size_t, bus_size_t);
#ifdef __BUS_SPACE_HAS_STREAM_METHODS
uint8_t (*bs_r_1_s)(void *, bus_space_handle_t,
bus_size_t);
uint16_t (*bs_r_2_s)(void *, bus_space_handle_t,
bus_size_t);
uint32_t (*bs_r_4_s)(void *, bus_space_handle_t,
bus_size_t);
uint64_t (*bs_r_8_s)(void *, bus_space_handle_t,
bus_size_t);
void (*bs_rm_1_s)(void *, bus_space_handle_t,
bus_size_t, uint8_t *, bus_size_t);
void (*bs_rm_2_s)(void *, bus_space_handle_t,
bus_size_t, uint16_t *, bus_size_t);
void (*bs_rm_4_s)(void *, bus_space_handle_t,
bus_size_t, uint32_t *, bus_size_t);
void (*bs_rm_8_s)(void *, bus_space_handle_t,
bus_size_t, uint64_t *, bus_size_t);
void (*bs_rr_1_s)(void *, bus_space_handle_t,
bus_size_t, uint8_t *, bus_size_t);
void (*bs_rr_2_s)(void *, bus_space_handle_t,
bus_size_t, uint16_t *, bus_size_t);
void (*bs_rr_4_s)(void *, bus_space_handle_t,
bus_size_t, uint32_t *, bus_size_t);
void (*bs_rr_8_s)(void *, bus_space_handle_t,
bus_size_t, uint64_t *, bus_size_t);
void (*bs_w_1_s)(void *, bus_space_handle_t,
bus_size_t, uint8_t);
void (*bs_w_2_s)(void *, bus_space_handle_t,
bus_size_t, uint16_t);
void (*bs_w_4_s)(void *, bus_space_handle_t,
bus_size_t, uint32_t);
void (*bs_w_8_s)(void *, bus_space_handle_t,
bus_size_t, uint64_t);
void (*bs_wm_1_s)(void *, bus_space_handle_t,
bus_size_t, const uint8_t *, bus_size_t);
void (*bs_wm_2_s)(void *, bus_space_handle_t,
bus_size_t, const uint16_t *, bus_size_t);
void (*bs_wm_4_s)(void *, bus_space_handle_t,
bus_size_t, const uint32_t *, bus_size_t);
void (*bs_wm_8_s)(void *, bus_space_handle_t,
bus_size_t, const uint64_t *, bus_size_t);
void (*bs_wr_1_s)(void *, bus_space_handle_t,
bus_size_t, const uint8_t *, bus_size_t);
void (*bs_wr_2_s)(void *, bus_space_handle_t,
bus_size_t, const uint16_t *, bus_size_t);
void (*bs_wr_4_s)(void *, bus_space_handle_t,
bus_size_t, const uint32_t *, bus_size_t);
void (*bs_wr_8_s)(void *, bus_space_handle_t,
bus_size_t, const uint64_t *, bus_size_t);
#endif
#ifdef __BUS_SPACE_HAS_PROBING_METHODS
int (*bs_pe_1)(void *, bus_space_handle_t,
bus_size_t, uint8_t *);
int (*bs_pe_2)(void *, bus_space_handle_t,
bus_size_t, uint16_t *);
int (*bs_pe_4)(void *, bus_space_handle_t,
bus_size_t, uint32_t *);
int (*bs_pe_8)(void *, bus_space_handle_t,
bus_size_t, uint64_t *);
int (*bs_po_1)(void *, bus_space_handle_t,
bus_size_t, uint8_t);
int (*bs_po_2)(void *, bus_space_handle_t,
bus_size_t, uint16_t);
int (*bs_po_4)(void *, bus_space_handle_t,
bus_size_t, uint32_t);
int (*bs_po_8)(void *, bus_space_handle_t,
bus_size_t, uint64_t);
#endif
};
#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
#define _BUS_DMAMAP_COHERENT __BIT(16)
#define _BUS_DMAMAP_IS_BOUNCING __BIT(17)
#define _BUS_DMAMAP_NOALLOC __BIT(18)
struct mbuf;
struct uio;
typedef struct riscv_bus_dma_tag *bus_dma_tag_t;
typedef struct riscv_bus_dmamap *bus_dmamap_t;
#define BUS_DMA_TAG_VALID(t) ((t) != (bus_dma_tag_t)0)
struct riscv_bus_dma_segment {
bus_addr_t ds_addr;
bus_size_t ds_len;
uint32_t _ds_flags;
paddr_t _ds_paddr;
};
typedef struct riscv_bus_dma_segment bus_dma_segment_t;
struct riscv_dma_range {
paddr_t dr_sysbase;
bus_addr_t dr_busbase;
bus_size_t dr_len;
uint32_t dr_flags;
};
struct riscv_bus_dma_tag {
struct riscv_dma_range *_ranges;
int _nranges;
void *_cookie;
int (*_dmamap_create)(bus_dma_tag_t, bus_size_t, int,
bus_size_t, bus_size_t, int, bus_dmamap_t *);
void (*_dmamap_destroy)(bus_dma_tag_t, bus_dmamap_t);
int (*_dmamap_load)(bus_dma_tag_t, bus_dmamap_t, void *,
bus_size_t, struct proc *, int);
int (*_dmamap_load_mbuf)(bus_dma_tag_t, bus_dmamap_t,
struct mbuf *, int);
int (*_dmamap_load_uio)(bus_dma_tag_t, bus_dmamap_t,
struct uio *, int);
int (*_dmamap_load_raw)(bus_dma_tag_t, bus_dmamap_t,
bus_dma_segment_t *, int, bus_size_t, int);
void (*_dmamap_unload)(bus_dma_tag_t, bus_dmamap_t);
void (*_dmamap_sync)(bus_dma_tag_t, bus_dmamap_t,
bus_addr_t, bus_size_t, int);
int (*_dmamem_alloc)(bus_dma_tag_t, bus_size_t, bus_size_t,
bus_size_t, bus_dma_segment_t *, int, int *, int);
void (*_dmamem_free)(bus_dma_tag_t,
bus_dma_segment_t *, int);
int (*_dmamem_map)(bus_dma_tag_t, bus_dma_segment_t *,
int, size_t, void **, int);
void (*_dmamem_unmap)(bus_dma_tag_t, void *, size_t);
paddr_t (*_dmamem_mmap)(bus_dma_tag_t, bus_dma_segment_t *,
int, off_t, int, int);
int (*_dmatag_subregion)(bus_dma_tag_t, bus_addr_t, bus_addr_t,
bus_dma_tag_t *, int);
void (*_dmatag_destroy)(bus_dma_tag_t);
int _tag_needs_free;
int (*_may_bounce)(bus_dma_tag_t, bus_dmamap_t, int, int *);
};
struct riscv_bus_dmamap {
bus_size_t _dm_size;
int _dm_segcnt;
bus_size_t _dm_maxmaxsegsz;
bus_size_t _dm_boundary;
int _dm_flags;
void *_dm_origbuf;
int _dm_buftype;
struct vmspace *_dm_vmspace;
void *_dm_cookie;
#if defined(KASAN)
void *dm_buf;
bus_size_t dm_buflen;
int dm_buftype;
#endif
bus_size_t dm_maxsegsz;
bus_size_t dm_mapsize;
int dm_nsegs;
bus_dma_segment_t dm_segs[1];
};
#define _BUS_DMA_BUFTYPE_INVALID 0
#define _BUS_DMA_BUFTYPE_LINEAR 1
#define _BUS_DMA_BUFTYPE_MBUF 2
#define _BUS_DMA_BUFTYPE_UIO 3
#define _BUS_DMA_BUFTYPE_RAW 4
#ifdef _RISCV_BUS_DMA_PRIVATE
#define _BUS_AVAIL_END physical_end
struct riscv_bus_dma_cookie {
int id_flags;
union {
void *un_origbuf;
char *un_linearbuf;
struct mbuf *un_mbuf;
struct uio *un_uio;
} id_origbuf_un;
#define id_origbuf id_origbuf_un.un_origbuf
#define id_origlinearbuf id_origbuf_un.un_linearbuf
#define id_origmbuf id_origbuf_un.un_mbuf
#define id_origuio id_origbuf_un.un_uio
bus_size_t id_origbuflen;
void *id_bouncebuf;
bus_size_t id_bouncebuflen;
int id_nbouncesegs;
bus_dma_segment_t
id_bouncesegs[0];
};
#define _BUS_DMA_IS_BOUNCING __BIT(2)
#define _BUS_DMA_HAS_BOUNCE __BIT(1)
#endif
#define _BUS_DMA_MIGHT_NEED_BOUNCE __BIT(0)
#endif