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