Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'net-ipa-ipa-register-cleanup'

Alex Elder says:

====================
net: ipa: IPA register cleanup

This series consists of cleanup patches, almost entirely related to
the definitions for IPA registers. Some comments are updated or
added to provide better information about defined IPA registers.
Other cleanups ensure symbol names and their assigned values are
defined consistently. Some essentially duplicate definitions get
consolidated for simplicity. In a few cases some minor bugs
(missing definitions) are fixed. With these changes, all IPA
register offsets and associated field masks should be correct for
IPA versions 3.5.1, 4.0, 4.1, and 4.2.
====================

Link: https://lore.kernel.org/r/20201116233805.13775-1-elder@linaro.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+266 -211
+10 -10
drivers/net/ipa/gsi.h
··· 33 33 34 34 /* Execution environment IDs */ 35 35 enum gsi_ee_id { 36 - GSI_EE_AP = 0, 37 - GSI_EE_MODEM = 1, 38 - GSI_EE_UC = 2, 39 - GSI_EE_TZ = 3, 36 + GSI_EE_AP = 0x0, 37 + GSI_EE_MODEM = 0x1, 38 + GSI_EE_UC = 0x2, 39 + GSI_EE_TZ = 0x3, 40 40 }; 41 41 42 42 struct gsi_ring { ··· 96 96 97 97 /* Hardware values signifying the state of a channel */ 98 98 enum gsi_channel_state { 99 - GSI_CHANNEL_STATE_NOT_ALLOCATED = 0x0, 100 - GSI_CHANNEL_STATE_ALLOCATED = 0x1, 101 - GSI_CHANNEL_STATE_STARTED = 0x2, 102 - GSI_CHANNEL_STATE_STOPPED = 0x3, 103 - GSI_CHANNEL_STATE_STOP_IN_PROC = 0x4, 104 - GSI_CHANNEL_STATE_ERROR = 0xf, 99 + GSI_CHANNEL_STATE_NOT_ALLOCATED = 0x0, 100 + GSI_CHANNEL_STATE_ALLOCATED = 0x1, 101 + GSI_CHANNEL_STATE_STARTED = 0x2, 102 + GSI_CHANNEL_STATE_STOPPED = 0x3, 103 + GSI_CHANNEL_STATE_STOP_IN_PROC = 0x4, 104 + GSI_CHANNEL_STATE_ERROR = 0xf, 105 105 }; 106 106 107 107 /* We only care about channels between IPA and AP */
+18 -7
drivers/net/ipa/gsi_reg.h
··· 71 71 #define ERINDEX_FMASK GENMASK(18, 14) 72 72 #define CHSTATE_FMASK GENMASK(23, 20) 73 73 #define ELEMENT_SIZE_FMASK GENMASK(31, 24) 74 + 74 75 /** enum gsi_channel_type - CHTYPE_PROTOCOL field values in CH_C_CNTXT_0 */ 75 76 enum gsi_channel_type { 76 77 GSI_CHANNEL_TYPE_MHI = 0x0, ··· 224 223 (0x0001f008 + 0x4000 * (ee)) 225 224 #define CH_CHID_FMASK GENMASK(7, 0) 226 225 #define CH_OPCODE_FMASK GENMASK(31, 24) 226 + 227 227 /** enum gsi_ch_cmd_opcode - CH_OPCODE field values in CH_CMD */ 228 228 enum gsi_ch_cmd_opcode { 229 229 GSI_CH_ALLOCATE = 0x0, ··· 240 238 (0x0001f010 + 0x4000 * (ee)) 241 239 #define EV_CHID_FMASK GENMASK(7, 0) 242 240 #define EV_OPCODE_FMASK GENMASK(31, 24) 241 + 243 242 /** enum gsi_evt_cmd_opcode - EV_OPCODE field values in EV_CH_CMD */ 244 243 enum gsi_evt_cmd_opcode { 245 244 GSI_EVT_ALLOCATE = 0x0, ··· 255 252 #define GENERIC_OPCODE_FMASK GENMASK(4, 0) 256 253 #define GENERIC_CHID_FMASK GENMASK(9, 5) 257 254 #define GENERIC_EE_FMASK GENMASK(13, 10) 255 + 258 256 /** enum gsi_generic_cmd_opcode - GENERIC_OPCODE field values in GENERIC_CMD */ 259 257 enum gsi_generic_cmd_opcode { 260 258 GSI_GENERIC_HALT_CHANNEL = 0x1, ··· 279 275 /* Fields below are present for IPA v4.2 and above */ 280 276 #define GSI_USE_RD_WR_ENG_FMASK GENMASK(30, 30) 281 277 #define GSI_USE_INTER_EE_FMASK GENMASK(31, 31) 278 + 282 279 /** enum gsi_iram_size - IRAM_SIZE field values in HW_PARAM_2 */ 283 280 enum gsi_iram_size { 284 281 IRAM_SIZE_ONE_KB = 0x0, ··· 298 293 GSI_EE_N_CNTXT_TYPE_IRQ_MSK_OFFSET(GSI_EE_AP) 299 294 #define GSI_EE_N_CNTXT_TYPE_IRQ_MSK_OFFSET(ee) \ 300 295 (0x0001f088 + 0x4000 * (ee)) 296 + 301 297 /* Values here are bit positions in the TYPE_IRQ and TYPE_IRQ_MSK registers */ 302 298 enum gsi_irq_type_id { 303 - GSI_CH_CTRL = 0, /* channel allocation, etc. */ 304 - GSI_EV_CTRL = 1, /* event ring allocation, etc. */ 305 - GSI_GLOB_EE = 2, /* global/general event */ 306 - GSI_IEOB = 3, /* TRE completion */ 307 - GSI_INTER_EE_CH_CTRL = 4, /* remote-issued stop/reset (unused) */ 308 - GSI_INTER_EE_EV_CTRL = 5, /* remote-issued event reset (unused) */ 309 - GSI_GENERAL = 6, /* general-purpose event */ 299 + GSI_CH_CTRL = 0x0, /* channel allocation, etc. */ 300 + GSI_EV_CTRL = 0x1, /* event ring allocation, etc. */ 301 + GSI_GLOB_EE = 0x2, /* global/general event */ 302 + GSI_IEOB = 0x3, /* TRE completion */ 303 + GSI_INTER_EE_CH_CTRL = 0x4, /* remote-issued stop/reset (unused) */ 304 + GSI_INTER_EE_EV_CTRL = 0x5, /* remote-issued event reset (unused) */ 305 + GSI_GENERAL = 0x6, /* general-purpose event */ 310 306 }; 311 307 312 308 #define GSI_CNTXT_SRC_CH_IRQ_OFFSET \ ··· 412 406 #define ERR_VIRT_IDX_FMASK GENMASK(23, 19) 413 407 #define ERR_TYPE_FMASK GENMASK(27, 24) 414 408 #define ERR_EE_FMASK GENMASK(31, 28) 409 + 415 410 /** enum gsi_err_code - ERR_CODE field values in EE_ERR_LOG */ 416 411 enum gsi_err_code { 417 412 GSI_INVALID_TRE = 0x1, ··· 424 417 /* 7 is not assigned */ 425 418 GSI_HWO_1 = 0x8, 426 419 }; 420 + 427 421 /** enum gsi_err_type - ERR_TYPE field values in EE_ERR_LOG */ 428 422 enum gsi_err_type { 429 423 GSI_ERR_TYPE_GLOB = 0x1, ··· 443 435 (0x0001f400 + 0x4000 * (ee)) 444 436 #define INTER_EE_RESULT_FMASK GENMASK(2, 0) 445 437 #define GENERIC_EE_RESULT_FMASK GENMASK(7, 5) 438 + 439 + /** enum gsi_generic_ee_result - GENERIC_EE_RESULT field values in SCRATCH_0 */ 446 440 enum gsi_generic_ee_result { 447 441 GENERIC_EE_SUCCESS = 0x1, 448 442 GENERIC_EE_CHANNEL_NOT_RUNNING = 0x2, ··· 454 444 GENERIC_EE_RETRY = 0x6, 455 445 GENERIC_EE_NO_RESOURCES = 0x7, 456 446 }; 447 + 457 448 #define USB_MAX_PACKET_FMASK GENMASK(15, 15) /* 0: HS; 1: SS */ 458 449 #define MHI_BASE_CHANNEL_FMASK GENMASK(31, 24) 459 450
+3 -3
drivers/net/ipa/ipa_cmd.c
··· 38 38 39 39 /* Some commands can wait until indicated pipeline stages are clear */ 40 40 enum pipeline_clear_options { 41 - pipeline_clear_hps = 0, 42 - pipeline_clear_src_grp = 1, 43 - pipeline_clear_full = 2, 41 + pipeline_clear_hps = 0x0, 42 + pipeline_clear_src_grp = 0x1, 43 + pipeline_clear_full = 0x2, 44 44 }; 45 45 46 46 /* IPA_CMD_IP_V{4,6}_{FILTER,ROUTING}_INIT */
+10 -11
drivers/net/ipa/ipa_cmd.h
··· 27 27 * a request is *not* an immediate command. 28 28 */ 29 29 enum ipa_cmd_opcode { 30 - IPA_CMD_NONE = 0, 31 - IPA_CMD_IP_V4_FILTER_INIT = 3, 32 - IPA_CMD_IP_V6_FILTER_INIT = 4, 33 - IPA_CMD_IP_V4_ROUTING_INIT = 7, 34 - IPA_CMD_IP_V6_ROUTING_INIT = 8, 35 - IPA_CMD_HDR_INIT_LOCAL = 9, 36 - IPA_CMD_REGISTER_WRITE = 12, 37 - IPA_CMD_IP_PACKET_INIT = 16, 38 - IPA_CMD_DMA_SHARED_MEM = 19, 39 - IPA_CMD_IP_PACKET_TAG_STATUS = 20, 30 + IPA_CMD_NONE = 0x0, 31 + IPA_CMD_IP_V4_FILTER_INIT = 0x3, 32 + IPA_CMD_IP_V6_FILTER_INIT = 0x4, 33 + IPA_CMD_IP_V4_ROUTING_INIT = 0x7, 34 + IPA_CMD_IP_V6_ROUTING_INIT = 0x8, 35 + IPA_CMD_HDR_INIT_LOCAL = 0x9, 36 + IPA_CMD_REGISTER_WRITE = 0xc, 37 + IPA_CMD_IP_PACKET_INIT = 0x10, 38 + IPA_CMD_DMA_SHARED_MEM = 0x13, 39 + IPA_CMD_IP_PACKET_TAG_STATUS = 0x14, 40 40 }; 41 41 42 42 /** ··· 49 49 enum ipa_cmd_opcode opcode; 50 50 enum dma_data_direction direction; 51 51 }; 52 - 53 52 54 53 #ifdef IPA_VALIDATE 55 54
+5 -5
drivers/net/ipa/ipa_endpoint.c
··· 665 665 /* ...but we still need to fit into a 32-bit register */ 666 666 WARN_ON(ticks > U32_MAX); 667 667 668 - /* IPA v3.5.1 just records the tick count */ 669 - if (ipa->version == IPA_VERSION_3_5_1) 668 + /* IPA v3.5.1 through v4.1 just record the tick count */ 669 + if (ipa->version < IPA_VERSION_4_2) 670 670 return (u32)ticks; 671 671 672 672 /* For IPA v4.2, the tick count is represented by base and ··· 1545 1545 val = ioread32(ipa->reg_virt + IPA_REG_FLAVOR_0_OFFSET); 1546 1546 1547 1547 /* Our RX is an IPA producer */ 1548 - rx_base = u32_get_bits(val, BAM_PROD_LOWEST_FMASK); 1549 - max = rx_base + u32_get_bits(val, BAM_MAX_PROD_PIPES_FMASK); 1548 + rx_base = u32_get_bits(val, IPA_PROD_LOWEST_FMASK); 1549 + max = rx_base + u32_get_bits(val, IPA_MAX_PROD_PIPES_FMASK); 1550 1550 if (max > IPA_ENDPOINT_MAX) { 1551 1551 dev_err(dev, "too many endpoints (%u > %u)\n", 1552 1552 max, IPA_ENDPOINT_MAX); ··· 1555 1555 rx_mask = GENMASK(max - 1, rx_base); 1556 1556 1557 1557 /* Our TX is an IPA consumer */ 1558 - max = u32_get_bits(val, BAM_MAX_CONS_PIPES_FMASK); 1558 + max = u32_get_bits(val, IPA_MAX_CONS_PIPES_FMASK); 1559 1559 tx_mask = GENMASK(max - 1, 0); 1560 1560 1561 1561 ipa->available = rx_mask | tx_mask;
+1 -1
drivers/net/ipa/ipa_endpoint.h
··· 25 25 #define IPA_MTU ETH_DATA_LEN 26 26 27 27 enum ipa_endpoint_name { 28 - IPA_ENDPOINT_AP_MODEM_TX = 0, 28 + IPA_ENDPOINT_AP_MODEM_TX, 29 29 IPA_ENDPOINT_MODEM_LAN_TX, 30 30 IPA_ENDPOINT_MODEM_COMMAND_TX, 31 31 IPA_ENDPOINT_AP_COMMAND_TX,
+3 -3
drivers/net/ipa/ipa_interrupt.c
··· 139 139 u32 val; 140 140 141 141 /* assert(mask & ipa->available); */ 142 - val = ioread32(ipa->reg_virt + IPA_REG_SUSPEND_IRQ_EN_OFFSET); 142 + val = ioread32(ipa->reg_virt + IPA_REG_IRQ_SUSPEND_EN_OFFSET); 143 143 if (enable) 144 144 val |= mask; 145 145 else 146 146 val &= ~mask; 147 - iowrite32(val, ipa->reg_virt + IPA_REG_SUSPEND_IRQ_EN_OFFSET); 147 + iowrite32(val, ipa->reg_virt + IPA_REG_IRQ_SUSPEND_EN_OFFSET); 148 148 } 149 149 150 150 /* Enable TX_SUSPEND for an endpoint */ ··· 168 168 u32 val; 169 169 170 170 val = ioread32(ipa->reg_virt + IPA_REG_IRQ_SUSPEND_INFO_OFFSET); 171 - iowrite32(val, ipa->reg_virt + IPA_REG_SUSPEND_IRQ_CLR_OFFSET); 171 + iowrite32(val, ipa->reg_virt + IPA_REG_IRQ_SUSPEND_CLR_OFFSET); 172 172 } 173 173 174 174 /* Simulate arrival of an IPA TX_SUSPEND interrupt */
-16
drivers/net/ipa/ipa_interrupt.h
··· 13 13 struct ipa_interrupt; 14 14 15 15 /** 16 - * enum ipa_irq_id - IPA interrupt type 17 - * @IPA_IRQ_UC_0: Microcontroller event interrupt 18 - * @IPA_IRQ_UC_1: Microcontroller response interrupt 19 - * @IPA_IRQ_TX_SUSPEND: Data ready interrupt 20 - * 21 - * The data ready interrupt is signaled if data has arrived that is destined 22 - * for an AP RX endpoint whose underlying GSI channel is suspended/stopped. 23 - */ 24 - enum ipa_irq_id { 25 - IPA_IRQ_UC_0 = 2, 26 - IPA_IRQ_UC_1 = 3, 27 - IPA_IRQ_TX_SUSPEND = 14, 28 - IPA_IRQ_COUNT, /* Number of interrupt types (not an index) */ 29 - }; 30 - 31 - /** 32 16 * typedef ipa_irq_handler_t - IPA interrupt handler function type 33 17 * @ipa: IPA pointer 34 18 * @irq_id: interrupt type
+9 -6
drivers/net/ipa/ipa_main.c
··· 325 325 326 326 /* Disable PA mask to allow HOLB drop (hardware workaround) */ 327 327 val = ioread32(ipa->reg_virt + IPA_REG_TX_CFG_OFFSET); 328 - val &= ~PA_MASK_EN; 328 + val &= ~PA_MASK_EN_FMASK; 329 329 iowrite32(val, ipa->reg_virt + IPA_REG_TX_CFG_OFFSET); 330 330 } 331 331 ··· 336 336 337 337 /* Configure aggregation granularity */ 338 338 granularity = ipa_aggr_granularity_val(IPA_AGGR_GRANULARITY); 339 - val = u32_encode_bits(granularity, AGGR_GRANULARITY); 339 + val = u32_encode_bits(granularity, AGGR_GRANULARITY_FMASK); 340 340 iowrite32(val, ipa->reg_virt + IPA_REG_COUNTER_CFG_OFFSET); 341 341 342 - /* Disable hashed IPv4 and IPv6 routing and filtering for IPA v4.2 */ 343 - if (ipa->version == IPA_VERSION_4_2) 344 - iowrite32(0, ipa->reg_virt + IPA_REG_FILT_ROUT_HASH_EN_OFFSET); 342 + /* IPA v4.2 does not support hashed tables, so disable them */ 343 + if (ipa->version == IPA_VERSION_4_2) { 344 + u32 offset = ipa_reg_filt_rout_hash_en_offset(ipa->version); 345 + 346 + iowrite32(0, ipa->reg_virt + offset); 347 + } 345 348 346 349 /* Enable dynamic clock division */ 347 350 ipa_hardware_dcd_config(ipa); ··· 688 685 /* Aggregation granularity value can't be 0, and must fit */ 689 686 BUILD_BUG_ON(!ipa_aggr_granularity_val(IPA_AGGR_GRANULARITY)); 690 687 BUILD_BUG_ON(ipa_aggr_granularity_val(IPA_AGGR_GRANULARITY) > 691 - field_max(AGGR_GRANULARITY)); 688 + field_max(AGGR_GRANULARITY_FMASK)); 692 689 #endif /* IPA_VALIDATE */ 693 690 } 694 691
+6 -6
drivers/net/ipa/ipa_qmi_msg.h
··· 74 74 75 75 /* The AP tells the modem its platform type. We assume Android. */ 76 76 enum ipa_platform_type { 77 - IPA_QMI_PLATFORM_TYPE_INVALID = 0, /* Invalid */ 78 - IPA_QMI_PLATFORM_TYPE_TN = 1, /* Data card */ 79 - IPA_QMI_PLATFORM_TYPE_LE = 2, /* Data router */ 80 - IPA_QMI_PLATFORM_TYPE_MSM_ANDROID = 3, /* Android MSM */ 81 - IPA_QMI_PLATFORM_TYPE_MSM_WINDOWS = 4, /* Windows MSM */ 82 - IPA_QMI_PLATFORM_TYPE_MSM_QNX_V01 = 5, /* QNX MSM */ 77 + IPA_QMI_PLATFORM_TYPE_INVALID = 0x0, /* Invalid */ 78 + IPA_QMI_PLATFORM_TYPE_TN = 0x1, /* Data card */ 79 + IPA_QMI_PLATFORM_TYPE_LE = 0x2, /* Data router */ 80 + IPA_QMI_PLATFORM_TYPE_MSM_ANDROID = 0x3, /* Android MSM */ 81 + IPA_QMI_PLATFORM_TYPE_MSM_WINDOWS = 0x4, /* Windows MSM */ 82 + IPA_QMI_PLATFORM_TYPE_MSM_QNX_V01 = 0x5, /* QNX MSM */ 83 83 }; 84 84 85 85 /* This defines the start and end offset of a range of memory. Both
+175 -122
drivers/net/ipa/ipa_reg.h
··· 65 65 * of valid bits for the register. 66 66 */ 67 67 68 - #define IPA_REG_ENABLED_PIPES_OFFSET 0x00000038 69 - 68 + /* The next field is not supported for IPA v4.1 */ 70 69 #define IPA_REG_COMP_CFG_OFFSET 0x0000003c 71 70 #define ENABLE_FMASK GENMASK(0, 0) 72 71 #define GSI_SNOC_BYPASS_DIS_FMASK GENMASK(1, 1) 73 72 #define GEN_QMB_0_SNOC_BYPASS_DIS_FMASK GENMASK(2, 2) 74 73 #define GEN_QMB_1_SNOC_BYPASS_DIS_FMASK GENMASK(3, 3) 75 74 #define IPA_DCMP_FAST_CLK_EN_FMASK GENMASK(4, 4) 75 + /* The remaining fields are not present for IPA v3.5.1 */ 76 76 #define IPA_QMB_SELECT_CONS_EN_FMASK GENMASK(5, 5) 77 77 #define IPA_QMB_SELECT_PROD_EN_FMASK GENMASK(6, 6) 78 78 #define GSI_MULTI_INORDER_RD_DIS_FMASK GENMASK(7, 7) ··· 110 110 #define TX_0_FMASK GENMASK(19, 19) 111 111 #define TX_1_FMASK GENMASK(20, 20) 112 112 #define FNR_FMASK GENMASK(21, 21) 113 + /* The remaining fields are not present for IPA v3.5.1 */ 113 114 #define QSB2AXI_CMDQ_L_FMASK GENMASK(22, 22) 114 115 #define AGGR_WRAPPER_FMASK GENMASK(23, 23) 115 116 #define RAM_SLAVEWAY_FMASK GENMASK(24, 24) ··· 139 138 #define IPA_REG_QSB_MAX_READS_OFFSET 0x00000078 140 139 #define GEN_QMB_0_MAX_READS_FMASK GENMASK(3, 0) 141 140 #define GEN_QMB_1_MAX_READS_FMASK GENMASK(7, 4) 142 - /* The next two fields are present for IPA v4.0 and above */ 141 + /* The next two fields are not present for IPA v3.5.1 */ 143 142 #define GEN_QMB_0_MAX_READS_BEATS_FMASK GENMASK(23, 16) 144 143 #define GEN_QMB_1_MAX_READS_BEATS_FMASK GENMASK(31, 24) 145 144 146 - static inline u32 ipa_reg_state_aggr_active_offset(enum ipa_version version) 145 + static inline u32 ipa_reg_filt_rout_hash_en_offset(enum ipa_version version) 147 146 { 148 147 if (version == IPA_VERSION_3_5_1) 149 - return 0x0000010c; 148 + return 0x000008c; 150 149 151 - return 0x000000b4; 150 + return 0x0000148; 152 151 } 153 - /* ipa->available defines the valid bits in the STATE_AGGR_ACTIVE register */ 154 - 155 - /* The next register is present for IPA v4.2 and above */ 156 - #define IPA_REG_FILT_ROUT_HASH_EN_OFFSET 0x00000148 157 - #define IPV6_ROUTER_HASH_EN GENMASK(0, 0) 158 - #define IPV6_FILTER_HASH_EN GENMASK(4, 4) 159 - #define IPV4_ROUTER_HASH_EN GENMASK(8, 8) 160 - #define IPV4_FILTER_HASH_EN GENMASK(12, 12) 161 152 162 153 static inline u32 ipa_reg_filt_rout_hash_flush_offset(enum ipa_version version) 163 154 { ··· 159 166 return 0x000014c; 160 167 } 161 168 162 - #define IPV6_ROUTER_HASH_FLUSH GENMASK(0, 0) 163 - #define IPV6_FILTER_HASH_FLUSH GENMASK(4, 4) 164 - #define IPV4_ROUTER_HASH_FLUSH GENMASK(8, 8) 165 - #define IPV4_FILTER_HASH_FLUSH GENMASK(12, 12) 169 + /* The next four fields are used for the hash enable and flush registers */ 170 + #define IPV6_ROUTER_HASH_FMASK GENMASK(0, 0) 171 + #define IPV6_FILTER_HASH_FMASK GENMASK(4, 4) 172 + #define IPV4_ROUTER_HASH_FMASK GENMASK(8, 8) 173 + #define IPV4_FILTER_HASH_FMASK GENMASK(12, 12) 174 + 175 + /* ipa->available defines the valid bits in the STATE_AGGR_ACTIVE register */ 176 + static inline u32 ipa_reg_state_aggr_active_offset(enum ipa_version version) 177 + { 178 + if (version == IPA_VERSION_3_5_1) 179 + return 0x0000010c; 180 + 181 + return 0x000000b4; 182 + } 166 183 167 184 #define IPA_REG_BCR_OFFSET 0x000001d0 168 - #define BCR_CMDQ_L_LACK_ONE_ENTRY BIT(0) 169 - #define BCR_TX_NOT_USING_BRESP BIT(1) 170 - #define BCR_SUSPEND_L2_IRQ BIT(3) 171 - #define BCR_HOLB_DROP_L2_IRQ BIT(4) 172 - #define BCR_DUAL_TX BIT(5) 185 + /* The next two fields are not present for IPA v4.2 */ 186 + #define BCR_CMDQ_L_LACK_ONE_ENTRY_FMASK GENMASK(0, 0) 187 + #define BCR_TX_NOT_USING_BRESP_FMASK GENMASK(1, 1) 188 + /* The next field is invalid for IPA v4.1 */ 189 + #define BCR_TX_SUSPEND_IRQ_ASSERT_ONCE_FMASK GENMASK(2, 2) 190 + /* The next two fields are not present for IPA v4.2 */ 191 + #define BCR_SUSPEND_L2_IRQ_FMASK GENMASK(3, 3) 192 + #define BCR_HOLB_DROP_L2_IRQ_FMASK GENMASK(4, 4) 193 + #define BCR_DUAL_TX_FMASK GENMASK(5, 5) 194 + #define BCR_ENABLE_FILTER_DATA_CACHE_FMASK GENMASK(6, 6) 195 + #define BCR_NOTIF_PRIORITY_OVER_ZLT_FMASK GENMASK(7, 7) 196 + #define BCR_FILTER_PREFETCH_EN_FMASK GENMASK(8, 8) 197 + #define BCR_ROUTER_PREFETCH_EN_FMASK GENMASK(9, 9) 173 198 174 199 /* Backward compatibility register value to use for each version */ 175 200 static inline u32 ipa_reg_bcr_val(enum ipa_version version) 176 201 { 177 202 if (version == IPA_VERSION_3_5_1) 178 - return BCR_CMDQ_L_LACK_ONE_ENTRY | BCR_TX_NOT_USING_BRESP | 179 - BCR_SUSPEND_L2_IRQ | BCR_HOLB_DROP_L2_IRQ | BCR_DUAL_TX; 203 + return BCR_CMDQ_L_LACK_ONE_ENTRY_FMASK | 204 + BCR_TX_NOT_USING_BRESP_FMASK | 205 + BCR_SUSPEND_L2_IRQ_FMASK | 206 + BCR_HOLB_DROP_L2_IRQ_FMASK | 207 + BCR_DUAL_TX_FMASK; 180 208 181 209 if (version == IPA_VERSION_4_0 || version == IPA_VERSION_4_1) 182 - return BCR_CMDQ_L_LACK_ONE_ENTRY | BCR_SUSPEND_L2_IRQ | 183 - BCR_HOLB_DROP_L2_IRQ | BCR_DUAL_TX; 210 + return BCR_CMDQ_L_LACK_ONE_ENTRY_FMASK | 211 + BCR_SUSPEND_L2_IRQ_FMASK | 212 + BCR_HOLB_DROP_L2_IRQ_FMASK | 213 + BCR_DUAL_TX_FMASK; 184 214 185 215 return 0x00000000; 186 216 } 187 217 218 + /* The value of the next register must be a multiple of 8 */ 188 219 #define IPA_REG_LOCAL_PKT_PROC_CNTXT_BASE_OFFSET 0x000001e8 189 220 190 - #define IPA_REG_AGGR_FORCE_CLOSE_OFFSET 0x000001ec 191 221 /* ipa->available defines the valid bits in the AGGR_FORCE_CLOSE register */ 192 - 193 - /* The internal inactivity timer clock is used for the aggregation timer */ 194 - #define TIMER_FREQUENCY 32000 /* 32 KHz inactivity timer clock */ 222 + #define IPA_REG_AGGR_FORCE_CLOSE_OFFSET 0x000001ec 195 223 196 224 #define IPA_REG_COUNTER_CFG_OFFSET 0x000001f0 197 - #define AGGR_GRANULARITY GENMASK(8, 4) 225 + #define AGGR_GRANULARITY_FMASK GENMASK(8, 4) 226 + 227 + /* The internal inactivity timer clock is used for the aggregation timer */ 228 + #define TIMER_FREQUENCY 32000 /* 32 KHz inactivity timer clock */ 229 + 198 230 /* Compute the value to use in the AGGR_GRANULARITY field representing the 199 231 * given number of microseconds. The value is one less than the number of 200 - * timer ticks in the requested period. Zero not a valid granularity value. 232 + * timer ticks in the requested period. 0 not a valid granularity value. 201 233 */ 202 234 static inline u32 ipa_aggr_granularity_val(u32 usec) 203 235 { ··· 231 213 232 214 #define IPA_REG_TX_CFG_OFFSET 0x000001fc 233 215 /* The first three fields are present for IPA v3.5.1 only */ 234 - #define TX0_PREFETCH_DISABLE GENMASK(0, 0) 235 - #define TX1_PREFETCH_DISABLE GENMASK(1, 1) 236 - #define PREFETCH_ALMOST_EMPTY_SIZE GENMASK(4, 2) 237 - /* The next fields are present for IPA v4.0 and above */ 238 - #define PREFETCH_ALMOST_EMPTY_SIZE_TX0 GENMASK(5, 2) 239 - #define DMAW_SCND_OUTSD_PRED_THRESHOLD GENMASK(9, 6) 240 - #define DMAW_SCND_OUTSD_PRED_EN GENMASK(10, 10) 241 - #define DMAW_MAX_BEATS_256_DIS GENMASK(11, 11) 242 - #define PA_MASK_EN GENMASK(12, 12) 243 - #define PREFETCH_ALMOST_EMPTY_SIZE_TX1 GENMASK(16, 13) 244 - /* The last two fields are present for IPA v4.2 and above */ 245 - #define SSPND_PA_NO_START_STATE GENMASK(18, 18) 246 - #define SSPND_PA_NO_BQ_STATE GENMASK(19, 19) 216 + #define TX0_PREFETCH_DISABLE_FMASK GENMASK(0, 0) 217 + #define TX1_PREFETCH_DISABLE_FMASK GENMASK(1, 1) 218 + #define PREFETCH_ALMOST_EMPTY_SIZE_FMASK GENMASK(4, 2) 219 + /* The next six fields are present for IPA v4.0 and above */ 220 + #define PREFETCH_ALMOST_EMPTY_SIZE_TX0_FMASK GENMASK(5, 2) 221 + #define DMAW_SCND_OUTSD_PRED_THRESHOLD_FMASK GENMASK(9, 6) 222 + #define DMAW_SCND_OUTSD_PRED_EN_FMASK GENMASK(10, 10) 223 + #define DMAW_MAX_BEATS_256_DIS_FMASK GENMASK(11, 11) 224 + #define PA_MASK_EN_FMASK GENMASK(12, 12) 225 + #define PREFETCH_ALMOST_EMPTY_SIZE_TX1_FMASK GENMASK(16, 13) 226 + /* The next two fields are present for IPA v4.2 only */ 227 + #define SSPND_PA_NO_START_STATE_FMASK GENMASK(18, 18) 228 + #define SSPND_PA_NO_BQ_STATE_FMASK GENMASK(19, 19) 247 229 248 230 #define IPA_REG_FLAVOR_0_OFFSET 0x00000210 249 - #define BAM_MAX_PIPES_FMASK GENMASK(4, 0) 250 - #define BAM_MAX_CONS_PIPES_FMASK GENMASK(12, 8) 251 - #define BAM_MAX_PROD_PIPES_FMASK GENMASK(20, 16) 252 - #define BAM_PROD_LOWEST_FMASK GENMASK(27, 24) 231 + #define IPA_MAX_PIPES_FMASK GENMASK(3, 0) 232 + #define IPA_MAX_CONS_PIPES_FMASK GENMASK(12, 8) 233 + #define IPA_MAX_PROD_PIPES_FMASK GENMASK(20, 16) 234 + #define IPA_PROD_LOWEST_FMASK GENMASK(27, 24) 253 235 254 236 static inline u32 ipa_reg_idle_indication_cfg_offset(enum ipa_version version) 255 237 { ··· 311 293 (0x00000504 + 0x0020 * (rt)) 312 294 #define IPA_REG_DST_RSRC_GRP_45_RSRC_TYPE_N_OFFSET(rt) \ 313 295 (0x00000508 + 0x0020 * (rt)) 296 + /* The next four fields are used for all resource group registers */ 314 297 #define X_MIN_LIM_FMASK GENMASK(5, 0) 315 298 #define X_MAX_LIM_FMASK GENMASK(13, 8) 299 + /* The next two fields are not always present (if resource count is odd) */ 316 300 #define Y_MIN_LIM_FMASK GENMASK(21, 16) 317 301 #define Y_MAX_LIM_FMASK GENMASK(29, 24) 318 302 319 303 #define IPA_REG_ENDP_INIT_CTRL_N_OFFSET(ep) \ 320 304 (0x00000800 + 0x0070 * (ep)) 305 + /* The next field should only used for IPA v3.5.1 */ 321 306 #define ENDP_SUSPEND_FMASK GENMASK(0, 0) 322 307 #define ENDP_DELAY_FMASK GENMASK(1, 1) 323 308 ··· 330 309 #define CS_OFFLOAD_EN_FMASK GENMASK(2, 1) 331 310 #define CS_METADATA_HDR_OFFSET_FMASK GENMASK(6, 3) 332 311 #define CS_GEN_QMB_MASTER_SEL_FMASK GENMASK(8, 8) 312 + 313 + /** enum ipa_cs_offload_en - checksum offload field in ENDP_INIT_CFG_N */ 314 + enum ipa_cs_offload_en { 315 + IPA_CS_OFFLOAD_NONE = 0x0, 316 + IPA_CS_OFFLOAD_UL = 0x1, 317 + IPA_CS_OFFLOAD_DL = 0x2, 318 + }; 333 319 334 320 #define IPA_REG_ENDP_INIT_HDR_N_OFFSET(ep) \ 335 321 (0x00000810 + 0x0070 * (ep)) ··· 373 345 #define PAD_EN_FMASK GENMASK(29, 29) 374 346 #define HDR_FTCH_DISABLE_FMASK GENMASK(30, 30) 375 347 348 + /** enum ipa_mode - mode field in ENDP_INIT_MODE_N */ 349 + enum ipa_mode { 350 + IPA_BASIC = 0x0, 351 + IPA_ENABLE_FRAMING_HDLC = 0x1, 352 + IPA_ENABLE_DEFRAMING_HDLC = 0x2, 353 + IPA_DMA = 0x3, 354 + }; 355 + 376 356 #define IPA_REG_ENDP_INIT_AGGR_N_OFFSET(ep) \ 377 357 (0x00000824 + 0x0070 * (ep)) 378 358 #define AGGR_EN_FMASK GENMASK(1, 0) ··· 392 356 #define AGGR_FORCE_CLOSE_FMASK GENMASK(22, 22) 393 357 #define AGGR_HARD_BYTE_LIMIT_ENABLE_FMASK GENMASK(24, 24) 394 358 359 + /** enum ipa_aggr_en - aggregation enable field in ENDP_INIT_AGGR_N */ 360 + enum ipa_aggr_en { 361 + IPA_BYPASS_AGGR = 0x0, 362 + IPA_ENABLE_AGGR = 0x1, 363 + IPA_ENABLE_DEAGGR = 0x2, 364 + }; 365 + 366 + /** enum ipa_aggr_type - aggregation type field in ENDP_INIT_AGGR_N */ 367 + enum ipa_aggr_type { 368 + IPA_MBIM_16 = 0x0, 369 + IPA_HDLC = 0x1, 370 + IPA_TLP = 0x2, 371 + IPA_RNDIS = 0x3, 372 + IPA_GENERIC = 0x4, 373 + IPA_COALESCE = 0x5, 374 + IPA_QCMAP = 0x6, 375 + }; 376 + 395 377 /* Valid only for RX (IPA producer) endpoints */ 396 378 #define IPA_REG_ENDP_INIT_HOL_BLOCK_EN_N_OFFSET(rxep) \ 397 379 (0x0000082c + 0x0070 * (rxep)) ··· 418 364 /* Valid only for RX (IPA producer) endpoints */ 419 365 #define IPA_REG_ENDP_INIT_HOL_BLOCK_TIMER_N_OFFSET(rxep) \ 420 366 (0x00000830 + 0x0070 * (rxep)) 421 - /* The next fields are present for IPA v4.2 only */ 367 + /* The next two fields are present for IPA v4.2 only */ 422 368 #define BASE_VALUE_FMASK GENMASK(4, 0) 423 369 #define SCALE_FMASK GENMASK(12, 8) 424 370 ··· 426 372 #define IPA_REG_ENDP_INIT_DEAGGR_N_OFFSET(txep) \ 427 373 (0x00000834 + 0x0070 * (txep)) 428 374 #define DEAGGR_HDR_LEN_FMASK GENMASK(5, 0) 375 + #define SYSPIPE_ERR_DETECTION_FMASK GENMASK(6, 6) 429 376 #define PACKET_OFFSET_VALID_FMASK GENMASK(7, 7) 430 377 #define PACKET_OFFSET_LOCATION_FMASK GENMASK(13, 8) 378 + #define IGNORE_MIN_PKT_ERR_FMASK GENMASK(14, 14) 431 379 #define MAX_PACKET_LEN_FMASK GENMASK(31, 16) 432 380 433 381 #define IPA_REG_ENDP_INIT_RSRC_GRP_N_OFFSET(ep) \ ··· 453 397 #define HPS_REP_SEQ_TYPE_FMASK GENMASK(11, 8) 454 398 #define DPS_REP_SEQ_TYPE_FMASK GENMASK(15, 12) 455 399 400 + /** 401 + * enum ipa_seq_type - HPS and DPS sequencer type fields in ENDP_INIT_SEQ_N 402 + * @IPA_SEQ_DMA_ONLY: only DMA is performed 403 + * @IPA_SEQ_2ND_PKT_PROCESS_PASS_NO_DEC_UCP: 404 + * second packet processing pass + no decipher + microcontroller 405 + * @IPA_SEQ_PKT_PROCESS_NO_DEC_NO_UCP_DMAP: 406 + * packet processing + no decipher + no uCP + HPS REP DMA parser 407 + * @IPA_SEQ_INVALID: invalid sequencer type 408 + * 409 + * The values defined here are broken into 4-bit nibbles that are written 410 + * into fields of the INIT_SEQ_N endpoint registers. 411 + */ 412 + enum ipa_seq_type { 413 + IPA_SEQ_DMA_ONLY = 0x0000, 414 + IPA_SEQ_2ND_PKT_PROCESS_PASS_NO_DEC_UCP = 0x0004, 415 + IPA_SEQ_PKT_PROCESS_NO_DEC_NO_UCP_DMAP = 0x0806, 416 + IPA_SEQ_INVALID = 0xffff, 417 + }; 418 + 456 419 #define IPA_REG_ENDP_STATUS_N_OFFSET(ep) \ 457 420 (0x00000840 + 0x0070 * (ep)) 458 421 #define STATUS_EN_FMASK GENMASK(0, 0) 459 422 #define STATUS_ENDP_FMASK GENMASK(5, 1) 460 423 #define STATUS_LOCATION_FMASK GENMASK(8, 8) 461 - /* The next field is present for IPA v4.0 and above */ 424 + /* The next field is not present for IPA v3.5.1 */ 462 425 #define STATUS_PKT_SUPPRESS_FMASK GENMASK(9, 9) 463 426 464 - /* "er" is either an endpoint ID (for filters) or a route ID (for routes) */ 427 + /* The next register is only present for IPA versions that support hashing */ 465 428 #define IPA_REG_ENDP_FILTER_ROUTER_HSH_CFG_N_OFFSET(er) \ 466 429 (0x0000085c + 0x0070 * (er)) 467 430 #define FILTER_HASH_MSK_SRC_ID_FMASK GENMASK(0, 0) ··· 515 440 IPA_REG_IRQ_CLR_EE_N_OFFSET(GSI_EE_AP) 516 441 #define IPA_REG_IRQ_CLR_EE_N_OFFSET(ee) \ 517 442 (0x00003010 + 0x1000 * (ee)) 443 + /** 444 + * enum ipa_irq_id - Bit positions representing type of IPA IRQ 445 + * @IPA_IRQ_UC_0: Microcontroller event interrupt 446 + * @IPA_IRQ_UC_1: Microcontroller response interrupt 447 + * @IPA_IRQ_TX_SUSPEND: Data ready interrupt 448 + * 449 + * IRQ types not described above are not currently used. 450 + */ 451 + enum ipa_irq_id { 452 + IPA_IRQ_BAD_SNOC_ACCESS = 0x0, 453 + /* Type (bit) 0x1 is not defined */ 454 + IPA_IRQ_UC_0 = 0x2, 455 + IPA_IRQ_UC_1 = 0x3, 456 + IPA_IRQ_UC_2 = 0x4, 457 + IPA_IRQ_UC_3 = 0x5, 458 + IPA_IRQ_UC_IN_Q_NOT_EMPTY = 0x6, 459 + IPA_IRQ_UC_RX_CMD_Q_NOT_FULL = 0x7, 460 + IPA_IRQ_PROC_UC_ACK_Q_NOT_EMPTY = 0x8, 461 + IPA_IRQ_RX_ERR = 0x9, 462 + IPA_IRQ_DEAGGR_ERR = 0xa, 463 + IPA_IRQ_TX_ERR = 0xb, 464 + IPA_IRQ_STEP_MODE = 0xc, 465 + IPA_IRQ_PROC_ERR = 0xd, 466 + IPA_IRQ_TX_SUSPEND = 0xe, 467 + IPA_IRQ_TX_HOLB_DROP = 0xf, 468 + IPA_IRQ_BAM_GSI_IDLE = 0x10, 469 + IPA_IRQ_PIPE_YELLOW_BELOW = 0x11, 470 + IPA_IRQ_PIPE_RED_BELOW = 0x12, 471 + IPA_IRQ_PIPE_YELLOW_ABOVE = 0x13, 472 + IPA_IRQ_PIPE_RED_ABOVE = 0x14, 473 + IPA_IRQ_UCP = 0x15, 474 + IPA_IRQ_DCMP = 0x16, 475 + IPA_IRQ_GSI_EE = 0x17, 476 + IPA_IRQ_GSI_IPA_IF_TLV_RCVD = 0x18, 477 + IPA_IRQ_GSI_UC = 0x19, 478 + IPA_IRQ_COUNT, /* Last; not an id */ 479 + }; 518 480 519 481 #define IPA_REG_IRQ_UC_OFFSET \ 520 482 IPA_REG_IRQ_UC_EE_N_OFFSET(GSI_EE_AP) 521 483 #define IPA_REG_IRQ_UC_EE_N_OFFSET(ee) \ 522 484 (0x0000301c + 0x1000 * (ee)) 485 + #define UC_INTR_FMASK GENMASK(0, 0) 523 486 487 + /* ipa->available defines the valid bits in the SUSPEND_INFO register */ 524 488 #define IPA_REG_IRQ_SUSPEND_INFO_OFFSET \ 525 489 IPA_REG_IRQ_SUSPEND_INFO_EE_N_OFFSET(GSI_EE_AP) 526 490 #define IPA_REG_IRQ_SUSPEND_INFO_EE_N_OFFSET(ee) \ 527 491 (0x00003030 + 0x1000 * (ee)) 528 - /* ipa->available defines the valid bits in the SUSPEND_INFO register */ 529 492 530 - #define IPA_REG_SUSPEND_IRQ_EN_OFFSET \ 531 - IPA_REG_SUSPEND_IRQ_EN_EE_N_OFFSET(GSI_EE_AP) 532 - #define IPA_REG_SUSPEND_IRQ_EN_EE_N_OFFSET(ee) \ 493 + /* ipa->available defines the valid bits in the IRQ_SUSPEND_EN register */ 494 + #define IPA_REG_IRQ_SUSPEND_EN_OFFSET \ 495 + IPA_REG_IRQ_SUSPEND_EN_EE_N_OFFSET(GSI_EE_AP) 496 + #define IPA_REG_IRQ_SUSPEND_EN_EE_N_OFFSET(ee) \ 533 497 (0x00003034 + 0x1000 * (ee)) 534 - /* ipa->available defines the valid bits in the SUSPEND_IRQ_EN register */ 535 498 536 - #define IPA_REG_SUSPEND_IRQ_CLR_OFFSET \ 537 - IPA_REG_SUSPEND_IRQ_CLR_EE_N_OFFSET(GSI_EE_AP) 538 - #define IPA_REG_SUSPEND_IRQ_CLR_EE_N_OFFSET(ee) \ 499 + /* ipa->available defines the valid bits in the IRQ_SUSPEND_CLR register */ 500 + #define IPA_REG_IRQ_SUSPEND_CLR_OFFSET \ 501 + IPA_REG_IRQ_SUSPEND_CLR_EE_N_OFFSET(GSI_EE_AP) 502 + #define IPA_REG_IRQ_SUSPEND_CLR_EE_N_OFFSET(ee) \ 539 503 (0x00003038 + 0x1000 * (ee)) 540 - /* ipa->available defines the valid bits in the SUSPEND_IRQ_CLR register */ 541 - 542 - /** enum ipa_cs_offload_en - checksum offload field in ENDP_INIT_CFG_N */ 543 - enum ipa_cs_offload_en { 544 - IPA_CS_OFFLOAD_NONE = 0, 545 - IPA_CS_OFFLOAD_UL = 1, 546 - IPA_CS_OFFLOAD_DL = 2, 547 - IPA_CS_RSVD 548 - }; 549 - 550 - /** enum ipa_aggr_en - aggregation enable field in ENDP_INIT_AGGR_N */ 551 - enum ipa_aggr_en { 552 - IPA_BYPASS_AGGR = 0, 553 - IPA_ENABLE_AGGR = 1, 554 - IPA_ENABLE_DEAGGR = 2, 555 - }; 556 - 557 - /** enum ipa_aggr_type - aggregation type field in in_ENDP_INIT_AGGR_N */ 558 - enum ipa_aggr_type { 559 - IPA_MBIM_16 = 0, 560 - IPA_HDLC = 1, 561 - IPA_TLP = 2, 562 - IPA_RNDIS = 3, 563 - IPA_GENERIC = 4, 564 - IPA_COALESCE = 5, 565 - IPA_QCMAP = 6, 566 - }; 567 - 568 - /** enum ipa_mode - mode field in ENDP_INIT_MODE_N */ 569 - enum ipa_mode { 570 - IPA_BASIC = 0, 571 - IPA_ENABLE_FRAMING_HDLC = 1, 572 - IPA_ENABLE_DEFRAMING_HDLC = 2, 573 - IPA_DMA = 3, 574 - }; 575 - 576 - /** 577 - * enum ipa_seq_type - HPS and DPS sequencer type fields in in ENDP_INIT_SEQ_N 578 - * @IPA_SEQ_DMA_ONLY: only DMA is performed 579 - * @IPA_SEQ_PKT_PROCESS_NO_DEC_UCP: 580 - * packet processing + no decipher + microcontroller (Ethernet Bridging) 581 - * @IPA_SEQ_2ND_PKT_PROCESS_PASS_NO_DEC_UCP: 582 - * second packet processing pass + no decipher + microcontroller 583 - * @IPA_SEQ_DMA_DEC: DMA + cipher/decipher 584 - * @IPA_SEQ_DMA_COMP_DECOMP: DMA + compression/decompression 585 - * @IPA_SEQ_PKT_PROCESS_NO_DEC_NO_UCP_DMAP: 586 - * packet processing + no decipher + no uCP + HPS REP DMA parser 587 - * @IPA_SEQ_INVALID: invalid sequencer type 588 - * 589 - * The values defined here are broken into 4-bit nibbles that are written 590 - * into fields of the INIT_SEQ_N endpoint registers. 591 - */ 592 - enum ipa_seq_type { 593 - IPA_SEQ_DMA_ONLY = 0x0000, 594 - IPA_SEQ_PKT_PROCESS_NO_DEC_UCP = 0x0002, 595 - IPA_SEQ_2ND_PKT_PROCESS_PASS_NO_DEC_UCP = 0x0004, 596 - IPA_SEQ_DMA_DEC = 0x0011, 597 - IPA_SEQ_DMA_COMP_DECOMP = 0x0020, 598 - IPA_SEQ_PKT_PROCESS_NO_DEC_NO_UCP_DMAP = 0x0806, 599 - IPA_SEQ_INVALID = 0xffff, 600 - }; 601 504 602 505 int ipa_reg_init(struct ipa *ipa); 603 506 void ipa_reg_exit(struct ipa *ipa);
+2 -2
drivers/net/ipa/ipa_table.c
··· 422 422 return -EBUSY; 423 423 } 424 424 425 - val = IPV4_FILTER_HASH_FLUSH | IPV6_FILTER_HASH_FLUSH; 426 - val |= IPV6_ROUTER_HASH_FLUSH | IPV4_ROUTER_HASH_FLUSH; 425 + val = IPV4_FILTER_HASH_FMASK | IPV6_FILTER_HASH_FMASK; 426 + val |= IPV6_ROUTER_HASH_FMASK | IPV4_ROUTER_HASH_FMASK; 427 427 428 428 ipa_cmd_register_write_add(trans, offset, val, val, false); 429 429
+24 -19
drivers/net/ipa/ipa_uc.c
··· 86 86 87 87 /** enum ipa_uc_command - commands from the AP to the microcontroller */ 88 88 enum ipa_uc_command { 89 - IPA_UC_COMMAND_NO_OP = 0, 90 - IPA_UC_COMMAND_UPDATE_FLAGS = 1, 91 - IPA_UC_COMMAND_DEBUG_RUN_TEST = 2, 92 - IPA_UC_COMMAND_DEBUG_GET_INFO = 3, 93 - IPA_UC_COMMAND_ERR_FATAL = 4, 94 - IPA_UC_COMMAND_CLK_GATE = 5, 95 - IPA_UC_COMMAND_CLK_UNGATE = 6, 96 - IPA_UC_COMMAND_MEMCPY = 7, 97 - IPA_UC_COMMAND_RESET_PIPE = 8, 98 - IPA_UC_COMMAND_REG_WRITE = 9, 99 - IPA_UC_COMMAND_GSI_CH_EMPTY = 10, 89 + IPA_UC_COMMAND_NO_OP = 0x0, 90 + IPA_UC_COMMAND_UPDATE_FLAGS = 0x1, 91 + IPA_UC_COMMAND_DEBUG_RUN_TEST = 0x2, 92 + IPA_UC_COMMAND_DEBUG_GET_INFO = 0x3, 93 + IPA_UC_COMMAND_ERR_FATAL = 0x4, 94 + IPA_UC_COMMAND_CLK_GATE = 0x5, 95 + IPA_UC_COMMAND_CLK_UNGATE = 0x6, 96 + IPA_UC_COMMAND_MEMCPY = 0x7, 97 + IPA_UC_COMMAND_RESET_PIPE = 0x8, 98 + IPA_UC_COMMAND_REG_WRITE = 0x9, 99 + IPA_UC_COMMAND_GSI_CH_EMPTY = 0xa, 100 100 }; 101 101 102 102 /** enum ipa_uc_response - microcontroller response codes */ 103 103 enum ipa_uc_response { 104 - IPA_UC_RESPONSE_NO_OP = 0, 105 - IPA_UC_RESPONSE_INIT_COMPLETED = 1, 106 - IPA_UC_RESPONSE_CMD_COMPLETED = 2, 107 - IPA_UC_RESPONSE_DEBUG_GET_INFO = 3, 104 + IPA_UC_RESPONSE_NO_OP = 0x0, 105 + IPA_UC_RESPONSE_INIT_COMPLETED = 0x1, 106 + IPA_UC_RESPONSE_CMD_COMPLETED = 0x2, 107 + IPA_UC_RESPONSE_DEBUG_GET_INFO = 0x3, 108 108 }; 109 109 110 110 /** enum ipa_uc_event - common cpu events reported by the microcontroller */ 111 111 enum ipa_uc_event { 112 - IPA_UC_EVENT_NO_OP = 0, 113 - IPA_UC_EVENT_ERROR = 1, 114 - IPA_UC_EVENT_LOG_INFO = 2, 112 + IPA_UC_EVENT_NO_OP = 0x0, 113 + IPA_UC_EVENT_ERROR = 0x1, 114 + IPA_UC_EVENT_LOG_INFO = 0x2, 115 115 }; 116 116 117 117 static struct ipa_uc_mem_area *ipa_uc_shared(struct ipa *ipa) ··· 192 192 static void send_uc_command(struct ipa *ipa, u32 command, u32 command_param) 193 193 { 194 194 struct ipa_uc_mem_area *shared = ipa_uc_shared(ipa); 195 + u32 val; 195 196 197 + /* Fill in the command data */ 196 198 shared->command = command; 197 199 shared->command_param = cpu_to_le32(command_param); 198 200 shared->command_param_hi = 0; 199 201 shared->response = 0; 200 202 shared->response_param = 0; 201 203 202 - iowrite32(1, ipa->reg_virt + IPA_REG_IRQ_UC_OFFSET); 204 + /* Use an interrupt to tell the microcontroller the command is ready */ 205 + val = u32_encode_bits(1, UC_INTR_FMASK); 206 + 207 + iowrite32(val, ipa->reg_virt + IPA_REG_IRQ_UC_OFFSET); 203 208 } 204 209 205 210 /* Tell the microcontroller the AP is shutting down */