1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Tsi721 PCIExpress-to-SRIO bridge definitions 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright 2011, Integrated Device Technology, Inc. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef __TSI721_H 9*4882a593Smuzhiyun #define __TSI721_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* Debug output filtering masks */ 12*4882a593Smuzhiyun enum { 13*4882a593Smuzhiyun DBG_NONE = 0, 14*4882a593Smuzhiyun DBG_INIT = BIT(0), /* driver init */ 15*4882a593Smuzhiyun DBG_EXIT = BIT(1), /* driver exit */ 16*4882a593Smuzhiyun DBG_MPORT = BIT(2), /* mport add/remove */ 17*4882a593Smuzhiyun DBG_MAINT = BIT(3), /* maintenance ops messages */ 18*4882a593Smuzhiyun DBG_DMA = BIT(4), /* DMA transfer messages */ 19*4882a593Smuzhiyun DBG_DMAV = BIT(5), /* verbose DMA transfer messages */ 20*4882a593Smuzhiyun DBG_IBW = BIT(6), /* inbound window */ 21*4882a593Smuzhiyun DBG_EVENT = BIT(7), /* event handling messages */ 22*4882a593Smuzhiyun DBG_OBW = BIT(8), /* outbound window messages */ 23*4882a593Smuzhiyun DBG_DBELL = BIT(9), /* doorbell messages */ 24*4882a593Smuzhiyun DBG_OMSG = BIT(10), /* doorbell messages */ 25*4882a593Smuzhiyun DBG_IMSG = BIT(11), /* doorbell messages */ 26*4882a593Smuzhiyun DBG_ALL = ~0, 27*4882a593Smuzhiyun }; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #ifdef DEBUG 30*4882a593Smuzhiyun extern u32 tsi_dbg_level; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define tsi_debug(level, dev, fmt, arg...) \ 33*4882a593Smuzhiyun do { \ 34*4882a593Smuzhiyun if (DBG_##level & tsi_dbg_level) \ 35*4882a593Smuzhiyun dev_dbg(dev, "%s: " fmt "\n", __func__, ##arg); \ 36*4882a593Smuzhiyun } while (0) 37*4882a593Smuzhiyun #else 38*4882a593Smuzhiyun #define tsi_debug(level, dev, fmt, arg...) \ 39*4882a593Smuzhiyun no_printk(KERN_DEBUG "%s: " fmt "\n", __func__, ##arg) 40*4882a593Smuzhiyun #endif 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define tsi_info(dev, fmt, arg...) \ 43*4882a593Smuzhiyun dev_info(dev, "%s: " fmt "\n", __func__, ##arg) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define tsi_warn(dev, fmt, arg...) \ 46*4882a593Smuzhiyun dev_warn(dev, "%s: WARNING " fmt "\n", __func__, ##arg) 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define tsi_err(dev, fmt, arg...) \ 49*4882a593Smuzhiyun dev_err(dev, "%s: ERROR " fmt "\n", __func__, ##arg) 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define DRV_NAME "tsi721" 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define DEFAULT_HOPCOUNT 0xff 54*4882a593Smuzhiyun #define DEFAULT_DESTID 0xff 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* PCI device ID */ 57*4882a593Smuzhiyun #define PCI_DEVICE_ID_TSI721 0x80ab 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define BAR_0 0 60*4882a593Smuzhiyun #define BAR_1 1 61*4882a593Smuzhiyun #define BAR_2 2 62*4882a593Smuzhiyun #define BAR_4 4 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #define TSI721_PC2SR_BARS 2 65*4882a593Smuzhiyun #define TSI721_PC2SR_WINS 8 66*4882a593Smuzhiyun #define TSI721_PC2SR_ZONES 8 67*4882a593Smuzhiyun #define TSI721_MAINT_WIN 0 /* Window for outbound maintenance requests */ 68*4882a593Smuzhiyun #define IDB_QUEUE 0 /* Inbound Doorbell Queue to use */ 69*4882a593Smuzhiyun #define IDB_QSIZE 512 /* Inbound Doorbell Queue size */ 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* Memory space sizes */ 72*4882a593Smuzhiyun #define TSI721_REG_SPACE_SIZE (512 * 1024) /* 512K */ 73*4882a593Smuzhiyun #define TSI721_DB_WIN_SIZE (16 * 1024 * 1024) /* 16MB */ 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun #define RIO_TT_CODE_8 0x00000000 76*4882a593Smuzhiyun #define RIO_TT_CODE_16 0x00000001 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #define TSI721_DMA_MAXCH 8 79*4882a593Smuzhiyun #define TSI721_DMA_MINSTSSZ 32 80*4882a593Smuzhiyun #define TSI721_DMA_STSBLKSZ 8 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun #define TSI721_SRIO_MAXCH 8 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define DBELL_SID(buf) (((u8)buf[2] << 8) | (u8)buf[3]) 85*4882a593Smuzhiyun #define DBELL_TID(buf) (((u8)buf[4] << 8) | (u8)buf[5]) 86*4882a593Smuzhiyun #define DBELL_INF(buf) (((u8)buf[0] << 8) | (u8)buf[1]) 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define TSI721_RIO_PW_MSG_SIZE 16 /* Tsi721 saves only 16 bytes of PW msg */ 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /* Register definitions */ 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* 93*4882a593Smuzhiyun * Registers in PCIe configuration space 94*4882a593Smuzhiyun */ 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun #define TSI721_PCIECFG_MSIXTBL 0x0a4 97*4882a593Smuzhiyun #define TSI721_MSIXTBL_OFFSET 0x2c000 98*4882a593Smuzhiyun #define TSI721_PCIECFG_MSIXPBA 0x0a8 99*4882a593Smuzhiyun #define TSI721_MSIXPBA_OFFSET 0x2a000 100*4882a593Smuzhiyun #define TSI721_PCIECFG_EPCTL 0x400 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /* 103*4882a593Smuzhiyun * Event Management Registers 104*4882a593Smuzhiyun */ 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun #define TSI721_RIO_EM_INT_STAT 0x10910 107*4882a593Smuzhiyun #define TSI721_RIO_EM_INT_STAT_PW_RX 0x00010000 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun #define TSI721_RIO_EM_INT_ENABLE 0x10914 110*4882a593Smuzhiyun #define TSI721_RIO_EM_INT_ENABLE_PW_RX 0x00010000 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #define TSI721_RIO_EM_DEV_INT_EN 0x10930 113*4882a593Smuzhiyun #define TSI721_RIO_EM_DEV_INT_EN_INT 0x00000001 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /* 116*4882a593Smuzhiyun * Port-Write Block Registers 117*4882a593Smuzhiyun */ 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun #define TSI721_RIO_PW_CTL 0x10a04 120*4882a593Smuzhiyun #define TSI721_RIO_PW_CTL_PW_TIMER 0xf0000000 121*4882a593Smuzhiyun #define TSI721_RIO_PW_CTL_PWT_DIS (0 << 28) 122*4882a593Smuzhiyun #define TSI721_RIO_PW_CTL_PWT_103 (1 << 28) 123*4882a593Smuzhiyun #define TSI721_RIO_PW_CTL_PWT_205 (1 << 29) 124*4882a593Smuzhiyun #define TSI721_RIO_PW_CTL_PWT_410 (1 << 30) 125*4882a593Smuzhiyun #define TSI721_RIO_PW_CTL_PWT_820 (1 << 31) 126*4882a593Smuzhiyun #define TSI721_RIO_PW_CTL_PWC_MODE 0x01000000 127*4882a593Smuzhiyun #define TSI721_RIO_PW_CTL_PWC_CONT 0x00000000 128*4882a593Smuzhiyun #define TSI721_RIO_PW_CTL_PWC_REL 0x01000000 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun #define TSI721_RIO_PW_RX_STAT 0x10a10 131*4882a593Smuzhiyun #define TSI721_RIO_PW_RX_STAT_WR_SIZE 0x0000f000 132*4882a593Smuzhiyun #define TSI_RIO_PW_RX_STAT_WDPTR 0x00000100 133*4882a593Smuzhiyun #define TSI721_RIO_PW_RX_STAT_PW_SHORT 0x00000008 134*4882a593Smuzhiyun #define TSI721_RIO_PW_RX_STAT_PW_TRUNC 0x00000004 135*4882a593Smuzhiyun #define TSI721_RIO_PW_RX_STAT_PW_DISC 0x00000002 136*4882a593Smuzhiyun #define TSI721_RIO_PW_RX_STAT_PW_VAL 0x00000001 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun #define TSI721_RIO_PW_RX_CAPT(x) (0x10a20 + (x)*4) 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /* 141*4882a593Smuzhiyun * Inbound Doorbells 142*4882a593Smuzhiyun */ 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun #define TSI721_IDB_ENTRY_SIZE 64 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #define TSI721_IDQ_CTL(x) (0x20000 + (x) * 0x1000) 147*4882a593Smuzhiyun #define TSI721_IDQ_SUSPEND 0x00000002 148*4882a593Smuzhiyun #define TSI721_IDQ_INIT 0x00000001 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define TSI721_IDQ_STS(x) (0x20004 + (x) * 0x1000) 151*4882a593Smuzhiyun #define TSI721_IDQ_RUN 0x00200000 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun #define TSI721_IDQ_MASK(x) (0x20008 + (x) * 0x1000) 154*4882a593Smuzhiyun #define TSI721_IDQ_MASK_MASK 0xffff0000 155*4882a593Smuzhiyun #define TSI721_IDQ_MASK_PATT 0x0000ffff 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun #define TSI721_IDQ_RP(x) (0x2000c + (x) * 0x1000) 158*4882a593Smuzhiyun #define TSI721_IDQ_RP_PTR 0x0007ffff 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #define TSI721_IDQ_WP(x) (0x20010 + (x) * 0x1000) 161*4882a593Smuzhiyun #define TSI721_IDQ_WP_PTR 0x0007ffff 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun #define TSI721_IDQ_BASEL(x) (0x20014 + (x) * 0x1000) 164*4882a593Smuzhiyun #define TSI721_IDQ_BASEL_ADDR 0xffffffc0 165*4882a593Smuzhiyun #define TSI721_IDQ_BASEU(x) (0x20018 + (x) * 0x1000) 166*4882a593Smuzhiyun #define TSI721_IDQ_SIZE(x) (0x2001c + (x) * 0x1000) 167*4882a593Smuzhiyun #define TSI721_IDQ_SIZE_VAL(size) (__fls(size) - 4) 168*4882a593Smuzhiyun #define TSI721_IDQ_SIZE_MIN 512 169*4882a593Smuzhiyun #define TSI721_IDQ_SIZE_MAX (512 * 1024) 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun #define TSI721_SR_CHINT(x) (0x20040 + (x) * 0x1000) 172*4882a593Smuzhiyun #define TSI721_SR_CHINTE(x) (0x20044 + (x) * 0x1000) 173*4882a593Smuzhiyun #define TSI721_SR_CHINTSET(x) (0x20048 + (x) * 0x1000) 174*4882a593Smuzhiyun #define TSI721_SR_CHINT_ODBOK 0x00000020 175*4882a593Smuzhiyun #define TSI721_SR_CHINT_IDBQRCV 0x00000010 176*4882a593Smuzhiyun #define TSI721_SR_CHINT_SUSP 0x00000008 177*4882a593Smuzhiyun #define TSI721_SR_CHINT_ODBTO 0x00000004 178*4882a593Smuzhiyun #define TSI721_SR_CHINT_ODBRTRY 0x00000002 179*4882a593Smuzhiyun #define TSI721_SR_CHINT_ODBERR 0x00000001 180*4882a593Smuzhiyun #define TSI721_SR_CHINT_ALL 0x0000003f 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun #define TSI721_IBWIN_NUM 8 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun #define TSI721_IBWIN_LB(x) (0x29000 + (x) * 0x20) 185*4882a593Smuzhiyun #define TSI721_IBWIN_LB_BA 0xfffff000 186*4882a593Smuzhiyun #define TSI721_IBWIN_LB_WEN 0x00000001 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun #define TSI721_IBWIN_UB(x) (0x29004 + (x) * 0x20) 189*4882a593Smuzhiyun #define TSI721_IBWIN_SZ(x) (0x29008 + (x) * 0x20) 190*4882a593Smuzhiyun #define TSI721_IBWIN_SZ_SIZE 0x00001f00 191*4882a593Smuzhiyun #define TSI721_IBWIN_SIZE(size) (__fls(size) - 12) 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun #define TSI721_IBWIN_TLA(x) (0x2900c + (x) * 0x20) 194*4882a593Smuzhiyun #define TSI721_IBWIN_TLA_ADD 0xfffff000 195*4882a593Smuzhiyun #define TSI721_IBWIN_TUA(x) (0x29010 + (x) * 0x20) 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun #define TSI721_SR2PC_GEN_INTE 0x29800 198*4882a593Smuzhiyun #define TSI721_SR2PC_PWE 0x29804 199*4882a593Smuzhiyun #define TSI721_SR2PC_GEN_INT 0x29808 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun #define TSI721_DEV_INTE 0x29840 202*4882a593Smuzhiyun #define TSI721_DEV_INT 0x29844 203*4882a593Smuzhiyun #define TSI721_DEV_INTSET 0x29848 204*4882a593Smuzhiyun #define TSI721_DEV_INT_BDMA_CH 0x00002000 205*4882a593Smuzhiyun #define TSI721_DEV_INT_BDMA_NCH 0x00001000 206*4882a593Smuzhiyun #define TSI721_DEV_INT_SMSG_CH 0x00000800 207*4882a593Smuzhiyun #define TSI721_DEV_INT_SMSG_NCH 0x00000400 208*4882a593Smuzhiyun #define TSI721_DEV_INT_SR2PC_CH 0x00000200 209*4882a593Smuzhiyun #define TSI721_DEV_INT_SRIO 0x00000020 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun #define TSI721_DEV_CHAN_INTE 0x2984c 212*4882a593Smuzhiyun #define TSI721_DEV_CHAN_INT 0x29850 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #define TSI721_INT_SR2PC_CHAN_M 0xff000000 215*4882a593Smuzhiyun #define TSI721_INT_SR2PC_CHAN(x) (1 << (24 + (x))) 216*4882a593Smuzhiyun #define TSI721_INT_IMSG_CHAN_M 0x00ff0000 217*4882a593Smuzhiyun #define TSI721_INT_IMSG_CHAN(x) (1 << (16 + (x))) 218*4882a593Smuzhiyun #define TSI721_INT_OMSG_CHAN_M 0x0000ff00 219*4882a593Smuzhiyun #define TSI721_INT_OMSG_CHAN(x) (1 << (8 + (x))) 220*4882a593Smuzhiyun #define TSI721_INT_BDMA_CHAN_M 0x000000ff 221*4882a593Smuzhiyun #define TSI721_INT_BDMA_CHAN(x) (1 << (x)) 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun /* 224*4882a593Smuzhiyun * PC2SR block registers 225*4882a593Smuzhiyun */ 226*4882a593Smuzhiyun #define TSI721_OBWIN_NUM TSI721_PC2SR_WINS 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun #define TSI721_OBWINLB(x) (0x40000 + (x) * 0x20) 229*4882a593Smuzhiyun #define TSI721_OBWINLB_BA 0xffff8000 230*4882a593Smuzhiyun #define TSI721_OBWINLB_WEN 0x00000001 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun #define TSI721_OBWINUB(x) (0x40004 + (x) * 0x20) 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun #define TSI721_OBWINSZ(x) (0x40008 + (x) * 0x20) 235*4882a593Smuzhiyun #define TSI721_OBWINSZ_SIZE 0x00001f00 236*4882a593Smuzhiyun #define TSI721_OBWIN_SIZE(size) (__fls(size) - 15) 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun #define TSI721_ZONE_SEL 0x41300 239*4882a593Smuzhiyun #define TSI721_ZONE_SEL_RD_WRB 0x00020000 240*4882a593Smuzhiyun #define TSI721_ZONE_SEL_GO 0x00010000 241*4882a593Smuzhiyun #define TSI721_ZONE_SEL_WIN 0x00000038 242*4882a593Smuzhiyun #define TSI721_ZONE_SEL_ZONE 0x00000007 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun #define TSI721_LUT_DATA0 0x41304 245*4882a593Smuzhiyun #define TSI721_LUT_DATA0_ADD 0xfffff000 246*4882a593Smuzhiyun #define TSI721_LUT_DATA0_RDTYPE 0x00000f00 247*4882a593Smuzhiyun #define TSI721_LUT_DATA0_NREAD 0x00000100 248*4882a593Smuzhiyun #define TSI721_LUT_DATA0_MNTRD 0x00000200 249*4882a593Smuzhiyun #define TSI721_LUT_DATA0_RDCRF 0x00000020 250*4882a593Smuzhiyun #define TSI721_LUT_DATA0_WRCRF 0x00000010 251*4882a593Smuzhiyun #define TSI721_LUT_DATA0_WRTYPE 0x0000000f 252*4882a593Smuzhiyun #define TSI721_LUT_DATA0_NWR 0x00000001 253*4882a593Smuzhiyun #define TSI721_LUT_DATA0_MNTWR 0x00000002 254*4882a593Smuzhiyun #define TSI721_LUT_DATA0_NWR_R 0x00000004 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun #define TSI721_LUT_DATA1 0x41308 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun #define TSI721_LUT_DATA2 0x4130c 259*4882a593Smuzhiyun #define TSI721_LUT_DATA2_HC 0xff000000 260*4882a593Smuzhiyun #define TSI721_LUT_DATA2_ADD65 0x000c0000 261*4882a593Smuzhiyun #define TSI721_LUT_DATA2_TT 0x00030000 262*4882a593Smuzhiyun #define TSI721_LUT_DATA2_DSTID 0x0000ffff 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun #define TSI721_PC2SR_INTE 0x41310 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun #define TSI721_DEVCTL 0x48004 267*4882a593Smuzhiyun #define TSI721_DEVCTL_SRBOOT_CMPL 0x00000004 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun #define TSI721_I2C_INT_ENABLE 0x49120 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /* 272*4882a593Smuzhiyun * Block DMA Engine Registers 273*4882a593Smuzhiyun * x = 0..7 274*4882a593Smuzhiyun */ 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun #define TSI721_DMAC_BASE(x) (0x51000 + (x) * 0x1000) 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun #define TSI721_DMAC_DWRCNT 0x000 279*4882a593Smuzhiyun #define TSI721_DMAC_DRDCNT 0x004 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun #define TSI721_DMAC_CTL 0x008 282*4882a593Smuzhiyun #define TSI721_DMAC_CTL_SUSP 0x00000002 283*4882a593Smuzhiyun #define TSI721_DMAC_CTL_INIT 0x00000001 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun #define TSI721_DMAC_INT 0x00c 286*4882a593Smuzhiyun #define TSI721_DMAC_INT_STFULL 0x00000010 287*4882a593Smuzhiyun #define TSI721_DMAC_INT_DONE 0x00000008 288*4882a593Smuzhiyun #define TSI721_DMAC_INT_SUSP 0x00000004 289*4882a593Smuzhiyun #define TSI721_DMAC_INT_ERR 0x00000002 290*4882a593Smuzhiyun #define TSI721_DMAC_INT_IOFDONE 0x00000001 291*4882a593Smuzhiyun #define TSI721_DMAC_INT_ALL 0x0000001f 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun #define TSI721_DMAC_INTSET 0x010 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #define TSI721_DMAC_STS 0x014 296*4882a593Smuzhiyun #define TSI721_DMAC_STS_ABORT 0x00400000 297*4882a593Smuzhiyun #define TSI721_DMAC_STS_RUN 0x00200000 298*4882a593Smuzhiyun #define TSI721_DMAC_STS_CS 0x001f0000 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun #define TSI721_DMAC_INTE 0x018 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun #define TSI721_DMAC_DPTRL 0x024 303*4882a593Smuzhiyun #define TSI721_DMAC_DPTRL_MASK 0xffffffe0 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun #define TSI721_DMAC_DPTRH 0x028 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun #define TSI721_DMAC_DSBL 0x02c 308*4882a593Smuzhiyun #define TSI721_DMAC_DSBL_MASK 0xffffffc0 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun #define TSI721_DMAC_DSBH 0x030 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun #define TSI721_DMAC_DSSZ 0x034 313*4882a593Smuzhiyun #define TSI721_DMAC_DSSZ_SIZE_M 0x0000000f 314*4882a593Smuzhiyun #define TSI721_DMAC_DSSZ_SIZE(size) (__fls(size) - 4) 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun #define TSI721_DMAC_DSRP 0x038 317*4882a593Smuzhiyun #define TSI721_DMAC_DSRP_MASK 0x0007ffff 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun #define TSI721_DMAC_DSWP 0x03c 320*4882a593Smuzhiyun #define TSI721_DMAC_DSWP_MASK 0x0007ffff 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun #define TSI721_BDMA_INTE 0x5f000 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun /* 325*4882a593Smuzhiyun * Messaging definitions 326*4882a593Smuzhiyun */ 327*4882a593Smuzhiyun #define TSI721_MSG_BUFFER_SIZE RIO_MAX_MSG_SIZE 328*4882a593Smuzhiyun #define TSI721_MSG_MAX_SIZE RIO_MAX_MSG_SIZE 329*4882a593Smuzhiyun #define TSI721_IMSG_MAXCH 8 330*4882a593Smuzhiyun #define TSI721_IMSG_CHNUM TSI721_IMSG_MAXCH 331*4882a593Smuzhiyun #define TSI721_IMSGD_MIN_RING_SIZE 32 332*4882a593Smuzhiyun #define TSI721_IMSGD_RING_SIZE 512 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun #define TSI721_OMSG_CHNUM 4 /* One channel per MBOX */ 335*4882a593Smuzhiyun #define TSI721_OMSGD_MIN_RING_SIZE 32 336*4882a593Smuzhiyun #define TSI721_OMSGD_RING_SIZE 512 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun /* 339*4882a593Smuzhiyun * Outbound Messaging Engine Registers 340*4882a593Smuzhiyun * x = 0..7 341*4882a593Smuzhiyun */ 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun #define TSI721_OBDMAC_DWRCNT(x) (0x61000 + (x) * 0x1000) 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun #define TSI721_OBDMAC_DRDCNT(x) (0x61004 + (x) * 0x1000) 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun #define TSI721_OBDMAC_CTL(x) (0x61008 + (x) * 0x1000) 348*4882a593Smuzhiyun #define TSI721_OBDMAC_CTL_MASK 0x00000007 349*4882a593Smuzhiyun #define TSI721_OBDMAC_CTL_RETRY_THR 0x00000004 350*4882a593Smuzhiyun #define TSI721_OBDMAC_CTL_SUSPEND 0x00000002 351*4882a593Smuzhiyun #define TSI721_OBDMAC_CTL_INIT 0x00000001 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun #define TSI721_OBDMAC_INT(x) (0x6100c + (x) * 0x1000) 354*4882a593Smuzhiyun #define TSI721_OBDMAC_INTSET(x) (0x61010 + (x) * 0x1000) 355*4882a593Smuzhiyun #define TSI721_OBDMAC_INTE(x) (0x61018 + (x) * 0x1000) 356*4882a593Smuzhiyun #define TSI721_OBDMAC_INT_MASK 0x0000001F 357*4882a593Smuzhiyun #define TSI721_OBDMAC_INT_ST_FULL 0x00000010 358*4882a593Smuzhiyun #define TSI721_OBDMAC_INT_DONE 0x00000008 359*4882a593Smuzhiyun #define TSI721_OBDMAC_INT_SUSPENDED 0x00000004 360*4882a593Smuzhiyun #define TSI721_OBDMAC_INT_ERROR 0x00000002 361*4882a593Smuzhiyun #define TSI721_OBDMAC_INT_IOF_DONE 0x00000001 362*4882a593Smuzhiyun #define TSI721_OBDMAC_INT_ALL TSI721_OBDMAC_INT_MASK 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun #define TSI721_OBDMAC_STS(x) (0x61014 + (x) * 0x1000) 365*4882a593Smuzhiyun #define TSI721_OBDMAC_STS_MASK 0x007f0000 366*4882a593Smuzhiyun #define TSI721_OBDMAC_STS_ABORT 0x00400000 367*4882a593Smuzhiyun #define TSI721_OBDMAC_STS_RUN 0x00200000 368*4882a593Smuzhiyun #define TSI721_OBDMAC_STS_CS 0x001f0000 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun #define TSI721_OBDMAC_PWE(x) (0x6101c + (x) * 0x1000) 371*4882a593Smuzhiyun #define TSI721_OBDMAC_PWE_MASK 0x00000002 372*4882a593Smuzhiyun #define TSI721_OBDMAC_PWE_ERROR_EN 0x00000002 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun #define TSI721_OBDMAC_DPTRL(x) (0x61020 + (x) * 0x1000) 375*4882a593Smuzhiyun #define TSI721_OBDMAC_DPTRL_MASK 0xfffffff0 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun #define TSI721_OBDMAC_DPTRH(x) (0x61024 + (x) * 0x1000) 378*4882a593Smuzhiyun #define TSI721_OBDMAC_DPTRH_MASK 0xffffffff 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun #define TSI721_OBDMAC_DSBL(x) (0x61040 + (x) * 0x1000) 381*4882a593Smuzhiyun #define TSI721_OBDMAC_DSBL_MASK 0xffffffc0 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun #define TSI721_OBDMAC_DSBH(x) (0x61044 + (x) * 0x1000) 384*4882a593Smuzhiyun #define TSI721_OBDMAC_DSBH_MASK 0xffffffff 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun #define TSI721_OBDMAC_DSSZ(x) (0x61048 + (x) * 0x1000) 387*4882a593Smuzhiyun #define TSI721_OBDMAC_DSSZ_MASK 0x0000000f 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun #define TSI721_OBDMAC_DSRP(x) (0x6104c + (x) * 0x1000) 390*4882a593Smuzhiyun #define TSI721_OBDMAC_DSRP_MASK 0x0007ffff 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun #define TSI721_OBDMAC_DSWP(x) (0x61050 + (x) * 0x1000) 393*4882a593Smuzhiyun #define TSI721_OBDMAC_DSWP_MASK 0x0007ffff 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun #define TSI721_RQRPTO 0x60010 396*4882a593Smuzhiyun #define TSI721_RQRPTO_MASK 0x00ffffff 397*4882a593Smuzhiyun #define TSI721_RQRPTO_VAL 400 /* Response TO value */ 398*4882a593Smuzhiyun 399*4882a593Smuzhiyun /* 400*4882a593Smuzhiyun * Inbound Messaging Engine Registers 401*4882a593Smuzhiyun * x = 0..7 402*4882a593Smuzhiyun */ 403*4882a593Smuzhiyun 404*4882a593Smuzhiyun #define TSI721_IB_DEVID_GLOBAL 0xffff 405*4882a593Smuzhiyun #define TSI721_IBDMAC_FQBL(x) (0x61200 + (x) * 0x1000) 406*4882a593Smuzhiyun #define TSI721_IBDMAC_FQBL_MASK 0xffffffc0 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun #define TSI721_IBDMAC_FQBH(x) (0x61204 + (x) * 0x1000) 409*4882a593Smuzhiyun #define TSI721_IBDMAC_FQBH_MASK 0xffffffff 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun #define TSI721_IBDMAC_FQSZ_ENTRY_INX TSI721_IMSGD_RING_SIZE 412*4882a593Smuzhiyun #define TSI721_IBDMAC_FQSZ(x) (0x61208 + (x) * 0x1000) 413*4882a593Smuzhiyun #define TSI721_IBDMAC_FQSZ_MASK 0x0000000f 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun #define TSI721_IBDMAC_FQRP(x) (0x6120c + (x) * 0x1000) 416*4882a593Smuzhiyun #define TSI721_IBDMAC_FQRP_MASK 0x0007ffff 417*4882a593Smuzhiyun 418*4882a593Smuzhiyun #define TSI721_IBDMAC_FQWP(x) (0x61210 + (x) * 0x1000) 419*4882a593Smuzhiyun #define TSI721_IBDMAC_FQWP_MASK 0x0007ffff 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun #define TSI721_IBDMAC_FQTH(x) (0x61214 + (x) * 0x1000) 422*4882a593Smuzhiyun #define TSI721_IBDMAC_FQTH_MASK 0x0007ffff 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun #define TSI721_IB_DEVID 0x60020 425*4882a593Smuzhiyun #define TSI721_IB_DEVID_MASK 0x0000ffff 426*4882a593Smuzhiyun 427*4882a593Smuzhiyun #define TSI721_IBDMAC_CTL(x) (0x61240 + (x) * 0x1000) 428*4882a593Smuzhiyun #define TSI721_IBDMAC_CTL_MASK 0x00000003 429*4882a593Smuzhiyun #define TSI721_IBDMAC_CTL_SUSPEND 0x00000002 430*4882a593Smuzhiyun #define TSI721_IBDMAC_CTL_INIT 0x00000001 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun #define TSI721_IBDMAC_STS(x) (0x61244 + (x) * 0x1000) 433*4882a593Smuzhiyun #define TSI721_IBDMAC_STS_MASK 0x007f0000 434*4882a593Smuzhiyun #define TSI721_IBSMAC_STS_ABORT 0x00400000 435*4882a593Smuzhiyun #define TSI721_IBSMAC_STS_RUN 0x00200000 436*4882a593Smuzhiyun #define TSI721_IBSMAC_STS_CS 0x001f0000 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun #define TSI721_IBDMAC_INT(x) (0x61248 + (x) * 0x1000) 439*4882a593Smuzhiyun #define TSI721_IBDMAC_INTSET(x) (0x6124c + (x) * 0x1000) 440*4882a593Smuzhiyun #define TSI721_IBDMAC_INTE(x) (0x61250 + (x) * 0x1000) 441*4882a593Smuzhiyun #define TSI721_IBDMAC_INT_MASK 0x0000100f 442*4882a593Smuzhiyun #define TSI721_IBDMAC_INT_SRTO 0x00001000 443*4882a593Smuzhiyun #define TSI721_IBDMAC_INT_SUSPENDED 0x00000008 444*4882a593Smuzhiyun #define TSI721_IBDMAC_INT_PC_ERROR 0x00000004 445*4882a593Smuzhiyun #define TSI721_IBDMAC_INT_FQ_LOW 0x00000002 446*4882a593Smuzhiyun #define TSI721_IBDMAC_INT_DQ_RCV 0x00000001 447*4882a593Smuzhiyun #define TSI721_IBDMAC_INT_ALL TSI721_IBDMAC_INT_MASK 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun #define TSI721_IBDMAC_PWE(x) (0x61254 + (x) * 0x1000) 450*4882a593Smuzhiyun #define TSI721_IBDMAC_PWE_MASK 0x00001700 451*4882a593Smuzhiyun #define TSI721_IBDMAC_PWE_SRTO 0x00001000 452*4882a593Smuzhiyun #define TSI721_IBDMAC_PWE_ILL_FMT 0x00000400 453*4882a593Smuzhiyun #define TSI721_IBDMAC_PWE_ILL_DEC 0x00000200 454*4882a593Smuzhiyun #define TSI721_IBDMAC_PWE_IMP_SP 0x00000100 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun #define TSI721_IBDMAC_DQBL(x) (0x61300 + (x) * 0x1000) 457*4882a593Smuzhiyun #define TSI721_IBDMAC_DQBL_MASK 0xffffffc0 458*4882a593Smuzhiyun #define TSI721_IBDMAC_DQBL_ADDR 0xffffffc0 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun #define TSI721_IBDMAC_DQBH(x) (0x61304 + (x) * 0x1000) 461*4882a593Smuzhiyun #define TSI721_IBDMAC_DQBH_MASK 0xffffffff 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun #define TSI721_IBDMAC_DQRP(x) (0x61308 + (x) * 0x1000) 464*4882a593Smuzhiyun #define TSI721_IBDMAC_DQRP_MASK 0x0007ffff 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun #define TSI721_IBDMAC_DQWR(x) (0x6130c + (x) * 0x1000) 467*4882a593Smuzhiyun #define TSI721_IBDMAC_DQWR_MASK 0x0007ffff 468*4882a593Smuzhiyun 469*4882a593Smuzhiyun #define TSI721_IBDMAC_DQSZ(x) (0x61314 + (x) * 0x1000) 470*4882a593Smuzhiyun #define TSI721_IBDMAC_DQSZ_MASK 0x0000000f 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun /* 473*4882a593Smuzhiyun * Messaging Engine Interrupts 474*4882a593Smuzhiyun */ 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun #define TSI721_SMSG_PWE 0x6a004 477*4882a593Smuzhiyun 478*4882a593Smuzhiyun #define TSI721_SMSG_INTE 0x6a000 479*4882a593Smuzhiyun #define TSI721_SMSG_INT 0x6a008 480*4882a593Smuzhiyun #define TSI721_SMSG_INTSET 0x6a010 481*4882a593Smuzhiyun #define TSI721_SMSG_INT_MASK 0x0086ffff 482*4882a593Smuzhiyun #define TSI721_SMSG_INT_UNS_RSP 0x00800000 483*4882a593Smuzhiyun #define TSI721_SMSG_INT_ECC_NCOR 0x00040000 484*4882a593Smuzhiyun #define TSI721_SMSG_INT_ECC_COR 0x00020000 485*4882a593Smuzhiyun #define TSI721_SMSG_INT_ECC_NCOR_CH 0x0000ff00 486*4882a593Smuzhiyun #define TSI721_SMSG_INT_ECC_COR_CH 0x000000ff 487*4882a593Smuzhiyun 488*4882a593Smuzhiyun #define TSI721_SMSG_ECC_LOG 0x6a014 489*4882a593Smuzhiyun #define TSI721_SMSG_ECC_LOG_MASK 0x00070007 490*4882a593Smuzhiyun #define TSI721_SMSG_ECC_LOG_ECC_NCOR_M 0x00070000 491*4882a593Smuzhiyun #define TSI721_SMSG_ECC_LOG_ECC_COR_M 0x00000007 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun #define TSI721_RETRY_GEN_CNT 0x6a100 494*4882a593Smuzhiyun #define TSI721_RETRY_GEN_CNT_MASK 0xffffffff 495*4882a593Smuzhiyun 496*4882a593Smuzhiyun #define TSI721_RETRY_RX_CNT 0x6a104 497*4882a593Smuzhiyun #define TSI721_RETRY_RX_CNT_MASK 0xffffffff 498*4882a593Smuzhiyun 499*4882a593Smuzhiyun #define TSI721_SMSG_ECC_COR_LOG(x) (0x6a300 + (x) * 4) 500*4882a593Smuzhiyun #define TSI721_SMSG_ECC_COR_LOG_MASK 0x000000ff 501*4882a593Smuzhiyun 502*4882a593Smuzhiyun #define TSI721_SMSG_ECC_NCOR(x) (0x6a340 + (x) * 4) 503*4882a593Smuzhiyun #define TSI721_SMSG_ECC_NCOR_MASK 0x000000ff 504*4882a593Smuzhiyun 505*4882a593Smuzhiyun /* 506*4882a593Smuzhiyun * Block DMA Descriptors 507*4882a593Smuzhiyun */ 508*4882a593Smuzhiyun 509*4882a593Smuzhiyun struct tsi721_dma_desc { 510*4882a593Smuzhiyun __le32 type_id; 511*4882a593Smuzhiyun 512*4882a593Smuzhiyun #define TSI721_DMAD_DEVID 0x0000ffff 513*4882a593Smuzhiyun #define TSI721_DMAD_CRF 0x00010000 514*4882a593Smuzhiyun #define TSI721_DMAD_PRIO 0x00060000 515*4882a593Smuzhiyun #define TSI721_DMAD_RTYPE 0x00780000 516*4882a593Smuzhiyun #define TSI721_DMAD_IOF 0x08000000 517*4882a593Smuzhiyun #define TSI721_DMAD_DTYPE 0xe0000000 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun __le32 bcount; 520*4882a593Smuzhiyun 521*4882a593Smuzhiyun #define TSI721_DMAD_BCOUNT1 0x03ffffff /* if DTYPE == 1 */ 522*4882a593Smuzhiyun #define TSI721_DMAD_BCOUNT2 0x0000000f /* if DTYPE == 2 */ 523*4882a593Smuzhiyun #define TSI721_DMAD_TT 0x0c000000 524*4882a593Smuzhiyun #define TSI721_DMAD_RADDR0 0xc0000000 525*4882a593Smuzhiyun 526*4882a593Smuzhiyun union { 527*4882a593Smuzhiyun __le32 raddr_lo; /* if DTYPE == (1 || 2) */ 528*4882a593Smuzhiyun __le32 next_lo; /* if DTYPE == 3 */ 529*4882a593Smuzhiyun }; 530*4882a593Smuzhiyun 531*4882a593Smuzhiyun #define TSI721_DMAD_CFGOFF 0x00ffffff 532*4882a593Smuzhiyun #define TSI721_DMAD_HOPCNT 0xff000000 533*4882a593Smuzhiyun 534*4882a593Smuzhiyun union { 535*4882a593Smuzhiyun __le32 raddr_hi; /* if DTYPE == (1 || 2) */ 536*4882a593Smuzhiyun __le32 next_hi; /* if DTYPE == 3 */ 537*4882a593Smuzhiyun }; 538*4882a593Smuzhiyun 539*4882a593Smuzhiyun union { 540*4882a593Smuzhiyun struct { /* if DTYPE == 1 */ 541*4882a593Smuzhiyun __le32 bufptr_lo; 542*4882a593Smuzhiyun __le32 bufptr_hi; 543*4882a593Smuzhiyun __le32 s_dist; 544*4882a593Smuzhiyun __le32 s_size; 545*4882a593Smuzhiyun } t1; 546*4882a593Smuzhiyun __le32 data[4]; /* if DTYPE == 2 */ 547*4882a593Smuzhiyun u32 reserved[4]; /* if DTYPE == 3 */ 548*4882a593Smuzhiyun }; 549*4882a593Smuzhiyun } __aligned(32); 550*4882a593Smuzhiyun 551*4882a593Smuzhiyun /* 552*4882a593Smuzhiyun * Inbound Messaging Descriptor 553*4882a593Smuzhiyun */ 554*4882a593Smuzhiyun struct tsi721_imsg_desc { 555*4882a593Smuzhiyun __le32 type_id; 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun #define TSI721_IMD_DEVID 0x0000ffff 558*4882a593Smuzhiyun #define TSI721_IMD_CRF 0x00010000 559*4882a593Smuzhiyun #define TSI721_IMD_PRIO 0x00060000 560*4882a593Smuzhiyun #define TSI721_IMD_TT 0x00180000 561*4882a593Smuzhiyun #define TSI721_IMD_DTYPE 0xe0000000 562*4882a593Smuzhiyun 563*4882a593Smuzhiyun __le32 msg_info; 564*4882a593Smuzhiyun 565*4882a593Smuzhiyun #define TSI721_IMD_BCOUNT 0x00000ff8 566*4882a593Smuzhiyun #define TSI721_IMD_SSIZE 0x0000f000 567*4882a593Smuzhiyun #define TSI721_IMD_LETER 0x00030000 568*4882a593Smuzhiyun #define TSI721_IMD_XMBOX 0x003c0000 569*4882a593Smuzhiyun #define TSI721_IMD_MBOX 0x00c00000 570*4882a593Smuzhiyun #define TSI721_IMD_CS 0x78000000 571*4882a593Smuzhiyun #define TSI721_IMD_HO 0x80000000 572*4882a593Smuzhiyun 573*4882a593Smuzhiyun __le32 bufptr_lo; 574*4882a593Smuzhiyun __le32 bufptr_hi; 575*4882a593Smuzhiyun u32 reserved[12]; 576*4882a593Smuzhiyun 577*4882a593Smuzhiyun } __aligned(64); 578*4882a593Smuzhiyun 579*4882a593Smuzhiyun /* 580*4882a593Smuzhiyun * Outbound Messaging Descriptor 581*4882a593Smuzhiyun */ 582*4882a593Smuzhiyun struct tsi721_omsg_desc { 583*4882a593Smuzhiyun __le32 type_id; 584*4882a593Smuzhiyun 585*4882a593Smuzhiyun #define TSI721_OMD_DEVID 0x0000ffff 586*4882a593Smuzhiyun #define TSI721_OMD_CRF 0x00010000 587*4882a593Smuzhiyun #define TSI721_OMD_PRIO 0x00060000 588*4882a593Smuzhiyun #define TSI721_OMD_IOF 0x08000000 589*4882a593Smuzhiyun #define TSI721_OMD_DTYPE 0xe0000000 590*4882a593Smuzhiyun #define TSI721_OMD_RSRVD 0x17f80000 591*4882a593Smuzhiyun 592*4882a593Smuzhiyun __le32 msg_info; 593*4882a593Smuzhiyun 594*4882a593Smuzhiyun #define TSI721_OMD_BCOUNT 0x00000ff8 595*4882a593Smuzhiyun #define TSI721_OMD_SSIZE 0x0000f000 596*4882a593Smuzhiyun #define TSI721_OMD_LETER 0x00030000 597*4882a593Smuzhiyun #define TSI721_OMD_XMBOX 0x003c0000 598*4882a593Smuzhiyun #define TSI721_OMD_MBOX 0x00c00000 599*4882a593Smuzhiyun #define TSI721_OMD_TT 0x0c000000 600*4882a593Smuzhiyun 601*4882a593Smuzhiyun union { 602*4882a593Smuzhiyun __le32 bufptr_lo; /* if DTYPE == 4 */ 603*4882a593Smuzhiyun __le32 next_lo; /* if DTYPE == 5 */ 604*4882a593Smuzhiyun }; 605*4882a593Smuzhiyun 606*4882a593Smuzhiyun union { 607*4882a593Smuzhiyun __le32 bufptr_hi; /* if DTYPE == 4 */ 608*4882a593Smuzhiyun __le32 next_hi; /* if DTYPE == 5 */ 609*4882a593Smuzhiyun }; 610*4882a593Smuzhiyun 611*4882a593Smuzhiyun } __aligned(16); 612*4882a593Smuzhiyun 613*4882a593Smuzhiyun struct tsi721_dma_sts { 614*4882a593Smuzhiyun __le64 desc_sts[8]; 615*4882a593Smuzhiyun } __aligned(64); 616*4882a593Smuzhiyun 617*4882a593Smuzhiyun struct tsi721_desc_sts_fifo { 618*4882a593Smuzhiyun union { 619*4882a593Smuzhiyun __le64 da64; 620*4882a593Smuzhiyun struct { 621*4882a593Smuzhiyun __le32 lo; 622*4882a593Smuzhiyun __le32 hi; 623*4882a593Smuzhiyun } da32; 624*4882a593Smuzhiyun } stat[8]; 625*4882a593Smuzhiyun } __aligned(64); 626*4882a593Smuzhiyun 627*4882a593Smuzhiyun /* Descriptor types for BDMA and Messaging blocks */ 628*4882a593Smuzhiyun enum dma_dtype { 629*4882a593Smuzhiyun DTYPE1 = 1, /* Data Transfer DMA Descriptor */ 630*4882a593Smuzhiyun DTYPE2 = 2, /* Immediate Data Transfer DMA Descriptor */ 631*4882a593Smuzhiyun DTYPE3 = 3, /* Block Pointer DMA Descriptor */ 632*4882a593Smuzhiyun DTYPE4 = 4, /* Outbound Msg DMA Descriptor */ 633*4882a593Smuzhiyun DTYPE5 = 5, /* OB Messaging Block Pointer Descriptor */ 634*4882a593Smuzhiyun DTYPE6 = 6 /* Inbound Messaging Descriptor */ 635*4882a593Smuzhiyun }; 636*4882a593Smuzhiyun 637*4882a593Smuzhiyun enum dma_rtype { 638*4882a593Smuzhiyun NREAD = 0, 639*4882a593Smuzhiyun LAST_NWRITE_R = 1, 640*4882a593Smuzhiyun ALL_NWRITE = 2, 641*4882a593Smuzhiyun ALL_NWRITE_R = 3, 642*4882a593Smuzhiyun MAINT_RD = 4, 643*4882a593Smuzhiyun MAINT_WR = 5 644*4882a593Smuzhiyun }; 645*4882a593Smuzhiyun 646*4882a593Smuzhiyun /* 647*4882a593Smuzhiyun * mport Driver Definitions 648*4882a593Smuzhiyun */ 649*4882a593Smuzhiyun #define TSI721_DMA_CHNUM TSI721_DMA_MAXCH 650*4882a593Smuzhiyun 651*4882a593Smuzhiyun #define TSI721_DMACH_MAINT 7 /* DMA channel for maint requests */ 652*4882a593Smuzhiyun #define TSI721_DMACH_MAINT_NBD 32 /* Number of BDs for maint requests */ 653*4882a593Smuzhiyun 654*4882a593Smuzhiyun #define TSI721_DMACH_DMA 1 /* DMA channel for data transfers */ 655*4882a593Smuzhiyun 656*4882a593Smuzhiyun #define MSG_DMA_ENTRY_INX_TO_SIZE(x) ((0x10 << (x)) & 0xFFFF0) 657*4882a593Smuzhiyun 658*4882a593Smuzhiyun enum tsi721_smsg_int_flag { 659*4882a593Smuzhiyun SMSG_INT_NONE = 0x00000000, 660*4882a593Smuzhiyun SMSG_INT_ECC_COR_CH = 0x000000ff, 661*4882a593Smuzhiyun SMSG_INT_ECC_NCOR_CH = 0x0000ff00, 662*4882a593Smuzhiyun SMSG_INT_ECC_COR = 0x00020000, 663*4882a593Smuzhiyun SMSG_INT_ECC_NCOR = 0x00040000, 664*4882a593Smuzhiyun SMSG_INT_UNS_RSP = 0x00800000, 665*4882a593Smuzhiyun SMSG_INT_ALL = 0x0006ffff 666*4882a593Smuzhiyun }; 667*4882a593Smuzhiyun 668*4882a593Smuzhiyun /* Structures */ 669*4882a593Smuzhiyun 670*4882a593Smuzhiyun #ifdef CONFIG_RAPIDIO_DMA_ENGINE 671*4882a593Smuzhiyun 672*4882a593Smuzhiyun #define TSI721_BDMA_MAX_BCOUNT (TSI721_DMAD_BCOUNT1 + 1) 673*4882a593Smuzhiyun 674*4882a593Smuzhiyun struct tsi721_tx_desc { 675*4882a593Smuzhiyun struct dma_async_tx_descriptor txd; 676*4882a593Smuzhiyun u16 destid; 677*4882a593Smuzhiyun /* low 64-bits of 66-bit RIO address */ 678*4882a593Smuzhiyun u64 rio_addr; 679*4882a593Smuzhiyun /* upper 2-bits of 66-bit RIO address */ 680*4882a593Smuzhiyun u8 rio_addr_u; 681*4882a593Smuzhiyun enum dma_rtype rtype; 682*4882a593Smuzhiyun struct list_head desc_node; 683*4882a593Smuzhiyun struct scatterlist *sg; 684*4882a593Smuzhiyun unsigned int sg_len; 685*4882a593Smuzhiyun enum dma_status status; 686*4882a593Smuzhiyun }; 687*4882a593Smuzhiyun 688*4882a593Smuzhiyun struct tsi721_bdma_chan { 689*4882a593Smuzhiyun int id; 690*4882a593Smuzhiyun void __iomem *regs; 691*4882a593Smuzhiyun int bd_num; /* number of HW buffer descriptors */ 692*4882a593Smuzhiyun void *bd_base; /* start of DMA descriptors */ 693*4882a593Smuzhiyun dma_addr_t bd_phys; 694*4882a593Smuzhiyun void *sts_base; /* start of DMA BD status FIFO */ 695*4882a593Smuzhiyun dma_addr_t sts_phys; 696*4882a593Smuzhiyun int sts_size; 697*4882a593Smuzhiyun u32 sts_rdptr; 698*4882a593Smuzhiyun u32 wr_count; 699*4882a593Smuzhiyun u32 wr_count_next; 700*4882a593Smuzhiyun 701*4882a593Smuzhiyun struct dma_chan dchan; 702*4882a593Smuzhiyun struct tsi721_tx_desc *tx_desc; 703*4882a593Smuzhiyun spinlock_t lock; 704*4882a593Smuzhiyun struct tsi721_tx_desc *active_tx; 705*4882a593Smuzhiyun struct list_head queue; 706*4882a593Smuzhiyun struct list_head free_list; 707*4882a593Smuzhiyun struct tasklet_struct tasklet; 708*4882a593Smuzhiyun bool active; 709*4882a593Smuzhiyun }; 710*4882a593Smuzhiyun 711*4882a593Smuzhiyun #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ 712*4882a593Smuzhiyun 713*4882a593Smuzhiyun struct tsi721_bdma_maint { 714*4882a593Smuzhiyun int ch_id; /* BDMA channel number */ 715*4882a593Smuzhiyun int bd_num; /* number of buffer descriptors */ 716*4882a593Smuzhiyun void *bd_base; /* start of DMA descriptors */ 717*4882a593Smuzhiyun dma_addr_t bd_phys; 718*4882a593Smuzhiyun void *sts_base; /* start of DMA BD status FIFO */ 719*4882a593Smuzhiyun dma_addr_t sts_phys; 720*4882a593Smuzhiyun int sts_size; 721*4882a593Smuzhiyun }; 722*4882a593Smuzhiyun 723*4882a593Smuzhiyun struct tsi721_imsg_ring { 724*4882a593Smuzhiyun u32 size; 725*4882a593Smuzhiyun /* VA/PA of data buffers for incoming messages */ 726*4882a593Smuzhiyun void *buf_base; 727*4882a593Smuzhiyun dma_addr_t buf_phys; 728*4882a593Smuzhiyun /* VA/PA of circular free buffer list */ 729*4882a593Smuzhiyun void *imfq_base; 730*4882a593Smuzhiyun dma_addr_t imfq_phys; 731*4882a593Smuzhiyun /* VA/PA of Inbound message descriptors */ 732*4882a593Smuzhiyun void *imd_base; 733*4882a593Smuzhiyun dma_addr_t imd_phys; 734*4882a593Smuzhiyun /* Inbound Queue buffer pointers */ 735*4882a593Smuzhiyun void *imq_base[TSI721_IMSGD_RING_SIZE]; 736*4882a593Smuzhiyun 737*4882a593Smuzhiyun u32 rx_slot; 738*4882a593Smuzhiyun void *dev_id; 739*4882a593Smuzhiyun u32 fq_wrptr; 740*4882a593Smuzhiyun u32 desc_rdptr; 741*4882a593Smuzhiyun spinlock_t lock; 742*4882a593Smuzhiyun }; 743*4882a593Smuzhiyun 744*4882a593Smuzhiyun struct tsi721_omsg_ring { 745*4882a593Smuzhiyun u32 size; 746*4882a593Smuzhiyun /* VA/PA of OB Msg descriptors */ 747*4882a593Smuzhiyun void *omd_base; 748*4882a593Smuzhiyun dma_addr_t omd_phys; 749*4882a593Smuzhiyun /* VA/PA of OB Msg data buffers */ 750*4882a593Smuzhiyun void *omq_base[TSI721_OMSGD_RING_SIZE]; 751*4882a593Smuzhiyun dma_addr_t omq_phys[TSI721_OMSGD_RING_SIZE]; 752*4882a593Smuzhiyun /* VA/PA of OB Msg descriptor status FIFO */ 753*4882a593Smuzhiyun void *sts_base; 754*4882a593Smuzhiyun dma_addr_t sts_phys; 755*4882a593Smuzhiyun u32 sts_size; /* # of allocated status entries */ 756*4882a593Smuzhiyun u32 sts_rdptr; 757*4882a593Smuzhiyun 758*4882a593Smuzhiyun u32 tx_slot; 759*4882a593Smuzhiyun void *dev_id; 760*4882a593Smuzhiyun u32 wr_count; 761*4882a593Smuzhiyun spinlock_t lock; 762*4882a593Smuzhiyun }; 763*4882a593Smuzhiyun 764*4882a593Smuzhiyun enum tsi721_flags { 765*4882a593Smuzhiyun TSI721_USING_MSI = (1 << 0), 766*4882a593Smuzhiyun TSI721_USING_MSIX = (1 << 1), 767*4882a593Smuzhiyun TSI721_IMSGID_SET = (1 << 2), 768*4882a593Smuzhiyun }; 769*4882a593Smuzhiyun 770*4882a593Smuzhiyun #ifdef CONFIG_PCI_MSI 771*4882a593Smuzhiyun /* 772*4882a593Smuzhiyun * MSI-X Table Entries (0 ... 69) 773*4882a593Smuzhiyun */ 774*4882a593Smuzhiyun #define TSI721_MSIX_DMACH_DONE(x) (0 + (x)) 775*4882a593Smuzhiyun #define TSI721_MSIX_DMACH_INT(x) (8 + (x)) 776*4882a593Smuzhiyun #define TSI721_MSIX_BDMA_INT 16 777*4882a593Smuzhiyun #define TSI721_MSIX_OMSG_DONE(x) (17 + (x)) 778*4882a593Smuzhiyun #define TSI721_MSIX_OMSG_INT(x) (25 + (x)) 779*4882a593Smuzhiyun #define TSI721_MSIX_IMSG_DQ_RCV(x) (33 + (x)) 780*4882a593Smuzhiyun #define TSI721_MSIX_IMSG_INT(x) (41 + (x)) 781*4882a593Smuzhiyun #define TSI721_MSIX_MSG_INT 49 782*4882a593Smuzhiyun #define TSI721_MSIX_SR2PC_IDBQ_RCV(x) (50 + (x)) 783*4882a593Smuzhiyun #define TSI721_MSIX_SR2PC_CH_INT(x) (58 + (x)) 784*4882a593Smuzhiyun #define TSI721_MSIX_SR2PC_INT 66 785*4882a593Smuzhiyun #define TSI721_MSIX_PC2SR_INT 67 786*4882a593Smuzhiyun #define TSI721_MSIX_SRIO_MAC_INT 68 787*4882a593Smuzhiyun #define TSI721_MSIX_I2C_INT 69 788*4882a593Smuzhiyun 789*4882a593Smuzhiyun /* MSI-X vector and init table entry indexes */ 790*4882a593Smuzhiyun enum tsi721_msix_vect { 791*4882a593Smuzhiyun TSI721_VECT_IDB, 792*4882a593Smuzhiyun TSI721_VECT_PWRX, /* PW_RX is part of SRIO MAC Interrupt reporting */ 793*4882a593Smuzhiyun TSI721_VECT_OMB0_DONE, 794*4882a593Smuzhiyun TSI721_VECT_OMB1_DONE, 795*4882a593Smuzhiyun TSI721_VECT_OMB2_DONE, 796*4882a593Smuzhiyun TSI721_VECT_OMB3_DONE, 797*4882a593Smuzhiyun TSI721_VECT_OMB0_INT, 798*4882a593Smuzhiyun TSI721_VECT_OMB1_INT, 799*4882a593Smuzhiyun TSI721_VECT_OMB2_INT, 800*4882a593Smuzhiyun TSI721_VECT_OMB3_INT, 801*4882a593Smuzhiyun TSI721_VECT_IMB0_RCV, 802*4882a593Smuzhiyun TSI721_VECT_IMB1_RCV, 803*4882a593Smuzhiyun TSI721_VECT_IMB2_RCV, 804*4882a593Smuzhiyun TSI721_VECT_IMB3_RCV, 805*4882a593Smuzhiyun TSI721_VECT_IMB0_INT, 806*4882a593Smuzhiyun TSI721_VECT_IMB1_INT, 807*4882a593Smuzhiyun TSI721_VECT_IMB2_INT, 808*4882a593Smuzhiyun TSI721_VECT_IMB3_INT, 809*4882a593Smuzhiyun #ifdef CONFIG_RAPIDIO_DMA_ENGINE 810*4882a593Smuzhiyun TSI721_VECT_DMA0_DONE, 811*4882a593Smuzhiyun TSI721_VECT_DMA1_DONE, 812*4882a593Smuzhiyun TSI721_VECT_DMA2_DONE, 813*4882a593Smuzhiyun TSI721_VECT_DMA3_DONE, 814*4882a593Smuzhiyun TSI721_VECT_DMA4_DONE, 815*4882a593Smuzhiyun TSI721_VECT_DMA5_DONE, 816*4882a593Smuzhiyun TSI721_VECT_DMA6_DONE, 817*4882a593Smuzhiyun TSI721_VECT_DMA7_DONE, 818*4882a593Smuzhiyun TSI721_VECT_DMA0_INT, 819*4882a593Smuzhiyun TSI721_VECT_DMA1_INT, 820*4882a593Smuzhiyun TSI721_VECT_DMA2_INT, 821*4882a593Smuzhiyun TSI721_VECT_DMA3_INT, 822*4882a593Smuzhiyun TSI721_VECT_DMA4_INT, 823*4882a593Smuzhiyun TSI721_VECT_DMA5_INT, 824*4882a593Smuzhiyun TSI721_VECT_DMA6_INT, 825*4882a593Smuzhiyun TSI721_VECT_DMA7_INT, 826*4882a593Smuzhiyun #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ 827*4882a593Smuzhiyun TSI721_VECT_MAX 828*4882a593Smuzhiyun }; 829*4882a593Smuzhiyun 830*4882a593Smuzhiyun #define IRQ_DEVICE_NAME_MAX 64 831*4882a593Smuzhiyun 832*4882a593Smuzhiyun struct msix_irq { 833*4882a593Smuzhiyun u16 vector; 834*4882a593Smuzhiyun char irq_name[IRQ_DEVICE_NAME_MAX]; 835*4882a593Smuzhiyun }; 836*4882a593Smuzhiyun #endif /* CONFIG_PCI_MSI */ 837*4882a593Smuzhiyun 838*4882a593Smuzhiyun struct tsi721_ib_win_mapping { 839*4882a593Smuzhiyun struct list_head node; 840*4882a593Smuzhiyun dma_addr_t lstart; 841*4882a593Smuzhiyun }; 842*4882a593Smuzhiyun 843*4882a593Smuzhiyun struct tsi721_ib_win { 844*4882a593Smuzhiyun u64 rstart; 845*4882a593Smuzhiyun u32 size; 846*4882a593Smuzhiyun dma_addr_t lstart; 847*4882a593Smuzhiyun bool active; 848*4882a593Smuzhiyun bool xlat; 849*4882a593Smuzhiyun struct list_head mappings; 850*4882a593Smuzhiyun }; 851*4882a593Smuzhiyun 852*4882a593Smuzhiyun struct tsi721_obw_bar { 853*4882a593Smuzhiyun u64 base; 854*4882a593Smuzhiyun u64 size; 855*4882a593Smuzhiyun u64 free; 856*4882a593Smuzhiyun }; 857*4882a593Smuzhiyun 858*4882a593Smuzhiyun struct tsi721_ob_win { 859*4882a593Smuzhiyun u64 base; 860*4882a593Smuzhiyun u32 size; 861*4882a593Smuzhiyun u16 destid; 862*4882a593Smuzhiyun u64 rstart; 863*4882a593Smuzhiyun bool active; 864*4882a593Smuzhiyun struct tsi721_obw_bar *pbar; 865*4882a593Smuzhiyun }; 866*4882a593Smuzhiyun 867*4882a593Smuzhiyun struct tsi721_device { 868*4882a593Smuzhiyun struct pci_dev *pdev; 869*4882a593Smuzhiyun struct rio_mport mport; 870*4882a593Smuzhiyun u32 flags; 871*4882a593Smuzhiyun void __iomem *regs; 872*4882a593Smuzhiyun #ifdef CONFIG_PCI_MSI 873*4882a593Smuzhiyun struct msix_irq msix[TSI721_VECT_MAX]; 874*4882a593Smuzhiyun #endif 875*4882a593Smuzhiyun /* Doorbells */ 876*4882a593Smuzhiyun void __iomem *odb_base; 877*4882a593Smuzhiyun void *idb_base; 878*4882a593Smuzhiyun dma_addr_t idb_dma; 879*4882a593Smuzhiyun struct work_struct idb_work; 880*4882a593Smuzhiyun u32 db_discard_count; 881*4882a593Smuzhiyun 882*4882a593Smuzhiyun /* Inbound Port-Write */ 883*4882a593Smuzhiyun struct work_struct pw_work; 884*4882a593Smuzhiyun struct kfifo pw_fifo; 885*4882a593Smuzhiyun spinlock_t pw_fifo_lock; 886*4882a593Smuzhiyun u32 pw_discard_count; 887*4882a593Smuzhiyun 888*4882a593Smuzhiyun /* BDMA Engine */ 889*4882a593Smuzhiyun struct tsi721_bdma_maint mdma; /* Maintenance rd/wr request channel */ 890*4882a593Smuzhiyun 891*4882a593Smuzhiyun #ifdef CONFIG_RAPIDIO_DMA_ENGINE 892*4882a593Smuzhiyun struct tsi721_bdma_chan bdma[TSI721_DMA_CHNUM]; 893*4882a593Smuzhiyun #endif 894*4882a593Smuzhiyun 895*4882a593Smuzhiyun /* Inbound Messaging */ 896*4882a593Smuzhiyun int imsg_init[TSI721_IMSG_CHNUM]; 897*4882a593Smuzhiyun struct tsi721_imsg_ring imsg_ring[TSI721_IMSG_CHNUM]; 898*4882a593Smuzhiyun 899*4882a593Smuzhiyun /* Outbound Messaging */ 900*4882a593Smuzhiyun int omsg_init[TSI721_OMSG_CHNUM]; 901*4882a593Smuzhiyun struct tsi721_omsg_ring omsg_ring[TSI721_OMSG_CHNUM]; 902*4882a593Smuzhiyun 903*4882a593Smuzhiyun /* Inbound Mapping Windows */ 904*4882a593Smuzhiyun struct tsi721_ib_win ib_win[TSI721_IBWIN_NUM]; 905*4882a593Smuzhiyun int ibwin_cnt; 906*4882a593Smuzhiyun 907*4882a593Smuzhiyun /* Outbound Mapping Windows */ 908*4882a593Smuzhiyun struct tsi721_obw_bar p2r_bar[2]; 909*4882a593Smuzhiyun struct tsi721_ob_win ob_win[TSI721_OBWIN_NUM]; 910*4882a593Smuzhiyun int obwin_cnt; 911*4882a593Smuzhiyun }; 912*4882a593Smuzhiyun 913*4882a593Smuzhiyun #ifdef CONFIG_RAPIDIO_DMA_ENGINE 914*4882a593Smuzhiyun extern void tsi721_bdma_handler(struct tsi721_bdma_chan *bdma_chan); 915*4882a593Smuzhiyun extern int tsi721_register_dma(struct tsi721_device *priv); 916*4882a593Smuzhiyun extern void tsi721_unregister_dma(struct tsi721_device *priv); 917*4882a593Smuzhiyun extern void tsi721_dma_stop_all(struct tsi721_device *priv); 918*4882a593Smuzhiyun #else 919*4882a593Smuzhiyun #define tsi721_dma_stop_all(priv) do {} while (0) 920*4882a593Smuzhiyun #define tsi721_unregister_dma(priv) do {} while (0) 921*4882a593Smuzhiyun #endif 922*4882a593Smuzhiyun 923*4882a593Smuzhiyun #endif 924