Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * Tsi721 PCIExpress-to-SRIO bridge definitions
0004  *
0005  * Copyright 2011, Integrated Device Technology, Inc.
0006  */
0007 
0008 #ifndef __TSI721_H
0009 #define __TSI721_H
0010 
0011 /* Debug output filtering masks */
0012 enum {
0013     DBG_NONE    = 0,
0014     DBG_INIT    = BIT(0), /* driver init */
0015     DBG_EXIT    = BIT(1), /* driver exit */
0016     DBG_MPORT   = BIT(2), /* mport add/remove */
0017     DBG_MAINT   = BIT(3), /* maintenance ops messages */
0018     DBG_DMA     = BIT(4), /* DMA transfer messages */
0019     DBG_DMAV    = BIT(5), /* verbose DMA transfer messages */
0020     DBG_IBW     = BIT(6), /* inbound window */
0021     DBG_EVENT   = BIT(7), /* event handling messages */
0022     DBG_OBW     = BIT(8), /* outbound window messages */
0023     DBG_DBELL   = BIT(9), /* doorbell messages */
0024     DBG_OMSG    = BIT(10), /* doorbell messages */
0025     DBG_IMSG    = BIT(11), /* doorbell messages */
0026     DBG_ALL     = ~0,
0027 };
0028 
0029 #ifdef DEBUG
0030 extern u32 tsi_dbg_level;
0031 
0032 #define tsi_debug(level, dev, fmt, arg...)              \
0033     do {                                \
0034         if (DBG_##level & tsi_dbg_level)                \
0035             dev_dbg(dev, "%s: " fmt "\n", __func__, ##arg); \
0036     } while (0)
0037 #else
0038 #define tsi_debug(level, dev, fmt, arg...) \
0039         no_printk(KERN_DEBUG "%s: " fmt "\n", __func__, ##arg)
0040 #endif
0041 
0042 #define tsi_info(dev, fmt, arg...) \
0043     dev_info(dev, "%s: " fmt "\n", __func__, ##arg)
0044 
0045 #define tsi_warn(dev, fmt, arg...) \
0046     dev_warn(dev, "%s: WARNING " fmt "\n", __func__, ##arg)
0047 
0048 #define tsi_err(dev, fmt, arg...) \
0049     dev_err(dev, "%s: ERROR " fmt "\n", __func__, ##arg)
0050 
0051 #define DRV_NAME    "tsi721"
0052 
0053 #define DEFAULT_HOPCOUNT    0xff
0054 #define DEFAULT_DESTID      0xff
0055 
0056 /* PCI device ID */
0057 #define PCI_DEVICE_ID_TSI721        0x80ab
0058 
0059 #define BAR_0   0
0060 #define BAR_1   1
0061 #define BAR_2   2
0062 #define BAR_4   4
0063 
0064 #define TSI721_PC2SR_BARS   2
0065 #define TSI721_PC2SR_WINS   8
0066 #define TSI721_PC2SR_ZONES  8
0067 #define TSI721_MAINT_WIN    0 /* Window for outbound maintenance requests */
0068 #define IDB_QUEUE       0 /* Inbound Doorbell Queue to use */
0069 #define IDB_QSIZE       512 /* Inbound Doorbell Queue size */
0070 
0071 /* Memory space sizes */
0072 #define TSI721_REG_SPACE_SIZE       (512 * 1024) /* 512K */
0073 #define TSI721_DB_WIN_SIZE      (16 * 1024 * 1024) /* 16MB */
0074 
0075 #define  RIO_TT_CODE_8      0x00000000
0076 #define  RIO_TT_CODE_16     0x00000001
0077 
0078 #define TSI721_DMA_MAXCH    8
0079 #define TSI721_DMA_MINSTSSZ 32
0080 #define TSI721_DMA_STSBLKSZ 8
0081 
0082 #define TSI721_SRIO_MAXCH   8
0083 
0084 #define DBELL_SID(buf)      (((u8)buf[2] << 8) | (u8)buf[3])
0085 #define DBELL_TID(buf)      (((u8)buf[4] << 8) | (u8)buf[5])
0086 #define DBELL_INF(buf)      (((u8)buf[0] << 8) | (u8)buf[1])
0087 
0088 #define TSI721_RIO_PW_MSG_SIZE  16  /* Tsi721 saves only 16 bytes of PW msg */
0089 
0090 /* Register definitions */
0091 
0092 /*
0093  * Registers in PCIe configuration space
0094  */
0095 
0096 #define TSI721_PCIECFG_MSIXTBL  0x0a4
0097 #define TSI721_MSIXTBL_OFFSET   0x2c000
0098 #define TSI721_PCIECFG_MSIXPBA  0x0a8
0099 #define TSI721_MSIXPBA_OFFSET   0x2a000
0100 #define TSI721_PCIECFG_EPCTL    0x400
0101 
0102 /*
0103  * Event Management Registers
0104  */
0105 
0106 #define TSI721_RIO_EM_INT_STAT      0x10910
0107 #define TSI721_RIO_EM_INT_STAT_PW_RX    0x00010000
0108 
0109 #define TSI721_RIO_EM_INT_ENABLE    0x10914
0110 #define TSI721_RIO_EM_INT_ENABLE_PW_RX  0x00010000
0111 
0112 #define TSI721_RIO_EM_DEV_INT_EN    0x10930
0113 #define TSI721_RIO_EM_DEV_INT_EN_INT    0x00000001
0114 
0115 /*
0116  * Port-Write Block Registers
0117  */
0118 
0119 #define TSI721_RIO_PW_CTL       0x10a04
0120 #define TSI721_RIO_PW_CTL_PW_TIMER  0xf0000000
0121 #define TSI721_RIO_PW_CTL_PWT_DIS   (0 << 28)
0122 #define TSI721_RIO_PW_CTL_PWT_103   (1 << 28)
0123 #define TSI721_RIO_PW_CTL_PWT_205   (1 << 29)
0124 #define TSI721_RIO_PW_CTL_PWT_410   (1 << 30)
0125 #define TSI721_RIO_PW_CTL_PWT_820   (1 << 31)
0126 #define TSI721_RIO_PW_CTL_PWC_MODE  0x01000000
0127 #define TSI721_RIO_PW_CTL_PWC_CONT  0x00000000
0128 #define TSI721_RIO_PW_CTL_PWC_REL   0x01000000
0129 
0130 #define TSI721_RIO_PW_RX_STAT       0x10a10
0131 #define TSI721_RIO_PW_RX_STAT_WR_SIZE   0x0000f000
0132 #define TSI_RIO_PW_RX_STAT_WDPTR    0x00000100
0133 #define TSI721_RIO_PW_RX_STAT_PW_SHORT  0x00000008
0134 #define TSI721_RIO_PW_RX_STAT_PW_TRUNC  0x00000004
0135 #define TSI721_RIO_PW_RX_STAT_PW_DISC   0x00000002
0136 #define TSI721_RIO_PW_RX_STAT_PW_VAL    0x00000001
0137 
0138 #define TSI721_RIO_PW_RX_CAPT(x)    (0x10a20 + (x)*4)
0139 
0140 /*
0141  * Inbound Doorbells
0142  */
0143 
0144 #define TSI721_IDB_ENTRY_SIZE   64
0145 
0146 #define TSI721_IDQ_CTL(x)   (0x20000 + (x) * 0x1000)
0147 #define TSI721_IDQ_SUSPEND  0x00000002
0148 #define TSI721_IDQ_INIT     0x00000001
0149 
0150 #define TSI721_IDQ_STS(x)   (0x20004 + (x) * 0x1000)
0151 #define TSI721_IDQ_RUN      0x00200000
0152 
0153 #define TSI721_IDQ_MASK(x)  (0x20008 + (x) * 0x1000)
0154 #define TSI721_IDQ_MASK_MASK    0xffff0000
0155 #define TSI721_IDQ_MASK_PATT    0x0000ffff
0156 
0157 #define TSI721_IDQ_RP(x)    (0x2000c + (x) * 0x1000)
0158 #define TSI721_IDQ_RP_PTR   0x0007ffff
0159 
0160 #define TSI721_IDQ_WP(x)    (0x20010 + (x) * 0x1000)
0161 #define TSI721_IDQ_WP_PTR   0x0007ffff
0162 
0163 #define TSI721_IDQ_BASEL(x) (0x20014 + (x) * 0x1000)
0164 #define TSI721_IDQ_BASEL_ADDR   0xffffffc0
0165 #define TSI721_IDQ_BASEU(x) (0x20018 + (x) * 0x1000)
0166 #define TSI721_IDQ_SIZE(x)  (0x2001c + (x) * 0x1000)
0167 #define TSI721_IDQ_SIZE_VAL(size)   (__fls(size) - 4)
0168 #define TSI721_IDQ_SIZE_MIN 512
0169 #define TSI721_IDQ_SIZE_MAX (512 * 1024)
0170 
0171 #define TSI721_SR_CHINT(x)  (0x20040 + (x) * 0x1000)
0172 #define TSI721_SR_CHINTE(x) (0x20044 + (x) * 0x1000)
0173 #define TSI721_SR_CHINTSET(x)   (0x20048 + (x) * 0x1000)
0174 #define TSI721_SR_CHINT_ODBOK   0x00000020
0175 #define TSI721_SR_CHINT_IDBQRCV 0x00000010
0176 #define TSI721_SR_CHINT_SUSP    0x00000008
0177 #define TSI721_SR_CHINT_ODBTO   0x00000004
0178 #define TSI721_SR_CHINT_ODBRTRY 0x00000002
0179 #define TSI721_SR_CHINT_ODBERR  0x00000001
0180 #define TSI721_SR_CHINT_ALL 0x0000003f
0181 
0182 #define TSI721_IBWIN_NUM    8
0183 
0184 #define TSI721_IBWIN_LB(x)  (0x29000 + (x) * 0x20)
0185 #define TSI721_IBWIN_LB_BA  0xfffff000
0186 #define TSI721_IBWIN_LB_WEN 0x00000001
0187 
0188 #define TSI721_IBWIN_UB(x)  (0x29004 + (x) * 0x20)
0189 #define TSI721_IBWIN_SZ(x)  (0x29008 + (x) * 0x20)
0190 #define TSI721_IBWIN_SZ_SIZE    0x00001f00
0191 #define TSI721_IBWIN_SIZE(size) (__fls(size) - 12)
0192 
0193 #define TSI721_IBWIN_TLA(x) (0x2900c + (x) * 0x20)
0194 #define TSI721_IBWIN_TLA_ADD    0xfffff000
0195 #define TSI721_IBWIN_TUA(x) (0x29010 + (x) * 0x20)
0196 
0197 #define TSI721_SR2PC_GEN_INTE   0x29800
0198 #define TSI721_SR2PC_PWE    0x29804
0199 #define TSI721_SR2PC_GEN_INT    0x29808
0200 
0201 #define TSI721_DEV_INTE     0x29840
0202 #define TSI721_DEV_INT      0x29844
0203 #define TSI721_DEV_INTSET   0x29848
0204 #define TSI721_DEV_INT_BDMA_CH  0x00002000
0205 #define TSI721_DEV_INT_BDMA_NCH 0x00001000
0206 #define TSI721_DEV_INT_SMSG_CH  0x00000800
0207 #define TSI721_DEV_INT_SMSG_NCH 0x00000400
0208 #define TSI721_DEV_INT_SR2PC_CH 0x00000200
0209 #define TSI721_DEV_INT_SRIO 0x00000020
0210 
0211 #define TSI721_DEV_CHAN_INTE    0x2984c
0212 #define TSI721_DEV_CHAN_INT 0x29850
0213 
0214 #define TSI721_INT_SR2PC_CHAN_M 0xff000000
0215 #define TSI721_INT_SR2PC_CHAN(x) (1 << (24 + (x)))
0216 #define TSI721_INT_IMSG_CHAN_M  0x00ff0000
0217 #define TSI721_INT_IMSG_CHAN(x) (1 << (16 + (x)))
0218 #define TSI721_INT_OMSG_CHAN_M  0x0000ff00
0219 #define TSI721_INT_OMSG_CHAN(x) (1 << (8 + (x)))
0220 #define TSI721_INT_BDMA_CHAN_M  0x000000ff
0221 #define TSI721_INT_BDMA_CHAN(x) (1 << (x))
0222 
0223 /*
0224  * PC2SR block registers
0225  */
0226 #define TSI721_OBWIN_NUM    TSI721_PC2SR_WINS
0227 
0228 #define TSI721_OBWINLB(x)   (0x40000 + (x) * 0x20)
0229 #define TSI721_OBWINLB_BA   0xffff8000
0230 #define TSI721_OBWINLB_WEN  0x00000001
0231 
0232 #define TSI721_OBWINUB(x)   (0x40004 + (x) * 0x20)
0233 
0234 #define TSI721_OBWINSZ(x)   (0x40008 + (x) * 0x20)
0235 #define TSI721_OBWINSZ_SIZE 0x00001f00
0236 #define TSI721_OBWIN_SIZE(size) (__fls(size) - 15)
0237 
0238 #define TSI721_ZONE_SEL     0x41300
0239 #define TSI721_ZONE_SEL_RD_WRB  0x00020000
0240 #define TSI721_ZONE_SEL_GO  0x00010000
0241 #define TSI721_ZONE_SEL_WIN 0x00000038
0242 #define TSI721_ZONE_SEL_ZONE    0x00000007
0243 
0244 #define TSI721_LUT_DATA0    0x41304
0245 #define TSI721_LUT_DATA0_ADD    0xfffff000
0246 #define TSI721_LUT_DATA0_RDTYPE 0x00000f00
0247 #define TSI721_LUT_DATA0_NREAD  0x00000100
0248 #define TSI721_LUT_DATA0_MNTRD  0x00000200
0249 #define TSI721_LUT_DATA0_RDCRF  0x00000020
0250 #define TSI721_LUT_DATA0_WRCRF  0x00000010
0251 #define TSI721_LUT_DATA0_WRTYPE 0x0000000f
0252 #define TSI721_LUT_DATA0_NWR    0x00000001
0253 #define TSI721_LUT_DATA0_MNTWR  0x00000002
0254 #define TSI721_LUT_DATA0_NWR_R  0x00000004
0255 
0256 #define TSI721_LUT_DATA1    0x41308
0257 
0258 #define TSI721_LUT_DATA2    0x4130c
0259 #define TSI721_LUT_DATA2_HC 0xff000000
0260 #define TSI721_LUT_DATA2_ADD65  0x000c0000
0261 #define TSI721_LUT_DATA2_TT 0x00030000
0262 #define TSI721_LUT_DATA2_DSTID  0x0000ffff
0263 
0264 #define TSI721_PC2SR_INTE   0x41310
0265 
0266 #define TSI721_DEVCTL       0x48004
0267 #define TSI721_DEVCTL_SRBOOT_CMPL   0x00000004
0268 
0269 #define TSI721_I2C_INT_ENABLE   0x49120
0270 
0271 /*
0272  * Block DMA Engine Registers
0273  *   x = 0..7
0274  */
0275 
0276 #define TSI721_DMAC_BASE(x) (0x51000 + (x) * 0x1000)
0277 
0278 #define TSI721_DMAC_DWRCNT  0x000
0279 #define TSI721_DMAC_DRDCNT  0x004
0280 
0281 #define TSI721_DMAC_CTL     0x008
0282 #define TSI721_DMAC_CTL_SUSP    0x00000002
0283 #define TSI721_DMAC_CTL_INIT    0x00000001
0284 
0285 #define TSI721_DMAC_INT     0x00c
0286 #define TSI721_DMAC_INT_STFULL  0x00000010
0287 #define TSI721_DMAC_INT_DONE    0x00000008
0288 #define TSI721_DMAC_INT_SUSP    0x00000004
0289 #define TSI721_DMAC_INT_ERR 0x00000002
0290 #define TSI721_DMAC_INT_IOFDONE 0x00000001
0291 #define TSI721_DMAC_INT_ALL 0x0000001f
0292 
0293 #define TSI721_DMAC_INTSET  0x010
0294 
0295 #define TSI721_DMAC_STS     0x014
0296 #define TSI721_DMAC_STS_ABORT   0x00400000
0297 #define TSI721_DMAC_STS_RUN 0x00200000
0298 #define TSI721_DMAC_STS_CS  0x001f0000
0299 
0300 #define TSI721_DMAC_INTE    0x018
0301 
0302 #define TSI721_DMAC_DPTRL   0x024
0303 #define TSI721_DMAC_DPTRL_MASK  0xffffffe0
0304 
0305 #define TSI721_DMAC_DPTRH   0x028
0306 
0307 #define TSI721_DMAC_DSBL    0x02c
0308 #define TSI721_DMAC_DSBL_MASK   0xffffffc0
0309 
0310 #define TSI721_DMAC_DSBH    0x030
0311 
0312 #define TSI721_DMAC_DSSZ    0x034
0313 #define TSI721_DMAC_DSSZ_SIZE_M 0x0000000f
0314 #define TSI721_DMAC_DSSZ_SIZE(size) (__fls(size) - 4)
0315 
0316 #define TSI721_DMAC_DSRP    0x038
0317 #define TSI721_DMAC_DSRP_MASK   0x0007ffff
0318 
0319 #define TSI721_DMAC_DSWP    0x03c
0320 #define TSI721_DMAC_DSWP_MASK   0x0007ffff
0321 
0322 #define TSI721_BDMA_INTE    0x5f000
0323 
0324 /*
0325  * Messaging definitions
0326  */
0327 #define TSI721_MSG_BUFFER_SIZE      RIO_MAX_MSG_SIZE
0328 #define TSI721_MSG_MAX_SIZE     RIO_MAX_MSG_SIZE
0329 #define TSI721_IMSG_MAXCH       8
0330 #define TSI721_IMSG_CHNUM       TSI721_IMSG_MAXCH
0331 #define TSI721_IMSGD_MIN_RING_SIZE  32
0332 #define TSI721_IMSGD_RING_SIZE      512
0333 
0334 #define TSI721_OMSG_CHNUM       4 /* One channel per MBOX */
0335 #define TSI721_OMSGD_MIN_RING_SIZE  32
0336 #define TSI721_OMSGD_RING_SIZE      512
0337 
0338 /*
0339  * Outbound Messaging Engine Registers
0340  *   x = 0..7
0341  */
0342 
0343 #define TSI721_OBDMAC_DWRCNT(x)     (0x61000 + (x) * 0x1000)
0344 
0345 #define TSI721_OBDMAC_DRDCNT(x)     (0x61004 + (x) * 0x1000)
0346 
0347 #define TSI721_OBDMAC_CTL(x)        (0x61008 + (x) * 0x1000)
0348 #define TSI721_OBDMAC_CTL_MASK      0x00000007
0349 #define TSI721_OBDMAC_CTL_RETRY_THR 0x00000004
0350 #define TSI721_OBDMAC_CTL_SUSPEND   0x00000002
0351 #define TSI721_OBDMAC_CTL_INIT      0x00000001
0352 
0353 #define TSI721_OBDMAC_INT(x)        (0x6100c + (x) * 0x1000)
0354 #define TSI721_OBDMAC_INTSET(x)     (0x61010 + (x) * 0x1000)
0355 #define TSI721_OBDMAC_INTE(x)       (0x61018 + (x) * 0x1000)
0356 #define TSI721_OBDMAC_INT_MASK      0x0000001F
0357 #define TSI721_OBDMAC_INT_ST_FULL   0x00000010
0358 #define TSI721_OBDMAC_INT_DONE      0x00000008
0359 #define TSI721_OBDMAC_INT_SUSPENDED 0x00000004
0360 #define TSI721_OBDMAC_INT_ERROR     0x00000002
0361 #define TSI721_OBDMAC_INT_IOF_DONE  0x00000001
0362 #define TSI721_OBDMAC_INT_ALL       TSI721_OBDMAC_INT_MASK
0363 
0364 #define TSI721_OBDMAC_STS(x)        (0x61014 + (x) * 0x1000)
0365 #define TSI721_OBDMAC_STS_MASK      0x007f0000
0366 #define TSI721_OBDMAC_STS_ABORT     0x00400000
0367 #define TSI721_OBDMAC_STS_RUN       0x00200000
0368 #define TSI721_OBDMAC_STS_CS        0x001f0000
0369 
0370 #define TSI721_OBDMAC_PWE(x)        (0x6101c + (x) * 0x1000)
0371 #define TSI721_OBDMAC_PWE_MASK      0x00000002
0372 #define TSI721_OBDMAC_PWE_ERROR_EN  0x00000002
0373 
0374 #define TSI721_OBDMAC_DPTRL(x)      (0x61020 + (x) * 0x1000)
0375 #define TSI721_OBDMAC_DPTRL_MASK    0xfffffff0
0376 
0377 #define TSI721_OBDMAC_DPTRH(x)      (0x61024 + (x) * 0x1000)
0378 #define TSI721_OBDMAC_DPTRH_MASK    0xffffffff
0379 
0380 #define TSI721_OBDMAC_DSBL(x)       (0x61040 + (x) * 0x1000)
0381 #define TSI721_OBDMAC_DSBL_MASK     0xffffffc0
0382 
0383 #define TSI721_OBDMAC_DSBH(x)       (0x61044 + (x) * 0x1000)
0384 #define TSI721_OBDMAC_DSBH_MASK     0xffffffff
0385 
0386 #define TSI721_OBDMAC_DSSZ(x)       (0x61048 + (x) * 0x1000)
0387 #define TSI721_OBDMAC_DSSZ_MASK     0x0000000f
0388 
0389 #define TSI721_OBDMAC_DSRP(x)       (0x6104c + (x) * 0x1000)
0390 #define TSI721_OBDMAC_DSRP_MASK     0x0007ffff
0391 
0392 #define TSI721_OBDMAC_DSWP(x)       (0x61050 + (x) * 0x1000)
0393 #define TSI721_OBDMAC_DSWP_MASK     0x0007ffff
0394 
0395 #define TSI721_RQRPTO           0x60010
0396 #define TSI721_RQRPTO_MASK      0x00ffffff
0397 #define TSI721_RQRPTO_VAL       400 /* Response TO value */
0398 
0399 /*
0400  * Inbound Messaging Engine Registers
0401  *   x = 0..7
0402  */
0403 
0404 #define TSI721_IB_DEVID_GLOBAL      0xffff
0405 #define TSI721_IBDMAC_FQBL(x)       (0x61200 + (x) * 0x1000)
0406 #define TSI721_IBDMAC_FQBL_MASK     0xffffffc0
0407 
0408 #define TSI721_IBDMAC_FQBH(x)       (0x61204 + (x) * 0x1000)
0409 #define TSI721_IBDMAC_FQBH_MASK     0xffffffff
0410 
0411 #define TSI721_IBDMAC_FQSZ_ENTRY_INX    TSI721_IMSGD_RING_SIZE
0412 #define TSI721_IBDMAC_FQSZ(x)       (0x61208 + (x) * 0x1000)
0413 #define TSI721_IBDMAC_FQSZ_MASK     0x0000000f
0414 
0415 #define TSI721_IBDMAC_FQRP(x)       (0x6120c + (x) * 0x1000)
0416 #define TSI721_IBDMAC_FQRP_MASK     0x0007ffff
0417 
0418 #define TSI721_IBDMAC_FQWP(x)       (0x61210 + (x) * 0x1000)
0419 #define TSI721_IBDMAC_FQWP_MASK     0x0007ffff
0420 
0421 #define TSI721_IBDMAC_FQTH(x)       (0x61214 + (x) * 0x1000)
0422 #define TSI721_IBDMAC_FQTH_MASK     0x0007ffff
0423 
0424 #define TSI721_IB_DEVID         0x60020
0425 #define TSI721_IB_DEVID_MASK        0x0000ffff
0426 
0427 #define TSI721_IBDMAC_CTL(x)        (0x61240 + (x) * 0x1000)
0428 #define TSI721_IBDMAC_CTL_MASK      0x00000003
0429 #define TSI721_IBDMAC_CTL_SUSPEND   0x00000002
0430 #define TSI721_IBDMAC_CTL_INIT      0x00000001
0431 
0432 #define TSI721_IBDMAC_STS(x)        (0x61244 + (x) * 0x1000)
0433 #define TSI721_IBDMAC_STS_MASK      0x007f0000
0434 #define TSI721_IBSMAC_STS_ABORT     0x00400000
0435 #define TSI721_IBSMAC_STS_RUN       0x00200000
0436 #define TSI721_IBSMAC_STS_CS        0x001f0000
0437 
0438 #define TSI721_IBDMAC_INT(x)        (0x61248 + (x) * 0x1000)
0439 #define TSI721_IBDMAC_INTSET(x)     (0x6124c + (x) * 0x1000)
0440 #define TSI721_IBDMAC_INTE(x)       (0x61250 + (x) * 0x1000)
0441 #define TSI721_IBDMAC_INT_MASK      0x0000100f
0442 #define TSI721_IBDMAC_INT_SRTO      0x00001000
0443 #define TSI721_IBDMAC_INT_SUSPENDED 0x00000008
0444 #define TSI721_IBDMAC_INT_PC_ERROR  0x00000004
0445 #define TSI721_IBDMAC_INT_FQ_LOW    0x00000002
0446 #define TSI721_IBDMAC_INT_DQ_RCV    0x00000001
0447 #define TSI721_IBDMAC_INT_ALL       TSI721_IBDMAC_INT_MASK
0448 
0449 #define TSI721_IBDMAC_PWE(x)        (0x61254 + (x) * 0x1000)
0450 #define TSI721_IBDMAC_PWE_MASK      0x00001700
0451 #define TSI721_IBDMAC_PWE_SRTO      0x00001000
0452 #define TSI721_IBDMAC_PWE_ILL_FMT   0x00000400
0453 #define TSI721_IBDMAC_PWE_ILL_DEC   0x00000200
0454 #define TSI721_IBDMAC_PWE_IMP_SP    0x00000100
0455 
0456 #define TSI721_IBDMAC_DQBL(x)       (0x61300 + (x) * 0x1000)
0457 #define TSI721_IBDMAC_DQBL_MASK     0xffffffc0
0458 #define TSI721_IBDMAC_DQBL_ADDR     0xffffffc0
0459 
0460 #define TSI721_IBDMAC_DQBH(x)       (0x61304 + (x) * 0x1000)
0461 #define TSI721_IBDMAC_DQBH_MASK     0xffffffff
0462 
0463 #define TSI721_IBDMAC_DQRP(x)       (0x61308 + (x) * 0x1000)
0464 #define TSI721_IBDMAC_DQRP_MASK     0x0007ffff
0465 
0466 #define TSI721_IBDMAC_DQWR(x)       (0x6130c + (x) * 0x1000)
0467 #define TSI721_IBDMAC_DQWR_MASK     0x0007ffff
0468 
0469 #define TSI721_IBDMAC_DQSZ(x)       (0x61314 + (x) * 0x1000)
0470 #define TSI721_IBDMAC_DQSZ_MASK     0x0000000f
0471 
0472 /*
0473  * Messaging Engine Interrupts
0474  */
0475 
0476 #define TSI721_SMSG_PWE         0x6a004
0477 
0478 #define TSI721_SMSG_INTE        0x6a000
0479 #define TSI721_SMSG_INT         0x6a008
0480 #define TSI721_SMSG_INTSET      0x6a010
0481 #define TSI721_SMSG_INT_MASK        0x0086ffff
0482 #define TSI721_SMSG_INT_UNS_RSP     0x00800000
0483 #define TSI721_SMSG_INT_ECC_NCOR    0x00040000
0484 #define TSI721_SMSG_INT_ECC_COR     0x00020000
0485 #define TSI721_SMSG_INT_ECC_NCOR_CH 0x0000ff00
0486 #define TSI721_SMSG_INT_ECC_COR_CH  0x000000ff
0487 
0488 #define TSI721_SMSG_ECC_LOG     0x6a014
0489 #define TSI721_SMSG_ECC_LOG_MASK    0x00070007
0490 #define TSI721_SMSG_ECC_LOG_ECC_NCOR_M  0x00070000
0491 #define TSI721_SMSG_ECC_LOG_ECC_COR_M   0x00000007
0492 
0493 #define TSI721_RETRY_GEN_CNT        0x6a100
0494 #define TSI721_RETRY_GEN_CNT_MASK   0xffffffff
0495 
0496 #define TSI721_RETRY_RX_CNT     0x6a104
0497 #define TSI721_RETRY_RX_CNT_MASK    0xffffffff
0498 
0499 #define TSI721_SMSG_ECC_COR_LOG(x)  (0x6a300 + (x) * 4)
0500 #define TSI721_SMSG_ECC_COR_LOG_MASK    0x000000ff
0501 
0502 #define TSI721_SMSG_ECC_NCOR(x)     (0x6a340 + (x) * 4)
0503 #define TSI721_SMSG_ECC_NCOR_MASK   0x000000ff
0504 
0505 /*
0506  * Block DMA Descriptors
0507  */
0508 
0509 struct tsi721_dma_desc {
0510     __le32 type_id;
0511 
0512 #define TSI721_DMAD_DEVID   0x0000ffff
0513 #define TSI721_DMAD_CRF     0x00010000
0514 #define TSI721_DMAD_PRIO    0x00060000
0515 #define TSI721_DMAD_RTYPE   0x00780000
0516 #define TSI721_DMAD_IOF     0x08000000
0517 #define TSI721_DMAD_DTYPE   0xe0000000
0518 
0519     __le32 bcount;
0520 
0521 #define TSI721_DMAD_BCOUNT1 0x03ffffff /* if DTYPE == 1 */
0522 #define TSI721_DMAD_BCOUNT2 0x0000000f /* if DTYPE == 2 */
0523 #define TSI721_DMAD_TT      0x0c000000
0524 #define TSI721_DMAD_RADDR0  0xc0000000
0525 
0526     union {
0527         __le32 raddr_lo;       /* if DTYPE == (1 || 2) */
0528         __le32 next_lo;        /* if DTYPE == 3 */
0529     };
0530 
0531 #define TSI721_DMAD_CFGOFF  0x00ffffff
0532 #define TSI721_DMAD_HOPCNT  0xff000000
0533 
0534     union {
0535         __le32 raddr_hi;       /* if DTYPE == (1 || 2) */
0536         __le32 next_hi;        /* if DTYPE == 3 */
0537     };
0538 
0539     union {
0540         struct {           /* if DTYPE == 1 */
0541             __le32 bufptr_lo;
0542             __le32 bufptr_hi;
0543             __le32 s_dist;
0544             __le32 s_size;
0545         } t1;
0546         __le32 data[4];        /* if DTYPE == 2 */
0547         u32    reserved[4];    /* if DTYPE == 3 */
0548     };
0549 } __aligned(32);
0550 
0551 /*
0552  * Inbound Messaging Descriptor
0553  */
0554 struct tsi721_imsg_desc {
0555     __le32 type_id;
0556 
0557 #define TSI721_IMD_DEVID    0x0000ffff
0558 #define TSI721_IMD_CRF      0x00010000
0559 #define TSI721_IMD_PRIO     0x00060000
0560 #define TSI721_IMD_TT       0x00180000
0561 #define TSI721_IMD_DTYPE    0xe0000000
0562 
0563     __le32 msg_info;
0564 
0565 #define TSI721_IMD_BCOUNT   0x00000ff8
0566 #define TSI721_IMD_SSIZE    0x0000f000
0567 #define TSI721_IMD_LETER    0x00030000
0568 #define TSI721_IMD_XMBOX    0x003c0000
0569 #define TSI721_IMD_MBOX     0x00c00000
0570 #define TSI721_IMD_CS       0x78000000
0571 #define TSI721_IMD_HO       0x80000000
0572 
0573     __le32 bufptr_lo;
0574     __le32 bufptr_hi;
0575     u32    reserved[12];
0576 
0577 } __aligned(64);
0578 
0579 /*
0580  * Outbound Messaging Descriptor
0581  */
0582 struct tsi721_omsg_desc {
0583     __le32 type_id;
0584 
0585 #define TSI721_OMD_DEVID    0x0000ffff
0586 #define TSI721_OMD_CRF      0x00010000
0587 #define TSI721_OMD_PRIO     0x00060000
0588 #define TSI721_OMD_IOF      0x08000000
0589 #define TSI721_OMD_DTYPE    0xe0000000
0590 #define TSI721_OMD_RSRVD    0x17f80000
0591 
0592     __le32 msg_info;
0593 
0594 #define TSI721_OMD_BCOUNT   0x00000ff8
0595 #define TSI721_OMD_SSIZE    0x0000f000
0596 #define TSI721_OMD_LETER    0x00030000
0597 #define TSI721_OMD_XMBOX    0x003c0000
0598 #define TSI721_OMD_MBOX     0x00c00000
0599 #define TSI721_OMD_TT       0x0c000000
0600 
0601     union {
0602         __le32 bufptr_lo;   /* if DTYPE == 4 */
0603         __le32 next_lo;     /* if DTYPE == 5 */
0604     };
0605 
0606     union {
0607         __le32 bufptr_hi;   /* if DTYPE == 4 */
0608         __le32 next_hi;     /* if DTYPE == 5 */
0609     };
0610 
0611 } __aligned(16);
0612 
0613 struct tsi721_dma_sts {
0614     __le64  desc_sts[8];
0615 } __aligned(64);
0616 
0617 struct tsi721_desc_sts_fifo {
0618     union {
0619         __le64  da64;
0620         struct {
0621             __le32  lo;
0622             __le32  hi;
0623         } da32;
0624     } stat[8];
0625 } __aligned(64);
0626 
0627 /* Descriptor types for BDMA and Messaging blocks */
0628 enum dma_dtype {
0629     DTYPE1 = 1, /* Data Transfer DMA Descriptor */
0630     DTYPE2 = 2, /* Immediate Data Transfer DMA Descriptor */
0631     DTYPE3 = 3, /* Block Pointer DMA Descriptor */
0632     DTYPE4 = 4, /* Outbound Msg DMA Descriptor */
0633     DTYPE5 = 5, /* OB Messaging Block Pointer Descriptor */
0634     DTYPE6 = 6  /* Inbound Messaging Descriptor */
0635 };
0636 
0637 enum dma_rtype {
0638     NREAD = 0,
0639     LAST_NWRITE_R = 1,
0640     ALL_NWRITE = 2,
0641     ALL_NWRITE_R = 3,
0642     MAINT_RD = 4,
0643     MAINT_WR = 5
0644 };
0645 
0646 /*
0647  * mport Driver Definitions
0648  */
0649 #define TSI721_DMA_CHNUM    TSI721_DMA_MAXCH
0650 
0651 #define TSI721_DMACH_MAINT  7   /* DMA channel for maint requests */
0652 #define TSI721_DMACH_MAINT_NBD  32  /* Number of BDs for maint requests */
0653 
0654 #define TSI721_DMACH_DMA    1   /* DMA channel for data transfers */
0655 
0656 #define MSG_DMA_ENTRY_INX_TO_SIZE(x)    ((0x10 << (x)) & 0xFFFF0)
0657 
0658 enum tsi721_smsg_int_flag {
0659     SMSG_INT_NONE       = 0x00000000,
0660     SMSG_INT_ECC_COR_CH = 0x000000ff,
0661     SMSG_INT_ECC_NCOR_CH    = 0x0000ff00,
0662     SMSG_INT_ECC_COR    = 0x00020000,
0663     SMSG_INT_ECC_NCOR   = 0x00040000,
0664     SMSG_INT_UNS_RSP    = 0x00800000,
0665     SMSG_INT_ALL        = 0x0006ffff
0666 };
0667 
0668 /* Structures */
0669 
0670 #ifdef CONFIG_RAPIDIO_DMA_ENGINE
0671 
0672 #define TSI721_BDMA_MAX_BCOUNT  (TSI721_DMAD_BCOUNT1 + 1)
0673 
0674 struct tsi721_tx_desc {
0675     struct dma_async_tx_descriptor  txd;
0676     u16             destid;
0677     /* low 64-bits of 66-bit RIO address */
0678     u64             rio_addr;
0679     /* upper 2-bits of 66-bit RIO address */
0680     u8              rio_addr_u;
0681     enum dma_rtype          rtype;
0682     struct list_head        desc_node;
0683     struct scatterlist      *sg;
0684     unsigned int            sg_len;
0685     enum dma_status         status;
0686 };
0687 
0688 struct tsi721_bdma_chan {
0689     int     id;
0690     void __iomem    *regs;
0691     int     bd_num;     /* number of HW buffer descriptors */
0692     void        *bd_base;   /* start of DMA descriptors */
0693     dma_addr_t  bd_phys;
0694     void        *sts_base;  /* start of DMA BD status FIFO */
0695     dma_addr_t  sts_phys;
0696     int     sts_size;
0697     u32     sts_rdptr;
0698     u32     wr_count;
0699     u32     wr_count_next;
0700 
0701     struct dma_chan     dchan;
0702     struct tsi721_tx_desc   *tx_desc;
0703     spinlock_t      lock;
0704     struct tsi721_tx_desc   *active_tx;
0705     struct list_head    queue;
0706     struct list_head    free_list;
0707     struct tasklet_struct   tasklet;
0708     bool            active;
0709 };
0710 
0711 #endif /* CONFIG_RAPIDIO_DMA_ENGINE */
0712 
0713 struct tsi721_bdma_maint {
0714     int     ch_id;      /* BDMA channel number */
0715     int     bd_num;     /* number of buffer descriptors */
0716     void        *bd_base;   /* start of DMA descriptors */
0717     dma_addr_t  bd_phys;
0718     void        *sts_base;  /* start of DMA BD status FIFO */
0719     dma_addr_t  sts_phys;
0720     int     sts_size;
0721 };
0722 
0723 struct tsi721_imsg_ring {
0724     u32     size;
0725     /* VA/PA of data buffers for incoming messages */
0726     void        *buf_base;
0727     dma_addr_t  buf_phys;
0728     /* VA/PA of circular free buffer list */
0729     void        *imfq_base;
0730     dma_addr_t  imfq_phys;
0731     /* VA/PA of Inbound message descriptors */
0732     void        *imd_base;
0733     dma_addr_t  imd_phys;
0734      /* Inbound Queue buffer pointers */
0735     void        *imq_base[TSI721_IMSGD_RING_SIZE];
0736 
0737     u32     rx_slot;
0738     void        *dev_id;
0739     u32     fq_wrptr;
0740     u32     desc_rdptr;
0741     spinlock_t  lock;
0742 };
0743 
0744 struct tsi721_omsg_ring {
0745     u32     size;
0746     /* VA/PA of OB Msg descriptors */
0747     void        *omd_base;
0748     dma_addr_t  omd_phys;
0749     /* VA/PA of OB Msg data buffers */
0750     void        *omq_base[TSI721_OMSGD_RING_SIZE];
0751     dma_addr_t  omq_phys[TSI721_OMSGD_RING_SIZE];
0752     /* VA/PA of OB Msg descriptor status FIFO */
0753     void        *sts_base;
0754     dma_addr_t  sts_phys;
0755     u32     sts_size; /* # of allocated status entries */
0756     u32     sts_rdptr;
0757 
0758     u32     tx_slot;
0759     void        *dev_id;
0760     u32     wr_count;
0761     spinlock_t  lock;
0762 };
0763 
0764 enum tsi721_flags {
0765     TSI721_USING_MSI    = (1 << 0),
0766     TSI721_USING_MSIX   = (1 << 1),
0767     TSI721_IMSGID_SET   = (1 << 2),
0768 };
0769 
0770 #ifdef CONFIG_PCI_MSI
0771 /*
0772  * MSI-X Table Entries (0 ... 69)
0773  */
0774 #define TSI721_MSIX_DMACH_DONE(x)   (0 + (x))
0775 #define TSI721_MSIX_DMACH_INT(x)    (8 + (x))
0776 #define TSI721_MSIX_BDMA_INT        16
0777 #define TSI721_MSIX_OMSG_DONE(x)    (17 + (x))
0778 #define TSI721_MSIX_OMSG_INT(x)     (25 + (x))
0779 #define TSI721_MSIX_IMSG_DQ_RCV(x)  (33 + (x))
0780 #define TSI721_MSIX_IMSG_INT(x)     (41 + (x))
0781 #define TSI721_MSIX_MSG_INT     49
0782 #define TSI721_MSIX_SR2PC_IDBQ_RCV(x)   (50 + (x))
0783 #define TSI721_MSIX_SR2PC_CH_INT(x) (58 + (x))
0784 #define TSI721_MSIX_SR2PC_INT       66
0785 #define TSI721_MSIX_PC2SR_INT       67
0786 #define TSI721_MSIX_SRIO_MAC_INT    68
0787 #define TSI721_MSIX_I2C_INT     69
0788 
0789 /* MSI-X vector and init table entry indexes */
0790 enum tsi721_msix_vect {
0791     TSI721_VECT_IDB,
0792     TSI721_VECT_PWRX, /* PW_RX is part of SRIO MAC Interrupt reporting */
0793     TSI721_VECT_OMB0_DONE,
0794     TSI721_VECT_OMB1_DONE,
0795     TSI721_VECT_OMB2_DONE,
0796     TSI721_VECT_OMB3_DONE,
0797     TSI721_VECT_OMB0_INT,
0798     TSI721_VECT_OMB1_INT,
0799     TSI721_VECT_OMB2_INT,
0800     TSI721_VECT_OMB3_INT,
0801     TSI721_VECT_IMB0_RCV,
0802     TSI721_VECT_IMB1_RCV,
0803     TSI721_VECT_IMB2_RCV,
0804     TSI721_VECT_IMB3_RCV,
0805     TSI721_VECT_IMB0_INT,
0806     TSI721_VECT_IMB1_INT,
0807     TSI721_VECT_IMB2_INT,
0808     TSI721_VECT_IMB3_INT,
0809 #ifdef CONFIG_RAPIDIO_DMA_ENGINE
0810     TSI721_VECT_DMA0_DONE,
0811     TSI721_VECT_DMA1_DONE,
0812     TSI721_VECT_DMA2_DONE,
0813     TSI721_VECT_DMA3_DONE,
0814     TSI721_VECT_DMA4_DONE,
0815     TSI721_VECT_DMA5_DONE,
0816     TSI721_VECT_DMA6_DONE,
0817     TSI721_VECT_DMA7_DONE,
0818     TSI721_VECT_DMA0_INT,
0819     TSI721_VECT_DMA1_INT,
0820     TSI721_VECT_DMA2_INT,
0821     TSI721_VECT_DMA3_INT,
0822     TSI721_VECT_DMA4_INT,
0823     TSI721_VECT_DMA5_INT,
0824     TSI721_VECT_DMA6_INT,
0825     TSI721_VECT_DMA7_INT,
0826 #endif /* CONFIG_RAPIDIO_DMA_ENGINE */
0827     TSI721_VECT_MAX
0828 };
0829 
0830 #define IRQ_DEVICE_NAME_MAX 64
0831 
0832 struct msix_irq {
0833     u16 vector;
0834     char    irq_name[IRQ_DEVICE_NAME_MAX];
0835 };
0836 #endif /* CONFIG_PCI_MSI */
0837 
0838 struct tsi721_ib_win_mapping {
0839     struct list_head node;
0840     dma_addr_t  lstart;
0841 };
0842 
0843 struct tsi721_ib_win {
0844     u64     rstart;
0845     u32     size;
0846     dma_addr_t  lstart;
0847     bool        active;
0848     bool        xlat;
0849     struct list_head mappings;
0850 };
0851 
0852 struct tsi721_obw_bar {
0853     u64     base;
0854     u64     size;
0855     u64     free;
0856 };
0857 
0858 struct tsi721_ob_win {
0859     u64     base;
0860     u32     size;
0861     u16     destid;
0862     u64     rstart;
0863     bool        active;
0864     struct tsi721_obw_bar *pbar;
0865 };
0866 
0867 struct tsi721_device {
0868     struct pci_dev  *pdev;
0869     struct rio_mport mport;
0870     u32     flags;
0871     void __iomem    *regs;
0872 #ifdef CONFIG_PCI_MSI
0873     struct msix_irq msix[TSI721_VECT_MAX];
0874 #endif
0875     /* Doorbells */
0876     void __iomem    *odb_base;
0877     void        *idb_base;
0878     dma_addr_t  idb_dma;
0879     struct work_struct idb_work;
0880     u32     db_discard_count;
0881 
0882     /* Inbound Port-Write */
0883     struct work_struct pw_work;
0884     struct kfifo    pw_fifo;
0885     spinlock_t  pw_fifo_lock;
0886     u32     pw_discard_count;
0887 
0888     /* BDMA Engine */
0889     struct tsi721_bdma_maint mdma; /* Maintenance rd/wr request channel */
0890 
0891 #ifdef CONFIG_RAPIDIO_DMA_ENGINE
0892     struct tsi721_bdma_chan bdma[TSI721_DMA_CHNUM];
0893 #endif
0894 
0895     /* Inbound Messaging */
0896     int     imsg_init[TSI721_IMSG_CHNUM];
0897     struct tsi721_imsg_ring imsg_ring[TSI721_IMSG_CHNUM];
0898 
0899     /* Outbound Messaging */
0900     int     omsg_init[TSI721_OMSG_CHNUM];
0901     struct tsi721_omsg_ring omsg_ring[TSI721_OMSG_CHNUM];
0902 
0903     /* Inbound Mapping Windows */
0904     struct tsi721_ib_win ib_win[TSI721_IBWIN_NUM];
0905     int     ibwin_cnt;
0906 
0907     /* Outbound Mapping Windows */
0908     struct tsi721_obw_bar p2r_bar[2];
0909     struct tsi721_ob_win  ob_win[TSI721_OBWIN_NUM];
0910     int     obwin_cnt;
0911 };
0912 
0913 #ifdef CONFIG_RAPIDIO_DMA_ENGINE
0914 extern void tsi721_bdma_handler(struct tsi721_bdma_chan *bdma_chan);
0915 extern int tsi721_register_dma(struct tsi721_device *priv);
0916 extern void tsi721_unregister_dma(struct tsi721_device *priv);
0917 extern void tsi721_dma_stop_all(struct tsi721_device *priv);
0918 #else
0919 #define tsi721_dma_stop_all(priv) do {} while (0)
0920 #define tsi721_unregister_dma(priv) do {} while (0)
0921 #endif
0922 
0923 #endif