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