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