1b310de78SAlex Elder // SPDX-License-Identifier: GPL-2.0 2b310de78SAlex Elder 3b310de78SAlex Elder /* Copyright (C) 2022 Linaro Ltd. */ 4b310de78SAlex Elder 5b310de78SAlex Elder #include <linux/log2.h> 6b310de78SAlex Elder 7b310de78SAlex Elder #include "../gsi.h" 8b310de78SAlex Elder #include "../ipa_data.h" 9b310de78SAlex Elder #include "../ipa_endpoint.h" 10b310de78SAlex Elder #include "../ipa_mem.h" 11b310de78SAlex Elder 12b310de78SAlex Elder /** enum ipa_resource_type - IPA resource types for an SoC having IPA v4.7 */ 13b310de78SAlex Elder enum ipa_resource_type { 14b310de78SAlex Elder /* Source resource types; first must have value 0 */ 15b310de78SAlex Elder IPA_RESOURCE_TYPE_SRC_PKT_CONTEXTS = 0, 16b310de78SAlex Elder IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_LISTS, 17b310de78SAlex Elder IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_BUFF, 18b310de78SAlex Elder IPA_RESOURCE_TYPE_SRC_HPS_DMARS, 19b310de78SAlex Elder IPA_RESOURCE_TYPE_SRC_ACK_ENTRIES, 20b310de78SAlex Elder 21b310de78SAlex Elder /* Destination resource types; first must have value 0 */ 22b310de78SAlex Elder IPA_RESOURCE_TYPE_DST_DATA_SECTORS = 0, 23b310de78SAlex Elder IPA_RESOURCE_TYPE_DST_DPS_DMARS, 24b310de78SAlex Elder }; 25b310de78SAlex Elder 26b310de78SAlex Elder /* Resource groups used for an SoC having IPA v4.7 */ 27b310de78SAlex Elder enum ipa_rsrc_group_id { 28b310de78SAlex Elder /* Source resource group identifiers */ 29b310de78SAlex Elder IPA_RSRC_GROUP_SRC_UL_DL = 0, 30b310de78SAlex Elder IPA_RSRC_GROUP_SRC_UC_RX_Q, 31b310de78SAlex Elder IPA_RSRC_GROUP_SRC_COUNT, /* Last in set; not a source group */ 32b310de78SAlex Elder 33b310de78SAlex Elder /* Destination resource group identifiers */ 34b310de78SAlex Elder IPA_RSRC_GROUP_DST_UL_DL_DPL = 0, 35b310de78SAlex Elder IPA_RSRC_GROUP_DST_UNUSED_1, 36b310de78SAlex Elder IPA_RSRC_GROUP_DST_COUNT, /* Last; not a destination group */ 37b310de78SAlex Elder }; 38b310de78SAlex Elder 39b310de78SAlex Elder /* QSB configuration data for an SoC having IPA v4.7 */ 40b310de78SAlex Elder static const struct ipa_qsb_data ipa_qsb_data[] = { 41b310de78SAlex Elder [IPA_QSB_MASTER_DDR] = { 42b310de78SAlex Elder .max_writes = 8, 43b310de78SAlex Elder .max_reads = 0, /* no limit (hardware max) */ 44b310de78SAlex Elder .max_reads_beats = 120, 45b310de78SAlex Elder }, 46b310de78SAlex Elder }; 47b310de78SAlex Elder 48b310de78SAlex Elder /* Endpoint configuration data for an SoC having IPA v4.7 */ 49b310de78SAlex Elder static const struct ipa_gsi_endpoint_data ipa_gsi_endpoint_data[] = { 50b310de78SAlex Elder [IPA_ENDPOINT_AP_COMMAND_TX] = { 51b310de78SAlex Elder .ee_id = GSI_EE_AP, 52b310de78SAlex Elder .channel_id = 5, 53b310de78SAlex Elder .endpoint_id = 7, 54b310de78SAlex Elder .toward_ipa = true, 55b310de78SAlex Elder .channel = { 56b310de78SAlex Elder .tre_count = 256, 57b310de78SAlex Elder .event_count = 256, 58b310de78SAlex Elder .tlv_count = 20, 59b310de78SAlex Elder }, 60b310de78SAlex Elder .endpoint = { 61b310de78SAlex Elder .config = { 62b310de78SAlex Elder .resource_group = IPA_RSRC_GROUP_SRC_UL_DL, 63b310de78SAlex Elder .dma_mode = true, 64b310de78SAlex Elder .dma_endpoint = IPA_ENDPOINT_AP_LAN_RX, 65b310de78SAlex Elder .tx = { 66b310de78SAlex Elder .seq_type = IPA_SEQ_DMA, 67b310de78SAlex Elder }, 68b310de78SAlex Elder }, 69b310de78SAlex Elder }, 70b310de78SAlex Elder }, 71b310de78SAlex Elder [IPA_ENDPOINT_AP_LAN_RX] = { 72b310de78SAlex Elder .ee_id = GSI_EE_AP, 73b310de78SAlex Elder .channel_id = 14, 74b310de78SAlex Elder .endpoint_id = 9, 75b310de78SAlex Elder .toward_ipa = false, 76b310de78SAlex Elder .channel = { 77b310de78SAlex Elder .tre_count = 256, 78b310de78SAlex Elder .event_count = 256, 79b310de78SAlex Elder .tlv_count = 9, 80b310de78SAlex Elder }, 81b310de78SAlex Elder .endpoint = { 82b310de78SAlex Elder .config = { 83b310de78SAlex Elder .resource_group = IPA_RSRC_GROUP_DST_UL_DL_DPL, 84b310de78SAlex Elder .aggregation = true, 85b310de78SAlex Elder .status_enable = true, 86b310de78SAlex Elder .rx = { 87b310de78SAlex Elder .buffer_size = 8192, 88b310de78SAlex Elder .pad_align = ilog2(sizeof(u32)), 89b310de78SAlex Elder .aggr_time_limit = 500, 90b310de78SAlex Elder }, 91b310de78SAlex Elder }, 92b310de78SAlex Elder }, 93b310de78SAlex Elder }, 94b310de78SAlex Elder [IPA_ENDPOINT_AP_MODEM_TX] = { 95b310de78SAlex Elder .ee_id = GSI_EE_AP, 96b310de78SAlex Elder .channel_id = 2, 97b310de78SAlex Elder .endpoint_id = 2, 98b310de78SAlex Elder .toward_ipa = true, 99b310de78SAlex Elder .channel = { 100b310de78SAlex Elder .tre_count = 512, 101b310de78SAlex Elder .event_count = 512, 102b310de78SAlex Elder .tlv_count = 16, 103b310de78SAlex Elder }, 104b310de78SAlex Elder .endpoint = { 105b310de78SAlex Elder .filter_support = true, 106b310de78SAlex Elder .config = { 107b310de78SAlex Elder .resource_group = IPA_RSRC_GROUP_SRC_UL_DL, 108b310de78SAlex Elder .qmap = true, 109b310de78SAlex Elder .status_enable = true, 110b310de78SAlex Elder .tx = { 111b310de78SAlex Elder .seq_type = IPA_SEQ_2_PASS_SKIP_LAST_UC, 112b310de78SAlex Elder .status_endpoint = 113b310de78SAlex Elder IPA_ENDPOINT_MODEM_AP_RX, 114b310de78SAlex Elder }, 115b310de78SAlex Elder }, 116b310de78SAlex Elder }, 117b310de78SAlex Elder }, 118b310de78SAlex Elder [IPA_ENDPOINT_AP_MODEM_RX] = { 119b310de78SAlex Elder .ee_id = GSI_EE_AP, 120b310de78SAlex Elder .channel_id = 7, 121b310de78SAlex Elder .endpoint_id = 16, 122b310de78SAlex Elder .toward_ipa = false, 123b310de78SAlex Elder .channel = { 124b310de78SAlex Elder .tre_count = 256, 125b310de78SAlex Elder .event_count = 256, 126b310de78SAlex Elder .tlv_count = 9, 127b310de78SAlex Elder }, 128b310de78SAlex Elder .endpoint = { 129b310de78SAlex Elder .config = { 130b310de78SAlex Elder .resource_group = IPA_RSRC_GROUP_DST_UL_DL_DPL, 131b310de78SAlex Elder .qmap = true, 132b310de78SAlex Elder .aggregation = true, 133b310de78SAlex Elder .rx = { 134b310de78SAlex Elder .buffer_size = 8192, 135b310de78SAlex Elder .aggr_time_limit = 500, 136b310de78SAlex Elder .aggr_close_eof = true, 137b310de78SAlex Elder }, 138b310de78SAlex Elder }, 139b310de78SAlex Elder }, 140b310de78SAlex Elder }, 141b310de78SAlex Elder [IPA_ENDPOINT_MODEM_AP_TX] = { 142b310de78SAlex Elder .ee_id = GSI_EE_MODEM, 143b310de78SAlex Elder .channel_id = 0, 144b310de78SAlex Elder .endpoint_id = 5, 145b310de78SAlex Elder .toward_ipa = true, 146b310de78SAlex Elder .endpoint = { 147b310de78SAlex Elder .filter_support = true, 148b310de78SAlex Elder }, 149b310de78SAlex Elder }, 150b310de78SAlex Elder [IPA_ENDPOINT_MODEM_AP_RX] = { 151b310de78SAlex Elder .ee_id = GSI_EE_MODEM, 152b310de78SAlex Elder .channel_id = 7, 153b310de78SAlex Elder .endpoint_id = 14, 154b310de78SAlex Elder .toward_ipa = false, 155b310de78SAlex Elder }, 156b310de78SAlex Elder [IPA_ENDPOINT_MODEM_DL_NLO_TX] = { 157b310de78SAlex Elder .ee_id = GSI_EE_MODEM, 158b310de78SAlex Elder .channel_id = 2, 159b310de78SAlex Elder .endpoint_id = 8, 160b310de78SAlex Elder .toward_ipa = true, 161b310de78SAlex Elder .endpoint = { 162b310de78SAlex Elder .filter_support = true, 163b310de78SAlex Elder }, 164b310de78SAlex Elder }, 165b310de78SAlex Elder }; 166b310de78SAlex Elder 167b310de78SAlex Elder /* Source resource configuration data for an SoC having IPA v4.7 */ 168b310de78SAlex Elder static const struct ipa_resource ipa_resource_src[] = { 169b310de78SAlex Elder [IPA_RESOURCE_TYPE_SRC_PKT_CONTEXTS] = { 170b310de78SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL_DL] = { 171b310de78SAlex Elder .min = 8, .max = 8, 172b310de78SAlex Elder }, 173b310de78SAlex Elder }, 174b310de78SAlex Elder [IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_LISTS] = { 175b310de78SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL_DL] = { 176b310de78SAlex Elder .min = 8, .max = 8, 177b310de78SAlex Elder }, 178b310de78SAlex Elder }, 179b310de78SAlex Elder [IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_BUFF] = { 180b310de78SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL_DL] = { 181b310de78SAlex Elder .min = 18, .max = 18, 182b310de78SAlex Elder }, 183b310de78SAlex Elder }, 184b310de78SAlex Elder [IPA_RESOURCE_TYPE_SRC_HPS_DMARS] = { 185b310de78SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL_DL] = { 186b310de78SAlex Elder .min = 2, .max = 2, 187b310de78SAlex Elder }, 188b310de78SAlex Elder }, 189b310de78SAlex Elder [IPA_RESOURCE_TYPE_SRC_ACK_ENTRIES] = { 190b310de78SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL_DL] = { 191b310de78SAlex Elder .min = 15, .max = 15, 192b310de78SAlex Elder }, 193b310de78SAlex Elder }, 194b310de78SAlex Elder }; 195b310de78SAlex Elder 196b310de78SAlex Elder /* Destination resource configuration data for an SoC having IPA v4.7 */ 197b310de78SAlex Elder static const struct ipa_resource ipa_resource_dst[] = { 198b310de78SAlex Elder [IPA_RESOURCE_TYPE_DST_DATA_SECTORS] = { 199b310de78SAlex Elder .limits[IPA_RSRC_GROUP_DST_UL_DL_DPL] = { 200b310de78SAlex Elder .min = 7, .max = 7, 201b310de78SAlex Elder }, 202b310de78SAlex Elder }, 203b310de78SAlex Elder [IPA_RESOURCE_TYPE_DST_DPS_DMARS] = { 204b310de78SAlex Elder .limits[IPA_RSRC_GROUP_DST_UL_DL_DPL] = { 205b310de78SAlex Elder .min = 2, .max = 2, 206b310de78SAlex Elder }, 207b310de78SAlex Elder }, 208b310de78SAlex Elder }; 209b310de78SAlex Elder 210b310de78SAlex Elder /* Resource configuration data for an SoC having IPA v4.7 */ 211b310de78SAlex Elder static const struct ipa_resource_data ipa_resource_data = { 212b310de78SAlex Elder .rsrc_group_dst_count = IPA_RSRC_GROUP_DST_COUNT, 213b310de78SAlex Elder .rsrc_group_src_count = IPA_RSRC_GROUP_SRC_COUNT, 214b310de78SAlex Elder .resource_src_count = ARRAY_SIZE(ipa_resource_src), 215b310de78SAlex Elder .resource_src = ipa_resource_src, 216b310de78SAlex Elder .resource_dst_count = ARRAY_SIZE(ipa_resource_dst), 217b310de78SAlex Elder .resource_dst = ipa_resource_dst, 218b310de78SAlex Elder }; 219b310de78SAlex Elder 220b310de78SAlex Elder /* IPA-resident memory region data for an SoC having IPA v4.7 */ 221b310de78SAlex Elder static const struct ipa_mem ipa_mem_local_data[] = { 222b310de78SAlex Elder { 223b310de78SAlex Elder .id = IPA_MEM_UC_SHARED, 224b310de78SAlex Elder .offset = 0x0000, 225b310de78SAlex Elder .size = 0x0080, 226b310de78SAlex Elder .canary_count = 0, 227b310de78SAlex Elder }, 228b310de78SAlex Elder { 229b310de78SAlex Elder .id = IPA_MEM_UC_INFO, 230b310de78SAlex Elder .offset = 0x0080, 231b310de78SAlex Elder .size = 0x0200, 232b310de78SAlex Elder .canary_count = 0, 233b310de78SAlex Elder }, 234b310de78SAlex Elder { 235b310de78SAlex Elder .id = IPA_MEM_V4_FILTER_HASHED, 236b310de78SAlex Elder .offset = 0x0288, 237b310de78SAlex Elder .size = 0x0078, 238b310de78SAlex Elder .canary_count = 2, 239b310de78SAlex Elder }, 240b310de78SAlex Elder { 241b310de78SAlex Elder .id = IPA_MEM_V4_FILTER, 242b310de78SAlex Elder .offset = 0x0308, 243b310de78SAlex Elder .size = 0x0078, 244b310de78SAlex Elder .canary_count = 2, 245b310de78SAlex Elder }, 246b310de78SAlex Elder { 247b310de78SAlex Elder .id = IPA_MEM_V6_FILTER_HASHED, 248b310de78SAlex Elder .offset = 0x0388, 249b310de78SAlex Elder .size = 0x0078, 250b310de78SAlex Elder .canary_count = 2, 251b310de78SAlex Elder }, 252b310de78SAlex Elder { 253b310de78SAlex Elder .id = IPA_MEM_V6_FILTER, 254b310de78SAlex Elder .offset = 0x0408, 255b310de78SAlex Elder .size = 0x0078, 256b310de78SAlex Elder .canary_count = 2, 257b310de78SAlex Elder }, 258b310de78SAlex Elder { 259b310de78SAlex Elder .id = IPA_MEM_V4_ROUTE_HASHED, 260b310de78SAlex Elder .offset = 0x0488, 261b310de78SAlex Elder .size = 0x0078, 262b310de78SAlex Elder .canary_count = 2, 263b310de78SAlex Elder }, 264b310de78SAlex Elder { 265b310de78SAlex Elder .id = IPA_MEM_V4_ROUTE, 266b310de78SAlex Elder .offset = 0x0508, 267b310de78SAlex Elder .size = 0x0078, 268b310de78SAlex Elder .canary_count = 2, 269b310de78SAlex Elder }, 270b310de78SAlex Elder { 271b310de78SAlex Elder .id = IPA_MEM_V6_ROUTE_HASHED, 272b310de78SAlex Elder .offset = 0x0588, 273b310de78SAlex Elder .size = 0x0078, 274b310de78SAlex Elder .canary_count = 2, 275b310de78SAlex Elder }, 276b310de78SAlex Elder { 277b310de78SAlex Elder .id = IPA_MEM_V6_ROUTE, 278b310de78SAlex Elder .offset = 0x0608, 279b310de78SAlex Elder .size = 0x0078, 280b310de78SAlex Elder .canary_count = 2, 281b310de78SAlex Elder }, 282b310de78SAlex Elder { 283b310de78SAlex Elder .id = IPA_MEM_MODEM_HEADER, 284b310de78SAlex Elder .offset = 0x0688, 285b310de78SAlex Elder .size = 0x0240, 286b310de78SAlex Elder .canary_count = 2, 287b310de78SAlex Elder }, 288b310de78SAlex Elder { 289b310de78SAlex Elder .id = IPA_MEM_AP_HEADER, 290b310de78SAlex Elder .offset = 0x08c8, 291b310de78SAlex Elder .size = 0x0200, 292b310de78SAlex Elder .canary_count = 0, 293b310de78SAlex Elder }, 294b310de78SAlex Elder { 295b310de78SAlex Elder .id = IPA_MEM_MODEM_PROC_CTX, 296b310de78SAlex Elder .offset = 0x0ad0, 297b310de78SAlex Elder .size = 0x0200, 298b310de78SAlex Elder .canary_count = 2, 299b310de78SAlex Elder }, 300b310de78SAlex Elder { 301b310de78SAlex Elder .id = IPA_MEM_AP_PROC_CTX, 302b310de78SAlex Elder .offset = 0x0cd0, 303b310de78SAlex Elder .size = 0x0200, 304b310de78SAlex Elder .canary_count = 0, 305b310de78SAlex Elder }, 306b310de78SAlex Elder { 307b310de78SAlex Elder .id = IPA_MEM_NAT_TABLE, 308b310de78SAlex Elder .offset = 0x0ee0, 309b310de78SAlex Elder .size = 0x0d00, 310b310de78SAlex Elder .canary_count = 4, 311b310de78SAlex Elder }, 312b310de78SAlex Elder { 313b310de78SAlex Elder .id = IPA_MEM_PDN_CONFIG, 314b310de78SAlex Elder .offset = 0x1be8, 315b310de78SAlex Elder .size = 0x0050, 316b310de78SAlex Elder .canary_count = 0, 317b310de78SAlex Elder }, 318b310de78SAlex Elder { 319b310de78SAlex Elder .id = IPA_MEM_STATS_QUOTA_MODEM, 320b310de78SAlex Elder .offset = 0x1c40, 321b310de78SAlex Elder .size = 0x0030, 322b310de78SAlex Elder .canary_count = 4, 323b310de78SAlex Elder }, 324b310de78SAlex Elder { 325b310de78SAlex Elder .id = IPA_MEM_STATS_QUOTA_AP, 326b310de78SAlex Elder .offset = 0x1c70, 327b310de78SAlex Elder .size = 0x0048, 328b310de78SAlex Elder .canary_count = 0, 329b310de78SAlex Elder }, 330b310de78SAlex Elder { 331b310de78SAlex Elder .id = IPA_MEM_STATS_TETHERING, 332b310de78SAlex Elder .offset = 0x1cb8, 333b310de78SAlex Elder .size = 0x0238, 334b310de78SAlex Elder .canary_count = 0, 335b310de78SAlex Elder }, 336b310de78SAlex Elder { 337b310de78SAlex Elder .id = IPA_MEM_STATS_DROP, 338b310de78SAlex Elder .offset = 0x1ef0, 339b310de78SAlex Elder .size = 0x0020, 340b310de78SAlex Elder .canary_count = 0, 341b310de78SAlex Elder }, 342b310de78SAlex Elder { 343b310de78SAlex Elder .id = IPA_MEM_MODEM, 344b310de78SAlex Elder .offset = 0x1f18, 345b310de78SAlex Elder .size = 0x100c, 346b310de78SAlex Elder .canary_count = 2, 347b310de78SAlex Elder }, 348b310de78SAlex Elder { 349b310de78SAlex Elder .id = IPA_MEM_END_MARKER, 350b310de78SAlex Elder .offset = 0x3000, 351b310de78SAlex Elder .size = 0x0000, 352b310de78SAlex Elder .canary_count = 1, 353b310de78SAlex Elder }, 354b310de78SAlex Elder }; 355b310de78SAlex Elder 356b310de78SAlex Elder /* Memory configuration data for an SoC having IPA v4.7 */ 357b310de78SAlex Elder static const struct ipa_mem_data ipa_mem_data = { 358b310de78SAlex Elder .local_count = ARRAY_SIZE(ipa_mem_local_data), 359b310de78SAlex Elder .local = ipa_mem_local_data, 360*60ea6f00SAlex Elder .imem_addr = 0x146a8000, 361b310de78SAlex Elder .imem_size = 0x00002000, 362b310de78SAlex Elder .smem_id = 497, 363b310de78SAlex Elder .smem_size = 0x00009000, 364b310de78SAlex Elder }; 365b310de78SAlex Elder 366b310de78SAlex Elder /* Interconnect rates are in 1000 byte/second units */ 367b310de78SAlex Elder static const struct ipa_interconnect_data ipa_interconnect_data[] = { 368b310de78SAlex Elder { 369b310de78SAlex Elder .name = "memory", 370b310de78SAlex Elder .peak_bandwidth = 600000, /* 600 MBps */ 371b310de78SAlex Elder .average_bandwidth = 150000, /* 150 MBps */ 372b310de78SAlex Elder }, 373b310de78SAlex Elder /* Average rate is unused for the next two interconnects */ 374b310de78SAlex Elder { 375b310de78SAlex Elder .name = "imem", 376b310de78SAlex Elder .peak_bandwidth = 450000, /* 450 MBps */ 377b310de78SAlex Elder .average_bandwidth = 75000, /* 75 MBps (unused?) */ 378b310de78SAlex Elder }, 379b310de78SAlex Elder { 380b310de78SAlex Elder .name = "config", 381b310de78SAlex Elder .peak_bandwidth = 171400, /* 171.4 MBps */ 382b310de78SAlex Elder .average_bandwidth = 0, /* unused */ 383b310de78SAlex Elder }, 384b310de78SAlex Elder }; 385b310de78SAlex Elder 386b310de78SAlex Elder /* Clock and interconnect configuration data for an SoC having IPA v4.7 */ 387b310de78SAlex Elder static const struct ipa_power_data ipa_power_data = { 388b310de78SAlex Elder /* XXX Downstream code says 150 MHz (DT SVS2), 60 MHz (code) */ 389b310de78SAlex Elder .core_clock_rate = 100 * 1000 * 1000, /* Hz (150? 60?) */ 390b310de78SAlex Elder .interconnect_count = ARRAY_SIZE(ipa_interconnect_data), 391b310de78SAlex Elder .interconnect_data = ipa_interconnect_data, 392b310de78SAlex Elder }; 393b310de78SAlex Elder 394b310de78SAlex Elder /* Configuration data for an SoC having IPA v4.7 */ 395b310de78SAlex Elder const struct ipa_data ipa_data_v4_7 = { 396b310de78SAlex Elder .version = IPA_VERSION_4_7, 397b310de78SAlex Elder .qsb_count = ARRAY_SIZE(ipa_qsb_data), 398b310de78SAlex Elder .qsb_data = ipa_qsb_data, 399b310de78SAlex Elder .modem_route_count = 8, 400b310de78SAlex Elder .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 401b310de78SAlex Elder .endpoint_data = ipa_gsi_endpoint_data, 402b310de78SAlex Elder .resource_data = &ipa_resource_data, 403b310de78SAlex Elder .mem_data = &ipa_mem_data, 404b310de78SAlex Elder .power_data = &ipa_power_data, 405b310de78SAlex Elder }; 406