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