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 #include "hw/irq.h" 6*ec150c7eSMarkus Armbruster 70d09e41aSPaolo Bonzini struct dma_context_metadata { 80d09e41aSPaolo Bonzini /* data descriptor md */ 90d09e41aSPaolo Bonzini uint16_t metadata; 100d09e41aSPaolo Bonzini }; 110d09e41aSPaolo Bonzini 120d09e41aSPaolo Bonzini struct etraxfs_dma_client 130d09e41aSPaolo Bonzini { 140d09e41aSPaolo Bonzini /* DMA controller. */ 150d09e41aSPaolo Bonzini int channel; 160d09e41aSPaolo Bonzini void *ctrl; 170d09e41aSPaolo Bonzini 180d09e41aSPaolo Bonzini /* client. */ 190d09e41aSPaolo Bonzini struct { 200d09e41aSPaolo Bonzini int (*push)(void *opaque, unsigned char *buf, 210d09e41aSPaolo Bonzini int len, bool eop); 220d09e41aSPaolo Bonzini void (*pull)(void *opaque); 230d09e41aSPaolo Bonzini void (*metadata_push)(void *opaque, 240d09e41aSPaolo Bonzini const struct dma_context_metadata *md); 250d09e41aSPaolo Bonzini void *opaque; 260d09e41aSPaolo Bonzini } client; 270d09e41aSPaolo Bonzini }; 280d09e41aSPaolo Bonzini 290d09e41aSPaolo Bonzini void *etraxfs_dmac_init(hwaddr base, int nr_channels); 300d09e41aSPaolo Bonzini void etraxfs_dmac_connect(void *opaque, int channel, qemu_irq *line, 310d09e41aSPaolo Bonzini int input); 320d09e41aSPaolo Bonzini void etraxfs_dmac_connect_client(void *opaque, int c, 330d09e41aSPaolo Bonzini struct etraxfs_dma_client *cl); 340d09e41aSPaolo Bonzini int etraxfs_dmac_input(struct etraxfs_dma_client *client, 350d09e41aSPaolo Bonzini void *buf, int len, int eop); 360d09e41aSPaolo Bonzini 370d09e41aSPaolo Bonzini #endif 38