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 */ 345eb3dc13SLuca 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] = { 416a2843aaSLuca Weiss .max_writes = 12, 426a2843aaSLuca Weiss .max_reads = 13, 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 = { 825eb3dc13SLuca 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, 107*934e6966SLuca Weiss .checksum = true, 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 = { 1305eb3dc13SLuca Weiss .resource_group = IPA_RSRC_GROUP_DST_UL_DL, 131*934e6966SLuca Weiss .checksum = true, 132b310de78SAlex Elder .qmap = true, 133b310de78SAlex Elder .aggregation = true, 134b310de78SAlex Elder .rx = { 135b310de78SAlex Elder .buffer_size = 8192, 136b310de78SAlex Elder .aggr_time_limit = 500, 137b310de78SAlex Elder .aggr_close_eof = true, 138b310de78SAlex Elder }, 139b310de78SAlex Elder }, 140b310de78SAlex Elder }, 141b310de78SAlex Elder }, 142b310de78SAlex Elder [IPA_ENDPOINT_MODEM_AP_TX] = { 143b310de78SAlex Elder .ee_id = GSI_EE_MODEM, 144b310de78SAlex Elder .channel_id = 0, 145b310de78SAlex Elder .endpoint_id = 5, 146b310de78SAlex Elder .toward_ipa = true, 147b310de78SAlex Elder .endpoint = { 148b310de78SAlex Elder .filter_support = true, 149b310de78SAlex Elder }, 150b310de78SAlex Elder }, 151b310de78SAlex Elder [IPA_ENDPOINT_MODEM_AP_RX] = { 152b310de78SAlex Elder .ee_id = GSI_EE_MODEM, 153b310de78SAlex Elder .channel_id = 7, 154b310de78SAlex Elder .endpoint_id = 14, 155b310de78SAlex Elder .toward_ipa = false, 156b310de78SAlex Elder }, 157b310de78SAlex Elder [IPA_ENDPOINT_MODEM_DL_NLO_TX] = { 158b310de78SAlex Elder .ee_id = GSI_EE_MODEM, 159b310de78SAlex Elder .channel_id = 2, 160b310de78SAlex Elder .endpoint_id = 8, 161b310de78SAlex Elder .toward_ipa = true, 162b310de78SAlex Elder .endpoint = { 163b310de78SAlex Elder .filter_support = true, 164b310de78SAlex Elder }, 165b310de78SAlex Elder }, 166b310de78SAlex Elder }; 167b310de78SAlex Elder 168b310de78SAlex Elder /* Source resource configuration data for an SoC having IPA v4.7 */ 169b310de78SAlex Elder static const struct ipa_resource ipa_resource_src[] = { 170b310de78SAlex Elder [IPA_RESOURCE_TYPE_SRC_PKT_CONTEXTS] = { 171b310de78SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL_DL] = { 172b310de78SAlex Elder .min = 8, .max = 8, 173b310de78SAlex Elder }, 174b310de78SAlex Elder }, 175b310de78SAlex Elder [IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_LISTS] = { 176b310de78SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL_DL] = { 177b310de78SAlex Elder .min = 8, .max = 8, 178b310de78SAlex Elder }, 179b310de78SAlex Elder }, 180b310de78SAlex Elder [IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_BUFF] = { 181b310de78SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL_DL] = { 182b310de78SAlex Elder .min = 18, .max = 18, 183b310de78SAlex Elder }, 184b310de78SAlex Elder }, 185b310de78SAlex Elder [IPA_RESOURCE_TYPE_SRC_HPS_DMARS] = { 186b310de78SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL_DL] = { 187b310de78SAlex Elder .min = 2, .max = 2, 188b310de78SAlex Elder }, 189b310de78SAlex Elder }, 190b310de78SAlex Elder [IPA_RESOURCE_TYPE_SRC_ACK_ENTRIES] = { 191b310de78SAlex Elder .limits[IPA_RSRC_GROUP_SRC_UL_DL] = { 192b310de78SAlex Elder .min = 15, .max = 15, 193b310de78SAlex Elder }, 194b310de78SAlex Elder }, 195b310de78SAlex Elder }; 196b310de78SAlex Elder 197b310de78SAlex Elder /* Destination resource configuration data for an SoC having IPA v4.7 */ 198b310de78SAlex Elder static const struct ipa_resource ipa_resource_dst[] = { 199b310de78SAlex Elder [IPA_RESOURCE_TYPE_DST_DATA_SECTORS] = { 2005eb3dc13SLuca Weiss .limits[IPA_RSRC_GROUP_DST_UL_DL] = { 201b310de78SAlex Elder .min = 7, .max = 7, 202b310de78SAlex Elder }, 203b310de78SAlex Elder }, 204b310de78SAlex Elder [IPA_RESOURCE_TYPE_DST_DPS_DMARS] = { 2055eb3dc13SLuca Weiss .limits[IPA_RSRC_GROUP_DST_UL_DL] = { 206b310de78SAlex Elder .min = 2, .max = 2, 207b310de78SAlex Elder }, 208b310de78SAlex Elder }, 209b310de78SAlex Elder }; 210b310de78SAlex Elder 211b310de78SAlex Elder /* Resource configuration data for an SoC having IPA v4.7 */ 212b310de78SAlex Elder static const struct ipa_resource_data ipa_resource_data = { 213b310de78SAlex Elder .rsrc_group_dst_count = IPA_RSRC_GROUP_DST_COUNT, 214b310de78SAlex Elder .rsrc_group_src_count = IPA_RSRC_GROUP_SRC_COUNT, 215b310de78SAlex Elder .resource_src_count = ARRAY_SIZE(ipa_resource_src), 216b310de78SAlex Elder .resource_src = ipa_resource_src, 217b310de78SAlex Elder .resource_dst_count = ARRAY_SIZE(ipa_resource_dst), 218b310de78SAlex Elder .resource_dst = ipa_resource_dst, 219b310de78SAlex Elder }; 220b310de78SAlex Elder 221b310de78SAlex Elder /* IPA-resident memory region data for an SoC having IPA v4.7 */ 222b310de78SAlex Elder static const struct ipa_mem ipa_mem_local_data[] = { 223b310de78SAlex Elder { 224b310de78SAlex Elder .id = IPA_MEM_UC_SHARED, 225b310de78SAlex Elder .offset = 0x0000, 226b310de78SAlex Elder .size = 0x0080, 227b310de78SAlex Elder .canary_count = 0, 228b310de78SAlex Elder }, 229b310de78SAlex Elder { 230b310de78SAlex Elder .id = IPA_MEM_UC_INFO, 231b310de78SAlex Elder .offset = 0x0080, 232b310de78SAlex Elder .size = 0x0200, 233b310de78SAlex Elder .canary_count = 0, 234b310de78SAlex Elder }, 235b310de78SAlex Elder { 236b310de78SAlex Elder .id = IPA_MEM_V4_FILTER_HASHED, 237b310de78SAlex Elder .offset = 0x0288, 238b310de78SAlex Elder .size = 0x0078, 239b310de78SAlex Elder .canary_count = 2, 240b310de78SAlex Elder }, 241b310de78SAlex Elder { 242b310de78SAlex Elder .id = IPA_MEM_V4_FILTER, 243b310de78SAlex Elder .offset = 0x0308, 244b310de78SAlex Elder .size = 0x0078, 245b310de78SAlex Elder .canary_count = 2, 246b310de78SAlex Elder }, 247b310de78SAlex Elder { 248b310de78SAlex Elder .id = IPA_MEM_V6_FILTER_HASHED, 249b310de78SAlex Elder .offset = 0x0388, 250b310de78SAlex Elder .size = 0x0078, 251b310de78SAlex Elder .canary_count = 2, 252b310de78SAlex Elder }, 253b310de78SAlex Elder { 254b310de78SAlex Elder .id = IPA_MEM_V6_FILTER, 255b310de78SAlex Elder .offset = 0x0408, 256b310de78SAlex Elder .size = 0x0078, 257b310de78SAlex Elder .canary_count = 2, 258b310de78SAlex Elder }, 259b310de78SAlex Elder { 260b310de78SAlex Elder .id = IPA_MEM_V4_ROUTE_HASHED, 261b310de78SAlex Elder .offset = 0x0488, 262b310de78SAlex Elder .size = 0x0078, 263b310de78SAlex Elder .canary_count = 2, 264b310de78SAlex Elder }, 265b310de78SAlex Elder { 266b310de78SAlex Elder .id = IPA_MEM_V4_ROUTE, 267b310de78SAlex Elder .offset = 0x0508, 268b310de78SAlex Elder .size = 0x0078, 269b310de78SAlex Elder .canary_count = 2, 270b310de78SAlex Elder }, 271b310de78SAlex Elder { 272b310de78SAlex Elder .id = IPA_MEM_V6_ROUTE_HASHED, 273b310de78SAlex Elder .offset = 0x0588, 274b310de78SAlex Elder .size = 0x0078, 275b310de78SAlex Elder .canary_count = 2, 276b310de78SAlex Elder }, 277b310de78SAlex Elder { 278b310de78SAlex Elder .id = IPA_MEM_V6_ROUTE, 279b310de78SAlex Elder .offset = 0x0608, 280b310de78SAlex Elder .size = 0x0078, 281b310de78SAlex Elder .canary_count = 2, 282b310de78SAlex Elder }, 283b310de78SAlex Elder { 284b310de78SAlex Elder .id = IPA_MEM_MODEM_HEADER, 285b310de78SAlex Elder .offset = 0x0688, 286b310de78SAlex Elder .size = 0x0240, 287b310de78SAlex Elder .canary_count = 2, 288b310de78SAlex Elder }, 289b310de78SAlex Elder { 290b310de78SAlex Elder .id = IPA_MEM_AP_HEADER, 291b310de78SAlex Elder .offset = 0x08c8, 292b310de78SAlex Elder .size = 0x0200, 293b310de78SAlex Elder .canary_count = 0, 294b310de78SAlex Elder }, 295b310de78SAlex Elder { 296b310de78SAlex Elder .id = IPA_MEM_MODEM_PROC_CTX, 297b310de78SAlex Elder .offset = 0x0ad0, 298b310de78SAlex Elder .size = 0x0200, 299b310de78SAlex Elder .canary_count = 2, 300b310de78SAlex Elder }, 301b310de78SAlex Elder { 302b310de78SAlex Elder .id = IPA_MEM_AP_PROC_CTX, 303b310de78SAlex Elder .offset = 0x0cd0, 304b310de78SAlex Elder .size = 0x0200, 305b310de78SAlex Elder .canary_count = 0, 306b310de78SAlex Elder }, 307b310de78SAlex Elder { 308b310de78SAlex Elder .id = IPA_MEM_NAT_TABLE, 309b310de78SAlex Elder .offset = 0x0ee0, 310b310de78SAlex Elder .size = 0x0d00, 311b310de78SAlex Elder .canary_count = 4, 312b310de78SAlex Elder }, 313b310de78SAlex Elder { 314b310de78SAlex Elder .id = IPA_MEM_PDN_CONFIG, 315b310de78SAlex Elder .offset = 0x1be8, 316b310de78SAlex Elder .size = 0x0050, 317b310de78SAlex Elder .canary_count = 0, 318b310de78SAlex Elder }, 319b310de78SAlex Elder { 320b310de78SAlex Elder .id = IPA_MEM_STATS_QUOTA_MODEM, 321b310de78SAlex Elder .offset = 0x1c40, 322b310de78SAlex Elder .size = 0x0030, 323b310de78SAlex Elder .canary_count = 4, 324b310de78SAlex Elder }, 325b310de78SAlex Elder { 326b310de78SAlex Elder .id = IPA_MEM_STATS_QUOTA_AP, 327b310de78SAlex Elder .offset = 0x1c70, 328b310de78SAlex Elder .size = 0x0048, 329b310de78SAlex Elder .canary_count = 0, 330b310de78SAlex Elder }, 331b310de78SAlex Elder { 332b310de78SAlex Elder .id = IPA_MEM_STATS_TETHERING, 333b310de78SAlex Elder .offset = 0x1cb8, 334b310de78SAlex Elder .size = 0x0238, 335b310de78SAlex Elder .canary_count = 0, 336b310de78SAlex Elder }, 337b310de78SAlex Elder { 338b310de78SAlex Elder .id = IPA_MEM_STATS_DROP, 339b310de78SAlex Elder .offset = 0x1ef0, 340b310de78SAlex Elder .size = 0x0020, 341b310de78SAlex Elder .canary_count = 0, 342b310de78SAlex Elder }, 343b310de78SAlex Elder { 344b310de78SAlex Elder .id = IPA_MEM_MODEM, 345b310de78SAlex Elder .offset = 0x1f18, 346b310de78SAlex Elder .size = 0x100c, 347b310de78SAlex Elder .canary_count = 2, 348b310de78SAlex Elder }, 349b310de78SAlex Elder { 350b310de78SAlex Elder .id = IPA_MEM_END_MARKER, 351b310de78SAlex Elder .offset = 0x3000, 352b310de78SAlex Elder .size = 0x0000, 353b310de78SAlex Elder .canary_count = 1, 354b310de78SAlex Elder }, 355b310de78SAlex Elder }; 356b310de78SAlex Elder 357b310de78SAlex Elder /* Memory configuration data for an SoC having IPA v4.7 */ 358b310de78SAlex Elder static const struct ipa_mem_data ipa_mem_data = { 359b310de78SAlex Elder .local_count = ARRAY_SIZE(ipa_mem_local_data), 360b310de78SAlex Elder .local = ipa_mem_local_data, 36160ea6f00SAlex Elder .imem_addr = 0x146a8000, 362b310de78SAlex Elder .imem_size = 0x00002000, 363b310de78SAlex Elder .smem_id = 497, 364b310de78SAlex Elder .smem_size = 0x00009000, 365b310de78SAlex Elder }; 366b310de78SAlex Elder 367b310de78SAlex Elder /* Interconnect rates are in 1000 byte/second units */ 368b310de78SAlex Elder static const struct ipa_interconnect_data ipa_interconnect_data[] = { 369b310de78SAlex Elder { 370b310de78SAlex Elder .name = "memory", 371b310de78SAlex Elder .peak_bandwidth = 600000, /* 600 MBps */ 372b310de78SAlex Elder .average_bandwidth = 150000, /* 150 MBps */ 373b310de78SAlex Elder }, 374b310de78SAlex Elder /* Average rate is unused for the next two interconnects */ 375b310de78SAlex Elder { 376b310de78SAlex Elder .name = "imem", 377b310de78SAlex Elder .peak_bandwidth = 450000, /* 450 MBps */ 378b310de78SAlex Elder .average_bandwidth = 75000, /* 75 MBps (unused?) */ 379b310de78SAlex Elder }, 380b310de78SAlex Elder { 381b310de78SAlex Elder .name = "config", 382b310de78SAlex Elder .peak_bandwidth = 171400, /* 171.4 MBps */ 383b310de78SAlex Elder .average_bandwidth = 0, /* unused */ 384b310de78SAlex Elder }, 385b310de78SAlex Elder }; 386b310de78SAlex Elder 387b310de78SAlex Elder /* Clock and interconnect configuration data for an SoC having IPA v4.7 */ 388b310de78SAlex Elder static const struct ipa_power_data ipa_power_data = { 389b310de78SAlex Elder /* XXX Downstream code says 150 MHz (DT SVS2), 60 MHz (code) */ 390b310de78SAlex Elder .core_clock_rate = 100 * 1000 * 1000, /* Hz (150? 60?) */ 391b310de78SAlex Elder .interconnect_count = ARRAY_SIZE(ipa_interconnect_data), 392b310de78SAlex Elder .interconnect_data = ipa_interconnect_data, 393b310de78SAlex Elder }; 394b310de78SAlex Elder 395b310de78SAlex Elder /* Configuration data for an SoC having IPA v4.7 */ 396b310de78SAlex Elder const struct ipa_data ipa_data_v4_7 = { 397b310de78SAlex Elder .version = IPA_VERSION_4_7, 398b310de78SAlex Elder .qsb_count = ARRAY_SIZE(ipa_qsb_data), 399b310de78SAlex Elder .qsb_data = ipa_qsb_data, 400b310de78SAlex Elder .modem_route_count = 8, 401b310de78SAlex Elder .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 402b310de78SAlex Elder .endpoint_data = ipa_gsi_endpoint_data, 403b310de78SAlex Elder .resource_data = &ipa_resource_data, 404b310de78SAlex Elder .mem_data = &ipa_mem_data, 405b310de78SAlex Elder .power_data = &ipa_power_data, 406b310de78SAlex Elder }; 407