xref: /OK3568_Linux_fs/kernel/drivers/hid/intel-ish-hid/ipc/hw-ish-regs.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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