| #ifndef C2K_DMA_H_ |
| #define C2K_DMA_H_ |
| |
| #ifndef __ASSEMBLY__ |
| |
| #include <linux/mm_types.h> |
| #include <linux/time.h> |
| |
| // Mem to IO Control |
| #define M2IO_START (1 << 0) |
| #define M2IO_FLENEN (1 << 1) |
| #define M2IO_FCOM (1 << 2) |
| #define M2IO_DONOSTOP (1 << 3) |
| #define M2IO_DONOSTA (1 << 4) |
| |
| // IO to Mem: DMA Control |
| #define IO2M_IRQFRDYN (1 << 0) |
| #define IO2M_IRQFLST (1 << 1) |
| #define IO2M_IRQFDON (1 << 2) |
| #define IO2M_IRQFLSH (1 << 3) |
| #define IO2M_IRQFLEN (1 << 4) |
| #define IO2M_IRQFTHLD (1 << 5) |
| |
| // IRQ Status Register |
| #define IRQ_IRQFRDYN (1 << 0) |
| #define IRQ_IRQFLST (1 << 1) |
| #define IRQ_IRQFDON (1 << 2) |
| #define IRQ_IRQFLSH (1 << 3) |
| #define IRQ_IRQFLEN (1 << 4) |
| #define IRQ_IRQFTHLD (1 << 5) |
| #define IRQ_IRQFCTRL (1 << 6) |
| |
| // Inbound Frame and Buffer Descriptor Programming |
| |
| // BControl |
| #define BLAST (1 << 16) |
| #define BFIX (1 << 17) |
| |
| #define MDMA_INBOUND_BUF_DESC 256 |
| #define MDMA_OUTBOUND_BUF_DESC 256 |
| |
| #define MDMA_MAX_BUF_SIZE 0xffff |
| #define MDMA_SPLIT_BUF_SIZE 0x8000 /* half a page with 64kB pages */ |
| |
| /* AxCACHE[3:0], bit[3]= WA, bit[2]= RA, bit[1]= C, bit[0]= B */ |
| #define BUFFERABLE (1 << 0) |
| #define CACHEABLE (1 << 1) |
| #define READ_ALLOC (1 << 2) |
| #define WRITE_ALLOC (1 << 3) |
| |
| /* AxUSER[0] = coherent(1)/non_coherent(0) */ |
| |
| /* AxUSER[4:1] */ |
| #define STRONGLY_ORDERED 0x0 |
| #define DEVICE 0x1 |
| #define NORMAL_NONCACHEABLE 0x3 |
| #define WRITETHROUGH 0x6 |
| #define WRITEBACK 0x7 |
| #define WRITEBACK_WA 0xf |
| |
| /* AxPROT[2:0], bit[2]= instruction(1)/data(0), bit[1]= non-secure(1)/secure(0) , bit[0] = privilege(1)/normal(0) */ |
| #define PRIVILEGE (1 << 0) |
| #define NON_SECURE (1 << 1) |
| #define INSTRUCTION (1 << 2) |
| |
| |
| #define AWUSER_COHERENT(x) ((((x) << 1) | 1) << 19) |
| #define AWPROT(x) ((x) << 16) |
| #define AWCACHE(x) ((x) << 12) |
| |
| #define ARUSER_COHERENT(x) ((((x) << 1) | 1) << 7) |
| #define ARPROT(x) ((x) << 4) |
| #define ARCACHE(x) ((x) << 0) |
| |
| |
| struct comcerto_xor_buffer_desc { |
| u32 bpointer; |
| u32 bcontrol; |
| }__attribute__ ((aligned(8))); |
| |
| struct comcerto_xor_inbound_fdesc { |
| u32 next_desc; |
| u32 fcontrol; |
| u32 fstatus0; |
| u32 fstatus1; |
| struct comcerto_xor_buffer_desc bdesc[MDMA_INBOUND_BUF_DESC]; |
| }__attribute__ ((aligned(16))); |
| |
| struct comcerto_xor_outbound_fdesc { |
| u32 next_desc; |
| u32 fcontrol; |
| u32 fstatus0; |
| u32 fstatus1; |
| struct comcerto_xor_buffer_desc bdesc[MDMA_OUTBOUND_BUF_DESC]; |
| }__attribute__ ((aligned(16))); |
| |
| struct comcerto_dma_buf { |
| dma_addr_t phys_addr; |
| unsigned int len; |
| unsigned int split; |
| }; |
| |
| struct comcerto_dma_sg { |
| unsigned int input_idx; |
| unsigned int output_idx; |
| dma_addr_t high_phys_addr; |
| dma_addr_t low_phys_addr; |
| #if defined(CONFIG_COMCERTO_MDMA_PROF) |
| struct timeval start; |
| struct timeval end; |
| #endif |
| struct comcerto_dma_buf in_bdesc[MDMA_INBOUND_BUF_DESC]; |
| struct comcerto_dma_buf out_bdesc[MDMA_OUTBOUND_BUF_DESC]; |
| }; |
| |
| |
| extern struct comcerto_xor_inbound_fdesc *mdma_in_desc; |
| extern struct comcerto_xor_outbound_fdesc *mdma_out_desc; |
| |
| |
| static inline void comcerto_dma_set_in_bdesc(u32 idx, u32 addr, u32 ctrl) |
| { |
| mdma_in_desc->bdesc[idx].bpointer = addr; |
| mdma_in_desc->bdesc[idx].bcontrol = ctrl; |
| } |
| |
| static inline void comcerto_dma_set_out_bdesc(u32 idx, u32 addr, u32 ctrl) |
| { |
| mdma_out_desc->bdesc[idx].bpointer = addr; |
| mdma_out_desc->bdesc[idx].bcontrol = ctrl; |
| } |
| |
| static inline void comcerto_dma_in_bdesc_ctrl_update(u32 idx, u32 ctrl) |
| { |
| mdma_in_desc->bdesc[idx].bcontrol |= ctrl; |
| } |
| |
| static inline void comcerto_dma_out_bdesc_ctrl_update(u32 idx, u32 ctrl) |
| { |
| mdma_out_desc->bdesc[idx].bcontrol |= ctrl; |
| } |
| |
| extern void comcerto_dma_get(void); |
| extern void comcerto_dma_put(void); |
| extern void comcerto_dma_set_in_bdesc(u32 idx, u32 addr, u32 ctrl); |
| extern void comcerto_dma_set_out_bdesc(u32 idx, u32 addr, u32 ctrl); |
| extern void comcerto_dma_start(void); |
| extern void comcerto_dma_wait(void); |
| |
| int comcerto_dma_sg_add_input(struct comcerto_dma_sg *sg, struct page *page, unsigned int offset, unsigned int len, int use_acp); |
| int comcerto_dma_sg_add_output(struct comcerto_dma_sg *sg, struct page *page, unsigned int offset, unsigned int len, int use_acp); |
| void comcerto_dma_sg_setup(struct comcerto_dma_sg *sg, unsigned int len); |
| void comcerto_dma_sg_cleanup(struct comcerto_dma_sg *sg, unsigned int len); |
| |
| static inline void comcerto_dma_sg_init(struct comcerto_dma_sg *sg) |
| { |
| sg->input_idx = 0; |
| sg->output_idx = 0; |
| sg->high_phys_addr = 0x0; |
| sg->low_phys_addr = 0xffffffff; |
| } |
| |
| #endif |
| |
| #endif /* C2K_DMA_H_ */ |