162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Tsi721 PCIExpress-to-SRIO bridge definitions 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2011, Integrated Device Technology, Inc. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef __TSI721_H 962306a36Sopenharmony_ci#define __TSI721_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/* Debug output filtering masks */ 1262306a36Sopenharmony_cienum { 1362306a36Sopenharmony_ci DBG_NONE = 0, 1462306a36Sopenharmony_ci DBG_INIT = BIT(0), /* driver init */ 1562306a36Sopenharmony_ci DBG_EXIT = BIT(1), /* driver exit */ 1662306a36Sopenharmony_ci DBG_MPORT = BIT(2), /* mport add/remove */ 1762306a36Sopenharmony_ci DBG_MAINT = BIT(3), /* maintenance ops messages */ 1862306a36Sopenharmony_ci DBG_DMA = BIT(4), /* DMA transfer messages */ 1962306a36Sopenharmony_ci DBG_DMAV = BIT(5), /* verbose DMA transfer messages */ 2062306a36Sopenharmony_ci DBG_IBW = BIT(6), /* inbound window */ 2162306a36Sopenharmony_ci DBG_EVENT = BIT(7), /* event handling messages */ 2262306a36Sopenharmony_ci DBG_OBW = BIT(8), /* outbound window messages */ 2362306a36Sopenharmony_ci DBG_DBELL = BIT(9), /* doorbell messages */ 2462306a36Sopenharmony_ci DBG_OMSG = BIT(10), /* doorbell messages */ 2562306a36Sopenharmony_ci DBG_IMSG = BIT(11), /* doorbell messages */ 2662306a36Sopenharmony_ci DBG_ALL = ~0, 2762306a36Sopenharmony_ci}; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#ifdef DEBUG 3062306a36Sopenharmony_ciextern u32 tsi_dbg_level; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define tsi_debug(level, dev, fmt, arg...) \ 3362306a36Sopenharmony_ci do { \ 3462306a36Sopenharmony_ci if (DBG_##level & tsi_dbg_level) \ 3562306a36Sopenharmony_ci dev_dbg(dev, "%s: " fmt "\n", __func__, ##arg); \ 3662306a36Sopenharmony_ci } while (0) 3762306a36Sopenharmony_ci#else 3862306a36Sopenharmony_ci#define tsi_debug(level, dev, fmt, arg...) \ 3962306a36Sopenharmony_ci no_printk(KERN_DEBUG "%s: " fmt "\n", __func__, ##arg) 4062306a36Sopenharmony_ci#endif 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#define tsi_info(dev, fmt, arg...) \ 4362306a36Sopenharmony_ci dev_info(dev, "%s: " fmt "\n", __func__, ##arg) 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define tsi_warn(dev, fmt, arg...) \ 4662306a36Sopenharmony_ci dev_warn(dev, "%s: WARNING " fmt "\n", __func__, ##arg) 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#define tsi_err(dev, fmt, arg...) \ 4962306a36Sopenharmony_ci dev_err(dev, "%s: ERROR " fmt "\n", __func__, ##arg) 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define DRV_NAME "tsi721" 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define DEFAULT_HOPCOUNT 0xff 5462306a36Sopenharmony_ci#define DEFAULT_DESTID 0xff 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci/* PCI device ID */ 5762306a36Sopenharmony_ci#define PCI_DEVICE_ID_TSI721 0x80ab 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci#define BAR_0 0 6062306a36Sopenharmony_ci#define BAR_1 1 6162306a36Sopenharmony_ci#define BAR_2 2 6262306a36Sopenharmony_ci#define BAR_4 4 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci#define TSI721_PC2SR_BARS 2 6562306a36Sopenharmony_ci#define TSI721_PC2SR_WINS 8 6662306a36Sopenharmony_ci#define TSI721_PC2SR_ZONES 8 6762306a36Sopenharmony_ci#define TSI721_MAINT_WIN 0 /* Window for outbound maintenance requests */ 6862306a36Sopenharmony_ci#define IDB_QUEUE 0 /* Inbound Doorbell Queue to use */ 6962306a36Sopenharmony_ci#define IDB_QSIZE 512 /* Inbound Doorbell Queue size */ 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* Memory space sizes */ 7262306a36Sopenharmony_ci#define TSI721_REG_SPACE_SIZE (512 * 1024) /* 512K */ 7362306a36Sopenharmony_ci#define TSI721_DB_WIN_SIZE (16 * 1024 * 1024) /* 16MB */ 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci#define RIO_TT_CODE_8 0x00000000 7662306a36Sopenharmony_ci#define RIO_TT_CODE_16 0x00000001 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#define TSI721_DMA_MAXCH 8 7962306a36Sopenharmony_ci#define TSI721_DMA_MINSTSSZ 32 8062306a36Sopenharmony_ci#define TSI721_DMA_STSBLKSZ 8 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci#define TSI721_SRIO_MAXCH 8 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci#define DBELL_SID(buf) (((u8)buf[2] << 8) | (u8)buf[3]) 8562306a36Sopenharmony_ci#define DBELL_TID(buf) (((u8)buf[4] << 8) | (u8)buf[5]) 8662306a36Sopenharmony_ci#define DBELL_INF(buf) (((u8)buf[0] << 8) | (u8)buf[1]) 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci#define TSI721_RIO_PW_MSG_SIZE 16 /* Tsi721 saves only 16 bytes of PW msg */ 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* Register definitions */ 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci/* 9362306a36Sopenharmony_ci * Registers in PCIe configuration space 9462306a36Sopenharmony_ci */ 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#define TSI721_PCIECFG_MSIXTBL 0x0a4 9762306a36Sopenharmony_ci#define TSI721_MSIXTBL_OFFSET 0x2c000 9862306a36Sopenharmony_ci#define TSI721_PCIECFG_MSIXPBA 0x0a8 9962306a36Sopenharmony_ci#define TSI721_MSIXPBA_OFFSET 0x2a000 10062306a36Sopenharmony_ci#define TSI721_PCIECFG_EPCTL 0x400 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci/* 10362306a36Sopenharmony_ci * Event Management Registers 10462306a36Sopenharmony_ci */ 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci#define TSI721_RIO_EM_INT_STAT 0x10910 10762306a36Sopenharmony_ci#define TSI721_RIO_EM_INT_STAT_PW_RX 0x00010000 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci#define TSI721_RIO_EM_INT_ENABLE 0x10914 11062306a36Sopenharmony_ci#define TSI721_RIO_EM_INT_ENABLE_PW_RX 0x00010000 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci#define TSI721_RIO_EM_DEV_INT_EN 0x10930 11362306a36Sopenharmony_ci#define TSI721_RIO_EM_DEV_INT_EN_INT 0x00000001 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci/* 11662306a36Sopenharmony_ci * Port-Write Block Registers 11762306a36Sopenharmony_ci */ 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci#define TSI721_RIO_PW_CTL 0x10a04 12062306a36Sopenharmony_ci#define TSI721_RIO_PW_CTL_PW_TIMER 0xf0000000 12162306a36Sopenharmony_ci#define TSI721_RIO_PW_CTL_PWT_DIS (0 << 28) 12262306a36Sopenharmony_ci#define TSI721_RIO_PW_CTL_PWT_103 (1 << 28) 12362306a36Sopenharmony_ci#define TSI721_RIO_PW_CTL_PWT_205 (1 << 29) 12462306a36Sopenharmony_ci#define TSI721_RIO_PW_CTL_PWT_410 (1 << 30) 12562306a36Sopenharmony_ci#define TSI721_RIO_PW_CTL_PWT_820 (1 << 31) 12662306a36Sopenharmony_ci#define TSI721_RIO_PW_CTL_PWC_MODE 0x01000000 12762306a36Sopenharmony_ci#define TSI721_RIO_PW_CTL_PWC_CONT 0x00000000 12862306a36Sopenharmony_ci#define TSI721_RIO_PW_CTL_PWC_REL 0x01000000 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci#define TSI721_RIO_PW_RX_STAT 0x10a10 13162306a36Sopenharmony_ci#define TSI721_RIO_PW_RX_STAT_WR_SIZE 0x0000f000 13262306a36Sopenharmony_ci#define TSI_RIO_PW_RX_STAT_WDPTR 0x00000100 13362306a36Sopenharmony_ci#define TSI721_RIO_PW_RX_STAT_PW_SHORT 0x00000008 13462306a36Sopenharmony_ci#define TSI721_RIO_PW_RX_STAT_PW_TRUNC 0x00000004 13562306a36Sopenharmony_ci#define TSI721_RIO_PW_RX_STAT_PW_DISC 0x00000002 13662306a36Sopenharmony_ci#define TSI721_RIO_PW_RX_STAT_PW_VAL 0x00000001 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci#define TSI721_RIO_PW_RX_CAPT(x) (0x10a20 + (x)*4) 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci/* 14162306a36Sopenharmony_ci * Inbound Doorbells 14262306a36Sopenharmony_ci */ 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci#define TSI721_IDB_ENTRY_SIZE 64 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci#define TSI721_IDQ_CTL(x) (0x20000 + (x) * 0x1000) 14762306a36Sopenharmony_ci#define TSI721_IDQ_SUSPEND 0x00000002 14862306a36Sopenharmony_ci#define TSI721_IDQ_INIT 0x00000001 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci#define TSI721_IDQ_STS(x) (0x20004 + (x) * 0x1000) 15162306a36Sopenharmony_ci#define TSI721_IDQ_RUN 0x00200000 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci#define TSI721_IDQ_MASK(x) (0x20008 + (x) * 0x1000) 15462306a36Sopenharmony_ci#define TSI721_IDQ_MASK_MASK 0xffff0000 15562306a36Sopenharmony_ci#define TSI721_IDQ_MASK_PATT 0x0000ffff 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci#define TSI721_IDQ_RP(x) (0x2000c + (x) * 0x1000) 15862306a36Sopenharmony_ci#define TSI721_IDQ_RP_PTR 0x0007ffff 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci#define TSI721_IDQ_WP(x) (0x20010 + (x) * 0x1000) 16162306a36Sopenharmony_ci#define TSI721_IDQ_WP_PTR 0x0007ffff 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci#define TSI721_IDQ_BASEL(x) (0x20014 + (x) * 0x1000) 16462306a36Sopenharmony_ci#define TSI721_IDQ_BASEL_ADDR 0xffffffc0 16562306a36Sopenharmony_ci#define TSI721_IDQ_BASEU(x) (0x20018 + (x) * 0x1000) 16662306a36Sopenharmony_ci#define TSI721_IDQ_SIZE(x) (0x2001c + (x) * 0x1000) 16762306a36Sopenharmony_ci#define TSI721_IDQ_SIZE_VAL(size) (__fls(size) - 4) 16862306a36Sopenharmony_ci#define TSI721_IDQ_SIZE_MIN 512 16962306a36Sopenharmony_ci#define TSI721_IDQ_SIZE_MAX (512 * 1024) 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci#define TSI721_SR_CHINT(x) (0x20040 + (x) * 0x1000) 17262306a36Sopenharmony_ci#define TSI721_SR_CHINTE(x) (0x20044 + (x) * 0x1000) 17362306a36Sopenharmony_ci#define TSI721_SR_CHINTSET(x) (0x20048 + (x) * 0x1000) 17462306a36Sopenharmony_ci#define TSI721_SR_CHINT_ODBOK 0x00000020 17562306a36Sopenharmony_ci#define TSI721_SR_CHINT_IDBQRCV 0x00000010 17662306a36Sopenharmony_ci#define TSI721_SR_CHINT_SUSP 0x00000008 17762306a36Sopenharmony_ci#define TSI721_SR_CHINT_ODBTO 0x00000004 17862306a36Sopenharmony_ci#define TSI721_SR_CHINT_ODBRTRY 0x00000002 17962306a36Sopenharmony_ci#define TSI721_SR_CHINT_ODBERR 0x00000001 18062306a36Sopenharmony_ci#define TSI721_SR_CHINT_ALL 0x0000003f 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci#define TSI721_IBWIN_NUM 8 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci#define TSI721_IBWIN_LB(x) (0x29000 + (x) * 0x20) 18562306a36Sopenharmony_ci#define TSI721_IBWIN_LB_BA 0xfffff000 18662306a36Sopenharmony_ci#define TSI721_IBWIN_LB_WEN 0x00000001 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci#define TSI721_IBWIN_UB(x) (0x29004 + (x) * 0x20) 18962306a36Sopenharmony_ci#define TSI721_IBWIN_SZ(x) (0x29008 + (x) * 0x20) 19062306a36Sopenharmony_ci#define TSI721_IBWIN_SZ_SIZE 0x00001f00 19162306a36Sopenharmony_ci#define TSI721_IBWIN_SIZE(size) (__fls(size) - 12) 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci#define TSI721_IBWIN_TLA(x) (0x2900c + (x) * 0x20) 19462306a36Sopenharmony_ci#define TSI721_IBWIN_TLA_ADD 0xfffff000 19562306a36Sopenharmony_ci#define TSI721_IBWIN_TUA(x) (0x29010 + (x) * 0x20) 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci#define TSI721_SR2PC_GEN_INTE 0x29800 19862306a36Sopenharmony_ci#define TSI721_SR2PC_PWE 0x29804 19962306a36Sopenharmony_ci#define TSI721_SR2PC_GEN_INT 0x29808 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci#define TSI721_DEV_INTE 0x29840 20262306a36Sopenharmony_ci#define TSI721_DEV_INT 0x29844 20362306a36Sopenharmony_ci#define TSI721_DEV_INTSET 0x29848 20462306a36Sopenharmony_ci#define TSI721_DEV_INT_BDMA_CH 0x00002000 20562306a36Sopenharmony_ci#define TSI721_DEV_INT_BDMA_NCH 0x00001000 20662306a36Sopenharmony_ci#define TSI721_DEV_INT_SMSG_CH 0x00000800 20762306a36Sopenharmony_ci#define TSI721_DEV_INT_SMSG_NCH 0x00000400 20862306a36Sopenharmony_ci#define TSI721_DEV_INT_SR2PC_CH 0x00000200 20962306a36Sopenharmony_ci#define TSI721_DEV_INT_SRIO 0x00000020 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci#define TSI721_DEV_CHAN_INTE 0x2984c 21262306a36Sopenharmony_ci#define TSI721_DEV_CHAN_INT 0x29850 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci#define TSI721_INT_SR2PC_CHAN_M 0xff000000 21562306a36Sopenharmony_ci#define TSI721_INT_SR2PC_CHAN(x) (1 << (24 + (x))) 21662306a36Sopenharmony_ci#define TSI721_INT_IMSG_CHAN_M 0x00ff0000 21762306a36Sopenharmony_ci#define TSI721_INT_IMSG_CHAN(x) (1 << (16 + (x))) 21862306a36Sopenharmony_ci#define TSI721_INT_OMSG_CHAN_M 0x0000ff00 21962306a36Sopenharmony_ci#define TSI721_INT_OMSG_CHAN(x) (1 << (8 + (x))) 22062306a36Sopenharmony_ci#define TSI721_INT_BDMA_CHAN_M 0x000000ff 22162306a36Sopenharmony_ci#define TSI721_INT_BDMA_CHAN(x) (1 << (x)) 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci/* 22462306a36Sopenharmony_ci * PC2SR block registers 22562306a36Sopenharmony_ci */ 22662306a36Sopenharmony_ci#define TSI721_OBWIN_NUM TSI721_PC2SR_WINS 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci#define TSI721_OBWINLB(x) (0x40000 + (x) * 0x20) 22962306a36Sopenharmony_ci#define TSI721_OBWINLB_BA 0xffff8000 23062306a36Sopenharmony_ci#define TSI721_OBWINLB_WEN 0x00000001 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci#define TSI721_OBWINUB(x) (0x40004 + (x) * 0x20) 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci#define TSI721_OBWINSZ(x) (0x40008 + (x) * 0x20) 23562306a36Sopenharmony_ci#define TSI721_OBWINSZ_SIZE 0x00001f00 23662306a36Sopenharmony_ci#define TSI721_OBWIN_SIZE(size) (__fls(size) - 15) 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci#define TSI721_ZONE_SEL 0x41300 23962306a36Sopenharmony_ci#define TSI721_ZONE_SEL_RD_WRB 0x00020000 24062306a36Sopenharmony_ci#define TSI721_ZONE_SEL_GO 0x00010000 24162306a36Sopenharmony_ci#define TSI721_ZONE_SEL_WIN 0x00000038 24262306a36Sopenharmony_ci#define TSI721_ZONE_SEL_ZONE 0x00000007 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci#define TSI721_LUT_DATA0 0x41304 24562306a36Sopenharmony_ci#define TSI721_LUT_DATA0_ADD 0xfffff000 24662306a36Sopenharmony_ci#define TSI721_LUT_DATA0_RDTYPE 0x00000f00 24762306a36Sopenharmony_ci#define TSI721_LUT_DATA0_NREAD 0x00000100 24862306a36Sopenharmony_ci#define TSI721_LUT_DATA0_MNTRD 0x00000200 24962306a36Sopenharmony_ci#define TSI721_LUT_DATA0_RDCRF 0x00000020 25062306a36Sopenharmony_ci#define TSI721_LUT_DATA0_WRCRF 0x00000010 25162306a36Sopenharmony_ci#define TSI721_LUT_DATA0_WRTYPE 0x0000000f 25262306a36Sopenharmony_ci#define TSI721_LUT_DATA0_NWR 0x00000001 25362306a36Sopenharmony_ci#define TSI721_LUT_DATA0_MNTWR 0x00000002 25462306a36Sopenharmony_ci#define TSI721_LUT_DATA0_NWR_R 0x00000004 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci#define TSI721_LUT_DATA1 0x41308 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci#define TSI721_LUT_DATA2 0x4130c 25962306a36Sopenharmony_ci#define TSI721_LUT_DATA2_HC 0xff000000 26062306a36Sopenharmony_ci#define TSI721_LUT_DATA2_ADD65 0x000c0000 26162306a36Sopenharmony_ci#define TSI721_LUT_DATA2_TT 0x00030000 26262306a36Sopenharmony_ci#define TSI721_LUT_DATA2_DSTID 0x0000ffff 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci#define TSI721_PC2SR_INTE 0x41310 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci#define TSI721_DEVCTL 0x48004 26762306a36Sopenharmony_ci#define TSI721_DEVCTL_SRBOOT_CMPL 0x00000004 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci#define TSI721_I2C_INT_ENABLE 0x49120 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci/* 27262306a36Sopenharmony_ci * Block DMA Engine Registers 27362306a36Sopenharmony_ci * x = 0..7 27462306a36Sopenharmony_ci */ 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci#define TSI721_DMAC_BASE(x) (0x51000 + (x) * 0x1000) 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci#define TSI721_DMAC_DWRCNT 0x000 27962306a36Sopenharmony_ci#define TSI721_DMAC_DRDCNT 0x004 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci#define TSI721_DMAC_CTL 0x008 28262306a36Sopenharmony_ci#define TSI721_DMAC_CTL_SUSP 0x00000002 28362306a36Sopenharmony_ci#define TSI721_DMAC_CTL_INIT 0x00000001 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci#define TSI721_DMAC_INT 0x00c 28662306a36Sopenharmony_ci#define TSI721_DMAC_INT_STFULL 0x00000010 28762306a36Sopenharmony_ci#define TSI721_DMAC_INT_DONE 0x00000008 28862306a36Sopenharmony_ci#define TSI721_DMAC_INT_SUSP 0x00000004 28962306a36Sopenharmony_ci#define TSI721_DMAC_INT_ERR 0x00000002 29062306a36Sopenharmony_ci#define TSI721_DMAC_INT_IOFDONE 0x00000001 29162306a36Sopenharmony_ci#define TSI721_DMAC_INT_ALL 0x0000001f 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci#define TSI721_DMAC_INTSET 0x010 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci#define TSI721_DMAC_STS 0x014 29662306a36Sopenharmony_ci#define TSI721_DMAC_STS_ABORT 0x00400000 29762306a36Sopenharmony_ci#define TSI721_DMAC_STS_RUN 0x00200000 29862306a36Sopenharmony_ci#define TSI721_DMAC_STS_CS 0x001f0000 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci#define TSI721_DMAC_INTE 0x018 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci#define TSI721_DMAC_DPTRL 0x024 30362306a36Sopenharmony_ci#define TSI721_DMAC_DPTRL_MASK 0xffffffe0 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci#define TSI721_DMAC_DPTRH 0x028 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci#define TSI721_DMAC_DSBL 0x02c 30862306a36Sopenharmony_ci#define TSI721_DMAC_DSBL_MASK 0xffffffc0 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci#define TSI721_DMAC_DSBH 0x030 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci#define TSI721_DMAC_DSSZ 0x034 31362306a36Sopenharmony_ci#define TSI721_DMAC_DSSZ_SIZE_M 0x0000000f 31462306a36Sopenharmony_ci#define TSI721_DMAC_DSSZ_SIZE(size) (__fls(size) - 4) 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci#define TSI721_DMAC_DSRP 0x038 31762306a36Sopenharmony_ci#define TSI721_DMAC_DSRP_MASK 0x0007ffff 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci#define TSI721_DMAC_DSWP 0x03c 32062306a36Sopenharmony_ci#define TSI721_DMAC_DSWP_MASK 0x0007ffff 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci#define TSI721_BDMA_INTE 0x5f000 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci/* 32562306a36Sopenharmony_ci * Messaging definitions 32662306a36Sopenharmony_ci */ 32762306a36Sopenharmony_ci#define TSI721_MSG_BUFFER_SIZE RIO_MAX_MSG_SIZE 32862306a36Sopenharmony_ci#define TSI721_MSG_MAX_SIZE RIO_MAX_MSG_SIZE 32962306a36Sopenharmony_ci#define TSI721_IMSG_MAXCH 8 33062306a36Sopenharmony_ci#define TSI721_IMSG_CHNUM TSI721_IMSG_MAXCH 33162306a36Sopenharmony_ci#define TSI721_IMSGD_MIN_RING_SIZE 32 33262306a36Sopenharmony_ci#define TSI721_IMSGD_RING_SIZE 512 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci#define TSI721_OMSG_CHNUM 4 /* One channel per MBOX */ 33562306a36Sopenharmony_ci#define TSI721_OMSGD_MIN_RING_SIZE 32 33662306a36Sopenharmony_ci#define TSI721_OMSGD_RING_SIZE 512 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci/* 33962306a36Sopenharmony_ci * Outbound Messaging Engine Registers 34062306a36Sopenharmony_ci * x = 0..7 34162306a36Sopenharmony_ci */ 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci#define TSI721_OBDMAC_DWRCNT(x) (0x61000 + (x) * 0x1000) 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci#define TSI721_OBDMAC_DRDCNT(x) (0x61004 + (x) * 0x1000) 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci#define TSI721_OBDMAC_CTL(x) (0x61008 + (x) * 0x1000) 34862306a36Sopenharmony_ci#define TSI721_OBDMAC_CTL_MASK 0x00000007 34962306a36Sopenharmony_ci#define TSI721_OBDMAC_CTL_RETRY_THR 0x00000004 35062306a36Sopenharmony_ci#define TSI721_OBDMAC_CTL_SUSPEND 0x00000002 35162306a36Sopenharmony_ci#define TSI721_OBDMAC_CTL_INIT 0x00000001 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci#define TSI721_OBDMAC_INT(x) (0x6100c + (x) * 0x1000) 35462306a36Sopenharmony_ci#define TSI721_OBDMAC_INTSET(x) (0x61010 + (x) * 0x1000) 35562306a36Sopenharmony_ci#define TSI721_OBDMAC_INTE(x) (0x61018 + (x) * 0x1000) 35662306a36Sopenharmony_ci#define TSI721_OBDMAC_INT_MASK 0x0000001F 35762306a36Sopenharmony_ci#define TSI721_OBDMAC_INT_ST_FULL 0x00000010 35862306a36Sopenharmony_ci#define TSI721_OBDMAC_INT_DONE 0x00000008 35962306a36Sopenharmony_ci#define TSI721_OBDMAC_INT_SUSPENDED 0x00000004 36062306a36Sopenharmony_ci#define TSI721_OBDMAC_INT_ERROR 0x00000002 36162306a36Sopenharmony_ci#define TSI721_OBDMAC_INT_IOF_DONE 0x00000001 36262306a36Sopenharmony_ci#define TSI721_OBDMAC_INT_ALL TSI721_OBDMAC_INT_MASK 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci#define TSI721_OBDMAC_STS(x) (0x61014 + (x) * 0x1000) 36562306a36Sopenharmony_ci#define TSI721_OBDMAC_STS_MASK 0x007f0000 36662306a36Sopenharmony_ci#define TSI721_OBDMAC_STS_ABORT 0x00400000 36762306a36Sopenharmony_ci#define TSI721_OBDMAC_STS_RUN 0x00200000 36862306a36Sopenharmony_ci#define TSI721_OBDMAC_STS_CS 0x001f0000 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci#define TSI721_OBDMAC_PWE(x) (0x6101c + (x) * 0x1000) 37162306a36Sopenharmony_ci#define TSI721_OBDMAC_PWE_MASK 0x00000002 37262306a36Sopenharmony_ci#define TSI721_OBDMAC_PWE_ERROR_EN 0x00000002 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci#define TSI721_OBDMAC_DPTRL(x) (0x61020 + (x) * 0x1000) 37562306a36Sopenharmony_ci#define TSI721_OBDMAC_DPTRL_MASK 0xfffffff0 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci#define TSI721_OBDMAC_DPTRH(x) (0x61024 + (x) * 0x1000) 37862306a36Sopenharmony_ci#define TSI721_OBDMAC_DPTRH_MASK 0xffffffff 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci#define TSI721_OBDMAC_DSBL(x) (0x61040 + (x) * 0x1000) 38162306a36Sopenharmony_ci#define TSI721_OBDMAC_DSBL_MASK 0xffffffc0 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci#define TSI721_OBDMAC_DSBH(x) (0x61044 + (x) * 0x1000) 38462306a36Sopenharmony_ci#define TSI721_OBDMAC_DSBH_MASK 0xffffffff 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci#define TSI721_OBDMAC_DSSZ(x) (0x61048 + (x) * 0x1000) 38762306a36Sopenharmony_ci#define TSI721_OBDMAC_DSSZ_MASK 0x0000000f 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci#define TSI721_OBDMAC_DSRP(x) (0x6104c + (x) * 0x1000) 39062306a36Sopenharmony_ci#define TSI721_OBDMAC_DSRP_MASK 0x0007ffff 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci#define TSI721_OBDMAC_DSWP(x) (0x61050 + (x) * 0x1000) 39362306a36Sopenharmony_ci#define TSI721_OBDMAC_DSWP_MASK 0x0007ffff 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci#define TSI721_RQRPTO 0x60010 39662306a36Sopenharmony_ci#define TSI721_RQRPTO_MASK 0x00ffffff 39762306a36Sopenharmony_ci#define TSI721_RQRPTO_VAL 400 /* Response TO value */ 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci/* 40062306a36Sopenharmony_ci * Inbound Messaging Engine Registers 40162306a36Sopenharmony_ci * x = 0..7 40262306a36Sopenharmony_ci */ 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci#define TSI721_IB_DEVID_GLOBAL 0xffff 40562306a36Sopenharmony_ci#define TSI721_IBDMAC_FQBL(x) (0x61200 + (x) * 0x1000) 40662306a36Sopenharmony_ci#define TSI721_IBDMAC_FQBL_MASK 0xffffffc0 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci#define TSI721_IBDMAC_FQBH(x) (0x61204 + (x) * 0x1000) 40962306a36Sopenharmony_ci#define TSI721_IBDMAC_FQBH_MASK 0xffffffff 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci#define TSI721_IBDMAC_FQSZ_ENTRY_INX TSI721_IMSGD_RING_SIZE 41262306a36Sopenharmony_ci#define TSI721_IBDMAC_FQSZ(x) (0x61208 + (x) * 0x1000) 41362306a36Sopenharmony_ci#define TSI721_IBDMAC_FQSZ_MASK 0x0000000f 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci#define TSI721_IBDMAC_FQRP(x) (0x6120c + (x) * 0x1000) 41662306a36Sopenharmony_ci#define TSI721_IBDMAC_FQRP_MASK 0x0007ffff 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci#define TSI721_IBDMAC_FQWP(x) (0x61210 + (x) * 0x1000) 41962306a36Sopenharmony_ci#define TSI721_IBDMAC_FQWP_MASK 0x0007ffff 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_ci#define TSI721_IBDMAC_FQTH(x) (0x61214 + (x) * 0x1000) 42262306a36Sopenharmony_ci#define TSI721_IBDMAC_FQTH_MASK 0x0007ffff 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci#define TSI721_IB_DEVID 0x60020 42562306a36Sopenharmony_ci#define TSI721_IB_DEVID_MASK 0x0000ffff 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci#define TSI721_IBDMAC_CTL(x) (0x61240 + (x) * 0x1000) 42862306a36Sopenharmony_ci#define TSI721_IBDMAC_CTL_MASK 0x00000003 42962306a36Sopenharmony_ci#define TSI721_IBDMAC_CTL_SUSPEND 0x00000002 43062306a36Sopenharmony_ci#define TSI721_IBDMAC_CTL_INIT 0x00000001 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci#define TSI721_IBDMAC_STS(x) (0x61244 + (x) * 0x1000) 43362306a36Sopenharmony_ci#define TSI721_IBDMAC_STS_MASK 0x007f0000 43462306a36Sopenharmony_ci#define TSI721_IBSMAC_STS_ABORT 0x00400000 43562306a36Sopenharmony_ci#define TSI721_IBSMAC_STS_RUN 0x00200000 43662306a36Sopenharmony_ci#define TSI721_IBSMAC_STS_CS 0x001f0000 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci#define TSI721_IBDMAC_INT(x) (0x61248 + (x) * 0x1000) 43962306a36Sopenharmony_ci#define TSI721_IBDMAC_INTSET(x) (0x6124c + (x) * 0x1000) 44062306a36Sopenharmony_ci#define TSI721_IBDMAC_INTE(x) (0x61250 + (x) * 0x1000) 44162306a36Sopenharmony_ci#define TSI721_IBDMAC_INT_MASK 0x0000100f 44262306a36Sopenharmony_ci#define TSI721_IBDMAC_INT_SRTO 0x00001000 44362306a36Sopenharmony_ci#define TSI721_IBDMAC_INT_SUSPENDED 0x00000008 44462306a36Sopenharmony_ci#define TSI721_IBDMAC_INT_PC_ERROR 0x00000004 44562306a36Sopenharmony_ci#define TSI721_IBDMAC_INT_FQ_LOW 0x00000002 44662306a36Sopenharmony_ci#define TSI721_IBDMAC_INT_DQ_RCV 0x00000001 44762306a36Sopenharmony_ci#define TSI721_IBDMAC_INT_ALL TSI721_IBDMAC_INT_MASK 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci#define TSI721_IBDMAC_PWE(x) (0x61254 + (x) * 0x1000) 45062306a36Sopenharmony_ci#define TSI721_IBDMAC_PWE_MASK 0x00001700 45162306a36Sopenharmony_ci#define TSI721_IBDMAC_PWE_SRTO 0x00001000 45262306a36Sopenharmony_ci#define TSI721_IBDMAC_PWE_ILL_FMT 0x00000400 45362306a36Sopenharmony_ci#define TSI721_IBDMAC_PWE_ILL_DEC 0x00000200 45462306a36Sopenharmony_ci#define TSI721_IBDMAC_PWE_IMP_SP 0x00000100 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ci#define TSI721_IBDMAC_DQBL(x) (0x61300 + (x) * 0x1000) 45762306a36Sopenharmony_ci#define TSI721_IBDMAC_DQBL_MASK 0xffffffc0 45862306a36Sopenharmony_ci#define TSI721_IBDMAC_DQBL_ADDR 0xffffffc0 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci#define TSI721_IBDMAC_DQBH(x) (0x61304 + (x) * 0x1000) 46162306a36Sopenharmony_ci#define TSI721_IBDMAC_DQBH_MASK 0xffffffff 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci#define TSI721_IBDMAC_DQRP(x) (0x61308 + (x) * 0x1000) 46462306a36Sopenharmony_ci#define TSI721_IBDMAC_DQRP_MASK 0x0007ffff 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci#define TSI721_IBDMAC_DQWR(x) (0x6130c + (x) * 0x1000) 46762306a36Sopenharmony_ci#define TSI721_IBDMAC_DQWR_MASK 0x0007ffff 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_ci#define TSI721_IBDMAC_DQSZ(x) (0x61314 + (x) * 0x1000) 47062306a36Sopenharmony_ci#define TSI721_IBDMAC_DQSZ_MASK 0x0000000f 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci/* 47362306a36Sopenharmony_ci * Messaging Engine Interrupts 47462306a36Sopenharmony_ci */ 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci#define TSI721_SMSG_PWE 0x6a004 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci#define TSI721_SMSG_INTE 0x6a000 47962306a36Sopenharmony_ci#define TSI721_SMSG_INT 0x6a008 48062306a36Sopenharmony_ci#define TSI721_SMSG_INTSET 0x6a010 48162306a36Sopenharmony_ci#define TSI721_SMSG_INT_MASK 0x0086ffff 48262306a36Sopenharmony_ci#define TSI721_SMSG_INT_UNS_RSP 0x00800000 48362306a36Sopenharmony_ci#define TSI721_SMSG_INT_ECC_NCOR 0x00040000 48462306a36Sopenharmony_ci#define TSI721_SMSG_INT_ECC_COR 0x00020000 48562306a36Sopenharmony_ci#define TSI721_SMSG_INT_ECC_NCOR_CH 0x0000ff00 48662306a36Sopenharmony_ci#define TSI721_SMSG_INT_ECC_COR_CH 0x000000ff 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_ci#define TSI721_SMSG_ECC_LOG 0x6a014 48962306a36Sopenharmony_ci#define TSI721_SMSG_ECC_LOG_MASK 0x00070007 49062306a36Sopenharmony_ci#define TSI721_SMSG_ECC_LOG_ECC_NCOR_M 0x00070000 49162306a36Sopenharmony_ci#define TSI721_SMSG_ECC_LOG_ECC_COR_M 0x00000007 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci#define TSI721_RETRY_GEN_CNT 0x6a100 49462306a36Sopenharmony_ci#define TSI721_RETRY_GEN_CNT_MASK 0xffffffff 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci#define TSI721_RETRY_RX_CNT 0x6a104 49762306a36Sopenharmony_ci#define TSI721_RETRY_RX_CNT_MASK 0xffffffff 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci#define TSI721_SMSG_ECC_COR_LOG(x) (0x6a300 + (x) * 4) 50062306a36Sopenharmony_ci#define TSI721_SMSG_ECC_COR_LOG_MASK 0x000000ff 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci#define TSI721_SMSG_ECC_NCOR(x) (0x6a340 + (x) * 4) 50362306a36Sopenharmony_ci#define TSI721_SMSG_ECC_NCOR_MASK 0x000000ff 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci/* 50662306a36Sopenharmony_ci * Block DMA Descriptors 50762306a36Sopenharmony_ci */ 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_cistruct tsi721_dma_desc { 51062306a36Sopenharmony_ci __le32 type_id; 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_ci#define TSI721_DMAD_DEVID 0x0000ffff 51362306a36Sopenharmony_ci#define TSI721_DMAD_CRF 0x00010000 51462306a36Sopenharmony_ci#define TSI721_DMAD_PRIO 0x00060000 51562306a36Sopenharmony_ci#define TSI721_DMAD_RTYPE 0x00780000 51662306a36Sopenharmony_ci#define TSI721_DMAD_IOF 0x08000000 51762306a36Sopenharmony_ci#define TSI721_DMAD_DTYPE 0xe0000000 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci __le32 bcount; 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_ci#define TSI721_DMAD_BCOUNT1 0x03ffffff /* if DTYPE == 1 */ 52262306a36Sopenharmony_ci#define TSI721_DMAD_BCOUNT2 0x0000000f /* if DTYPE == 2 */ 52362306a36Sopenharmony_ci#define TSI721_DMAD_TT 0x0c000000 52462306a36Sopenharmony_ci#define TSI721_DMAD_RADDR0 0xc0000000 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci union { 52762306a36Sopenharmony_ci __le32 raddr_lo; /* if DTYPE == (1 || 2) */ 52862306a36Sopenharmony_ci __le32 next_lo; /* if DTYPE == 3 */ 52962306a36Sopenharmony_ci }; 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_ci#define TSI721_DMAD_CFGOFF 0x00ffffff 53262306a36Sopenharmony_ci#define TSI721_DMAD_HOPCNT 0xff000000 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_ci union { 53562306a36Sopenharmony_ci __le32 raddr_hi; /* if DTYPE == (1 || 2) */ 53662306a36Sopenharmony_ci __le32 next_hi; /* if DTYPE == 3 */ 53762306a36Sopenharmony_ci }; 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_ci union { 54062306a36Sopenharmony_ci struct { /* if DTYPE == 1 */ 54162306a36Sopenharmony_ci __le32 bufptr_lo; 54262306a36Sopenharmony_ci __le32 bufptr_hi; 54362306a36Sopenharmony_ci __le32 s_dist; 54462306a36Sopenharmony_ci __le32 s_size; 54562306a36Sopenharmony_ci } t1; 54662306a36Sopenharmony_ci __le32 data[4]; /* if DTYPE == 2 */ 54762306a36Sopenharmony_ci u32 reserved[4]; /* if DTYPE == 3 */ 54862306a36Sopenharmony_ci }; 54962306a36Sopenharmony_ci} __aligned(32); 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci/* 55262306a36Sopenharmony_ci * Inbound Messaging Descriptor 55362306a36Sopenharmony_ci */ 55462306a36Sopenharmony_cistruct tsi721_imsg_desc { 55562306a36Sopenharmony_ci __le32 type_id; 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ci#define TSI721_IMD_DEVID 0x0000ffff 55862306a36Sopenharmony_ci#define TSI721_IMD_CRF 0x00010000 55962306a36Sopenharmony_ci#define TSI721_IMD_PRIO 0x00060000 56062306a36Sopenharmony_ci#define TSI721_IMD_TT 0x00180000 56162306a36Sopenharmony_ci#define TSI721_IMD_DTYPE 0xe0000000 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci __le32 msg_info; 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ci#define TSI721_IMD_BCOUNT 0x00000ff8 56662306a36Sopenharmony_ci#define TSI721_IMD_SSIZE 0x0000f000 56762306a36Sopenharmony_ci#define TSI721_IMD_LETER 0x00030000 56862306a36Sopenharmony_ci#define TSI721_IMD_XMBOX 0x003c0000 56962306a36Sopenharmony_ci#define TSI721_IMD_MBOX 0x00c00000 57062306a36Sopenharmony_ci#define TSI721_IMD_CS 0x78000000 57162306a36Sopenharmony_ci#define TSI721_IMD_HO 0x80000000 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_ci __le32 bufptr_lo; 57462306a36Sopenharmony_ci __le32 bufptr_hi; 57562306a36Sopenharmony_ci u32 reserved[12]; 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ci} __aligned(64); 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci/* 58062306a36Sopenharmony_ci * Outbound Messaging Descriptor 58162306a36Sopenharmony_ci */ 58262306a36Sopenharmony_cistruct tsi721_omsg_desc { 58362306a36Sopenharmony_ci __le32 type_id; 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci#define TSI721_OMD_DEVID 0x0000ffff 58662306a36Sopenharmony_ci#define TSI721_OMD_CRF 0x00010000 58762306a36Sopenharmony_ci#define TSI721_OMD_PRIO 0x00060000 58862306a36Sopenharmony_ci#define TSI721_OMD_IOF 0x08000000 58962306a36Sopenharmony_ci#define TSI721_OMD_DTYPE 0xe0000000 59062306a36Sopenharmony_ci#define TSI721_OMD_RSRVD 0x17f80000 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_ci __le32 msg_info; 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci#define TSI721_OMD_BCOUNT 0x00000ff8 59562306a36Sopenharmony_ci#define TSI721_OMD_SSIZE 0x0000f000 59662306a36Sopenharmony_ci#define TSI721_OMD_LETER 0x00030000 59762306a36Sopenharmony_ci#define TSI721_OMD_XMBOX 0x003c0000 59862306a36Sopenharmony_ci#define TSI721_OMD_MBOX 0x00c00000 59962306a36Sopenharmony_ci#define TSI721_OMD_TT 0x0c000000 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ci union { 60262306a36Sopenharmony_ci __le32 bufptr_lo; /* if DTYPE == 4 */ 60362306a36Sopenharmony_ci __le32 next_lo; /* if DTYPE == 5 */ 60462306a36Sopenharmony_ci }; 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ci union { 60762306a36Sopenharmony_ci __le32 bufptr_hi; /* if DTYPE == 4 */ 60862306a36Sopenharmony_ci __le32 next_hi; /* if DTYPE == 5 */ 60962306a36Sopenharmony_ci }; 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_ci} __aligned(16); 61262306a36Sopenharmony_ci 61362306a36Sopenharmony_cistruct tsi721_dma_sts { 61462306a36Sopenharmony_ci __le64 desc_sts[8]; 61562306a36Sopenharmony_ci} __aligned(64); 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_cistruct tsi721_desc_sts_fifo { 61862306a36Sopenharmony_ci union { 61962306a36Sopenharmony_ci __le64 da64; 62062306a36Sopenharmony_ci struct { 62162306a36Sopenharmony_ci __le32 lo; 62262306a36Sopenharmony_ci __le32 hi; 62362306a36Sopenharmony_ci } da32; 62462306a36Sopenharmony_ci } stat[8]; 62562306a36Sopenharmony_ci} __aligned(64); 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_ci/* Descriptor types for BDMA and Messaging blocks */ 62862306a36Sopenharmony_cienum dma_dtype { 62962306a36Sopenharmony_ci DTYPE1 = 1, /* Data Transfer DMA Descriptor */ 63062306a36Sopenharmony_ci DTYPE2 = 2, /* Immediate Data Transfer DMA Descriptor */ 63162306a36Sopenharmony_ci DTYPE3 = 3, /* Block Pointer DMA Descriptor */ 63262306a36Sopenharmony_ci DTYPE4 = 4, /* Outbound Msg DMA Descriptor */ 63362306a36Sopenharmony_ci DTYPE5 = 5, /* OB Messaging Block Pointer Descriptor */ 63462306a36Sopenharmony_ci DTYPE6 = 6 /* Inbound Messaging Descriptor */ 63562306a36Sopenharmony_ci}; 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_cienum dma_rtype { 63862306a36Sopenharmony_ci NREAD = 0, 63962306a36Sopenharmony_ci LAST_NWRITE_R = 1, 64062306a36Sopenharmony_ci ALL_NWRITE = 2, 64162306a36Sopenharmony_ci ALL_NWRITE_R = 3, 64262306a36Sopenharmony_ci MAINT_RD = 4, 64362306a36Sopenharmony_ci MAINT_WR = 5 64462306a36Sopenharmony_ci}; 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_ci/* 64762306a36Sopenharmony_ci * mport Driver Definitions 64862306a36Sopenharmony_ci */ 64962306a36Sopenharmony_ci#define TSI721_DMA_CHNUM TSI721_DMA_MAXCH 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_ci#define TSI721_DMACH_MAINT 7 /* DMA channel for maint requests */ 65262306a36Sopenharmony_ci#define TSI721_DMACH_MAINT_NBD 32 /* Number of BDs for maint requests */ 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ci#define TSI721_DMACH_DMA 1 /* DMA channel for data transfers */ 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_ci#define MSG_DMA_ENTRY_INX_TO_SIZE(x) ((0x10 << (x)) & 0xFFFF0) 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_cienum tsi721_smsg_int_flag { 65962306a36Sopenharmony_ci SMSG_INT_NONE = 0x00000000, 66062306a36Sopenharmony_ci SMSG_INT_ECC_COR_CH = 0x000000ff, 66162306a36Sopenharmony_ci SMSG_INT_ECC_NCOR_CH = 0x0000ff00, 66262306a36Sopenharmony_ci SMSG_INT_ECC_COR = 0x00020000, 66362306a36Sopenharmony_ci SMSG_INT_ECC_NCOR = 0x00040000, 66462306a36Sopenharmony_ci SMSG_INT_UNS_RSP = 0x00800000, 66562306a36Sopenharmony_ci SMSG_INT_ALL = 0x0006ffff 66662306a36Sopenharmony_ci}; 66762306a36Sopenharmony_ci 66862306a36Sopenharmony_ci/* Structures */ 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ci#ifdef CONFIG_RAPIDIO_DMA_ENGINE 67162306a36Sopenharmony_ci 67262306a36Sopenharmony_ci#define TSI721_BDMA_MAX_BCOUNT (TSI721_DMAD_BCOUNT1 + 1) 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_cistruct tsi721_tx_desc { 67562306a36Sopenharmony_ci struct dma_async_tx_descriptor txd; 67662306a36Sopenharmony_ci u16 destid; 67762306a36Sopenharmony_ci /* low 64-bits of 66-bit RIO address */ 67862306a36Sopenharmony_ci u64 rio_addr; 67962306a36Sopenharmony_ci /* upper 2-bits of 66-bit RIO address */ 68062306a36Sopenharmony_ci u8 rio_addr_u; 68162306a36Sopenharmony_ci enum dma_rtype rtype; 68262306a36Sopenharmony_ci struct list_head desc_node; 68362306a36Sopenharmony_ci struct scatterlist *sg; 68462306a36Sopenharmony_ci unsigned int sg_len; 68562306a36Sopenharmony_ci enum dma_status status; 68662306a36Sopenharmony_ci}; 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_cistruct tsi721_bdma_chan { 68962306a36Sopenharmony_ci int id; 69062306a36Sopenharmony_ci void __iomem *regs; 69162306a36Sopenharmony_ci int bd_num; /* number of HW buffer descriptors */ 69262306a36Sopenharmony_ci void *bd_base; /* start of DMA descriptors */ 69362306a36Sopenharmony_ci dma_addr_t bd_phys; 69462306a36Sopenharmony_ci void *sts_base; /* start of DMA BD status FIFO */ 69562306a36Sopenharmony_ci dma_addr_t sts_phys; 69662306a36Sopenharmony_ci int sts_size; 69762306a36Sopenharmony_ci u32 sts_rdptr; 69862306a36Sopenharmony_ci u32 wr_count; 69962306a36Sopenharmony_ci u32 wr_count_next; 70062306a36Sopenharmony_ci 70162306a36Sopenharmony_ci struct dma_chan dchan; 70262306a36Sopenharmony_ci struct tsi721_tx_desc *tx_desc; 70362306a36Sopenharmony_ci spinlock_t lock; 70462306a36Sopenharmony_ci struct tsi721_tx_desc *active_tx; 70562306a36Sopenharmony_ci struct list_head queue; 70662306a36Sopenharmony_ci struct list_head free_list; 70762306a36Sopenharmony_ci struct tasklet_struct tasklet; 70862306a36Sopenharmony_ci bool active; 70962306a36Sopenharmony_ci}; 71062306a36Sopenharmony_ci 71162306a36Sopenharmony_ci#endif /* CONFIG_RAPIDIO_DMA_ENGINE */ 71262306a36Sopenharmony_ci 71362306a36Sopenharmony_cistruct tsi721_bdma_maint { 71462306a36Sopenharmony_ci int ch_id; /* BDMA channel number */ 71562306a36Sopenharmony_ci int bd_num; /* number of buffer descriptors */ 71662306a36Sopenharmony_ci void *bd_base; /* start of DMA descriptors */ 71762306a36Sopenharmony_ci dma_addr_t bd_phys; 71862306a36Sopenharmony_ci void *sts_base; /* start of DMA BD status FIFO */ 71962306a36Sopenharmony_ci dma_addr_t sts_phys; 72062306a36Sopenharmony_ci int sts_size; 72162306a36Sopenharmony_ci}; 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_cistruct tsi721_imsg_ring { 72462306a36Sopenharmony_ci u32 size; 72562306a36Sopenharmony_ci /* VA/PA of data buffers for incoming messages */ 72662306a36Sopenharmony_ci void *buf_base; 72762306a36Sopenharmony_ci dma_addr_t buf_phys; 72862306a36Sopenharmony_ci /* VA/PA of circular free buffer list */ 72962306a36Sopenharmony_ci void *imfq_base; 73062306a36Sopenharmony_ci dma_addr_t imfq_phys; 73162306a36Sopenharmony_ci /* VA/PA of Inbound message descriptors */ 73262306a36Sopenharmony_ci void *imd_base; 73362306a36Sopenharmony_ci dma_addr_t imd_phys; 73462306a36Sopenharmony_ci /* Inbound Queue buffer pointers */ 73562306a36Sopenharmony_ci void *imq_base[TSI721_IMSGD_RING_SIZE]; 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_ci u32 rx_slot; 73862306a36Sopenharmony_ci void *dev_id; 73962306a36Sopenharmony_ci u32 fq_wrptr; 74062306a36Sopenharmony_ci u32 desc_rdptr; 74162306a36Sopenharmony_ci spinlock_t lock; 74262306a36Sopenharmony_ci}; 74362306a36Sopenharmony_ci 74462306a36Sopenharmony_cistruct tsi721_omsg_ring { 74562306a36Sopenharmony_ci u32 size; 74662306a36Sopenharmony_ci /* VA/PA of OB Msg descriptors */ 74762306a36Sopenharmony_ci void *omd_base; 74862306a36Sopenharmony_ci dma_addr_t omd_phys; 74962306a36Sopenharmony_ci /* VA/PA of OB Msg data buffers */ 75062306a36Sopenharmony_ci void *omq_base[TSI721_OMSGD_RING_SIZE]; 75162306a36Sopenharmony_ci dma_addr_t omq_phys[TSI721_OMSGD_RING_SIZE]; 75262306a36Sopenharmony_ci /* VA/PA of OB Msg descriptor status FIFO */ 75362306a36Sopenharmony_ci void *sts_base; 75462306a36Sopenharmony_ci dma_addr_t sts_phys; 75562306a36Sopenharmony_ci u32 sts_size; /* # of allocated status entries */ 75662306a36Sopenharmony_ci u32 sts_rdptr; 75762306a36Sopenharmony_ci 75862306a36Sopenharmony_ci u32 tx_slot; 75962306a36Sopenharmony_ci void *dev_id; 76062306a36Sopenharmony_ci u32 wr_count; 76162306a36Sopenharmony_ci spinlock_t lock; 76262306a36Sopenharmony_ci}; 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_cienum tsi721_flags { 76562306a36Sopenharmony_ci TSI721_USING_MSI = (1 << 0), 76662306a36Sopenharmony_ci TSI721_USING_MSIX = (1 << 1), 76762306a36Sopenharmony_ci TSI721_IMSGID_SET = (1 << 2), 76862306a36Sopenharmony_ci}; 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_ci#ifdef CONFIG_PCI_MSI 77162306a36Sopenharmony_ci/* 77262306a36Sopenharmony_ci * MSI-X Table Entries (0 ... 69) 77362306a36Sopenharmony_ci */ 77462306a36Sopenharmony_ci#define TSI721_MSIX_DMACH_DONE(x) (0 + (x)) 77562306a36Sopenharmony_ci#define TSI721_MSIX_DMACH_INT(x) (8 + (x)) 77662306a36Sopenharmony_ci#define TSI721_MSIX_BDMA_INT 16 77762306a36Sopenharmony_ci#define TSI721_MSIX_OMSG_DONE(x) (17 + (x)) 77862306a36Sopenharmony_ci#define TSI721_MSIX_OMSG_INT(x) (25 + (x)) 77962306a36Sopenharmony_ci#define TSI721_MSIX_IMSG_DQ_RCV(x) (33 + (x)) 78062306a36Sopenharmony_ci#define TSI721_MSIX_IMSG_INT(x) (41 + (x)) 78162306a36Sopenharmony_ci#define TSI721_MSIX_MSG_INT 49 78262306a36Sopenharmony_ci#define TSI721_MSIX_SR2PC_IDBQ_RCV(x) (50 + (x)) 78362306a36Sopenharmony_ci#define TSI721_MSIX_SR2PC_CH_INT(x) (58 + (x)) 78462306a36Sopenharmony_ci#define TSI721_MSIX_SR2PC_INT 66 78562306a36Sopenharmony_ci#define TSI721_MSIX_PC2SR_INT 67 78662306a36Sopenharmony_ci#define TSI721_MSIX_SRIO_MAC_INT 68 78762306a36Sopenharmony_ci#define TSI721_MSIX_I2C_INT 69 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_ci/* MSI-X vector and init table entry indexes */ 79062306a36Sopenharmony_cienum tsi721_msix_vect { 79162306a36Sopenharmony_ci TSI721_VECT_IDB, 79262306a36Sopenharmony_ci TSI721_VECT_PWRX, /* PW_RX is part of SRIO MAC Interrupt reporting */ 79362306a36Sopenharmony_ci TSI721_VECT_OMB0_DONE, 79462306a36Sopenharmony_ci TSI721_VECT_OMB1_DONE, 79562306a36Sopenharmony_ci TSI721_VECT_OMB2_DONE, 79662306a36Sopenharmony_ci TSI721_VECT_OMB3_DONE, 79762306a36Sopenharmony_ci TSI721_VECT_OMB0_INT, 79862306a36Sopenharmony_ci TSI721_VECT_OMB1_INT, 79962306a36Sopenharmony_ci TSI721_VECT_OMB2_INT, 80062306a36Sopenharmony_ci TSI721_VECT_OMB3_INT, 80162306a36Sopenharmony_ci TSI721_VECT_IMB0_RCV, 80262306a36Sopenharmony_ci TSI721_VECT_IMB1_RCV, 80362306a36Sopenharmony_ci TSI721_VECT_IMB2_RCV, 80462306a36Sopenharmony_ci TSI721_VECT_IMB3_RCV, 80562306a36Sopenharmony_ci TSI721_VECT_IMB0_INT, 80662306a36Sopenharmony_ci TSI721_VECT_IMB1_INT, 80762306a36Sopenharmony_ci TSI721_VECT_IMB2_INT, 80862306a36Sopenharmony_ci TSI721_VECT_IMB3_INT, 80962306a36Sopenharmony_ci#ifdef CONFIG_RAPIDIO_DMA_ENGINE 81062306a36Sopenharmony_ci TSI721_VECT_DMA0_DONE, 81162306a36Sopenharmony_ci TSI721_VECT_DMA1_DONE, 81262306a36Sopenharmony_ci TSI721_VECT_DMA2_DONE, 81362306a36Sopenharmony_ci TSI721_VECT_DMA3_DONE, 81462306a36Sopenharmony_ci TSI721_VECT_DMA4_DONE, 81562306a36Sopenharmony_ci TSI721_VECT_DMA5_DONE, 81662306a36Sopenharmony_ci TSI721_VECT_DMA6_DONE, 81762306a36Sopenharmony_ci TSI721_VECT_DMA7_DONE, 81862306a36Sopenharmony_ci TSI721_VECT_DMA0_INT, 81962306a36Sopenharmony_ci TSI721_VECT_DMA1_INT, 82062306a36Sopenharmony_ci TSI721_VECT_DMA2_INT, 82162306a36Sopenharmony_ci TSI721_VECT_DMA3_INT, 82262306a36Sopenharmony_ci TSI721_VECT_DMA4_INT, 82362306a36Sopenharmony_ci TSI721_VECT_DMA5_INT, 82462306a36Sopenharmony_ci TSI721_VECT_DMA6_INT, 82562306a36Sopenharmony_ci TSI721_VECT_DMA7_INT, 82662306a36Sopenharmony_ci#endif /* CONFIG_RAPIDIO_DMA_ENGINE */ 82762306a36Sopenharmony_ci TSI721_VECT_MAX 82862306a36Sopenharmony_ci}; 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_ci#define IRQ_DEVICE_NAME_MAX 64 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_cistruct msix_irq { 83362306a36Sopenharmony_ci u16 vector; 83462306a36Sopenharmony_ci char irq_name[IRQ_DEVICE_NAME_MAX]; 83562306a36Sopenharmony_ci}; 83662306a36Sopenharmony_ci#endif /* CONFIG_PCI_MSI */ 83762306a36Sopenharmony_ci 83862306a36Sopenharmony_cistruct tsi721_ib_win_mapping { 83962306a36Sopenharmony_ci struct list_head node; 84062306a36Sopenharmony_ci dma_addr_t lstart; 84162306a36Sopenharmony_ci}; 84262306a36Sopenharmony_ci 84362306a36Sopenharmony_cistruct tsi721_ib_win { 84462306a36Sopenharmony_ci u64 rstart; 84562306a36Sopenharmony_ci u32 size; 84662306a36Sopenharmony_ci dma_addr_t lstart; 84762306a36Sopenharmony_ci bool active; 84862306a36Sopenharmony_ci bool xlat; 84962306a36Sopenharmony_ci struct list_head mappings; 85062306a36Sopenharmony_ci}; 85162306a36Sopenharmony_ci 85262306a36Sopenharmony_cistruct tsi721_obw_bar { 85362306a36Sopenharmony_ci u64 base; 85462306a36Sopenharmony_ci u64 size; 85562306a36Sopenharmony_ci u64 free; 85662306a36Sopenharmony_ci}; 85762306a36Sopenharmony_ci 85862306a36Sopenharmony_cistruct tsi721_ob_win { 85962306a36Sopenharmony_ci u64 base; 86062306a36Sopenharmony_ci u32 size; 86162306a36Sopenharmony_ci u16 destid; 86262306a36Sopenharmony_ci u64 rstart; 86362306a36Sopenharmony_ci bool active; 86462306a36Sopenharmony_ci struct tsi721_obw_bar *pbar; 86562306a36Sopenharmony_ci}; 86662306a36Sopenharmony_ci 86762306a36Sopenharmony_cistruct tsi721_device { 86862306a36Sopenharmony_ci struct pci_dev *pdev; 86962306a36Sopenharmony_ci struct rio_mport mport; 87062306a36Sopenharmony_ci u32 flags; 87162306a36Sopenharmony_ci void __iomem *regs; 87262306a36Sopenharmony_ci#ifdef CONFIG_PCI_MSI 87362306a36Sopenharmony_ci struct msix_irq msix[TSI721_VECT_MAX]; 87462306a36Sopenharmony_ci#endif 87562306a36Sopenharmony_ci /* Doorbells */ 87662306a36Sopenharmony_ci void __iomem *odb_base; 87762306a36Sopenharmony_ci void *idb_base; 87862306a36Sopenharmony_ci dma_addr_t idb_dma; 87962306a36Sopenharmony_ci struct work_struct idb_work; 88062306a36Sopenharmony_ci u32 db_discard_count; 88162306a36Sopenharmony_ci 88262306a36Sopenharmony_ci /* Inbound Port-Write */ 88362306a36Sopenharmony_ci struct work_struct pw_work; 88462306a36Sopenharmony_ci struct kfifo pw_fifo; 88562306a36Sopenharmony_ci spinlock_t pw_fifo_lock; 88662306a36Sopenharmony_ci u32 pw_discard_count; 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_ci /* BDMA Engine */ 88962306a36Sopenharmony_ci struct tsi721_bdma_maint mdma; /* Maintenance rd/wr request channel */ 89062306a36Sopenharmony_ci 89162306a36Sopenharmony_ci#ifdef CONFIG_RAPIDIO_DMA_ENGINE 89262306a36Sopenharmony_ci struct tsi721_bdma_chan bdma[TSI721_DMA_CHNUM]; 89362306a36Sopenharmony_ci#endif 89462306a36Sopenharmony_ci 89562306a36Sopenharmony_ci /* Inbound Messaging */ 89662306a36Sopenharmony_ci int imsg_init[TSI721_IMSG_CHNUM]; 89762306a36Sopenharmony_ci struct tsi721_imsg_ring imsg_ring[TSI721_IMSG_CHNUM]; 89862306a36Sopenharmony_ci 89962306a36Sopenharmony_ci /* Outbound Messaging */ 90062306a36Sopenharmony_ci int omsg_init[TSI721_OMSG_CHNUM]; 90162306a36Sopenharmony_ci struct tsi721_omsg_ring omsg_ring[TSI721_OMSG_CHNUM]; 90262306a36Sopenharmony_ci 90362306a36Sopenharmony_ci /* Inbound Mapping Windows */ 90462306a36Sopenharmony_ci struct tsi721_ib_win ib_win[TSI721_IBWIN_NUM]; 90562306a36Sopenharmony_ci int ibwin_cnt; 90662306a36Sopenharmony_ci 90762306a36Sopenharmony_ci /* Outbound Mapping Windows */ 90862306a36Sopenharmony_ci struct tsi721_obw_bar p2r_bar[2]; 90962306a36Sopenharmony_ci struct tsi721_ob_win ob_win[TSI721_OBWIN_NUM]; 91062306a36Sopenharmony_ci int obwin_cnt; 91162306a36Sopenharmony_ci}; 91262306a36Sopenharmony_ci 91362306a36Sopenharmony_ci#ifdef CONFIG_RAPIDIO_DMA_ENGINE 91462306a36Sopenharmony_ciextern void tsi721_bdma_handler(struct tsi721_bdma_chan *bdma_chan); 91562306a36Sopenharmony_ciextern int tsi721_register_dma(struct tsi721_device *priv); 91662306a36Sopenharmony_ciextern void tsi721_unregister_dma(struct tsi721_device *priv); 91762306a36Sopenharmony_ciextern void tsi721_dma_stop_all(struct tsi721_device *priv); 91862306a36Sopenharmony_ci#else 91962306a36Sopenharmony_ci#define tsi721_dma_stop_all(priv) do {} while (0) 92062306a36Sopenharmony_ci#define tsi721_unregister_dma(priv) do {} while (0) 92162306a36Sopenharmony_ci#endif 92262306a36Sopenharmony_ci 92362306a36Sopenharmony_ci#endif 924