1 /* 2 * Copyright (c) 2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 #include "hal_9224.h" 18 19 struct hal_hw_srng_config hw_srng_table_9224v2[] = { 20 /* TODO: max_rings can populated by querying HW capabilities */ 21 { /* REO_DST */ 22 .start_ring_id = HAL_SRNG_REO2SW1, 23 .max_rings = 8, 24 .entry_size = sizeof(struct reo_destination_ring) >> 2, 25 .lmac_ring = FALSE, 26 .ring_dir = HAL_SRNG_DST_RING, 27 .reg_start = { 28 HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR( 29 REO_REG_REG_BASE), 30 HWIO_REO_R2_REO2SW1_RING_HP_ADDR( 31 REO_REG_REG_BASE) 32 }, 33 .reg_size = { 34 HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) - 35 HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0), 36 HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) - 37 HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0), 38 }, 39 .max_size = 40 HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >> 41 HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT, 42 }, 43 { /* REO_EXCEPTION */ 44 /* Designating REO2SW0 ring as exception ring. This ring is 45 * similar to other REO2SW rings though it is named as REO2SW0. 46 * Any of theREO2SW rings can be used as exception ring. 47 */ 48 .start_ring_id = HAL_SRNG_REO2SW0, 49 .max_rings = 1, 50 .entry_size = sizeof(struct reo_destination_ring) >> 2, 51 .lmac_ring = FALSE, 52 .ring_dir = HAL_SRNG_DST_RING, 53 .reg_start = { 54 HWIO_REO_R0_REO2SW0_RING_BASE_LSB_ADDR( 55 REO_REG_REG_BASE), 56 HWIO_REO_R2_REO2SW0_RING_HP_ADDR( 57 REO_REG_REG_BASE) 58 }, 59 /* Single ring - provide ring size if multiple rings of this 60 * type are supported 61 */ 62 .reg_size = {}, 63 .max_size = 64 HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_BMSK >> 65 HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_SHFT, 66 }, 67 { /* REO_REINJECT */ 68 .start_ring_id = HAL_SRNG_SW2REO, 69 .max_rings = 4, 70 .entry_size = sizeof(struct reo_entrance_ring) >> 2, 71 .lmac_ring = FALSE, 72 .ring_dir = HAL_SRNG_SRC_RING, 73 .reg_start = { 74 HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR( 75 REO_REG_REG_BASE), 76 HWIO_REO_R2_SW2REO_RING_HP_ADDR( 77 REO_REG_REG_BASE) 78 }, 79 /* Single ring - provide ring size if multiple rings of this 80 * type are supported 81 */ 82 .reg_size = { 83 HWIO_REO_R0_SW2REO1_RING_BASE_LSB_ADDR(0) - 84 HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(0), 85 HWIO_REO_R2_SW2REO1_RING_HP_ADDR(0) - 86 HWIO_REO_R2_SW2REO_RING_HP_ADDR(0) 87 }, 88 .max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >> 89 HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT, 90 }, 91 { /* REO_CMD */ 92 .start_ring_id = HAL_SRNG_REO_CMD, 93 .max_rings = 1, 94 .entry_size = (sizeof(struct tlv_32_hdr) + 95 sizeof(struct reo_get_queue_stats)) >> 2, 96 .lmac_ring = FALSE, 97 .ring_dir = HAL_SRNG_SRC_RING, 98 .reg_start = { 99 HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR( 100 REO_REG_REG_BASE), 101 HWIO_REO_R2_REO_CMD_RING_HP_ADDR( 102 REO_REG_REG_BASE), 103 }, 104 /* Single ring - provide ring size if multiple rings of this 105 * type are supported 106 */ 107 .reg_size = {}, 108 .max_size = HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >> 109 HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT, 110 }, 111 { /* REO_STATUS */ 112 .start_ring_id = HAL_SRNG_REO_STATUS, 113 .max_rings = 1, 114 .entry_size = (sizeof(struct tlv_32_hdr) + 115 sizeof(struct reo_get_queue_stats_status)) >> 2, 116 .lmac_ring = FALSE, 117 .ring_dir = HAL_SRNG_DST_RING, 118 .reg_start = { 119 HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR( 120 REO_REG_REG_BASE), 121 HWIO_REO_R2_REO_STATUS_RING_HP_ADDR( 122 REO_REG_REG_BASE), 123 }, 124 /* Single ring - provide ring size if multiple rings of this 125 * type are supported 126 */ 127 .reg_size = {}, 128 .max_size = 129 HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >> 130 HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT, 131 }, 132 { /* TCL_DATA */ 133 .start_ring_id = HAL_SRNG_SW2TCL1, 134 .max_rings = 6, 135 .entry_size = sizeof(struct tcl_data_cmd) >> 2, 136 .lmac_ring = FALSE, 137 .ring_dir = HAL_SRNG_SRC_RING, 138 .reg_start = { 139 HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR( 140 MAC_TCL_REG_REG_BASE), 141 HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR( 142 MAC_TCL_REG_REG_BASE), 143 }, 144 .reg_size = { 145 HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) - 146 HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0), 147 HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) - 148 HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0), 149 }, 150 .max_size = 151 HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >> 152 HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT, 153 }, 154 { /* TCL_CMD/CREDIT */ 155 /* qca8074v2 and qcn9224 uses this ring for data commands */ 156 .start_ring_id = HAL_SRNG_SW2TCL_CMD, 157 .max_rings = 1, 158 .entry_size = sizeof(struct tcl_data_cmd) >> 2, 159 .lmac_ring = FALSE, 160 .ring_dir = HAL_SRNG_SRC_RING, 161 .reg_start = { 162 HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_LSB_ADDR( 163 MAC_TCL_REG_REG_BASE), 164 HWIO_TCL_R2_SW2TCL_CREDIT_RING_HP_ADDR( 165 MAC_TCL_REG_REG_BASE), 166 }, 167 /* Single ring - provide ring size if multiple rings of this 168 * type are supported 169 */ 170 .reg_size = {}, 171 .max_size = 172 HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_BMSK >> 173 HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_SHFT, 174 }, 175 { /* TCL_STATUS */ 176 .start_ring_id = HAL_SRNG_TCL_STATUS, 177 .max_rings = 1, 178 .entry_size = (sizeof(struct tlv_32_hdr) + 179 sizeof(struct tcl_status_ring)) >> 2, 180 .lmac_ring = FALSE, 181 .ring_dir = HAL_SRNG_DST_RING, 182 .reg_start = { 183 HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR( 184 MAC_TCL_REG_REG_BASE), 185 HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR( 186 MAC_TCL_REG_REG_BASE), 187 }, 188 /* Single ring - provide ring size if multiple rings of this 189 * type are supported 190 */ 191 .reg_size = {}, 192 .max_size = 193 HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >> 194 HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT, 195 }, 196 { /* CE_SRC */ 197 .start_ring_id = HAL_SRNG_CE_0_SRC, 198 .max_rings = 16, 199 .entry_size = sizeof(struct ce_src_desc) >> 2, 200 .lmac_ring = FALSE, 201 .ring_dir = HAL_SRNG_SRC_RING, 202 .reg_start = { 203 HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR( 204 WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE), 205 HWIO_WFSS_CE_CHANNEL_SRC_R2_SRC_RING_HP_ADDR( 206 WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE), 207 }, 208 .reg_size = { 209 WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE - 210 WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE, 211 WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE - 212 WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE, 213 }, 214 .max_size = 215 HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_BMSK >> 216 HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_SHFT, 217 }, 218 { /* CE_DST */ 219 .start_ring_id = HAL_SRNG_CE_0_DST, 220 .max_rings = 16, 221 .entry_size = 8 >> 2, 222 /*TODO: entry_size above should actually be 223 * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition 224 * of struct ce_dst_desc in HW header files 225 */ 226 .lmac_ring = FALSE, 227 .ring_dir = HAL_SRNG_SRC_RING, 228 .reg_start = { 229 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR( 230 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE), 231 HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR( 232 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE), 233 }, 234 .reg_size = { 235 WFSS_CE_1_CHANNEL_DST_REG_REG_BASE - 236 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE, 237 WFSS_CE_1_CHANNEL_DST_REG_REG_BASE - 238 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE, 239 }, 240 .max_size = 241 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >> 242 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT, 243 }, 244 { /* CE_DST_STATUS */ 245 .start_ring_id = HAL_SRNG_CE_0_DST_STATUS, 246 .max_rings = 16, 247 .entry_size = sizeof(struct ce_stat_desc) >> 2, 248 .lmac_ring = FALSE, 249 .ring_dir = HAL_SRNG_DST_RING, 250 .reg_start = { 251 HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR( 252 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE), 253 HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR( 254 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE), 255 }, 256 /* TODO: check destination status ring registers */ 257 .reg_size = { 258 WFSS_CE_1_CHANNEL_DST_REG_REG_BASE - 259 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE, 260 WFSS_CE_1_CHANNEL_DST_REG_REG_BASE - 261 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE, 262 }, 263 .max_size = 264 HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >> 265 HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT, 266 }, 267 { /* WBM_IDLE_LINK */ 268 .start_ring_id = HAL_SRNG_WBM_IDLE_LINK, 269 .max_rings = 1, 270 .entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2, 271 .lmac_ring = FALSE, 272 .ring_dir = HAL_SRNG_SRC_RING, 273 .reg_start = { 274 HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE), 275 HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(WBM_REG_REG_BASE), 276 }, 277 /* Single ring - provide ring size if multiple rings of this 278 * type are supported 279 */ 280 .reg_size = {}, 281 .max_size = 282 HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >> 283 HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT, 284 }, 285 { /* SW2WBM_RELEASE */ 286 .start_ring_id = HAL_SRNG_WBM_SW_RELEASE, 287 .max_rings = 2, 288 .entry_size = sizeof(struct wbm_release_ring) >> 2, 289 .lmac_ring = FALSE, 290 .ring_dir = HAL_SRNG_SRC_RING, 291 .reg_start = { 292 HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE), 293 HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE), 294 }, 295 .reg_size = { 296 HWIO_WBM_R0_SW1_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE) - 297 HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE), 298 HWIO_WBM_R2_SW1_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE) - 299 HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE) 300 }, 301 .max_size = 302 HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >> 303 HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT, 304 }, 305 { /* WBM2SW_RELEASE */ 306 .start_ring_id = HAL_SRNG_WBM2SW0_RELEASE, 307 .max_rings = 8, 308 .entry_size = sizeof(struct wbm_release_ring) >> 2, 309 .lmac_ring = FALSE, 310 .ring_dir = HAL_SRNG_DST_RING, 311 .reg_start = { 312 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR( 313 WBM_REG_REG_BASE), 314 HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR( 315 WBM_REG_REG_BASE), 316 }, 317 .reg_size = { 318 HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR( 319 WBM_REG_REG_BASE) - 320 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR( 321 WBM_REG_REG_BASE), 322 HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR( 323 WBM_REG_REG_BASE) - 324 HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR( 325 WBM_REG_REG_BASE), 326 }, 327 .max_size = 328 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >> 329 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT, 330 }, 331 { /* RXDMA_BUF */ 332 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0, 333 #ifdef IPA_OFFLOAD 334 .max_rings = 3, 335 #else 336 .max_rings = 3, 337 #endif 338 .entry_size = sizeof(struct wbm_buffer_ring) >> 2, 339 .lmac_ring = TRUE, 340 .ring_dir = HAL_SRNG_SRC_RING, 341 /* reg_start is not set because LMAC rings are not accessed 342 * from host 343 */ 344 .reg_start = {}, 345 .reg_size = {}, 346 .max_size = HAL_RXDMA_MAX_RING_SIZE, 347 }, 348 { /* RXDMA_DST */ 349 .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0, 350 .max_rings = 0, 351 .entry_size = 0/*sizeof(struct reo_entrance_ring) >> 2*/, 352 .lmac_ring = TRUE, 353 .ring_dir = HAL_SRNG_DST_RING, 354 /* reg_start is not set because LMAC rings are not accessed 355 * from host 356 */ 357 .reg_start = {}, 358 .reg_size = {}, 359 .max_size = HAL_RXDMA_MAX_RING_SIZE, 360 }, 361 #ifdef QCA_MONITOR_2_0_SUPPORT 362 { /* RXDMA_MONITOR_BUF */ 363 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF, 364 .max_rings = 1, 365 .entry_size = sizeof(struct mon_ingress_ring) >> 2, 366 .lmac_ring = TRUE, 367 .ring_dir = HAL_SRNG_SRC_RING, 368 /* reg_start is not set because LMAC rings are not accessed 369 * from host 370 */ 371 .reg_start = {}, 372 .reg_size = {}, 373 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 374 }, 375 #else 376 {}, 377 #endif 378 { /* RXDMA_MONITOR_STATUS */ 379 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF, 380 .max_rings = 0, 381 .entry_size = sizeof(struct wbm_buffer_ring) >> 2, 382 .lmac_ring = TRUE, 383 .ring_dir = HAL_SRNG_SRC_RING, 384 /* reg_start is not set because LMAC rings are not accessed 385 * from host 386 */ 387 .reg_start = {}, 388 .reg_size = {}, 389 .max_size = HAL_RXDMA_MAX_RING_SIZE, 390 }, 391 #ifdef QCA_MONITOR_2_0_SUPPORT 392 { /* RXDMA_MONITOR_DST */ 393 .start_ring_id = HAL_SRNG_WMAC1_RXMON2SW0, 394 .max_rings = 2, 395 .entry_size = sizeof(struct mon_destination_ring) >> 2, 396 .lmac_ring = TRUE, 397 .ring_dir = HAL_SRNG_DST_RING, 398 /* reg_start is not set because LMAC rings are not accessed 399 * from host 400 */ 401 .reg_start = {}, 402 .reg_size = {}, 403 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 404 }, 405 #else 406 {}, 407 #endif 408 { /* RXDMA_MONITOR_DESC */ 409 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC, 410 .max_rings = 0, 411 .entry_size = 0/*sizeof(struct sw_monitor_ring) >> 2*/, 412 .lmac_ring = TRUE, 413 .ring_dir = HAL_SRNG_DST_RING, 414 /* reg_start is not set because LMAC rings are not accessed 415 * from host 416 */ 417 .reg_start = {}, 418 .reg_size = {}, 419 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 420 }, 421 422 { /* DIR_BUF_RX_DMA_SRC */ 423 .start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING, 424 /* one ring for spectral and one ring for cfr */ 425 .max_rings = 2, 426 .entry_size = 2, 427 .lmac_ring = TRUE, 428 .ring_dir = HAL_SRNG_SRC_RING, 429 /* reg_start is not set because LMAC rings are not accessed 430 * from host 431 */ 432 .reg_start = {}, 433 .reg_size = {}, 434 .max_size = HAL_RXDMA_MAX_RING_SIZE, 435 }, 436 #ifdef WLAN_FEATURE_CIF_CFR 437 { /* WIFI_POS_SRC */ 438 .start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING, 439 .max_rings = 1, 440 .entry_size = sizeof(wmi_oem_dma_buf_release_entry) >> 2, 441 .lmac_ring = TRUE, 442 .ring_dir = HAL_SRNG_SRC_RING, 443 /* reg_start is not set because LMAC rings are not accessed 444 * from host 445 */ 446 .reg_start = {}, 447 .reg_size = {}, 448 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 449 }, 450 #endif 451 { /* REO2PPE */ 452 .start_ring_id = HAL_SRNG_REO2PPE, 453 .max_rings = 1, 454 .entry_size = sizeof(struct reo_destination_ring) >> 2, 455 .lmac_ring = FALSE, 456 .ring_dir = HAL_SRNG_DST_RING, 457 .reg_start = { 458 HWIO_REO_R0_REO2PPE_RING_BASE_LSB_ADDR( 459 REO_REG_REG_BASE), 460 HWIO_REO_R2_REO2PPE_RING_HP_ADDR( 461 REO_REG_REG_BASE), 462 }, 463 /* Single ring - provide ring size if multiple rings of this 464 * type are supported 465 */ 466 .reg_size = {}, 467 .max_size = 468 HWIO_REO_R0_REO2PPE_RING_BASE_LSB_RING_BASE_ADDR_LSB_BMSK >> 469 HWIO_REO_R0_REO2PPE_RING_BASE_LSB_RING_BASE_ADDR_LSB_SHFT, 470 }, 471 { /* PPE2TCL */ 472 .start_ring_id = HAL_SRNG_PPE2TCL1, 473 .max_rings = 1, 474 .entry_size = sizeof(struct tcl_entrance_from_ppe_ring) >> 2, 475 .lmac_ring = FALSE, 476 .ring_dir = HAL_SRNG_SRC_RING, 477 .reg_start = { 478 HWIO_TCL_R0_PPE2TCL1_RING_BASE_LSB_ADDR( 479 MAC_TCL_REG_REG_BASE), 480 HWIO_TCL_R2_PPE2TCL1_RING_HP_ADDR( 481 MAC_TCL_REG_REG_BASE), 482 }, 483 .reg_size = {}, 484 .max_size = 485 HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >> 486 HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT, 487 }, 488 { /* PPE_RELEASE */ 489 .start_ring_id = HAL_SRNG_WBM_PPE_RELEASE, 490 .max_rings = 1, 491 .entry_size = sizeof(struct wbm_release_ring) >> 2, 492 .lmac_ring = FALSE, 493 .ring_dir = HAL_SRNG_SRC_RING, 494 .reg_start = { 495 HWIO_WBM_R0_PPE_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE), 496 HWIO_WBM_R2_PPE_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE), 497 }, 498 .reg_size = {}, 499 .max_size = 500 HWIO_WBM_R0_PPE_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >> 501 HWIO_WBM_R0_PPE_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT, 502 }, 503 #ifdef QCA_MONITOR_2_0_SUPPORT 504 { /* TX_MONITOR_BUF */ 505 .start_ring_id = HAL_SRNG_SW2TXMON_BUF0, 506 .max_rings = 1, 507 .entry_size = sizeof(struct mon_ingress_ring) >> 2, 508 .lmac_ring = TRUE, 509 .ring_dir = HAL_SRNG_SRC_RING, 510 /* reg_start is not set because LMAC rings are not accessed 511 * from host 512 */ 513 .reg_start = {}, 514 .reg_size = {}, 515 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 516 }, 517 { /* TX_MONITOR_DST */ 518 .start_ring_id = HAL_SRNG_WMAC1_TXMON2SW0, 519 .max_rings = 2, 520 .entry_size = sizeof(struct mon_destination_ring) >> 2, 521 .lmac_ring = TRUE, 522 .ring_dir = HAL_SRNG_DST_RING, 523 /* reg_start is not set because LMAC rings are not accessed 524 * from host 525 */ 526 .reg_start = {}, 527 .reg_size = {}, 528 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 529 }, 530 #else 531 {}, 532 {}, 533 #endif 534 { /* SW2RXDMA */ 535 .start_ring_id = HAL_SRNG_SW2RXDMA_BUF0, 536 .max_rings = 3, 537 .entry_size = sizeof(struct reo_entrance_ring) >> 2, 538 .lmac_ring = TRUE, 539 .ring_dir = HAL_SRNG_SRC_RING, 540 /* reg_start is not set because LMAC rings are not accessed 541 * from host 542 */ 543 .reg_start = {}, 544 .reg_size = {}, 545 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 546 }, 547 }; 548 549 /** 550 * hal_qcn9224_attach()- Attach 9224 target specific hal_soc ops, 551 * offset and srng table 552 * Return: void 553 */ 554 void hal_qcn9224v2_attach(struct hal_soc *hal_soc) 555 { 556 hal_soc->hw_srng_table = hw_srng_table_9224v2; 557 558 hal_srng_hw_reg_offset_init_generic(hal_soc); 559 hal_srng_hw_reg_offset_init_qcn9224(hal_soc); 560 561 hal_hw_txrx_default_ops_attach_be(hal_soc); 562 hal_hw_txrx_ops_attach_qcn9224(hal_soc); 563 if (hal_soc->static_window_map) 564 hal_write_window_register(hal_soc); 565 hal_soc->dmac_cmn_src_rxbuf_ring = true; 566 } 567