1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * ISH registers definitions 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2012-2016, Intel Corporation. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _ISHTP_ISH_REGS_H_ 9*4882a593Smuzhiyun #define _ISHTP_ISH_REGS_H_ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /*** IPC PCI Offsets and sizes ***/ 13*4882a593Smuzhiyun /* ISH IPC Base Address */ 14*4882a593Smuzhiyun #define IPC_REG_BASE 0x0000 15*4882a593Smuzhiyun /* Peripheral Interrupt Status Register */ 16*4882a593Smuzhiyun #define IPC_REG_PISR_CHV_AB (IPC_REG_BASE + 0x00) 17*4882a593Smuzhiyun /* Peripheral Interrupt Mask Register */ 18*4882a593Smuzhiyun #define IPC_REG_PIMR_CHV_AB (IPC_REG_BASE + 0x04) 19*4882a593Smuzhiyun /*BXT, CHV_K0*/ 20*4882a593Smuzhiyun /*Peripheral Interrupt Status Register */ 21*4882a593Smuzhiyun #define IPC_REG_PISR_BXT (IPC_REG_BASE + 0x0C) 22*4882a593Smuzhiyun /*Peripheral Interrupt Mask Register */ 23*4882a593Smuzhiyun #define IPC_REG_PIMR_BXT (IPC_REG_BASE + 0x08) 24*4882a593Smuzhiyun /***********************************/ 25*4882a593Smuzhiyun /* ISH Host Firmware status Register */ 26*4882a593Smuzhiyun #define IPC_REG_ISH_HOST_FWSTS (IPC_REG_BASE + 0x34) 27*4882a593Smuzhiyun /* Host Communication Register */ 28*4882a593Smuzhiyun #define IPC_REG_HOST_COMM (IPC_REG_BASE + 0x38) 29*4882a593Smuzhiyun /* Reset register */ 30*4882a593Smuzhiyun #define IPC_REG_ISH_RST (IPC_REG_BASE + 0x44) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* Inbound doorbell register Host to ISH */ 33*4882a593Smuzhiyun #define IPC_REG_HOST2ISH_DRBL (IPC_REG_BASE + 0x48) 34*4882a593Smuzhiyun /* Outbound doorbell register ISH to Host */ 35*4882a593Smuzhiyun #define IPC_REG_ISH2HOST_DRBL (IPC_REG_BASE + 0x54) 36*4882a593Smuzhiyun /* ISH to HOST message registers */ 37*4882a593Smuzhiyun #define IPC_REG_ISH2HOST_MSG (IPC_REG_BASE + 0x60) 38*4882a593Smuzhiyun /* HOST to ISH message registers */ 39*4882a593Smuzhiyun #define IPC_REG_HOST2ISH_MSG (IPC_REG_BASE + 0xE0) 40*4882a593Smuzhiyun /* REMAP2 to enable DMA (D3 RCR) */ 41*4882a593Smuzhiyun #define IPC_REG_ISH_RMP2 (IPC_REG_BASE + 0x368) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define IPC_REG_MAX (IPC_REG_BASE + 0x400) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /*** register bits - HISR ***/ 46*4882a593Smuzhiyun /* bit corresponds HOST2ISH interrupt in PISR and PIMR registers */ 47*4882a593Smuzhiyun #define IPC_INT_HOST2ISH_BIT (1<<0) 48*4882a593Smuzhiyun /***********************************/ 49*4882a593Smuzhiyun /*CHV_A0, CHV_B0*/ 50*4882a593Smuzhiyun /* bit corresponds ISH2HOST interrupt in PISR and PIMR registers */ 51*4882a593Smuzhiyun #define IPC_INT_ISH2HOST_BIT_CHV_AB (1<<3) 52*4882a593Smuzhiyun /*BXT, CHV_K0*/ 53*4882a593Smuzhiyun /* bit corresponds ISH2HOST interrupt in PISR and PIMR registers */ 54*4882a593Smuzhiyun #define IPC_INT_ISH2HOST_BIT_BXT (1<<0) 55*4882a593Smuzhiyun /***********************************/ 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /* bit corresponds ISH2HOST busy clear interrupt in PIMR register */ 58*4882a593Smuzhiyun #define IPC_INT_ISH2HOST_CLR_MASK_BIT (1<<11) 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun /* offset of ISH2HOST busy clear interrupt in IPC_BUSY_CLR register */ 61*4882a593Smuzhiyun #define IPC_INT_ISH2HOST_CLR_OFFS (0) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* bit corresponds ISH2HOST busy clear interrupt in IPC_BUSY_CLR register */ 64*4882a593Smuzhiyun #define IPC_INT_ISH2HOST_CLR_BIT (1<<IPC_INT_ISH2HOST_CLR_OFFS) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* bit corresponds busy bit in doorbell registers */ 67*4882a593Smuzhiyun #define IPC_DRBL_BUSY_OFFS (31) 68*4882a593Smuzhiyun #define IPC_DRBL_BUSY_BIT (1<<IPC_DRBL_BUSY_OFFS) 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun #define IPC_HOST_OWNS_MSG_OFFS (30) 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* 73*4882a593Smuzhiyun * A0: bit means that host owns MSGnn registers and is reading them. 74*4882a593Smuzhiyun * ISH FW may not write to them 75*4882a593Smuzhiyun */ 76*4882a593Smuzhiyun #define IPC_HOST_OWNS_MSG_BIT (1<<IPC_HOST_OWNS_MSG_OFFS) 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun /* 79*4882a593Smuzhiyun * Host status bits (HOSTCOMM) 80*4882a593Smuzhiyun */ 81*4882a593Smuzhiyun /* bit corresponds host ready bit in Host Status Register (HOST_COMM) */ 82*4882a593Smuzhiyun #define IPC_HOSTCOMM_READY_OFFS (7) 83*4882a593Smuzhiyun #define IPC_HOSTCOMM_READY_BIT (1<<IPC_HOSTCOMM_READY_OFFS) 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /***********************************/ 86*4882a593Smuzhiyun /*CHV_A0, CHV_B0*/ 87*4882a593Smuzhiyun #define IPC_HOSTCOMM_INT_EN_OFFS_CHV_AB (31) 88*4882a593Smuzhiyun #define IPC_HOSTCOMM_INT_EN_BIT_CHV_AB \ 89*4882a593Smuzhiyun (1<<IPC_HOSTCOMM_INT_EN_OFFS_CHV_AB) 90*4882a593Smuzhiyun /*BXT, CHV_K0*/ 91*4882a593Smuzhiyun #define IPC_PIMR_INT_EN_OFFS_BXT (0) 92*4882a593Smuzhiyun #define IPC_PIMR_INT_EN_BIT_BXT (1<<IPC_PIMR_INT_EN_OFFS_BXT) 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #define IPC_HOST2ISH_BUSYCLEAR_MASK_OFFS_BXT (8) 95*4882a593Smuzhiyun #define IPC_HOST2ISH_BUSYCLEAR_MASK_BIT \ 96*4882a593Smuzhiyun (1<<IPC_HOST2ISH_BUSYCLEAR_MASK_OFFS_BXT) 97*4882a593Smuzhiyun /***********************************/ 98*4882a593Smuzhiyun /* 99*4882a593Smuzhiyun * both Host and ISH have ILUP at bit 0 100*4882a593Smuzhiyun * bit corresponds host ready bit in both status registers 101*4882a593Smuzhiyun */ 102*4882a593Smuzhiyun #define IPC_ILUP_OFFS (0) 103*4882a593Smuzhiyun #define IPC_ILUP_BIT (1<<IPC_ILUP_OFFS) 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun /* 106*4882a593Smuzhiyun * ISH FW status bits in ISH FW Status Register 107*4882a593Smuzhiyun */ 108*4882a593Smuzhiyun #define IPC_ISH_FWSTS_SHIFT 12 109*4882a593Smuzhiyun #define IPC_ISH_FWSTS_MASK GENMASK(15, 12) 110*4882a593Smuzhiyun #define IPC_GET_ISH_FWSTS(status) \ 111*4882a593Smuzhiyun (((status) & IPC_ISH_FWSTS_MASK) >> IPC_ISH_FWSTS_SHIFT) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* 114*4882a593Smuzhiyun * FW status bits (relevant) 115*4882a593Smuzhiyun */ 116*4882a593Smuzhiyun #define IPC_FWSTS_ILUP 0x1 117*4882a593Smuzhiyun #define IPC_FWSTS_ISHTP_UP (1<<1) 118*4882a593Smuzhiyun #define IPC_FWSTS_DMA0 (1<<16) 119*4882a593Smuzhiyun #define IPC_FWSTS_DMA1 (1<<17) 120*4882a593Smuzhiyun #define IPC_FWSTS_DMA2 (1<<18) 121*4882a593Smuzhiyun #define IPC_FWSTS_DMA3 (1<<19) 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #define IPC_ISH_IN_DMA \ 124*4882a593Smuzhiyun (IPC_FWSTS_DMA0 | IPC_FWSTS_DMA1 | IPC_FWSTS_DMA2 | IPC_FWSTS_DMA3) 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* bit corresponds host ready bit in ISH FW Status Register */ 127*4882a593Smuzhiyun #define IPC_ISH_ISHTP_READY_OFFS (1) 128*4882a593Smuzhiyun #define IPC_ISH_ISHTP_READY_BIT (1<<IPC_ISH_ISHTP_READY_OFFS) 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun #define IPC_RMP2_DMA_ENABLED 0x1 /* Value to enable DMA, per D3 RCR */ 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #define IPC_MSG_MAX_SIZE 0x80 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun #define IPC_HEADER_LENGTH_MASK 0x03FF 136*4882a593Smuzhiyun #define IPC_HEADER_PROTOCOL_MASK 0x0F 137*4882a593Smuzhiyun #define IPC_HEADER_MNG_CMD_MASK 0x0F 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun #define IPC_HEADER_LENGTH_OFFSET 0 140*4882a593Smuzhiyun #define IPC_HEADER_PROTOCOL_OFFSET 10 141*4882a593Smuzhiyun #define IPC_HEADER_MNG_CMD_OFFSET 16 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #define IPC_HEADER_GET_LENGTH(drbl_reg) \ 144*4882a593Smuzhiyun (((drbl_reg) >> IPC_HEADER_LENGTH_OFFSET)&IPC_HEADER_LENGTH_MASK) 145*4882a593Smuzhiyun #define IPC_HEADER_GET_PROTOCOL(drbl_reg) \ 146*4882a593Smuzhiyun (((drbl_reg) >> IPC_HEADER_PROTOCOL_OFFSET)&IPC_HEADER_PROTOCOL_MASK) 147*4882a593Smuzhiyun #define IPC_HEADER_GET_MNG_CMD(drbl_reg) \ 148*4882a593Smuzhiyun (((drbl_reg) >> IPC_HEADER_MNG_CMD_OFFSET)&IPC_HEADER_MNG_CMD_MASK) 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define IPC_IS_BUSY(drbl_reg) \ 151*4882a593Smuzhiyun (((drbl_reg)&IPC_DRBL_BUSY_BIT) == ((uint32_t)IPC_DRBL_BUSY_BIT)) 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun /***********************************/ 154*4882a593Smuzhiyun /*CHV_A0, CHV_B0*/ 155*4882a593Smuzhiyun #define IPC_INT_FROM_ISH_TO_HOST_CHV_AB(drbl_reg) \ 156*4882a593Smuzhiyun (((drbl_reg)&IPC_INT_ISH2HOST_BIT_CHV_AB) == \ 157*4882a593Smuzhiyun ((u32)IPC_INT_ISH2HOST_BIT_CHV_AB)) 158*4882a593Smuzhiyun /*BXT, CHV_K0*/ 159*4882a593Smuzhiyun #define IPC_INT_FROM_ISH_TO_HOST_BXT(drbl_reg) \ 160*4882a593Smuzhiyun (((drbl_reg)&IPC_INT_ISH2HOST_BIT_BXT) == \ 161*4882a593Smuzhiyun ((u32)IPC_INT_ISH2HOST_BIT_BXT)) 162*4882a593Smuzhiyun /***********************************/ 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun #define IPC_BUILD_HEADER(length, protocol, busy) \ 165*4882a593Smuzhiyun (((busy)<<IPC_DRBL_BUSY_OFFS) | \ 166*4882a593Smuzhiyun ((protocol) << IPC_HEADER_PROTOCOL_OFFSET) | \ 167*4882a593Smuzhiyun ((length)<<IPC_HEADER_LENGTH_OFFSET)) 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun #define IPC_BUILD_MNG_MSG(cmd, length) \ 170*4882a593Smuzhiyun (((1)<<IPC_DRBL_BUSY_OFFS)| \ 171*4882a593Smuzhiyun ((IPC_PROTOCOL_MNG)<<IPC_HEADER_PROTOCOL_OFFSET)| \ 172*4882a593Smuzhiyun ((cmd)<<IPC_HEADER_MNG_CMD_OFFSET)| \ 173*4882a593Smuzhiyun ((length)<<IPC_HEADER_LENGTH_OFFSET)) 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #define IPC_SET_HOST_READY(host_status) \ 177*4882a593Smuzhiyun ((host_status) |= (IPC_HOSTCOMM_READY_BIT)) 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun #define IPC_SET_HOST_ILUP(host_status) \ 180*4882a593Smuzhiyun ((host_status) |= (IPC_ILUP_BIT)) 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun #define IPC_CLEAR_HOST_READY(host_status) \ 183*4882a593Smuzhiyun ((host_status) ^= (IPC_HOSTCOMM_READY_BIT)) 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun #define IPC_CLEAR_HOST_ILUP(host_status) \ 186*4882a593Smuzhiyun ((host_status) ^= (IPC_ILUP_BIT)) 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun /* todo - temp until PIMR HW ready */ 189*4882a593Smuzhiyun #define IPC_HOST_BUSY_READING_OFFS 6 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* bit corresponds host ready bit in Host Status Register (HOST_COMM) */ 192*4882a593Smuzhiyun #define IPC_HOST_BUSY_READING_BIT (1<<IPC_HOST_BUSY_READING_OFFS) 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun #define IPC_SET_HOST_BUSY_READING(host_status) \ 195*4882a593Smuzhiyun ((host_status) |= (IPC_HOST_BUSY_READING_BIT)) 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun #define IPC_CLEAR_HOST_BUSY_READING(host_status)\ 198*4882a593Smuzhiyun ((host_status) ^= (IPC_HOST_BUSY_READING_BIT)) 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun #define IPC_IS_ISH_ISHTP_READY(ish_status) \ 202*4882a593Smuzhiyun (((ish_status) & IPC_ISH_ISHTP_READY_BIT) == \ 203*4882a593Smuzhiyun ((uint32_t)IPC_ISH_ISHTP_READY_BIT)) 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun #define IPC_IS_ISH_ILUP(ish_status) \ 206*4882a593Smuzhiyun (((ish_status) & IPC_ILUP_BIT) == ((uint32_t)IPC_ILUP_BIT)) 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun #define IPC_PROTOCOL_ISHTP 1 210*4882a593Smuzhiyun #define IPC_PROTOCOL_MNG 3 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #define MNG_RX_CMPL_ENABLE 0 213*4882a593Smuzhiyun #define MNG_RX_CMPL_DISABLE 1 214*4882a593Smuzhiyun #define MNG_RX_CMPL_INDICATION 2 215*4882a593Smuzhiyun #define MNG_RESET_NOTIFY 3 216*4882a593Smuzhiyun #define MNG_RESET_NOTIFY_ACK 4 217*4882a593Smuzhiyun #define MNG_SYNC_FW_CLOCK 5 218*4882a593Smuzhiyun #define MNG_ILLEGAL_CMD 0xFF 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun #endif /* _ISHTP_ISH_REGS_H_ */ 221