10d09e41aSPaolo Bonzini #ifndef HW_ETRAXFS_DMA_H 2175de524SMarkus Armbruster #define HW_ETRAXFS_DMA_H 30d09e41aSPaolo Bonzini 4*ec150c7eSMarkus Armbruster #include "exec/hwaddr.h" 5*ec150c7eSMarkus Armbruster 60d09e41aSPaolo Bonzini struct dma_context_metadata { 70d09e41aSPaolo Bonzini /* data descriptor md */ 80d09e41aSPaolo Bonzini uint16_t metadata; 90d09e41aSPaolo Bonzini }; 100d09e41aSPaolo Bonzini 110d09e41aSPaolo Bonzini struct etraxfs_dma_client 120d09e41aSPaolo Bonzini { 130d09e41aSPaolo Bonzini /* DMA controller. */ 140d09e41aSPaolo Bonzini int channel; 150d09e41aSPaolo Bonzini void *ctrl; 160d09e41aSPaolo Bonzini 170d09e41aSPaolo Bonzini /* client. */ 180d09e41aSPaolo Bonzini struct { 190d09e41aSPaolo Bonzini int (*push)(void *opaque, unsigned char *buf, 200d09e41aSPaolo Bonzini int len, bool eop); 210d09e41aSPaolo Bonzini void (*pull)(void *opaque); 220d09e41aSPaolo Bonzini void (*metadata_push)(void *opaque, 230d09e41aSPaolo Bonzini const struct dma_context_metadata *md); 240d09e41aSPaolo Bonzini void *opaque; 250d09e41aSPaolo Bonzini } client; 260d09e41aSPaolo Bonzini }; 270d09e41aSPaolo Bonzini 280d09e41aSPaolo Bonzini void *etraxfs_dmac_init(hwaddr base, int nr_channels); 290d09e41aSPaolo Bonzini void etraxfs_dmac_connect(void *opaque, int channel, qemu_irq *line, 300d09e41aSPaolo Bonzini int input); 310d09e41aSPaolo Bonzini void etraxfs_dmac_connect_client(void *opaque, int c, 320d09e41aSPaolo Bonzini struct etraxfs_dma_client *cl); 330d09e41aSPaolo Bonzini int etraxfs_dmac_input(struct etraxfs_dma_client *client, 340d09e41aSPaolo Bonzini void *buf, int len, int eop); 350d09e41aSPaolo Bonzini 360d09e41aSPaolo Bonzini #endif 37