xref: /openbmc/linux/drivers/net/ipa/gsi_reg.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1ca48b27bSAlex Elder /* SPDX-License-Identifier: GPL-2.0 */
2ca48b27bSAlex Elder 
3ca48b27bSAlex Elder /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
43c506addSAlex Elder  * Copyright (C) 2018-2023 Linaro Ltd.
5ca48b27bSAlex Elder  */
6ca48b27bSAlex Elder #ifndef _GSI_REG_H_
7ca48b27bSAlex Elder #define _GSI_REG_H_
8ca48b27bSAlex Elder 
93c506addSAlex Elder /* === Only "gsi.c" and "gsi_reg.c" should include this file === */
10ca48b27bSAlex Elder 
11ca48b27bSAlex Elder #include <linux/bits.h>
12ca48b27bSAlex Elder 
1355c49e5cSAlex Elder struct platform_device;
1455c49e5cSAlex Elder 
1555c49e5cSAlex Elder struct gsi;
1655c49e5cSAlex Elder 
17ca48b27bSAlex Elder /**
18ca48b27bSAlex Elder  * DOC: GSI Registers
19ca48b27bSAlex Elder  *
20ca48b27bSAlex Elder  * GSI registers are located within the "gsi" address space defined by Device
21ca48b27bSAlex Elder  * Tree.  The offset of each register within that space is specified by
22ca48b27bSAlex Elder  * symbols defined below.  The GSI address space is mapped to virtual memory
23ca48b27bSAlex Elder  * space in gsi_init().  All GSI registers are 32 bits wide.
24ca48b27bSAlex Elder  *
25ca48b27bSAlex Elder  * Each register type is duplicated for a number of instances of something.
26ca48b27bSAlex Elder  * For example, each GSI channel has its own set of registers defining its
27ca48b27bSAlex Elder  * configuration.  The offset to a channel's set of registers is computed
28ca48b27bSAlex Elder  * based on a "base" offset plus an additional "stride" amount computed
29ca48b27bSAlex Elder  * from the channel's ID.  For such registers, the offset is computed by a
30ca48b27bSAlex Elder  * function-like macro that takes a parameter used in the computation.
31ca48b27bSAlex Elder  *
32ca48b27bSAlex Elder  * The offset of a register dependent on execution environment is computed
33ca48b27bSAlex Elder  * by a macro that is supplied a parameter "ee".  The "ee" value is a member
34ca48b27bSAlex Elder  * of the gsi_ee_id enumerated type.
35ca48b27bSAlex Elder  *
36ca48b27bSAlex Elder  * The offset of a channel register is computed by a macro that is supplied a
37ca48b27bSAlex Elder  * parameter "ch".  The "ch" value is a channel id whose maximum value is 30
38ca48b27bSAlex Elder  * (though the actual limit is hardware-dependent).
39ca48b27bSAlex Elder  *
40ca48b27bSAlex Elder  * The offset of an event register is computed by a macro that is supplied a
41ca48b27bSAlex Elder  * parameter "ev".  The "ev" value is an event id whose maximum value is 15
42ca48b27bSAlex Elder  * (though the actual limit is hardware-dependent).
43ca48b27bSAlex Elder  */
44ca48b27bSAlex Elder 
458f0fece6SAlex Elder /* enum gsi_reg_id - GSI register IDs */
468f0fece6SAlex Elder enum gsi_reg_id {
478f0fece6SAlex Elder 	INTER_EE_SRC_CH_IRQ_MSK,			/* IPA v3.5+ */
488f0fece6SAlex Elder 	INTER_EE_SRC_EV_CH_IRQ_MSK,			/* IPA v3.5+ */
498f0fece6SAlex Elder 	CH_C_CNTXT_0,
508f0fece6SAlex Elder 	CH_C_CNTXT_1,
518f0fece6SAlex Elder 	CH_C_CNTXT_2,
528f0fece6SAlex Elder 	CH_C_CNTXT_3,
538f0fece6SAlex Elder 	CH_C_QOS,
548f0fece6SAlex Elder 	CH_C_SCRATCH_0,
558f0fece6SAlex Elder 	CH_C_SCRATCH_1,
568f0fece6SAlex Elder 	CH_C_SCRATCH_2,
578f0fece6SAlex Elder 	CH_C_SCRATCH_3,
588f0fece6SAlex Elder 	EV_CH_E_CNTXT_0,
598f0fece6SAlex Elder 	EV_CH_E_CNTXT_1,
608f0fece6SAlex Elder 	EV_CH_E_CNTXT_2,
618f0fece6SAlex Elder 	EV_CH_E_CNTXT_3,
628f0fece6SAlex Elder 	EV_CH_E_CNTXT_4,
638f0fece6SAlex Elder 	EV_CH_E_CNTXT_8,
648f0fece6SAlex Elder 	EV_CH_E_CNTXT_9,
658f0fece6SAlex Elder 	EV_CH_E_CNTXT_10,
668f0fece6SAlex Elder 	EV_CH_E_CNTXT_11,
678f0fece6SAlex Elder 	EV_CH_E_CNTXT_12,
688f0fece6SAlex Elder 	EV_CH_E_CNTXT_13,
698f0fece6SAlex Elder 	EV_CH_E_SCRATCH_0,
708f0fece6SAlex Elder 	EV_CH_E_SCRATCH_1,
718f0fece6SAlex Elder 	CH_C_DOORBELL_0,
728f0fece6SAlex Elder 	EV_CH_E_DOORBELL_0,
738f0fece6SAlex Elder 	GSI_STATUS,
748f0fece6SAlex Elder 	CH_CMD,
758f0fece6SAlex Elder 	EV_CH_CMD,
768f0fece6SAlex Elder 	GENERIC_CMD,
778f0fece6SAlex Elder 	HW_PARAM_2,					/* IPA v3.5.1+ */
78f651334eSAlex Elder 	HW_PARAM_4,					/* IPA v5.0+ */
798f0fece6SAlex Elder 	CNTXT_TYPE_IRQ,
808f0fece6SAlex Elder 	CNTXT_TYPE_IRQ_MSK,
818f0fece6SAlex Elder 	CNTXT_SRC_CH_IRQ,
828f0fece6SAlex Elder 	CNTXT_SRC_CH_IRQ_MSK,
838f0fece6SAlex Elder 	CNTXT_SRC_CH_IRQ_CLR,
848f0fece6SAlex Elder 	CNTXT_SRC_EV_CH_IRQ,
858f0fece6SAlex Elder 	CNTXT_SRC_EV_CH_IRQ_MSK,
868f0fece6SAlex Elder 	CNTXT_SRC_EV_CH_IRQ_CLR,
878f0fece6SAlex Elder 	CNTXT_SRC_IEOB_IRQ,
888f0fece6SAlex Elder 	CNTXT_SRC_IEOB_IRQ_MSK,
898f0fece6SAlex Elder 	CNTXT_SRC_IEOB_IRQ_CLR,
908f0fece6SAlex Elder 	CNTXT_GLOB_IRQ_STTS,
918f0fece6SAlex Elder 	CNTXT_GLOB_IRQ_EN,
928f0fece6SAlex Elder 	CNTXT_GLOB_IRQ_CLR,
938f0fece6SAlex Elder 	CNTXT_GSI_IRQ_STTS,
948f0fece6SAlex Elder 	CNTXT_GSI_IRQ_EN,
958f0fece6SAlex Elder 	CNTXT_GSI_IRQ_CLR,
968f0fece6SAlex Elder 	CNTXT_INTSET,
978f0fece6SAlex Elder 	ERROR_LOG,
988f0fece6SAlex Elder 	ERROR_LOG_CLR,
998f0fece6SAlex Elder 	CNTXT_SCRATCH_0,
1008f0fece6SAlex Elder 	GSI_REG_ID_COUNT,				/* Last; not an ID */
1018f0fece6SAlex Elder };
1028f0fece6SAlex Elder 
10376924eb9SAlex Elder /* CH_C_CNTXT_0 register */
104330ce9d3SAlex Elder enum gsi_reg_ch_c_cntxt_0_field_id {
105330ce9d3SAlex Elder 	CHTYPE_PROTOCOL,
106330ce9d3SAlex Elder 	CHTYPE_DIR,
107330ce9d3SAlex Elder 	CH_EE,
108330ce9d3SAlex Elder 	CHID,
10962747512SAlex Elder 	CHTYPE_PROTOCOL_MSB,				/* IPA v4.5-4.11 */
11037cd29ecSAlex Elder 	ERINDEX,					/* Not IPA v5.0+ */
111330ce9d3SAlex Elder 	CHSTATE,
112330ce9d3SAlex Elder 	ELEMENT_SIZE,
113330ce9d3SAlex Elder };
1140ec573efSAlex Elder 
1152ad6f03bSAlex Elder /** enum gsi_channel_type - CHTYPE_PROTOCOL field values in CH_C_CNTXT_0 */
1162ad6f03bSAlex Elder enum gsi_channel_type {
1172ad6f03bSAlex Elder 	GSI_CHANNEL_TYPE_MHI			= 0x0,
1182ad6f03bSAlex Elder 	GSI_CHANNEL_TYPE_XHCI			= 0x1,
1192ad6f03bSAlex Elder 	GSI_CHANNEL_TYPE_GPI			= 0x2,
1202ad6f03bSAlex Elder 	GSI_CHANNEL_TYPE_XDCI			= 0x3,
1212ad6f03bSAlex Elder 	GSI_CHANNEL_TYPE_WDI2			= 0x4,
1222ad6f03bSAlex Elder 	GSI_CHANNEL_TYPE_GCI			= 0x5,
1232ad6f03bSAlex Elder 	GSI_CHANNEL_TYPE_WDI3			= 0x6,
1242ad6f03bSAlex Elder 	GSI_CHANNEL_TYPE_MHIP			= 0x7,
1252ad6f03bSAlex Elder 	GSI_CHANNEL_TYPE_AQC			= 0x8,
1262ad6f03bSAlex Elder 	GSI_CHANNEL_TYPE_11AD			= 0x9,
1272ad6f03bSAlex Elder };
1282ad6f03bSAlex Elder 
129330ce9d3SAlex Elder /* CH_C_CNTXT_1 register */
130330ce9d3SAlex Elder enum gsi_reg_ch_c_cntxt_1_field_id {
131330ce9d3SAlex Elder 	CH_R_LENGTH,
13237cd29ecSAlex Elder 	CH_ERINDEX,					/* IPA v5.0+ */
133330ce9d3SAlex Elder };
134330ce9d3SAlex Elder 
135d2bb6e65SAlex Elder /* CH_C_QOS register */
136f50ca7ceSAlex Elder enum gsi_reg_ch_c_qos_field_id {
137f50ca7ceSAlex Elder 	WRR_WEIGHT,
138f50ca7ceSAlex Elder 	MAX_PREFETCH,
139f50ca7ceSAlex Elder 	USE_DB_ENG,
140f50ca7ceSAlex Elder 	USE_ESCAPE_BUF_ONLY,				/* IPA v4.0-4.2 */
141f50ca7ceSAlex Elder 	PREFETCH_MODE,					/* IPA v4.5+ */
142f50ca7ceSAlex Elder 	EMPTY_LVL_THRSHOLD,				/* IPA v4.5+ */
143f50ca7ceSAlex Elder 	DB_IN_BYTES,					/* IPA v4.9+ */
144f75f44ddSAlex Elder 	LOW_LATENCY_EN,					/* IPA v5.0+ */
145f50ca7ceSAlex Elder };
1464f57b2faSAlex Elder 
147b0b6f0ddSAlex Elder /** enum gsi_prefetch_mode - PREFETCH_MODE field in CH_C_QOS */
148b0b6f0ddSAlex Elder enum gsi_prefetch_mode {
149f50ca7ceSAlex Elder 	USE_PREFETCH_BUFS			= 0,
150f50ca7ceSAlex Elder 	ESCAPE_BUF_ONLY				= 1,
151f50ca7ceSAlex Elder 	SMART_PREFETCH				= 2,
152f50ca7ceSAlex Elder 	FREE_PREFETCH				= 3,
153b0b6f0ddSAlex Elder };
154ca48b27bSAlex Elder 
155d1ce6395SAlex Elder /* EV_CH_E_CNTXT_0 register */
156edc6158bSAlex Elder enum gsi_reg_ch_c_ev_ch_e_cntxt_0_field_id {
157edc6158bSAlex Elder 	EV_CHTYPE,	/* enum gsi_channel_type */
158edc6158bSAlex Elder 	EV_EE,		/* enum gsi_ee_id; always GSI_EE_AP for us */
159edc6158bSAlex Elder 	EV_EVCHID,
160edc6158bSAlex Elder 	EV_INTYPE,
161edc6158bSAlex Elder 	EV_CHSTATE,
162edc6158bSAlex Elder 	EV_ELEMENT_SIZE,
163edc6158bSAlex Elder };
164ca48b27bSAlex Elder 
165f75f44ddSAlex Elder /* EV_CH_E_CNTXT_1 register */
166f75f44ddSAlex Elder enum gsi_reg_ev_ch_c_cntxt_1_field_id {
167f75f44ddSAlex Elder 	R_LENGTH,
168f75f44ddSAlex Elder };
169f75f44ddSAlex Elder 
170d1ce6395SAlex Elder /* EV_CH_E_CNTXT_8 register */
171edc6158bSAlex Elder enum gsi_reg_ch_c_ev_ch_e_cntxt_8_field_id {
172edc6158bSAlex Elder 	EV_MODT,
173edc6158bSAlex Elder 	EV_MODC,
174edc6158bSAlex Elder 	EV_MOD_CNT,
175edc6158bSAlex Elder };
176ca48b27bSAlex Elder 
1775791a73cSAlex Elder /* GSI_STATUS register */
1783f3741c9SAlex Elder enum gsi_reg_gsi_status_field_id {
1793f3741c9SAlex Elder 	ENABLED,
1803f3741c9SAlex Elder };
181ca48b27bSAlex Elder 
1825791a73cSAlex Elder /* CH_CMD register */
1833f3741c9SAlex Elder enum gsi_reg_gsi_ch_cmd_field_id {
1843f3741c9SAlex Elder 	CH_CHID,
1853f3741c9SAlex Elder 	CH_OPCODE,
1863f3741c9SAlex Elder };
1878701cb00SAlex Elder 
188cec2076eSAlex Elder /** enum gsi_ch_cmd_opcode - CH_OPCODE field values in CH_CMD */
189cec2076eSAlex Elder enum gsi_ch_cmd_opcode {
190cec2076eSAlex Elder 	GSI_CH_ALLOCATE				= 0x0,
191cec2076eSAlex Elder 	GSI_CH_START				= 0x1,
192cec2076eSAlex Elder 	GSI_CH_STOP				= 0x2,
193cec2076eSAlex Elder 	GSI_CH_RESET				= 0x9,
194cec2076eSAlex Elder 	GSI_CH_DE_ALLOC				= 0xa,
1954f57b2faSAlex Elder 	GSI_CH_DB_STOP				= 0xb,
196cec2076eSAlex Elder };
197ca48b27bSAlex Elder 
1985791a73cSAlex Elder /* EV_CH_CMD register */
1993f3741c9SAlex Elder enum gsi_ev_ch_cmd_field_id {
2003f3741c9SAlex Elder 	EV_CHID,
2013f3741c9SAlex Elder 	EV_OPCODE,
2023f3741c9SAlex Elder };
2038701cb00SAlex Elder 
204cec2076eSAlex Elder /** enum gsi_evt_cmd_opcode - EV_OPCODE field values in EV_CH_CMD */
205cec2076eSAlex Elder enum gsi_evt_cmd_opcode {
206cec2076eSAlex Elder 	GSI_EVT_ALLOCATE			= 0x0,
207cec2076eSAlex Elder 	GSI_EVT_RESET				= 0x9,
208cec2076eSAlex Elder 	GSI_EVT_DE_ALLOC			= 0xa,
209cec2076eSAlex Elder };
210ca48b27bSAlex Elder 
2115791a73cSAlex Elder /* GENERIC_CMD register */
2123f3741c9SAlex Elder enum gsi_generic_cmd_field_id {
2133f3741c9SAlex Elder 	GENERIC_OPCODE,
2143f3741c9SAlex Elder 	GENERIC_CHID,
2153f3741c9SAlex Elder 	GENERIC_EE,
2163f3741c9SAlex Elder 	GENERIC_PARAMS,					/* IPA v4.11+ */
2173f3741c9SAlex Elder };
2188701cb00SAlex Elder 
219cec2076eSAlex Elder /** enum gsi_generic_cmd_opcode - GENERIC_OPCODE field values in GENERIC_CMD */
220cec2076eSAlex Elder enum gsi_generic_cmd_opcode {
221cec2076eSAlex Elder 	GSI_GENERIC_HALT_CHANNEL		= 0x1,
222cec2076eSAlex Elder 	GSI_GENERIC_ALLOCATE_CHANNEL		= 0x2,
2234c9d631aSAlex Elder 	GSI_GENERIC_ENABLE_FLOW_CONTROL		= 0x3,	/* IPA v4.2+ */
2244c9d631aSAlex Elder 	GSI_GENERIC_DISABLE_FLOW_CONTROL	= 0x4,	/* IPA v4.2+ */
225fe68c43cSAlex Elder 	GSI_GENERIC_QUERY_FLOW_CONTROL		= 0x5,	/* IPA v4.11+ */
226cec2076eSAlex Elder };
227ca48b27bSAlex Elder 
2285791a73cSAlex Elder /* HW_PARAM_2 register */				/* IPA v3.5.1+ */
2293f3741c9SAlex Elder enum gsi_hw_param_2_field_id {
2303f3741c9SAlex Elder 	IRAM_SIZE,
2313f3741c9SAlex Elder 	NUM_CH_PER_EE,
232f651334eSAlex Elder 	NUM_EV_PER_EE,					/* Not IPA v5.0+ */
2333f3741c9SAlex Elder 	GSI_CH_PEND_TRANSLATE,
2343f3741c9SAlex Elder 	GSI_CH_FULL_LOGIC,
2353f3741c9SAlex Elder 	GSI_USE_SDMA,					/* IPA v4.0+ */
2363f3741c9SAlex Elder 	GSI_SDMA_N_INT,					/* IPA v4.0+ */
2373f3741c9SAlex Elder 	GSI_SDMA_MAX_BURST,				/* IPA v4.0+ */
2383f3741c9SAlex Elder 	GSI_SDMA_N_IOVEC,				/* IPA v4.0+ */
2393f3741c9SAlex Elder 	GSI_USE_RD_WR_ENG,				/* IPA v4.2+ */
2403f3741c9SAlex Elder 	GSI_USE_INTER_EE,				/* IPA v4.2+ */
2413f3741c9SAlex Elder };
2428701cb00SAlex Elder 
2434730ab1cSAlex Elder /** enum gsi_iram_size - IRAM_SIZE field values in HW_PARAM_2 */
2444730ab1cSAlex Elder enum gsi_iram_size {
2454730ab1cSAlex Elder 	IRAM_SIZE_ONE_KB			= 0x0,
2464730ab1cSAlex Elder 	IRAM_SIZE_TWO_KB			= 0x1,
2474730ab1cSAlex Elder 	/* The next two values are available for IPA v4.0 and above */
2484730ab1cSAlex Elder 	IRAM_SIZE_TWO_N_HALF_KB			= 0x2,
2494730ab1cSAlex Elder 	IRAM_SIZE_THREE_KB			= 0x3,
250b0b6f0ddSAlex Elder 	/* The next two values are available for IPA v4.5 and above */
251b0b6f0ddSAlex Elder 	IRAM_SIZE_THREE_N_HALF_KB		= 0x4,
252b0b6f0ddSAlex Elder 	IRAM_SIZE_FOUR_KB			= 0x5,
2534730ab1cSAlex Elder };
254ca48b27bSAlex Elder 
255f651334eSAlex Elder /* HW_PARAM_4 register */				/* IPA v5.0+ */
256f651334eSAlex Elder enum gsi_hw_param_4_field_id {
257f651334eSAlex Elder 	EV_PER_EE,
258f651334eSAlex Elder 	IRAM_PROTOCOL_COUNT,
259f651334eSAlex Elder };
260f651334eSAlex Elder 
261c5ebba75SAlex Elder /**
262c5ebba75SAlex Elder  * enum gsi_irq_type_id: GSI IRQ types
263c5ebba75SAlex Elder  * @GSI_CH_CTRL:		Channel allocation, deallocation, etc.
264c5ebba75SAlex Elder  * @GSI_EV_CTRL:		Event ring allocation, deallocation, etc.
265c5ebba75SAlex Elder  * @GSI_GLOB_EE:		Global/general event
266c5ebba75SAlex Elder  * @GSI_IEOB:			Transfer (TRE) completion
267c5ebba75SAlex Elder  * @GSI_INTER_EE_CH_CTRL:	Remote-issued stop/reset (unused)
268c5ebba75SAlex Elder  * @GSI_INTER_EE_EV_CTRL:	Remote-issued event reset (unused)
269c5ebba75SAlex Elder  * @GSI_GENERAL:		General hardware event (bus error, etc.)
270c5ebba75SAlex Elder  */
271f9b28804SAlex Elder enum gsi_irq_type_id {
272c5ebba75SAlex Elder 	GSI_CH_CTRL				= BIT(0),
273c5ebba75SAlex Elder 	GSI_EV_CTRL				= BIT(1),
274c5ebba75SAlex Elder 	GSI_GLOB_EE				= BIT(2),
275c5ebba75SAlex Elder 	GSI_IEOB				= BIT(3),
276c5ebba75SAlex Elder 	GSI_INTER_EE_CH_CTRL			= BIT(4),
277c5ebba75SAlex Elder 	GSI_INTER_EE_EV_CTRL			= BIT(5),
278c5ebba75SAlex Elder 	GSI_GENERAL				= BIT(6),
279c5ebba75SAlex Elder 	/* IRQ types 7-31 (and their bit values) are reserved */
280f9b28804SAlex Elder };
281ca48b27bSAlex Elder 
282c5ebba75SAlex Elder /** enum gsi_global_irq_id: Global GSI interrupt events */
2836c6358ccSAlex Elder enum gsi_global_irq_id {
284c5ebba75SAlex Elder 	ERROR_INT				= BIT(0),
285c5ebba75SAlex Elder 	GP_INT1					= BIT(1),
286c5ebba75SAlex Elder 	GP_INT2					= BIT(2),
287c5ebba75SAlex Elder 	GP_INT3					= BIT(3),
288c5ebba75SAlex Elder 	/* Global IRQ types 4-31 (and their bit values) are reserved */
2896c6358ccSAlex Elder };
290ca48b27bSAlex Elder 
291c5ebba75SAlex Elder /** enum gsi_general_irq_id: GSI general IRQ conditions */
292c5ebba75SAlex Elder enum gsi_general_irq_id {
293c5ebba75SAlex Elder 	BREAK_POINT				= BIT(0),
294c5ebba75SAlex Elder 	BUS_ERROR				= BIT(1),
295c5ebba75SAlex Elder 	CMD_FIFO_OVRFLOW			= BIT(2),
296c5ebba75SAlex Elder 	MCS_STACK_OVRFLOW			= BIT(3),
297c5ebba75SAlex Elder 	/* General IRQ types 4-31 (and their bit values) are reserved */
2986c6358ccSAlex Elder };
299ca48b27bSAlex Elder 
3007ba51aa2SAlex Elder /* CNTXT_INTSET register */
3013f3741c9SAlex Elder enum gsi_cntxt_intset_field_id {
3023f3741c9SAlex Elder 	INTYPE,
3033f3741c9SAlex Elder };
304ca48b27bSAlex Elder 
3055791a73cSAlex Elder /* ERROR_LOG register */
3063f3741c9SAlex Elder enum gsi_error_log_field_id {
3073f3741c9SAlex Elder 	ERR_ARG3,
3083f3741c9SAlex Elder 	ERR_ARG2,
3093f3741c9SAlex Elder 	ERR_ARG1,
3103f3741c9SAlex Elder 	ERR_CODE,
3113f3741c9SAlex Elder 	ERR_VIRT_IDX,
3123f3741c9SAlex Elder 	ERR_TYPE,
3133f3741c9SAlex Elder 	ERR_EE,
3143f3741c9SAlex Elder };
3158701cb00SAlex Elder 
3167b0ac8f6SAlex Elder /** enum gsi_err_code - ERR_CODE field values in EE_ERR_LOG */
3177b0ac8f6SAlex Elder enum gsi_err_code {
3187b0ac8f6SAlex Elder 	GSI_INVALID_TRE				= 0x1,
3197b0ac8f6SAlex Elder 	GSI_OUT_OF_BUFFERS			= 0x2,
3207b0ac8f6SAlex Elder 	GSI_OUT_OF_RESOURCES			= 0x3,
3217b0ac8f6SAlex Elder 	GSI_UNSUPPORTED_INTER_EE_OP		= 0x4,
3227b0ac8f6SAlex Elder 	GSI_EVT_RING_EMPTY			= 0x5,
3237b0ac8f6SAlex Elder 	GSI_NON_ALLOCATED_EVT_ACCESS		= 0x6,
3247b0ac8f6SAlex Elder 	/* 7 is not assigned */
3257b0ac8f6SAlex Elder 	GSI_HWO_1				= 0x8,
3267b0ac8f6SAlex Elder };
3278701cb00SAlex Elder 
3287b0ac8f6SAlex Elder /** enum gsi_err_type - ERR_TYPE field values in EE_ERR_LOG */
3297b0ac8f6SAlex Elder enum gsi_err_type {
3307b0ac8f6SAlex Elder 	GSI_ERR_TYPE_GLOB			= 0x1,
3317b0ac8f6SAlex Elder 	GSI_ERR_TYPE_CHAN			= 0x2,
3327b0ac8f6SAlex Elder 	GSI_ERR_TYPE_EVT			= 0x3,
3337b0ac8f6SAlex Elder };
334ca48b27bSAlex Elder 
3355791a73cSAlex Elder /* CNTXT_SCRATCH_0 register */
3363f3741c9SAlex Elder enum gsi_cntxt_scratch_0_field_id {
3373f3741c9SAlex Elder 	INTER_EE_RESULT,
3383f3741c9SAlex Elder 	GENERIC_EE_RESULT,
3393f3741c9SAlex Elder };
3408701cb00SAlex Elder 
3418701cb00SAlex Elder /** enum gsi_generic_ee_result - GENERIC_EE_RESULT field values in SCRATCH_0 */
3424730ab1cSAlex Elder enum gsi_generic_ee_result {
3434730ab1cSAlex Elder 	GENERIC_EE_SUCCESS			= 0x1,
344c9d92cf2SAlex Elder 	GENERIC_EE_INCORRECT_CHANNEL_STATE	= 0x2,
3454730ab1cSAlex Elder 	GENERIC_EE_INCORRECT_DIRECTION		= 0x3,
3464730ab1cSAlex Elder 	GENERIC_EE_INCORRECT_CHANNEL_TYPE	= 0x4,
3474730ab1cSAlex Elder 	GENERIC_EE_INCORRECT_CHANNEL		= 0x5,
3484730ab1cSAlex Elder 	GENERIC_EE_RETRY			= 0x6,
3494730ab1cSAlex Elder 	GENERIC_EE_NO_RESOURCES			= 0x7,
3504730ab1cSAlex Elder };
3518701cb00SAlex Elder 
352d2bb6e65SAlex Elder extern const struct regs gsi_regs_v3_1;
353465d1bc9SAlex Elder extern const struct regs gsi_regs_v3_5_1;
3544a4270cfSAlex Elder extern const struct regs gsi_regs_v4_0;
3554a4270cfSAlex Elder extern const struct regs gsi_regs_v4_5;
3564a4270cfSAlex Elder extern const struct regs gsi_regs_v4_9;
357aa07fd43SAlex Elder extern const struct regs gsi_regs_v4_11;
358*faf0678eSAlex Elder extern const struct regs gsi_regs_v5_0;
359d2bb6e65SAlex Elder 
360d2bb6e65SAlex Elder /**
361d2bb6e65SAlex Elder  * gsi_reg() - Return the structure describing a GSI register
362d2bb6e65SAlex Elder  * @gsi:	GSI pointer
363d2bb6e65SAlex Elder  * @reg_id:	GSI register ID
364d2bb6e65SAlex Elder  */
365d2bb6e65SAlex Elder const struct reg *gsi_reg(struct gsi *gsi, enum gsi_reg_id reg_id);
366d2bb6e65SAlex Elder 
3673c506addSAlex Elder /**
3683c506addSAlex Elder  * gsi_reg_init() - Perform GSI register initialization
3693c506addSAlex Elder  * @gsi:	GSI pointer
3703c506addSAlex Elder  * @pdev:	GSI (IPA) platform device
3713c506addSAlex Elder  *
3723c506addSAlex Elder  * Initialize GSI registers, including looking up and I/O mapping
37359b12b1dSAlex Elder  * the "gsi" memory space.
3743c506addSAlex Elder  */
3753c506addSAlex Elder int gsi_reg_init(struct gsi *gsi, struct platform_device *pdev);
3763c506addSAlex Elder 
3773c506addSAlex Elder /**
3783c506addSAlex Elder  * gsi_reg_exit() - Inverse of gsi_reg_init()
3793c506addSAlex Elder  * @gsi:	GSI pointer
3803c506addSAlex Elder  */
3813c506addSAlex Elder void gsi_reg_exit(struct gsi *gsi);
3823c506addSAlex Elder 
383ca48b27bSAlex Elder #endif	/* _GSI_REG_H_ */
384