1*2c7b9b93SAlex Elder // SPDX-License-Identifier: GPL-2.0 2*2c7b9b93SAlex Elder 3*2c7b9b93SAlex Elder /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. 4*2c7b9b93SAlex Elder * Copyright (C) 2019-2021 Linaro Ltd. 5*2c7b9b93SAlex Elder */ 6*2c7b9b93SAlex Elder 7*2c7b9b93SAlex Elder #include <linux/log2.h> 8*2c7b9b93SAlex Elder 9*2c7b9b93SAlex Elder #include "gsi.h" 10*2c7b9b93SAlex Elder #include "ipa_data.h" 11*2c7b9b93SAlex Elder #include "ipa_endpoint.h" 12*2c7b9b93SAlex Elder #include "ipa_mem.h" 13*2c7b9b93SAlex Elder 14*2c7b9b93SAlex Elder /** enum ipa_resource_type - IPA resource types for an SoC having IPA v3.1 */ 15*2c7b9b93SAlex Elder enum ipa_resource_type { 16*2c7b9b93SAlex Elder /* Source resource types; first must have value 0 */ 17*2c7b9b93SAlex Elder IPA_RESOURCE_TYPE_SRC_PKT_CONTEXTS = 0, 18*2c7b9b93SAlex Elder IPA_RESOURCE_TYPE_SRC_HDR_SECTORS, 19*2c7b9b93SAlex Elder IPA_RESOURCE_TYPE_SRC_HDRI1_BUFFER, 20*2c7b9b93SAlex Elder IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_LISTS, 21*2c7b9b93SAlex Elder IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_BUFF, 22*2c7b9b93SAlex Elder IPA_RESOURCE_TYPE_SRC_HDRI2_BUFFERS, 23*2c7b9b93SAlex Elder IPA_RESOURCE_TYPE_SRC_HPS_DMARS, 24*2c7b9b93SAlex Elder IPA_RESOURCE_TYPE_SRC_ACK_ENTRIES, 25*2c7b9b93SAlex Elder 26*2c7b9b93SAlex Elder /* Destination resource types; first must have value 0 */ 27*2c7b9b93SAlex Elder IPA_RESOURCE_TYPE_DST_DATA_SECTORS = 0, 28*2c7b9b93SAlex Elder IPA_RESOURCE_TYPE_DST_DATA_SECTOR_LISTS, 29*2c7b9b93SAlex Elder IPA_RESOURCE_TYPE_DST_DPS_DMARS, 30*2c7b9b93SAlex Elder }; 31*2c7b9b93SAlex Elder 32*2c7b9b93SAlex Elder /* Resource groups used for an SoC having IPA v3.1 */ 33*2c7b9b93SAlex Elder enum ipa_rsrc_group_id { 34*2c7b9b93SAlex Elder /* Source resource group identifiers */ 35*2c7b9b93SAlex Elder IPA_RSRC_GROUP_SRC_UL = 0, 36*2c7b9b93SAlex Elder IPA_RSRC_GROUP_SRC_DL, 37*2c7b9b93SAlex Elder IPA_RSRC_GROUP_SRC_DIAG, 38*2c7b9b93SAlex Elder IPA_RSRC_GROUP_SRC_DMA, 39*2c7b9b93SAlex Elder IPA_RSRC_GROUP_SRC_UNUSED, 40*2c7b9b93SAlex Elder IPA_RSRC_GROUP_SRC_UC_RX_Q, 41*2c7b9b93SAlex Elder IPA_RSRC_GROUP_SRC_COUNT, /* Last in set; not a source group */ 42*2c7b9b93SAlex Elder 43*2c7b9b93SAlex Elder /* Destination resource group identifiers */ 44*2c7b9b93SAlex Elder IPA_RSRC_GROUP_DST_UL = 0, 45*2c7b9b93SAlex Elder IPA_RSRC_GROUP_DST_DL, 46*2c7b9b93SAlex Elder IPA_RSRC_GROUP_DST_DIAG_DPL, 47*2c7b9b93SAlex Elder IPA_RSRC_GROUP_DST_DMA, 48*2c7b9b93SAlex Elder IPA_RSRC_GROUP_DST_Q6ZIP_GENERAL, 49*2c7b9b93SAlex Elder IPA_RSRC_GROUP_DST_Q6ZIP_ENGINE, 50*2c7b9b93SAlex Elder IPA_RSRC_GROUP_DST_COUNT, /* Last; not a destination group */ 51*2c7b9b93SAlex Elder }; 52*2c7b9b93SAlex Elder 53*2c7b9b93SAlex Elder /* QSB configuration data for an SoC having IPA v3.1 */ 54*2c7b9b93SAlex Elder static const struct ipa_qsb_data ipa_qsb_data[] = { 55*2c7b9b93SAlex Elder [IPA_QSB_MASTER_DDR] = { 56*2c7b9b93SAlex Elder .max_writes = 8, 57*2c7b9b93SAlex Elder .max_reads = 8, 58*2c7b9b93SAlex Elder }, 59*2c7b9b93SAlex Elder [IPA_QSB_MASTER_PCIE] = { 60*2c7b9b93SAlex Elder .max_writes = 2, 61*2c7b9b93SAlex Elder .max_reads = 8, 62*2c7b9b93SAlex Elder }, 63*2c7b9b93SAlex Elder }; 64*2c7b9b93SAlex Elder 65*2c7b9b93SAlex Elder /* Endpoint data for an SoC having IPA v3.1 */ 66*2c7b9b93SAlex Elder static const struct ipa_gsi_endpoint_data ipa_gsi_endpoint_data[] = { 67*2c7b9b93SAlex Elder [IPA_ENDPOINT_AP_COMMAND_TX] = { 68*2c7b9b93SAlex Elder .ee_id = GSI_EE_AP, 69*2c7b9b93SAlex Elder .channel_id = 6, 70*2c7b9b93SAlex Elder .endpoint_id = 22, 71*2c7b9b93SAlex Elder .toward_ipa = true, 72*2c7b9b93SAlex Elder .channel = { 73*2c7b9b93SAlex Elder .tre_count = 256, 74*2c7b9b93SAlex Elder .event_count = 256, 75*2c7b9b93SAlex Elder .tlv_count = 18, 76*2c7b9b93SAlex Elder }, 77*2c7b9b93SAlex Elder .endpoint = { 78*2c7b9b93SAlex Elder .config = { 79*2c7b9b93SAlex Elder .resource_group = IPA_RSRC_GROUP_SRC_UL, 80*2c7b9b93SAlex Elder .dma_mode = true, 81*2c7b9b93SAlex Elder .dma_endpoint = IPA_ENDPOINT_AP_LAN_RX, 82*2c7b9b93SAlex Elder .tx = { 83*2c7b9b93SAlex Elder .seq_type = IPA_SEQ_DMA, 84*2c7b9b93SAlex Elder }, 85*2c7b9b93SAlex Elder }, 86*2c7b9b93SAlex Elder }, 87*2c7b9b93SAlex Elder }, 88*2c7b9b93SAlex Elder [IPA_ENDPOINT_AP_LAN_RX] = { 89*2c7b9b93SAlex Elder .ee_id = GSI_EE_AP, 90*2c7b9b93SAlex Elder .channel_id = 7, 91*2c7b9b93SAlex Elder .endpoint_id = 15, 92*2c7b9b93SAlex Elder .toward_ipa = false, 93*2c7b9b93SAlex Elder .channel = { 94*2c7b9b93SAlex Elder .tre_count = 256, 95*2c7b9b93SAlex Elder .event_count = 256, 96*2c7b9b93SAlex Elder .tlv_count = 8, 97*2c7b9b93SAlex Elder }, 98*2c7b9b93SAlex Elder .endpoint = { 99*2c7b9b93SAlex Elder .config = { 100*2c7b9b93SAlex Elder .resource_group = IPA_RSRC_GROUP_SRC_UL, 101*2c7b9b93SAlex Elder .aggregation = true, 102*2c7b9b93SAlex Elder .status_enable = true, 103*2c7b9b93SAlex Elder .rx = { 104*2c7b9b93SAlex Elder .buffer_size = 8192, 105*2c7b9b93SAlex Elder .pad_align = ilog2(sizeof(u32)), 106*2c7b9b93SAlex Elder .aggr_time_limit = 500, 107*2c7b9b93SAlex Elder }, 108*2c7b9b93SAlex Elder }, 109*2c7b9b93SAlex Elder }, 110*2c7b9b93SAlex Elder }, 111*2c7b9b93SAlex Elder [IPA_ENDPOINT_AP_MODEM_TX] = { 112*2c7b9b93SAlex Elder .ee_id = GSI_EE_AP, 113*2c7b9b93SAlex Elder .channel_id = 5, 114*2c7b9b93SAlex Elder .endpoint_id = 3, 115*2c7b9b93SAlex Elder .toward_ipa = true, 116*2c7b9b93SAlex Elder .channel = { 117*2c7b9b93SAlex Elder .tre_count = 512, 118*2c7b9b93SAlex Elder .event_count = 512, 119*2c7b9b93SAlex Elder .tlv_count = 16, 120*2c7b9b93SAlex Elder }, 121*2c7b9b93SAlex Elder .endpoint = { 122*2c7b9b93SAlex Elder .filter_support = true, 123*2c7b9b93SAlex Elder .config = { 124*2c7b9b93SAlex Elder .resource_group = IPA_RSRC_GROUP_SRC_UL, 125*2c7b9b93SAlex Elder .checksum = true, 126*2c7b9b93SAlex Elder .qmap = true, 127*2c7b9b93SAlex Elder .status_enable = true, 128*2c7b9b93SAlex Elder .tx = { 129*2c7b9b93SAlex Elder .seq_type = IPA_SEQ_2_PASS_SKIP_LAST_UC, 130*2c7b9b93SAlex Elder .status_endpoint = 131*2c7b9b93SAlex Elder IPA_ENDPOINT_MODEM_AP_RX, 132*2c7b9b93SAlex Elder }, 133*2c7b9b93SAlex Elder }, 134*2c7b9b93SAlex Elder }, 135*2c7b9b93SAlex Elder }, 136*2c7b9b93SAlex Elder [IPA_ENDPOINT_AP_MODEM_RX] = { 137*2c7b9b93SAlex Elder .ee_id = GSI_EE_AP, 138*2c7b9b93SAlex Elder .channel_id = 8, 139*2c7b9b93SAlex Elder .endpoint_id = 16, 140*2c7b9b93SAlex Elder .toward_ipa = false, 141*2c7b9b93SAlex Elder .channel = { 142*2c7b9b93SAlex Elder .tre_count = 256, 143*2c7b9b93SAlex Elder .event_count = 256, 144*2c7b9b93SAlex Elder .tlv_count = 8, 145*2c7b9b93SAlex Elder }, 146*2c7b9b93SAlex Elder .endpoint = { 147*2c7b9b93SAlex Elder .config = { 148*2c7b9b93SAlex Elder .resource_group = IPA_RSRC_GROUP_DST_DL, 149*2c7b9b93SAlex Elder .checksum = true, 150*2c7b9b93SAlex Elder .qmap = true, 151*2c7b9b93SAlex Elder .aggregation = true, 152*2c7b9b93SAlex Elder .rx = { 153*2c7b9b93SAlex Elder .buffer_size = 8192, 154*2c7b9b93SAlex Elder .aggr_time_limit = 500, 155*2c7b9b93SAlex Elder .aggr_close_eof = true, 156*2c7b9b93SAlex Elder }, 157*2c7b9b93SAlex Elder }, 158*2c7b9b93SAlex Elder }, 159*2c7b9b93SAlex Elder }, 160*2c7b9b93SAlex Elder [IPA_ENDPOINT_MODEM_LAN_TX] = { 161*2c7b9b93SAlex Elder .ee_id = GSI_EE_MODEM, 162*2c7b9b93SAlex Elder .channel_id = 4, 163*2c7b9b93SAlex Elder .endpoint_id = 9, 164*2c7b9b93SAlex Elder .toward_ipa = true, 165*2c7b9b93SAlex Elder .endpoint = { 166*2c7b9b93SAlex Elder .filter_support = true, 167*2c7b9b93SAlex Elder }, 168*2c7b9b93SAlex Elder }, 169*2c7b9b93SAlex Elder [IPA_ENDPOINT_MODEM_AP_TX] = { 170*2c7b9b93SAlex Elder .ee_id = GSI_EE_MODEM, 171*2c7b9b93SAlex Elder .channel_id = 0, 172*2c7b9b93SAlex Elder .endpoint_id = 5, 173*2c7b9b93SAlex Elder .toward_ipa = true, 174*2c7b9b93SAlex Elder .endpoint = { 175*2c7b9b93SAlex Elder .filter_support = true, 176*2c7b9b93SAlex Elder }, 177*2c7b9b93SAlex Elder }, 178*2c7b9b93SAlex Elder [IPA_ENDPOINT_MODEM_AP_RX] = { 179*2c7b9b93SAlex Elder .ee_id = GSI_EE_MODEM, 180*2c7b9b93SAlex Elder .channel_id = 5, 181*2c7b9b93SAlex Elder .endpoint_id = 18, 182*2c7b9b93SAlex Elder .toward_ipa = false, 183*2c7b9b93SAlex Elder }, 184*2c7b9b93SAlex Elder }; 185*2c7b9b93SAlex Elder 186*2c7b9b93SAlex Elder /* Source resource configuration data for an SoC having IPA v3.1 */ 187*2c7b9b93SAlex Elder static const struct ipa_resource ipa_resource_src[] = { 188*2c7b9b93SAlex Elder [IPA_RESOURCE_TYPE_SRC_PKT_CONTEXTS] = { 189*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL] = { 190*2c7b9b93SAlex Elder .min = 3, .max = 255, 191*2c7b9b93SAlex Elder }, 192*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DL] = { 193*2c7b9b93SAlex Elder .min = 3, .max = 255, 194*2c7b9b93SAlex Elder }, 195*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DIAG] = { 196*2c7b9b93SAlex Elder .min = 1, .max = 255, 197*2c7b9b93SAlex Elder }, 198*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DMA] = { 199*2c7b9b93SAlex Elder .min = 1, .max = 255, 200*2c7b9b93SAlex Elder }, 201*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UC_RX_Q] = { 202*2c7b9b93SAlex Elder .min = 2, .max = 255, 203*2c7b9b93SAlex Elder }, 204*2c7b9b93SAlex Elder }, 205*2c7b9b93SAlex Elder [IPA_RESOURCE_TYPE_SRC_HDR_SECTORS] = { 206*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL] = { 207*2c7b9b93SAlex Elder .min = 0, .max = 255, 208*2c7b9b93SAlex Elder }, 209*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DL] = { 210*2c7b9b93SAlex Elder .min = 0, .max = 255, 211*2c7b9b93SAlex Elder }, 212*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DIAG] = { 213*2c7b9b93SAlex Elder .min = 0, .max = 255, 214*2c7b9b93SAlex Elder }, 215*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DMA] = { 216*2c7b9b93SAlex Elder .min = 0, .max = 255, 217*2c7b9b93SAlex Elder }, 218*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UC_RX_Q] = { 219*2c7b9b93SAlex Elder .min = 0, .max = 255, 220*2c7b9b93SAlex Elder }, 221*2c7b9b93SAlex Elder }, 222*2c7b9b93SAlex Elder [IPA_RESOURCE_TYPE_SRC_HDRI1_BUFFER] = { 223*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL] = { 224*2c7b9b93SAlex Elder .min = 0, .max = 255, 225*2c7b9b93SAlex Elder }, 226*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DL] = { 227*2c7b9b93SAlex Elder .min = 0, .max = 255, 228*2c7b9b93SAlex Elder }, 229*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DIAG] = { 230*2c7b9b93SAlex Elder .min = 0, .max = 255, 231*2c7b9b93SAlex Elder }, 232*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DMA] = { 233*2c7b9b93SAlex Elder .min = 0, .max = 255, 234*2c7b9b93SAlex Elder }, 235*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UC_RX_Q] = { 236*2c7b9b93SAlex Elder .min = 0, .max = 255, 237*2c7b9b93SAlex Elder }, 238*2c7b9b93SAlex Elder }, 239*2c7b9b93SAlex Elder [IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_LISTS] = { 240*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL] = { 241*2c7b9b93SAlex Elder .min = 14, .max = 14, 242*2c7b9b93SAlex Elder }, 243*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DL] = { 244*2c7b9b93SAlex Elder .min = 16, .max = 16, 245*2c7b9b93SAlex Elder }, 246*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DIAG] = { 247*2c7b9b93SAlex Elder .min = 5, .max = 5, 248*2c7b9b93SAlex Elder }, 249*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DMA] = { 250*2c7b9b93SAlex Elder .min = 5, .max = 5, 251*2c7b9b93SAlex Elder }, 252*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UC_RX_Q] = { 253*2c7b9b93SAlex Elder .min = 8, .max = 8, 254*2c7b9b93SAlex Elder }, 255*2c7b9b93SAlex Elder }, 256*2c7b9b93SAlex Elder [IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_BUFF] = { 257*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL] = { 258*2c7b9b93SAlex Elder .min = 19, .max = 19, 259*2c7b9b93SAlex Elder }, 260*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DL] = { 261*2c7b9b93SAlex Elder .min = 26, .max = 26, 262*2c7b9b93SAlex Elder }, 263*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DIAG] = { 264*2c7b9b93SAlex Elder .min = 5, .max = 5, /* 3 downstream */ 265*2c7b9b93SAlex Elder }, 266*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DMA] = { 267*2c7b9b93SAlex Elder .min = 5, .max = 5, /* 7 downstream */ 268*2c7b9b93SAlex Elder }, 269*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UC_RX_Q] = { 270*2c7b9b93SAlex Elder .min = 8, .max = 8, 271*2c7b9b93SAlex Elder }, 272*2c7b9b93SAlex Elder }, 273*2c7b9b93SAlex Elder [IPA_RESOURCE_TYPE_SRC_HDRI2_BUFFERS] = { 274*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL] = { 275*2c7b9b93SAlex Elder .min = 0, .max = 255, 276*2c7b9b93SAlex Elder }, 277*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DL] = { 278*2c7b9b93SAlex Elder .min = 0, .max = 255, 279*2c7b9b93SAlex Elder }, 280*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DIAG] = { 281*2c7b9b93SAlex Elder .min = 0, .max = 255, 282*2c7b9b93SAlex Elder }, 283*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DMA] = { 284*2c7b9b93SAlex Elder .min = 0, .max = 255, 285*2c7b9b93SAlex Elder }, 286*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UC_RX_Q] = { 287*2c7b9b93SAlex Elder .min = 0, .max = 255, 288*2c7b9b93SAlex Elder }, 289*2c7b9b93SAlex Elder }, 290*2c7b9b93SAlex Elder [IPA_RESOURCE_TYPE_SRC_HPS_DMARS] = { 291*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL] = { 292*2c7b9b93SAlex Elder .min = 0, .max = 255, 293*2c7b9b93SAlex Elder }, 294*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DL] = { 295*2c7b9b93SAlex Elder .min = 0, .max = 255, 296*2c7b9b93SAlex Elder }, 297*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DIAG] = { 298*2c7b9b93SAlex Elder .min = 0, .max = 255, 299*2c7b9b93SAlex Elder }, 300*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DMA] = { 301*2c7b9b93SAlex Elder .min = 0, .max = 255, 302*2c7b9b93SAlex Elder }, 303*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UC_RX_Q] = { 304*2c7b9b93SAlex Elder .min = 0, .max = 255, 305*2c7b9b93SAlex Elder }, 306*2c7b9b93SAlex Elder }, 307*2c7b9b93SAlex Elder [IPA_RESOURCE_TYPE_SRC_ACK_ENTRIES] = { 308*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL] = { 309*2c7b9b93SAlex Elder .min = 19, .max = 19, 310*2c7b9b93SAlex Elder }, 311*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DL] = { 312*2c7b9b93SAlex Elder .min = 26, .max = 26, 313*2c7b9b93SAlex Elder }, 314*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DIAG] = { 315*2c7b9b93SAlex Elder .min = 5, .max = 5, 316*2c7b9b93SAlex Elder }, 317*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_DMA] = { 318*2c7b9b93SAlex Elder .min = 5, .max = 5, 319*2c7b9b93SAlex Elder }, 320*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UC_RX_Q] = { 321*2c7b9b93SAlex Elder .min = 8, .max = 8, 322*2c7b9b93SAlex Elder }, 323*2c7b9b93SAlex Elder }, 324*2c7b9b93SAlex Elder }; 325*2c7b9b93SAlex Elder 326*2c7b9b93SAlex Elder /* Destination resource configuration data for an SoC having IPA v3.1 */ 327*2c7b9b93SAlex Elder static const struct ipa_resource ipa_resource_dst[] = { 328*2c7b9b93SAlex Elder [IPA_RESOURCE_TYPE_DST_DATA_SECTORS] = { 329*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_UL] = { 330*2c7b9b93SAlex Elder .min = 3, .max = 3, /* 2 downstream */ 331*2c7b9b93SAlex Elder }, 332*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_DL] = { 333*2c7b9b93SAlex Elder .min = 3, .max = 3, 334*2c7b9b93SAlex Elder }, 335*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_DIAG_DPL] = { 336*2c7b9b93SAlex Elder .min = 1, .max = 1, /* 0 downstream */ 337*2c7b9b93SAlex Elder }, 338*2c7b9b93SAlex Elder /* IPA_RSRC_GROUP_DST_DMA uses 2 downstream */ 339*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_Q6ZIP_GENERAL] = { 340*2c7b9b93SAlex Elder .min = 3, .max = 3, 341*2c7b9b93SAlex Elder }, 342*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_Q6ZIP_ENGINE] = { 343*2c7b9b93SAlex Elder .min = 3, .max = 3, 344*2c7b9b93SAlex Elder }, 345*2c7b9b93SAlex Elder }, 346*2c7b9b93SAlex Elder [IPA_RESOURCE_TYPE_DST_DATA_SECTOR_LISTS] = { 347*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_UL] = { 348*2c7b9b93SAlex Elder .min = 0, .max = 255, 349*2c7b9b93SAlex Elder }, 350*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_DL] = { 351*2c7b9b93SAlex Elder .min = 0, .max = 255, 352*2c7b9b93SAlex Elder }, 353*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_DIAG_DPL] = { 354*2c7b9b93SAlex Elder .min = 0, .max = 255, 355*2c7b9b93SAlex Elder }, 356*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_DMA] = { 357*2c7b9b93SAlex Elder .min = 0, .max = 255, 358*2c7b9b93SAlex Elder }, 359*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_Q6ZIP_GENERAL] = { 360*2c7b9b93SAlex Elder .min = 0, .max = 255, 361*2c7b9b93SAlex Elder }, 362*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_Q6ZIP_ENGINE] = { 363*2c7b9b93SAlex Elder .min = 0, .max = 255, 364*2c7b9b93SAlex Elder }, 365*2c7b9b93SAlex Elder }, 366*2c7b9b93SAlex Elder [IPA_RESOURCE_TYPE_DST_DPS_DMARS] = { 367*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_UL] = { 368*2c7b9b93SAlex Elder .min = 1, .max = 1, 369*2c7b9b93SAlex Elder }, 370*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_DL] = { 371*2c7b9b93SAlex Elder .min = 1, .max = 1, 372*2c7b9b93SAlex Elder }, 373*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_DIAG_DPL] = { 374*2c7b9b93SAlex Elder .min = 1, .max = 1, 375*2c7b9b93SAlex Elder }, 376*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_DMA] = { 377*2c7b9b93SAlex Elder .min = 1, .max = 1, 378*2c7b9b93SAlex Elder }, 379*2c7b9b93SAlex Elder .limits[IPA_RSRC_GROUP_DST_Q6ZIP_GENERAL] = { 380*2c7b9b93SAlex Elder .min = 1, .max = 1, 381*2c7b9b93SAlex Elder }, 382*2c7b9b93SAlex Elder }, 383*2c7b9b93SAlex Elder }; 384*2c7b9b93SAlex Elder 385*2c7b9b93SAlex Elder /* Resource configuration data for an SoC having IPA v3.1 */ 386*2c7b9b93SAlex Elder static const struct ipa_resource_data ipa_resource_data = { 387*2c7b9b93SAlex Elder .rsrc_group_src_count = IPA_RSRC_GROUP_SRC_COUNT, 388*2c7b9b93SAlex Elder .rsrc_group_dst_count = IPA_RSRC_GROUP_DST_COUNT, 389*2c7b9b93SAlex Elder .resource_src_count = ARRAY_SIZE(ipa_resource_src), 390*2c7b9b93SAlex Elder .resource_src = ipa_resource_src, 391*2c7b9b93SAlex Elder .resource_dst_count = ARRAY_SIZE(ipa_resource_dst), 392*2c7b9b93SAlex Elder .resource_dst = ipa_resource_dst, 393*2c7b9b93SAlex Elder }; 394*2c7b9b93SAlex Elder 395*2c7b9b93SAlex Elder /* IPA-resident memory region data for an SoC having IPA v3.1 */ 396*2c7b9b93SAlex Elder static const struct ipa_mem ipa_mem_local_data[] = { 397*2c7b9b93SAlex Elder { 398*2c7b9b93SAlex Elder .id = IPA_MEM_UC_SHARED, 399*2c7b9b93SAlex Elder .offset = 0x0000, 400*2c7b9b93SAlex Elder .size = 0x0080, 401*2c7b9b93SAlex Elder .canary_count = 0, 402*2c7b9b93SAlex Elder }, 403*2c7b9b93SAlex Elder { 404*2c7b9b93SAlex Elder .id = IPA_MEM_UC_INFO, 405*2c7b9b93SAlex Elder .offset = 0x0080, 406*2c7b9b93SAlex Elder .size = 0x0200, 407*2c7b9b93SAlex Elder .canary_count = 0, 408*2c7b9b93SAlex Elder }, 409*2c7b9b93SAlex Elder { 410*2c7b9b93SAlex Elder .id = IPA_MEM_V4_FILTER_HASHED, 411*2c7b9b93SAlex Elder .offset = 0x0288, 412*2c7b9b93SAlex Elder .size = 0x0078, 413*2c7b9b93SAlex Elder .canary_count = 2, 414*2c7b9b93SAlex Elder }, 415*2c7b9b93SAlex Elder { 416*2c7b9b93SAlex Elder .id = IPA_MEM_V4_FILTER, 417*2c7b9b93SAlex Elder .offset = 0x0308, 418*2c7b9b93SAlex Elder .size = 0x0078, 419*2c7b9b93SAlex Elder .canary_count = 2, 420*2c7b9b93SAlex Elder }, 421*2c7b9b93SAlex Elder { 422*2c7b9b93SAlex Elder .id = IPA_MEM_V6_FILTER_HASHED, 423*2c7b9b93SAlex Elder .offset = 0x0388, 424*2c7b9b93SAlex Elder .size = 0x0078, 425*2c7b9b93SAlex Elder .canary_count = 2, 426*2c7b9b93SAlex Elder }, 427*2c7b9b93SAlex Elder { 428*2c7b9b93SAlex Elder .id = IPA_MEM_V6_FILTER, 429*2c7b9b93SAlex Elder .offset = 0x0408, 430*2c7b9b93SAlex Elder .size = 0x0078, 431*2c7b9b93SAlex Elder .canary_count = 2, 432*2c7b9b93SAlex Elder }, 433*2c7b9b93SAlex Elder { 434*2c7b9b93SAlex Elder .id = IPA_MEM_V4_ROUTE_HASHED, 435*2c7b9b93SAlex Elder .offset = 0x0488, 436*2c7b9b93SAlex Elder .size = 0x0078, 437*2c7b9b93SAlex Elder .canary_count = 2, 438*2c7b9b93SAlex Elder }, 439*2c7b9b93SAlex Elder { 440*2c7b9b93SAlex Elder .id = IPA_MEM_V4_ROUTE, 441*2c7b9b93SAlex Elder .offset = 0x0508, 442*2c7b9b93SAlex Elder .size = 0x0078, 443*2c7b9b93SAlex Elder .canary_count = 2, 444*2c7b9b93SAlex Elder }, 445*2c7b9b93SAlex Elder { 446*2c7b9b93SAlex Elder .id = IPA_MEM_V6_ROUTE_HASHED, 447*2c7b9b93SAlex Elder .offset = 0x0588, 448*2c7b9b93SAlex Elder .size = 0x0078, 449*2c7b9b93SAlex Elder .canary_count = 2, 450*2c7b9b93SAlex Elder }, 451*2c7b9b93SAlex Elder { 452*2c7b9b93SAlex Elder .id = IPA_MEM_V6_ROUTE, 453*2c7b9b93SAlex Elder .offset = 0x0608, 454*2c7b9b93SAlex Elder .size = 0x0078, 455*2c7b9b93SAlex Elder .canary_count = 2, 456*2c7b9b93SAlex Elder }, 457*2c7b9b93SAlex Elder { 458*2c7b9b93SAlex Elder .id = IPA_MEM_MODEM_HEADER, 459*2c7b9b93SAlex Elder .offset = 0x0688, 460*2c7b9b93SAlex Elder .size = 0x0140, 461*2c7b9b93SAlex Elder .canary_count = 2, 462*2c7b9b93SAlex Elder }, 463*2c7b9b93SAlex Elder { 464*2c7b9b93SAlex Elder .id = IPA_MEM_MODEM_PROC_CTX, 465*2c7b9b93SAlex Elder .offset = 0x07d0, 466*2c7b9b93SAlex Elder .size = 0x0200, 467*2c7b9b93SAlex Elder .canary_count = 2, 468*2c7b9b93SAlex Elder }, 469*2c7b9b93SAlex Elder { 470*2c7b9b93SAlex Elder .id = IPA_MEM_AP_PROC_CTX, 471*2c7b9b93SAlex Elder .offset = 0x09d0, 472*2c7b9b93SAlex Elder .size = 0x0200, 473*2c7b9b93SAlex Elder .canary_count = 0, 474*2c7b9b93SAlex Elder }, 475*2c7b9b93SAlex Elder { 476*2c7b9b93SAlex Elder .id = IPA_MEM_MODEM, 477*2c7b9b93SAlex Elder .offset = 0x0bd8, 478*2c7b9b93SAlex Elder .size = 0x1424, 479*2c7b9b93SAlex Elder .canary_count = 0, 480*2c7b9b93SAlex Elder }, 481*2c7b9b93SAlex Elder { 482*2c7b9b93SAlex Elder .id = IPA_MEM_END_MARKER, 483*2c7b9b93SAlex Elder .offset = 0x2000, 484*2c7b9b93SAlex Elder .size = 0, 485*2c7b9b93SAlex Elder .canary_count = 1, 486*2c7b9b93SAlex Elder }, 487*2c7b9b93SAlex Elder }; 488*2c7b9b93SAlex Elder 489*2c7b9b93SAlex Elder /* Memory configuration data for an SoC having IPA v3.1 */ 490*2c7b9b93SAlex Elder static const struct ipa_mem_data ipa_mem_data = { 491*2c7b9b93SAlex Elder .local_count = ARRAY_SIZE(ipa_mem_local_data), 492*2c7b9b93SAlex Elder .local = ipa_mem_local_data, 493*2c7b9b93SAlex Elder .imem_addr = 0x146bd000, 494*2c7b9b93SAlex Elder .imem_size = 0x00002000, 495*2c7b9b93SAlex Elder .smem_id = 497, 496*2c7b9b93SAlex Elder .smem_size = 0x00002000, 497*2c7b9b93SAlex Elder }; 498*2c7b9b93SAlex Elder 499*2c7b9b93SAlex Elder /* Interconnect bandwidths are in 1000 byte/second units */ 500*2c7b9b93SAlex Elder static const struct ipa_interconnect_data ipa_interconnect_data[] = { 501*2c7b9b93SAlex Elder { 502*2c7b9b93SAlex Elder .name = "memory", 503*2c7b9b93SAlex Elder .peak_bandwidth = 640000, /* 640 MBps */ 504*2c7b9b93SAlex Elder .average_bandwidth = 80000, /* 80 MBps */ 505*2c7b9b93SAlex Elder }, 506*2c7b9b93SAlex Elder { 507*2c7b9b93SAlex Elder .name = "imem", 508*2c7b9b93SAlex Elder .peak_bandwidth = 640000, /* 640 MBps */ 509*2c7b9b93SAlex Elder .average_bandwidth = 80000, /* 80 MBps */ 510*2c7b9b93SAlex Elder }, 511*2c7b9b93SAlex Elder /* Average bandwidth is unused for the next interconnect */ 512*2c7b9b93SAlex Elder { 513*2c7b9b93SAlex Elder .name = "config", 514*2c7b9b93SAlex Elder .peak_bandwidth = 80000, /* 80 MBps */ 515*2c7b9b93SAlex Elder .average_bandwidth = 0, /* unused */ 516*2c7b9b93SAlex Elder }, 517*2c7b9b93SAlex Elder }; 518*2c7b9b93SAlex Elder 519*2c7b9b93SAlex Elder /* Clock and interconnect configuration data for an SoC having IPA v3.1 */ 520*2c7b9b93SAlex Elder static const struct ipa_power_data ipa_power_data = { 521*2c7b9b93SAlex Elder .core_clock_rate = 16 * 1000 * 1000, /* Hz */ 522*2c7b9b93SAlex Elder .interconnect_count = ARRAY_SIZE(ipa_interconnect_data), 523*2c7b9b93SAlex Elder .interconnect_data = ipa_interconnect_data, 524*2c7b9b93SAlex Elder }; 525*2c7b9b93SAlex Elder 526*2c7b9b93SAlex Elder /* Configuration data for an SoC having IPA v3.1 */ 527*2c7b9b93SAlex Elder const struct ipa_data ipa_data_v3_1 = { 528*2c7b9b93SAlex Elder .version = IPA_VERSION_3_1, 529*2c7b9b93SAlex Elder .backward_compat = BCR_CMDQ_L_LACK_ONE_ENTRY_FMASK, 530*2c7b9b93SAlex Elder .qsb_count = ARRAY_SIZE(ipa_qsb_data), 531*2c7b9b93SAlex Elder .qsb_data = ipa_qsb_data, 532*2c7b9b93SAlex Elder .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 533*2c7b9b93SAlex Elder .endpoint_data = ipa_gsi_endpoint_data, 534*2c7b9b93SAlex Elder .resource_data = &ipa_resource_data, 535*2c7b9b93SAlex Elder .mem_data = &ipa_mem_data, 536*2c7b9b93SAlex Elder .power_data = &ipa_power_data, 537*2c7b9b93SAlex Elder }; 538