1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* Altera TSE SGDMA and MSGDMA Linux driver 3*4882a593Smuzhiyun * Copyright (C) 2014 Altera Corporation. All rights reserved 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef __ALTERA_MSGDMAHW_H__ 7*4882a593Smuzhiyun #define __ALTERA_MSGDMAHW_H__ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /* mSGDMA extended descriptor format 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun struct msgdma_extended_desc { 12*4882a593Smuzhiyun u32 read_addr_lo; /* data buffer source address low bits */ 13*4882a593Smuzhiyun u32 write_addr_lo; /* data buffer destination address low bits */ 14*4882a593Smuzhiyun u32 len; /* the number of bytes to transfer 15*4882a593Smuzhiyun * per descriptor 16*4882a593Smuzhiyun */ 17*4882a593Smuzhiyun u32 burst_seq_num; /* bit 31:24 write burst 18*4882a593Smuzhiyun * bit 23:16 read burst 19*4882a593Smuzhiyun * bit 15:0 sequence number 20*4882a593Smuzhiyun */ 21*4882a593Smuzhiyun u32 stride; /* bit 31:16 write stride 22*4882a593Smuzhiyun * bit 15:0 read stride 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun u32 read_addr_hi; /* data buffer source address high bits */ 25*4882a593Smuzhiyun u32 write_addr_hi; /* data buffer destination address high bits */ 26*4882a593Smuzhiyun u32 control; /* characteristics of the transfer */ 27*4882a593Smuzhiyun }; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* mSGDMA descriptor control field bit definitions 30*4882a593Smuzhiyun */ 31*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_SET_CH(x) ((x) & 0xff) 32*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_GEN_SOP BIT(8) 33*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_GEN_EOP BIT(9) 34*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_PARK_READS BIT(10) 35*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_PARK_WRITES BIT(11) 36*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_END_ON_EOP BIT(12) 37*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_END_ON_LEN BIT(13) 38*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_TR_COMP_IRQ BIT(14) 39*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_EARLY_IRQ BIT(15) 40*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_TR_ERR_IRQ (0xff << 16) 41*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_EARLY_DONE BIT(24) 42*4882a593Smuzhiyun /* Writing ‘1’ to the ‘go’ bit commits the entire descriptor into the 43*4882a593Smuzhiyun * descriptor FIFO(s) 44*4882a593Smuzhiyun */ 45*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_GO BIT(31) 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /* Tx buffer control flags 48*4882a593Smuzhiyun */ 49*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_TX_FIRST (MSGDMA_DESC_CTL_GEN_SOP | \ 50*4882a593Smuzhiyun MSGDMA_DESC_CTL_GO) 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_TX_MIDDLE (MSGDMA_DESC_CTL_GO) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_TX_LAST (MSGDMA_DESC_CTL_GEN_EOP | \ 55*4882a593Smuzhiyun MSGDMA_DESC_CTL_TR_COMP_IRQ | \ 56*4882a593Smuzhiyun MSGDMA_DESC_CTL_GO) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_TX_SINGLE (MSGDMA_DESC_CTL_GEN_SOP | \ 59*4882a593Smuzhiyun MSGDMA_DESC_CTL_GEN_EOP | \ 60*4882a593Smuzhiyun MSGDMA_DESC_CTL_TR_COMP_IRQ | \ 61*4882a593Smuzhiyun MSGDMA_DESC_CTL_GO) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define MSGDMA_DESC_CTL_RX_SINGLE (MSGDMA_DESC_CTL_END_ON_EOP | \ 64*4882a593Smuzhiyun MSGDMA_DESC_CTL_END_ON_LEN | \ 65*4882a593Smuzhiyun MSGDMA_DESC_CTL_TR_COMP_IRQ | \ 66*4882a593Smuzhiyun MSGDMA_DESC_CTL_EARLY_IRQ | \ 67*4882a593Smuzhiyun MSGDMA_DESC_CTL_TR_ERR_IRQ | \ 68*4882a593Smuzhiyun MSGDMA_DESC_CTL_GO) 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* mSGDMA extended descriptor stride definitions 71*4882a593Smuzhiyun */ 72*4882a593Smuzhiyun #define MSGDMA_DESC_TX_STRIDE (0x00010001) 73*4882a593Smuzhiyun #define MSGDMA_DESC_RX_STRIDE (0x00010001) 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* mSGDMA dispatcher control and status register map 76*4882a593Smuzhiyun */ 77*4882a593Smuzhiyun struct msgdma_csr { 78*4882a593Smuzhiyun u32 status; /* Read/Clear */ 79*4882a593Smuzhiyun u32 control; /* Read/Write */ 80*4882a593Smuzhiyun u32 rw_fill_level; /* bit 31:16 - write fill level 81*4882a593Smuzhiyun * bit 15:0 - read fill level 82*4882a593Smuzhiyun */ 83*4882a593Smuzhiyun u32 resp_fill_level; /* bit 15:0 */ 84*4882a593Smuzhiyun u32 rw_seq_num; /* bit 31:16 - write sequence number 85*4882a593Smuzhiyun * bit 15:0 - read sequence number 86*4882a593Smuzhiyun */ 87*4882a593Smuzhiyun u32 pad[3]; /* reserved */ 88*4882a593Smuzhiyun }; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /* mSGDMA CSR status register bit definitions 91*4882a593Smuzhiyun */ 92*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_BUSY BIT(0) 93*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_DESC_BUF_EMPTY BIT(1) 94*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_DESC_BUF_FULL BIT(2) 95*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_RESP_BUF_EMPTY BIT(3) 96*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_RESP_BUF_FULL BIT(4) 97*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_STOPPED BIT(5) 98*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_RESETTING BIT(6) 99*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_STOPPED_ON_ERR BIT(7) 100*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_STOPPED_ON_EARLY BIT(8) 101*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_IRQ BIT(9) 102*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_MASK 0x3FF 103*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_MASK_WITHOUT_IRQ 0x1FF 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_BUSY_GET(v) GET_BIT_VALUE(v, 0) 106*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_DESC_BUF_EMPTY_GET(v) GET_BIT_VALUE(v, 1) 107*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_DESC_BUF_FULL_GET(v) GET_BIT_VALUE(v, 2) 108*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_RESP_BUF_EMPTY_GET(v) GET_BIT_VALUE(v, 3) 109*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_RESP_BUF_FULL_GET(v) GET_BIT_VALUE(v, 4) 110*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_STOPPED_GET(v) GET_BIT_VALUE(v, 5) 111*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_RESETTING_GET(v) GET_BIT_VALUE(v, 6) 112*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_STOPPED_ON_ERR_GET(v) GET_BIT_VALUE(v, 7) 113*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_STOPPED_ON_EARLY_GET(v) GET_BIT_VALUE(v, 8) 114*4882a593Smuzhiyun #define MSGDMA_CSR_STAT_IRQ_GET(v) GET_BIT_VALUE(v, 9) 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /* mSGDMA CSR control register bit definitions 117*4882a593Smuzhiyun */ 118*4882a593Smuzhiyun #define MSGDMA_CSR_CTL_STOP BIT(0) 119*4882a593Smuzhiyun #define MSGDMA_CSR_CTL_RESET BIT(1) 120*4882a593Smuzhiyun #define MSGDMA_CSR_CTL_STOP_ON_ERR BIT(2) 121*4882a593Smuzhiyun #define MSGDMA_CSR_CTL_STOP_ON_EARLY BIT(3) 122*4882a593Smuzhiyun #define MSGDMA_CSR_CTL_GLOBAL_INTR BIT(4) 123*4882a593Smuzhiyun #define MSGDMA_CSR_CTL_STOP_DESCS BIT(5) 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* mSGDMA CSR fill level bits 126*4882a593Smuzhiyun */ 127*4882a593Smuzhiyun #define MSGDMA_CSR_WR_FILL_LEVEL_GET(v) (((v) & 0xffff0000) >> 16) 128*4882a593Smuzhiyun #define MSGDMA_CSR_RD_FILL_LEVEL_GET(v) ((v) & 0x0000ffff) 129*4882a593Smuzhiyun #define MSGDMA_CSR_RESP_FILL_LEVEL_GET(v) ((v) & 0x0000ffff) 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* mSGDMA response register map 132*4882a593Smuzhiyun */ 133*4882a593Smuzhiyun struct msgdma_response { 134*4882a593Smuzhiyun u32 bytes_transferred; 135*4882a593Smuzhiyun u32 status; 136*4882a593Smuzhiyun }; 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun #define msgdma_respoffs(a) (offsetof(struct msgdma_response, a)) 139*4882a593Smuzhiyun #define msgdma_csroffs(a) (offsetof(struct msgdma_csr, a)) 140*4882a593Smuzhiyun #define msgdma_descroffs(a) (offsetof(struct msgdma_extended_desc, a)) 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /* mSGDMA response register bit definitions 143*4882a593Smuzhiyun */ 144*4882a593Smuzhiyun #define MSGDMA_RESP_EARLY_TERM BIT(8) 145*4882a593Smuzhiyun #define MSGDMA_RESP_ERR_MASK 0xFF 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun #endif /* __ALTERA_MSGDMA_H__*/ 148