Path: blob/main/sys/contrib/dev/athk/ath12k/hal.h
105585 views
/* SPDX-License-Identifier: BSD-3-Clause-Clear */1/*2* Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.3* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.4*/56#ifndef ATH12K_HAL_H7#define ATH12K_HAL_H89#include "hal_desc.h"10#include "rx_desc.h"1112struct ath12k_base;1314#define HAL_LINK_DESC_SIZE (32 << 2)15#define HAL_LINK_DESC_ALIGN 12816#define HAL_NUM_MPDUS_PER_LINK_DESC 617#define HAL_NUM_TX_MSDUS_PER_LINK_DESC 718#define HAL_NUM_RX_MSDUS_PER_LINK_DESC 619#define HAL_NUM_MPDU_LINKS_PER_QUEUE_DESC 1220#define HAL_MAX_AVAIL_BLK_RES 32122#define HAL_RING_BASE_ALIGN 82324#define HAL_WBM_IDLE_SCATTER_BUF_SIZE_MAX 3270425/* TODO: Check with hw team on the supported scatter buf size */26#define HAL_WBM_IDLE_SCATTER_NEXT_PTR_SIZE 827#define HAL_WBM_IDLE_SCATTER_BUF_SIZE (HAL_WBM_IDLE_SCATTER_BUF_SIZE_MAX - \28HAL_WBM_IDLE_SCATTER_NEXT_PTR_SIZE)2930/* TODO: 16 entries per radio times MAX_VAPS_SUPPORTED */31#define HAL_DSCP_TID_MAP_TBL_NUM_ENTRIES_MAX 3232#define HAL_DSCP_TID_TBL_SIZE 243334/* calculate the register address from bar0 of shadow register x */35#define HAL_SHADOW_BASE_ADDR 0x000008fc36#define HAL_SHADOW_NUM_REGS 4037#define HAL_HP_OFFSET_IN_REG_START 138#define HAL_OFFSET_FROM_HP_TO_TP 43940#define HAL_SHADOW_REG(x) (HAL_SHADOW_BASE_ADDR + (4 * (x)))4142/* WCSS Relative address */43#define HAL_SEQ_WCSS_UMAC_OFFSET 0x00a0000044#define HAL_SEQ_WCSS_UMAC_REO_REG 0x00a3800045#define HAL_SEQ_WCSS_UMAC_TCL_REG 0x00a4400046#define HAL_SEQ_WCSS_UMAC_CE0_SRC_REG 0x01b8000047#define HAL_SEQ_WCSS_UMAC_CE0_DST_REG 0x01b8100048#define HAL_SEQ_WCSS_UMAC_CE1_SRC_REG 0x01b8200049#define HAL_SEQ_WCSS_UMAC_CE1_DST_REG 0x01b8300050#define HAL_SEQ_WCSS_UMAC_WBM_REG 0x00a340005152#define HAL_CE_WFSS_CE_REG_BASE 0x01b800005354#define HAL_TCL_SW_CONFIG_BANK_ADDR 0x00a4408c5556/* SW2TCL(x) R0 ring configuration address */57#define HAL_TCL1_RING_CMN_CTRL_REG 0x0000002058#define HAL_TCL1_RING_DSCP_TID_MAP 0x0000024059#define HAL_TCL1_RING_BASE_LSB 0x0000090060#define HAL_TCL1_RING_BASE_MSB 0x0000090461#define HAL_TCL1_RING_ID(ab) ((ab)->hw_params->regs->hal_tcl1_ring_id)62#define HAL_TCL1_RING_MISC(ab) \63((ab)->hw_params->regs->hal_tcl1_ring_misc)64#define HAL_TCL1_RING_TP_ADDR_LSB(ab) \65((ab)->hw_params->regs->hal_tcl1_ring_tp_addr_lsb)66#define HAL_TCL1_RING_TP_ADDR_MSB(ab) \67((ab)->hw_params->regs->hal_tcl1_ring_tp_addr_msb)68#define HAL_TCL1_RING_CONSUMER_INT_SETUP_IX0(ab) \69((ab)->hw_params->regs->hal_tcl1_ring_consumer_int_setup_ix0)70#define HAL_TCL1_RING_CONSUMER_INT_SETUP_IX1(ab) \71((ab)->hw_params->regs->hal_tcl1_ring_consumer_int_setup_ix1)72#define HAL_TCL1_RING_MSI1_BASE_LSB(ab) \73((ab)->hw_params->regs->hal_tcl1_ring_msi1_base_lsb)74#define HAL_TCL1_RING_MSI1_BASE_MSB(ab) \75((ab)->hw_params->regs->hal_tcl1_ring_msi1_base_msb)76#define HAL_TCL1_RING_MSI1_DATA(ab) \77((ab)->hw_params->regs->hal_tcl1_ring_msi1_data)78#define HAL_TCL2_RING_BASE_LSB 0x0000097879#define HAL_TCL_RING_BASE_LSB(ab) \80((ab)->hw_params->regs->hal_tcl_ring_base_lsb)8182#define HAL_TCL1_RING_MSI1_BASE_LSB_OFFSET(ab) \83(HAL_TCL1_RING_MSI1_BASE_LSB(ab) - HAL_TCL1_RING_BASE_LSB)84#define HAL_TCL1_RING_MSI1_BASE_MSB_OFFSET(ab) \85(HAL_TCL1_RING_MSI1_BASE_MSB(ab) - HAL_TCL1_RING_BASE_LSB)86#define HAL_TCL1_RING_MSI1_DATA_OFFSET(ab) \87(HAL_TCL1_RING_MSI1_DATA(ab) - HAL_TCL1_RING_BASE_LSB)88#define HAL_TCL1_RING_BASE_MSB_OFFSET \89(HAL_TCL1_RING_BASE_MSB - HAL_TCL1_RING_BASE_LSB)90#define HAL_TCL1_RING_ID_OFFSET(ab) \91(HAL_TCL1_RING_ID(ab) - HAL_TCL1_RING_BASE_LSB)92#define HAL_TCL1_RING_CONSR_INT_SETUP_IX0_OFFSET(ab) \93(HAL_TCL1_RING_CONSUMER_INT_SETUP_IX0(ab) - HAL_TCL1_RING_BASE_LSB)94#define HAL_TCL1_RING_CONSR_INT_SETUP_IX1_OFFSET(ab) \95(HAL_TCL1_RING_CONSUMER_INT_SETUP_IX1(ab) - HAL_TCL1_RING_BASE_LSB)96#define HAL_TCL1_RING_TP_ADDR_LSB_OFFSET(ab) \97(HAL_TCL1_RING_TP_ADDR_LSB(ab) - HAL_TCL1_RING_BASE_LSB)98#define HAL_TCL1_RING_TP_ADDR_MSB_OFFSET(ab) \99(HAL_TCL1_RING_TP_ADDR_MSB(ab) - HAL_TCL1_RING_BASE_LSB)100#define HAL_TCL1_RING_MISC_OFFSET(ab) \101(HAL_TCL1_RING_MISC(ab) - HAL_TCL1_RING_BASE_LSB)102103/* SW2TCL(x) R2 ring pointers (head/tail) address */104#define HAL_TCL1_RING_HP 0x00002000105#define HAL_TCL1_RING_TP 0x00002004106#define HAL_TCL2_RING_HP 0x00002008107#define HAL_TCL_RING_HP 0x00002028108109#define HAL_TCL1_RING_TP_OFFSET \110(HAL_TCL1_RING_TP - HAL_TCL1_RING_HP)111112/* TCL STATUS ring address */113#define HAL_TCL_STATUS_RING_BASE_LSB(ab) \114((ab)->hw_params->regs->hal_tcl_status_ring_base_lsb)115#define HAL_TCL_STATUS_RING_HP 0x00002048116117/* PPE2TCL1 Ring address */118#define HAL_TCL_PPE2TCL1_RING_BASE_LSB 0x00000c48119#define HAL_TCL_PPE2TCL1_RING_HP 0x00002038120121/* WBM PPE Release Ring address */122#define HAL_WBM_PPE_RELEASE_RING_BASE_LSB(ab) \123((ab)->hw_params->regs->hal_ppe_rel_ring_base)124#define HAL_WBM_PPE_RELEASE_RING_HP 0x00003020125126/* REO2SW(x) R0 ring configuration address */127#define HAL_REO1_GEN_ENABLE 0x00000000128#define HAL_REO1_MISC_CTRL_ADDR(ab) \129((ab)->hw_params->regs->hal_reo1_misc_ctrl_addr)130#define HAL_REO1_DEST_RING_CTRL_IX_0 0x00000004131#define HAL_REO1_DEST_RING_CTRL_IX_1 0x00000008132#define HAL_REO1_DEST_RING_CTRL_IX_2 0x0000000c133#define HAL_REO1_DEST_RING_CTRL_IX_3 0x00000010134#define HAL_REO1_SW_COOKIE_CFG0(ab) ((ab)->hw_params->regs->hal_reo1_sw_cookie_cfg0)135#define HAL_REO1_SW_COOKIE_CFG1(ab) ((ab)->hw_params->regs->hal_reo1_sw_cookie_cfg1)136#define HAL_REO1_QDESC_LUT_BASE0(ab) ((ab)->hw_params->regs->hal_reo1_qdesc_lut_base0)137#define HAL_REO1_QDESC_LUT_BASE1(ab) ((ab)->hw_params->regs->hal_reo1_qdesc_lut_base1)138#define HAL_REO1_RING_BASE_LSB(ab) ((ab)->hw_params->regs->hal_reo1_ring_base_lsb)139#define HAL_REO1_RING_BASE_MSB(ab) ((ab)->hw_params->regs->hal_reo1_ring_base_msb)140#define HAL_REO1_RING_ID(ab) ((ab)->hw_params->regs->hal_reo1_ring_id)141#define HAL_REO1_RING_MISC(ab) ((ab)->hw_params->regs->hal_reo1_ring_misc)142#define HAL_REO1_RING_HP_ADDR_LSB(ab) ((ab)->hw_params->regs->hal_reo1_ring_hp_addr_lsb)143#define HAL_REO1_RING_HP_ADDR_MSB(ab) ((ab)->hw_params->regs->hal_reo1_ring_hp_addr_msb)144#define HAL_REO1_RING_PRODUCER_INT_SETUP(ab) \145((ab)->hw_params->regs->hal_reo1_ring_producer_int_setup)146#define HAL_REO1_RING_MSI1_BASE_LSB(ab) \147((ab)->hw_params->regs->hal_reo1_ring_msi1_base_lsb)148#define HAL_REO1_RING_MSI1_BASE_MSB(ab) \149((ab)->hw_params->regs->hal_reo1_ring_msi1_base_msb)150#define HAL_REO1_RING_MSI1_DATA(ab) ((ab)->hw_params->regs->hal_reo1_ring_msi1_data)151#define HAL_REO2_RING_BASE_LSB(ab) ((ab)->hw_params->regs->hal_reo2_ring_base)152#define HAL_REO1_AGING_THRESH_IX_0(ab) ((ab)->hw_params->regs->hal_reo1_aging_thres_ix0)153#define HAL_REO1_AGING_THRESH_IX_1(ab) ((ab)->hw_params->regs->hal_reo1_aging_thres_ix1)154#define HAL_REO1_AGING_THRESH_IX_2(ab) ((ab)->hw_params->regs->hal_reo1_aging_thres_ix2)155#define HAL_REO1_AGING_THRESH_IX_3(ab) ((ab)->hw_params->regs->hal_reo1_aging_thres_ix3)156157/* REO2SW(x) R2 ring pointers (head/tail) address */158#define HAL_REO1_RING_HP 0x00003048159#define HAL_REO1_RING_TP 0x0000304c160#define HAL_REO2_RING_HP 0x00003050161162#define HAL_REO1_RING_TP_OFFSET (HAL_REO1_RING_TP - HAL_REO1_RING_HP)163164/* REO2SW0 ring configuration address */165#define HAL_REO_SW0_RING_BASE_LSB(ab) \166((ab)->hw_params->regs->hal_reo2_sw0_ring_base)167168/* REO2SW0 R2 ring pointer (head/tail) address */169#define HAL_REO_SW0_RING_HP 0x00003088170171/* REO CMD R0 address */172#define HAL_REO_CMD_RING_BASE_LSB(ab) \173((ab)->hw_params->regs->hal_reo_cmd_ring_base)174175/* REO CMD R2 address */176#define HAL_REO_CMD_HP 0x00003020177178/* SW2REO R0 address */179#define HAL_SW2REO_RING_BASE_LSB(ab) \180((ab)->hw_params->regs->hal_sw2reo_ring_base)181#define HAL_SW2REO1_RING_BASE_LSB(ab) \182((ab)->hw_params->regs->hal_sw2reo1_ring_base)183184/* SW2REO R2 address */185#define HAL_SW2REO_RING_HP 0x00003028186#define HAL_SW2REO1_RING_HP 0x00003030187188/* CE ring R0 address */189#define HAL_CE_SRC_RING_BASE_LSB 0x00000000190#define HAL_CE_DST_RING_BASE_LSB 0x00000000191#define HAL_CE_DST_STATUS_RING_BASE_LSB 0x00000058192#define HAL_CE_DST_RING_CTRL 0x000000b0193194/* CE ring R2 address */195#define HAL_CE_DST_RING_HP 0x00000400196#define HAL_CE_DST_STATUS_RING_HP 0x00000408197198/* REO status address */199#define HAL_REO_STATUS_RING_BASE_LSB(ab) \200((ab)->hw_params->regs->hal_reo_status_ring_base)201#define HAL_REO_STATUS_HP 0x000030a8202203/* WBM Idle R0 address */204#define HAL_WBM_IDLE_LINK_RING_BASE_LSB(ab) \205((ab)->hw_params->regs->hal_wbm_idle_ring_base_lsb)206#define HAL_WBM_IDLE_LINK_RING_MISC_ADDR(ab) \207((ab)->hw_params->regs->hal_wbm_idle_ring_misc_addr)208#define HAL_WBM_R0_IDLE_LIST_CONTROL_ADDR(ab) \209((ab)->hw_params->regs->hal_wbm_r0_idle_list_cntl_addr)210#define HAL_WBM_R0_IDLE_LIST_SIZE_ADDR(ab) \211((ab)->hw_params->regs->hal_wbm_r0_idle_list_size_addr)212#define HAL_WBM_SCATTERED_RING_BASE_LSB(ab) \213((ab)->hw_params->regs->hal_wbm_scattered_ring_base_lsb)214#define HAL_WBM_SCATTERED_RING_BASE_MSB(ab) \215((ab)->hw_params->regs->hal_wbm_scattered_ring_base_msb)216#define HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX0(ab) \217((ab)->hw_params->regs->hal_wbm_scattered_desc_head_info_ix0)218#define HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX1(ab) \219((ab)->hw_params->regs->hal_wbm_scattered_desc_head_info_ix1)220#define HAL_WBM_SCATTERED_DESC_PTR_TAIL_INFO_IX0(ab) \221((ab)->hw_params->regs->hal_wbm_scattered_desc_tail_info_ix0)222#define HAL_WBM_SCATTERED_DESC_PTR_TAIL_INFO_IX1(ab) \223((ab)->hw_params->regs->hal_wbm_scattered_desc_tail_info_ix1)224#define HAL_WBM_SCATTERED_DESC_PTR_HP_ADDR(ab) \225((ab)->hw_params->regs->hal_wbm_scattered_desc_ptr_hp_addr)226227/* WBM Idle R2 address */228#define HAL_WBM_IDLE_LINK_RING_HP 0x000030b8229230/* SW2WBM R0 release address */231#define HAL_WBM_SW_RELEASE_RING_BASE_LSB(ab) \232((ab)->hw_params->regs->hal_wbm_sw_release_ring_base_lsb)233#define HAL_WBM_SW1_RELEASE_RING_BASE_LSB(ab) \234((ab)->hw_params->regs->hal_wbm_sw1_release_ring_base_lsb)235236/* SW2WBM R2 release address */237#define HAL_WBM_SW_RELEASE_RING_HP 0x00003010238#define HAL_WBM_SW1_RELEASE_RING_HP 0x00003018239240/* WBM2SW R0 release address */241#define HAL_WBM0_RELEASE_RING_BASE_LSB(ab) \242((ab)->hw_params->regs->hal_wbm0_release_ring_base_lsb)243244#define HAL_WBM1_RELEASE_RING_BASE_LSB(ab) \245((ab)->hw_params->regs->hal_wbm1_release_ring_base_lsb)246247/* WBM2SW R2 release address */248#define HAL_WBM0_RELEASE_RING_HP 0x000030c8249#define HAL_WBM1_RELEASE_RING_HP 0x000030d0250251/* WBM cookie config address and mask */252#define HAL_WBM_SW_COOKIE_CFG0 0x00000040253#define HAL_WBM_SW_COOKIE_CFG1 0x00000044254#define HAL_WBM_SW_COOKIE_CFG2 0x00000090255#define HAL_WBM_SW_COOKIE_CONVERT_CFG 0x00000094256257#define HAL_WBM_SW_COOKIE_CFG_CMEM_BASE_ADDR_MSB GENMASK(7, 0)258#define HAL_WBM_SW_COOKIE_CFG_COOKIE_PPT_MSB GENMASK(12, 8)259#define HAL_WBM_SW_COOKIE_CFG_COOKIE_SPT_MSB GENMASK(17, 13)260#define HAL_WBM_SW_COOKIE_CFG_ALIGN BIT(18)261#define HAL_WBM_SW_COOKIE_CFG_RELEASE_PATH_EN BIT(0)262#define HAL_WBM_SW_COOKIE_CFG_ERR_PATH_EN BIT(1)263#define HAL_WBM_SW_COOKIE_CFG_CONV_IND_EN BIT(3)264265#define HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW0_EN BIT(1)266#define HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW1_EN BIT(2)267#define HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW2_EN BIT(3)268#define HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW3_EN BIT(4)269#define HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW4_EN BIT(5)270#define HAL_WBM_SW_COOKIE_CONV_CFG_GLOBAL_EN BIT(8)271272/* TCL ring field mask and offset */273#define HAL_TCL1_RING_BASE_MSB_RING_SIZE GENMASK(27, 8)274#define HAL_TCL1_RING_BASE_MSB_RING_BASE_ADDR_MSB GENMASK(7, 0)275#define HAL_TCL1_RING_ID_ENTRY_SIZE GENMASK(7, 0)276#define HAL_TCL1_RING_MISC_MSI_RING_ID_DISABLE BIT(0)277#define HAL_TCL1_RING_MISC_MSI_LOOPCNT_DISABLE BIT(1)278#define HAL_TCL1_RING_MISC_MSI_SWAP BIT(3)279#define HAL_TCL1_RING_MISC_HOST_FW_SWAP BIT(4)280#define HAL_TCL1_RING_MISC_DATA_TLV_SWAP BIT(5)281#define HAL_TCL1_RING_MISC_SRNG_ENABLE BIT(6)282#define HAL_TCL1_RING_CONSR_INT_SETUP_IX0_INTR_TMR_THOLD GENMASK(31, 16)283#define HAL_TCL1_RING_CONSR_INT_SETUP_IX0_BATCH_COUNTER_THOLD GENMASK(14, 0)284#define HAL_TCL1_RING_CONSR_INT_SETUP_IX1_LOW_THOLD GENMASK(15, 0)285#define HAL_TCL1_RING_MSI1_BASE_MSB_MSI1_ENABLE BIT(8)286#define HAL_TCL1_RING_MSI1_BASE_MSB_ADDR GENMASK(7, 0)287#define HAL_TCL1_RING_CMN_CTRL_DSCP_TID_MAP_PROG_EN BIT(23)288#define HAL_TCL1_RING_FIELD_DSCP_TID_MAP GENMASK(31, 0)289#define HAL_TCL1_RING_FIELD_DSCP_TID_MAP0 GENMASK(2, 0)290#define HAL_TCL1_RING_FIELD_DSCP_TID_MAP1 GENMASK(5, 3)291#define HAL_TCL1_RING_FIELD_DSCP_TID_MAP2 GENMASK(8, 6)292#define HAL_TCL1_RING_FIELD_DSCP_TID_MAP3 GENMASK(11, 9)293#define HAL_TCL1_RING_FIELD_DSCP_TID_MAP4 GENMASK(14, 12)294#define HAL_TCL1_RING_FIELD_DSCP_TID_MAP5 GENMASK(17, 15)295#define HAL_TCL1_RING_FIELD_DSCP_TID_MAP6 GENMASK(20, 18)296#define HAL_TCL1_RING_FIELD_DSCP_TID_MAP7 GENMASK(23, 21)297298/* REO ring field mask and offset */299#define HAL_REO1_RING_BASE_MSB_RING_SIZE GENMASK(27, 8)300#define HAL_REO1_RING_BASE_MSB_RING_BASE_ADDR_MSB GENMASK(7, 0)301#define HAL_REO1_RING_ID_RING_ID GENMASK(15, 8)302#define HAL_REO1_RING_ID_ENTRY_SIZE GENMASK(7, 0)303#define HAL_REO1_RING_MISC_MSI_SWAP BIT(3)304#define HAL_REO1_RING_MISC_HOST_FW_SWAP BIT(4)305#define HAL_REO1_RING_MISC_DATA_TLV_SWAP BIT(5)306#define HAL_REO1_RING_MISC_SRNG_ENABLE BIT(6)307#define HAL_REO1_RING_PRDR_INT_SETUP_INTR_TMR_THOLD GENMASK(31, 16)308#define HAL_REO1_RING_PRDR_INT_SETUP_BATCH_COUNTER_THOLD GENMASK(14, 0)309#define HAL_REO1_RING_MSI1_BASE_MSB_MSI1_ENABLE BIT(8)310#define HAL_REO1_RING_MSI1_BASE_MSB_ADDR GENMASK(7, 0)311#define HAL_REO1_MISC_CTL_FRAG_DST_RING GENMASK(20, 17)312#define HAL_REO1_MISC_CTL_BAR_DST_RING GENMASK(24, 21)313#define HAL_REO1_GEN_ENABLE_AGING_LIST_ENABLE BIT(2)314#define HAL_REO1_GEN_ENABLE_AGING_FLUSH_ENABLE BIT(3)315#define HAL_REO1_SW_COOKIE_CFG_CMEM_BASE_ADDR_MSB GENMASK(7, 0)316#define HAL_REO1_SW_COOKIE_CFG_COOKIE_PPT_MSB GENMASK(12, 8)317#define HAL_REO1_SW_COOKIE_CFG_COOKIE_SPT_MSB GENMASK(17, 13)318#define HAL_REO1_SW_COOKIE_CFG_ALIGN BIT(18)319#define HAL_REO1_SW_COOKIE_CFG_ENABLE BIT(19)320#define HAL_REO1_SW_COOKIE_CFG_GLOBAL_ENABLE BIT(20)321322/* CE ring bit field mask and shift */323#define HAL_CE_DST_R0_DEST_CTRL_MAX_LEN GENMASK(15, 0)324325#define HAL_ADDR_LSB_REG_MASK 0xffffffff326327#define HAL_ADDR_MSB_REG_SHIFT 32328329/* WBM ring bit field mask and shift */330#define HAL_WBM_LINK_DESC_IDLE_LIST_MODE BIT(1)331#define HAL_WBM_SCATTER_BUFFER_SIZE GENMASK(10, 2)332#define HAL_WBM_SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST GENMASK(31, 16)333#define HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32 GENMASK(7, 0)334#define HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_MATCH_TAG GENMASK(31, 8)335336#define HAL_WBM_SCATTERED_DESC_HEAD_P_OFFSET_IX1 GENMASK(20, 8)337#define HAL_WBM_SCATTERED_DESC_TAIL_P_OFFSET_IX1 GENMASK(20, 8)338339#define HAL_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE BIT(6)340#define HAL_WBM_IDLE_LINK_RING_MISC_RIND_ID_DISABLE BIT(0)341342#define BASE_ADDR_MATCH_TAG_VAL 0x5343344#define HAL_REO_REO2SW1_RING_BASE_MSB_RING_SIZE 0x000fffff345#define HAL_REO_REO2SW0_RING_BASE_MSB_RING_SIZE 0x000fffff346#define HAL_REO_SW2REO_RING_BASE_MSB_RING_SIZE 0x0000ffff347#define HAL_REO_CMD_RING_BASE_MSB_RING_SIZE 0x0000ffff348#define HAL_REO_STATUS_RING_BASE_MSB_RING_SIZE 0x0000ffff349#define HAL_SW2TCL1_RING_BASE_MSB_RING_SIZE 0x000fffff350#define HAL_SW2TCL1_CMD_RING_BASE_MSB_RING_SIZE 0x000fffff351#define HAL_TCL_STATUS_RING_BASE_MSB_RING_SIZE 0x0000ffff352#define HAL_CE_SRC_RING_BASE_MSB_RING_SIZE 0x0000ffff353#define HAL_CE_DST_RING_BASE_MSB_RING_SIZE 0x0000ffff354#define HAL_CE_DST_STATUS_RING_BASE_MSB_RING_SIZE 0x0000ffff355#define HAL_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE 0x000fffff356#define HAL_SW2WBM_RELEASE_RING_BASE_MSB_RING_SIZE 0x0000ffff357#define HAL_WBM2SW_RELEASE_RING_BASE_MSB_RING_SIZE 0x000fffff358#define HAL_RXDMA_RING_MAX_SIZE 0x0000ffff359#define HAL_RXDMA_RING_MAX_SIZE_BE 0x000fffff360#define HAL_WBM2PPE_RELEASE_RING_BASE_MSB_RING_SIZE 0x000fffff361362#define HAL_WBM2SW_REL_ERR_RING_NUM 3363/* Add any other errors here and return them in364* ath12k_hal_rx_desc_get_err().365*/366367enum hal_srng_ring_id {368HAL_SRNG_RING_ID_REO2SW0 = 0,369HAL_SRNG_RING_ID_REO2SW1,370HAL_SRNG_RING_ID_REO2SW2,371HAL_SRNG_RING_ID_REO2SW3,372HAL_SRNG_RING_ID_REO2SW4,373HAL_SRNG_RING_ID_REO2SW5,374HAL_SRNG_RING_ID_REO2SW6,375HAL_SRNG_RING_ID_REO2SW7,376HAL_SRNG_RING_ID_REO2SW8,377HAL_SRNG_RING_ID_REO2TCL,378HAL_SRNG_RING_ID_REO2PPE,379380HAL_SRNG_RING_ID_SW2REO = 16,381HAL_SRNG_RING_ID_SW2REO1,382HAL_SRNG_RING_ID_SW2REO2,383HAL_SRNG_RING_ID_SW2REO3,384385HAL_SRNG_RING_ID_REO_CMD,386HAL_SRNG_RING_ID_REO_STATUS,387388HAL_SRNG_RING_ID_SW2TCL1 = 24,389HAL_SRNG_RING_ID_SW2TCL2,390HAL_SRNG_RING_ID_SW2TCL3,391HAL_SRNG_RING_ID_SW2TCL4,392HAL_SRNG_RING_ID_SW2TCL5,393HAL_SRNG_RING_ID_SW2TCL6,394HAL_SRNG_RING_ID_PPE2TCL1 = 30,395396HAL_SRNG_RING_ID_SW2TCL_CMD = 40,397HAL_SRNG_RING_ID_SW2TCL1_CMD,398HAL_SRNG_RING_ID_TCL_STATUS,399400HAL_SRNG_RING_ID_CE0_SRC = 64,401HAL_SRNG_RING_ID_CE1_SRC,402HAL_SRNG_RING_ID_CE2_SRC,403HAL_SRNG_RING_ID_CE3_SRC,404HAL_SRNG_RING_ID_CE4_SRC,405HAL_SRNG_RING_ID_CE5_SRC,406HAL_SRNG_RING_ID_CE6_SRC,407HAL_SRNG_RING_ID_CE7_SRC,408HAL_SRNG_RING_ID_CE8_SRC,409HAL_SRNG_RING_ID_CE9_SRC,410HAL_SRNG_RING_ID_CE10_SRC,411HAL_SRNG_RING_ID_CE11_SRC,412HAL_SRNG_RING_ID_CE12_SRC,413HAL_SRNG_RING_ID_CE13_SRC,414HAL_SRNG_RING_ID_CE14_SRC,415HAL_SRNG_RING_ID_CE15_SRC,416417HAL_SRNG_RING_ID_CE0_DST = 81,418HAL_SRNG_RING_ID_CE1_DST,419HAL_SRNG_RING_ID_CE2_DST,420HAL_SRNG_RING_ID_CE3_DST,421HAL_SRNG_RING_ID_CE4_DST,422HAL_SRNG_RING_ID_CE5_DST,423HAL_SRNG_RING_ID_CE6_DST,424HAL_SRNG_RING_ID_CE7_DST,425HAL_SRNG_RING_ID_CE8_DST,426HAL_SRNG_RING_ID_CE9_DST,427HAL_SRNG_RING_ID_CE10_DST,428HAL_SRNG_RING_ID_CE11_DST,429HAL_SRNG_RING_ID_CE12_DST,430HAL_SRNG_RING_ID_CE13_DST,431HAL_SRNG_RING_ID_CE14_DST,432HAL_SRNG_RING_ID_CE15_DST,433434HAL_SRNG_RING_ID_CE0_DST_STATUS = 100,435HAL_SRNG_RING_ID_CE1_DST_STATUS,436HAL_SRNG_RING_ID_CE2_DST_STATUS,437HAL_SRNG_RING_ID_CE3_DST_STATUS,438HAL_SRNG_RING_ID_CE4_DST_STATUS,439HAL_SRNG_RING_ID_CE5_DST_STATUS,440HAL_SRNG_RING_ID_CE6_DST_STATUS,441HAL_SRNG_RING_ID_CE7_DST_STATUS,442HAL_SRNG_RING_ID_CE8_DST_STATUS,443HAL_SRNG_RING_ID_CE9_DST_STATUS,444HAL_SRNG_RING_ID_CE10_DST_STATUS,445HAL_SRNG_RING_ID_CE11_DST_STATUS,446HAL_SRNG_RING_ID_CE12_DST_STATUS,447HAL_SRNG_RING_ID_CE13_DST_STATUS,448HAL_SRNG_RING_ID_CE14_DST_STATUS,449HAL_SRNG_RING_ID_CE15_DST_STATUS,450451HAL_SRNG_RING_ID_WBM_IDLE_LINK = 120,452HAL_SRNG_RING_ID_WBM_SW0_RELEASE,453HAL_SRNG_RING_ID_WBM_SW1_RELEASE,454HAL_SRNG_RING_ID_WBM_PPE_RELEASE = 123,455456HAL_SRNG_RING_ID_WBM2SW0_RELEASE = 128,457HAL_SRNG_RING_ID_WBM2SW1_RELEASE,458HAL_SRNG_RING_ID_WBM2SW2_RELEASE,459HAL_SRNG_RING_ID_WBM2SW3_RELEASE, /* RX ERROR RING */460HAL_SRNG_RING_ID_WBM2SW4_RELEASE,461HAL_SRNG_RING_ID_WBM2SW5_RELEASE,462HAL_SRNG_RING_ID_WBM2SW6_RELEASE,463HAL_SRNG_RING_ID_WBM2SW7_RELEASE,464465HAL_SRNG_RING_ID_UMAC_ID_END = 159,466467/* Common DMAC rings shared by all LMACs */468HAL_SRNG_RING_ID_DMAC_CMN_ID_START = 160,469HAL_SRNG_SW2RXDMA_BUF0 = HAL_SRNG_RING_ID_DMAC_CMN_ID_START,470HAL_SRNG_SW2RXDMA_BUF1 = 161,471HAL_SRNG_SW2RXDMA_BUF2 = 162,472473HAL_SRNG_SW2RXMON_BUF0 = 168,474475HAL_SRNG_SW2TXMON_BUF0 = 176,476477HAL_SRNG_RING_ID_DMAC_CMN_ID_END = 183,478HAL_SRNG_RING_ID_PMAC1_ID_START = 184,479480HAL_SRNG_RING_ID_WMAC1_SW2RXMON_BUF0 = HAL_SRNG_RING_ID_PMAC1_ID_START,481482HAL_SRNG_RING_ID_WMAC1_RXDMA2SW0,483HAL_SRNG_RING_ID_WMAC1_RXDMA2SW1,484HAL_SRNG_RING_ID_WMAC1_RXMON2SW0 = HAL_SRNG_RING_ID_WMAC1_RXDMA2SW1,485HAL_SRNG_RING_ID_WMAC1_SW2RXDMA1_DESC,486HAL_SRNG_RING_ID_RXDMA_DIR_BUF,487HAL_SRNG_RING_ID_WMAC1_SW2TXMON_BUF0,488HAL_SRNG_RING_ID_WMAC1_TXMON2SW0_BUF0,489490HAL_SRNG_RING_ID_PMAC1_ID_END,491};492493/* SRNG registers are split into two groups R0 and R2 */494#define HAL_SRNG_REG_GRP_R0 0495#define HAL_SRNG_REG_GRP_R2 1496#define HAL_SRNG_NUM_REG_GRP 2497498/* TODO: number of PMACs */499#define HAL_SRNG_NUM_PMACS 3500#define HAL_SRNG_NUM_DMAC_RINGS (HAL_SRNG_RING_ID_DMAC_CMN_ID_END - \501HAL_SRNG_RING_ID_DMAC_CMN_ID_START)502#define HAL_SRNG_RINGS_PER_PMAC (HAL_SRNG_RING_ID_PMAC1_ID_END - \503HAL_SRNG_RING_ID_PMAC1_ID_START)504#define HAL_SRNG_NUM_PMAC_RINGS (HAL_SRNG_NUM_PMACS * HAL_SRNG_RINGS_PER_PMAC)505#define HAL_SRNG_RING_ID_MAX (HAL_SRNG_RING_ID_DMAC_CMN_ID_END + \506HAL_SRNG_NUM_PMAC_RINGS)507508enum hal_ring_type {509HAL_REO_DST,510HAL_REO_EXCEPTION,511HAL_REO_REINJECT,512HAL_REO_CMD,513HAL_REO_STATUS,514HAL_TCL_DATA,515HAL_TCL_CMD,516HAL_TCL_STATUS,517HAL_CE_SRC,518HAL_CE_DST,519HAL_CE_DST_STATUS,520HAL_WBM_IDLE_LINK,521HAL_SW2WBM_RELEASE,522HAL_WBM2SW_RELEASE,523HAL_RXDMA_BUF,524HAL_RXDMA_DST,525HAL_RXDMA_MONITOR_BUF,526HAL_RXDMA_MONITOR_STATUS,527HAL_RXDMA_MONITOR_DST,528HAL_RXDMA_MONITOR_DESC,529HAL_RXDMA_DIR_BUF,530HAL_PPE2TCL,531HAL_PPE_RELEASE,532HAL_TX_MONITOR_BUF,533HAL_TX_MONITOR_DST,534HAL_MAX_RING_TYPES,535};536537#define HAL_RX_MAX_BA_WINDOW 256538539#define HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_USEC (100 * 1000)540#define HAL_DEFAULT_VO_REO_TIMEOUT_USEC (40 * 1000)541542/**543* enum hal_reo_cmd_type: Enum for REO command type544* @HAL_REO_CMD_GET_QUEUE_STATS: Get REO queue status/stats545* @HAL_REO_CMD_FLUSH_QUEUE: Flush all frames in REO queue546* @HAL_REO_CMD_FLUSH_CACHE: Flush descriptor entries in the cache547* @HAL_REO_CMD_UNBLOCK_CACHE: Unblock a descriptor's address that was blocked548* earlier with a 'REO_FLUSH_CACHE' command549* @HAL_REO_CMD_FLUSH_TIMEOUT_LIST: Flush buffers/descriptors from timeout list550* @HAL_REO_CMD_UPDATE_RX_QUEUE: Update REO queue settings551*/552enum hal_reo_cmd_type {553HAL_REO_CMD_GET_QUEUE_STATS = 0,554HAL_REO_CMD_FLUSH_QUEUE = 1,555HAL_REO_CMD_FLUSH_CACHE = 2,556HAL_REO_CMD_UNBLOCK_CACHE = 3,557HAL_REO_CMD_FLUSH_TIMEOUT_LIST = 4,558HAL_REO_CMD_UPDATE_RX_QUEUE = 5,559};560561/**562* enum hal_reo_cmd_status: Enum for execution status of REO command563* @HAL_REO_CMD_SUCCESS: Command has successfully executed564* @HAL_REO_CMD_BLOCKED: Command could not be executed as the queue565* or cache was blocked566* @HAL_REO_CMD_FAILED: Command execution failed, could be due to567* invalid queue desc568* @HAL_REO_CMD_RESOURCE_BLOCKED:569* @HAL_REO_CMD_DRAIN:570*/571enum hal_reo_cmd_status {572HAL_REO_CMD_SUCCESS = 0,573HAL_REO_CMD_BLOCKED = 1,574HAL_REO_CMD_FAILED = 2,575HAL_REO_CMD_RESOURCE_BLOCKED = 3,576HAL_REO_CMD_DRAIN = 0xff,577};578579struct hal_wbm_idle_scatter_list {580dma_addr_t paddr;581struct hal_wbm_link_desc *vaddr;582};583584struct hal_srng_params {585dma_addr_t ring_base_paddr;586u32 *ring_base_vaddr;587int num_entries;588u32 intr_batch_cntr_thres_entries;589u32 intr_timer_thres_us;590u32 flags;591u32 max_buffer_len;592u32 low_threshold;593u32 high_threshold;594dma_addr_t msi_addr;595dma_addr_t msi2_addr;596u32 msi_data;597u32 msi2_data;598599/* Add more params as needed */600};601602enum hal_srng_dir {603HAL_SRNG_DIR_SRC,604HAL_SRNG_DIR_DST605};606607/* srng flags */608#define HAL_SRNG_FLAGS_MSI_SWAP 0x00000008609#define HAL_SRNG_FLAGS_RING_PTR_SWAP 0x00000010610#define HAL_SRNG_FLAGS_DATA_TLV_SWAP 0x00000020611#define HAL_SRNG_FLAGS_LOW_THRESH_INTR_EN 0x00010000612#define HAL_SRNG_FLAGS_MSI_INTR 0x00020000613#define HAL_SRNG_FLAGS_HIGH_THRESH_INTR_EN 0x00080000614#define HAL_SRNG_FLAGS_LMAC_RING 0x80000000615616#define HAL_SRNG_TLV_HDR_TAG GENMASK(9, 1)617#define HAL_SRNG_TLV_HDR_LEN GENMASK(25, 10)618619/* Common SRNG ring structure for source and destination rings */620struct hal_srng {621/* Unique SRNG ring ID */622u8 ring_id;623624/* Ring initialization done */625u8 initialized;626627/* Interrupt/MSI value assigned to this ring */628int irq;629630/* Physical base address of the ring */631dma_addr_t ring_base_paddr;632633/* Virtual base address of the ring */634u32 *ring_base_vaddr;635636/* Number of entries in ring */637u32 num_entries;638639/* Ring size */640u32 ring_size;641642/* Ring size mask */643u32 ring_size_mask;644645/* Size of ring entry */646u32 entry_size;647648/* Interrupt timer threshold - in micro seconds */649u32 intr_timer_thres_us;650651/* Interrupt batch counter threshold - in number of ring entries */652u32 intr_batch_cntr_thres_entries;653654/* MSI Address */655dma_addr_t msi_addr;656657/* MSI data */658u32 msi_data;659660/* MSI2 Address */661dma_addr_t msi2_addr;662663/* MSI2 data */664u32 msi2_data;665666/* Misc flags */667u32 flags;668669/* Lock for serializing ring index updates */670spinlock_t lock;671672struct lock_class_key lock_key;673674/* Start offset of SRNG register groups for this ring675* TBD: See if this is required - register address can be derived676* from ring ID677*/678u32 hwreg_base[HAL_SRNG_NUM_REG_GRP];679680u64 timestamp;681682/* Source or Destination ring */683enum hal_srng_dir ring_dir;684685union {686struct {687/* SW tail pointer */688u32 tp;689690/* Shadow head pointer location to be updated by HW */691volatile u32 *hp_addr;692693/* Cached head pointer */694u32 cached_hp;695696/* Tail pointer location to be updated by SW - This697* will be a register address and need not be698* accessed through SW structure699*/700u32 *tp_addr;701702/* Current SW loop cnt */703u32 loop_cnt;704705/* max transfer size */706u16 max_buffer_length;707708/* head pointer at access end */709u32 last_hp;710} dst_ring;711712struct {713/* SW head pointer */714u32 hp;715716/* SW reap head pointer */717u32 reap_hp;718719/* Shadow tail pointer location to be updated by HW */720u32 *tp_addr;721722/* Cached tail pointer */723u32 cached_tp;724725/* Head pointer location to be updated by SW - This726* will be a register address and need not be accessed727* through SW structure728*/729u32 *hp_addr;730731/* Low threshold - in number of ring entries */732u32 low_threshold;733734/* tail pointer at access end */735u32 last_tp;736} src_ring;737} u;738};739740/* Interrupt mitigation - Batch threshold in terms of number of frames */741#define HAL_SRNG_INT_BATCH_THRESHOLD_TX 256742#define HAL_SRNG_INT_BATCH_THRESHOLD_RX 128743#define HAL_SRNG_INT_BATCH_THRESHOLD_OTHER 1744745/* Interrupt mitigation - timer threshold in us */746#define HAL_SRNG_INT_TIMER_THRESHOLD_TX 1000747#define HAL_SRNG_INT_TIMER_THRESHOLD_RX 500748#define HAL_SRNG_INT_TIMER_THRESHOLD_OTHER 256749750enum hal_srng_mac_type {751ATH12K_HAL_SRNG_UMAC,752ATH12K_HAL_SRNG_DMAC,753ATH12K_HAL_SRNG_PMAC754};755756/* HW SRNG configuration table */757struct hal_srng_config {758int start_ring_id;759u16 max_rings;760u16 entry_size;761u32 reg_start[HAL_SRNG_NUM_REG_GRP];762u16 reg_size[HAL_SRNG_NUM_REG_GRP];763enum hal_srng_mac_type mac_type;764enum hal_srng_dir ring_dir;765u32 max_size;766};767768/**769* enum hal_rx_buf_return_buf_manager770*771* @HAL_RX_BUF_RBM_WBM_IDLE_BUF_LIST: Buffer returned to WBM idle buffer list772* @HAL_RX_BUF_RBM_WBM_CHIP0_IDLE_DESC_LIST: Descriptor returned to WBM idle773* descriptor list, where the chip 0 WBM is chosen in case of a multi-chip config774* @HAL_RX_BUF_RBM_WBM_CHIP1_IDLE_DESC_LIST: Descriptor returned to WBM idle775* descriptor list, where the chip 1 WBM is chosen in case of a multi-chip config776* @HAL_RX_BUF_RBM_WBM_CHIP2_IDLE_DESC_LIST: Descriptor returned to WBM idle777* descriptor list, where the chip 2 WBM is chosen in case of a multi-chip config778* @HAL_RX_BUF_RBM_FW_BM: Buffer returned to FW779* @HAL_RX_BUF_RBM_SW0_BM: For ring 0 -- returned to host780* @HAL_RX_BUF_RBM_SW1_BM: For ring 1 -- returned to host781* @HAL_RX_BUF_RBM_SW2_BM: For ring 2 -- returned to host782* @HAL_RX_BUF_RBM_SW3_BM: For ring 3 -- returned to host783* @HAL_RX_BUF_RBM_SW4_BM: For ring 4 -- returned to host784* @HAL_RX_BUF_RBM_SW5_BM: For ring 5 -- returned to host785* @HAL_RX_BUF_RBM_SW6_BM: For ring 6 -- returned to host786*/787788enum hal_rx_buf_return_buf_manager {789HAL_RX_BUF_RBM_WBM_IDLE_BUF_LIST,790HAL_RX_BUF_RBM_WBM_CHIP0_IDLE_DESC_LIST,791HAL_RX_BUF_RBM_WBM_CHIP1_IDLE_DESC_LIST,792HAL_RX_BUF_RBM_WBM_CHIP2_IDLE_DESC_LIST,793HAL_RX_BUF_RBM_FW_BM,794HAL_RX_BUF_RBM_SW0_BM,795HAL_RX_BUF_RBM_SW1_BM,796HAL_RX_BUF_RBM_SW2_BM,797HAL_RX_BUF_RBM_SW3_BM,798HAL_RX_BUF_RBM_SW4_BM,799HAL_RX_BUF_RBM_SW5_BM,800HAL_RX_BUF_RBM_SW6_BM,801};802803#define HAL_SRNG_DESC_LOOP_CNT 0xf0000000804805#define HAL_REO_CMD_FLG_NEED_STATUS BIT(0)806#define HAL_REO_CMD_FLG_STATS_CLEAR BIT(1)807#define HAL_REO_CMD_FLG_FLUSH_BLOCK_LATER BIT(2)808#define HAL_REO_CMD_FLG_FLUSH_RELEASE_BLOCKING BIT(3)809#define HAL_REO_CMD_FLG_FLUSH_NO_INVAL BIT(4)810#define HAL_REO_CMD_FLG_FLUSH_FWD_ALL_MPDUS BIT(5)811#define HAL_REO_CMD_FLG_FLUSH_ALL BIT(6)812#define HAL_REO_CMD_FLG_UNBLK_RESOURCE BIT(7)813#define HAL_REO_CMD_FLG_UNBLK_CACHE BIT(8)814815/* Should be matching with HAL_REO_UPD_RX_QUEUE_INFO0_UPD_* fields */816#define HAL_REO_CMD_UPD0_RX_QUEUE_NUM BIT(8)817#define HAL_REO_CMD_UPD0_VLD BIT(9)818#define HAL_REO_CMD_UPD0_ALDC BIT(10)819#define HAL_REO_CMD_UPD0_DIS_DUP_DETECTION BIT(11)820#define HAL_REO_CMD_UPD0_SOFT_REORDER_EN BIT(12)821#define HAL_REO_CMD_UPD0_AC BIT(13)822#define HAL_REO_CMD_UPD0_BAR BIT(14)823#define HAL_REO_CMD_UPD0_RETRY BIT(15)824#define HAL_REO_CMD_UPD0_CHECK_2K_MODE BIT(16)825#define HAL_REO_CMD_UPD0_OOR_MODE BIT(17)826#define HAL_REO_CMD_UPD0_BA_WINDOW_SIZE BIT(18)827#define HAL_REO_CMD_UPD0_PN_CHECK BIT(19)828#define HAL_REO_CMD_UPD0_EVEN_PN BIT(20)829#define HAL_REO_CMD_UPD0_UNEVEN_PN BIT(21)830#define HAL_REO_CMD_UPD0_PN_HANDLE_ENABLE BIT(22)831#define HAL_REO_CMD_UPD0_PN_SIZE BIT(23)832#define HAL_REO_CMD_UPD0_IGNORE_AMPDU_FLG BIT(24)833#define HAL_REO_CMD_UPD0_SVLD BIT(25)834#define HAL_REO_CMD_UPD0_SSN BIT(26)835#define HAL_REO_CMD_UPD0_SEQ_2K_ERR BIT(27)836#define HAL_REO_CMD_UPD0_PN_ERR BIT(28)837#define HAL_REO_CMD_UPD0_PN_VALID BIT(29)838#define HAL_REO_CMD_UPD0_PN BIT(30)839840/* Should be matching with HAL_REO_UPD_RX_QUEUE_INFO1_* fields */841#define HAL_REO_CMD_UPD1_VLD BIT(16)842#define HAL_REO_CMD_UPD1_ALDC GENMASK(18, 17)843#define HAL_REO_CMD_UPD1_DIS_DUP_DETECTION BIT(19)844#define HAL_REO_CMD_UPD1_SOFT_REORDER_EN BIT(20)845#define HAL_REO_CMD_UPD1_AC GENMASK(22, 21)846#define HAL_REO_CMD_UPD1_BAR BIT(23)847#define HAL_REO_CMD_UPD1_RETRY BIT(24)848#define HAL_REO_CMD_UPD1_CHECK_2K_MODE BIT(25)849#define HAL_REO_CMD_UPD1_OOR_MODE BIT(26)850#define HAL_REO_CMD_UPD1_PN_CHECK BIT(27)851#define HAL_REO_CMD_UPD1_EVEN_PN BIT(28)852#define HAL_REO_CMD_UPD1_UNEVEN_PN BIT(29)853#define HAL_REO_CMD_UPD1_PN_HANDLE_ENABLE BIT(30)854#define HAL_REO_CMD_UPD1_IGNORE_AMPDU_FLG BIT(31)855856/* Should be matching with HAL_REO_UPD_RX_QUEUE_INFO2_* fields */857#define HAL_REO_CMD_UPD2_SVLD BIT(10)858#define HAL_REO_CMD_UPD2_SSN GENMASK(22, 11)859#define HAL_REO_CMD_UPD2_SEQ_2K_ERR BIT(23)860#define HAL_REO_CMD_UPD2_PN_ERR BIT(24)861862struct ath12k_hal_reo_cmd {863u32 addr_lo;864u32 flag;865u32 upd0;866u32 upd1;867u32 upd2;868u32 pn[4];869u16 rx_queue_num;870u16 min_rel;871u16 min_fwd;872u8 addr_hi;873u8 ac_list;874u8 blocking_idx;875u16 ba_window_size;876u8 pn_size;877};878879enum hal_pn_type {880HAL_PN_TYPE_NONE,881HAL_PN_TYPE_WPA,882HAL_PN_TYPE_WAPI_EVEN,883HAL_PN_TYPE_WAPI_UNEVEN,884};885886enum hal_ce_desc {887HAL_CE_DESC_SRC,888HAL_CE_DESC_DST,889HAL_CE_DESC_DST_STATUS,890};891892#define HAL_HASH_ROUTING_RING_TCL 0893#define HAL_HASH_ROUTING_RING_SW1 1894#define HAL_HASH_ROUTING_RING_SW2 2895#define HAL_HASH_ROUTING_RING_SW3 3896#define HAL_HASH_ROUTING_RING_SW4 4897#define HAL_HASH_ROUTING_RING_REL 5898#define HAL_HASH_ROUTING_RING_FW 6899900struct hal_reo_status_header {901u16 cmd_num;902enum hal_reo_cmd_status cmd_status;903u16 cmd_exe_time;904u32 timestamp;905};906907struct hal_reo_status_queue_stats {908u16 ssn;909u16 curr_idx;910u32 pn[4];911u32 last_rx_queue_ts;912u32 last_rx_dequeue_ts;913u32 rx_bitmap[8]; /* Bitmap from 0-255 */914u32 curr_mpdu_cnt;915u32 curr_msdu_cnt;916u16 fwd_due_to_bar_cnt;917u16 dup_cnt;918u32 frames_in_order_cnt;919u32 num_mpdu_processed_cnt;920u32 num_msdu_processed_cnt;921u32 total_num_processed_byte_cnt;922u32 late_rx_mpdu_cnt;923u32 reorder_hole_cnt;924u8 timeout_cnt;925u8 bar_rx_cnt;926u8 num_window_2k_jump_cnt;927};928929struct hal_reo_status_flush_queue {930bool err_detected;931};932933enum hal_reo_status_flush_cache_err_code {934HAL_REO_STATUS_FLUSH_CACHE_ERR_CODE_SUCCESS,935HAL_REO_STATUS_FLUSH_CACHE_ERR_CODE_IN_USE,936HAL_REO_STATUS_FLUSH_CACHE_ERR_CODE_NOT_FOUND,937};938939struct hal_reo_status_flush_cache {940bool err_detected;941enum hal_reo_status_flush_cache_err_code err_code;942bool cache_controller_flush_status_hit;943u8 cache_controller_flush_status_desc_type;944u8 cache_controller_flush_status_client_id;945u8 cache_controller_flush_status_err;946u8 cache_controller_flush_status_cnt;947};948949enum hal_reo_status_unblock_cache_type {950HAL_REO_STATUS_UNBLOCK_BLOCKING_RESOURCE,951HAL_REO_STATUS_UNBLOCK_ENTIRE_CACHE_USAGE,952};953954struct hal_reo_status_unblock_cache {955bool err_detected;956enum hal_reo_status_unblock_cache_type unblock_type;957};958959struct hal_reo_status_flush_timeout_list {960bool err_detected;961bool list_empty;962u16 release_desc_cnt;963u16 fwd_buf_cnt;964};965966enum hal_reo_threshold_idx {967HAL_REO_THRESHOLD_IDX_DESC_COUNTER0,968HAL_REO_THRESHOLD_IDX_DESC_COUNTER1,969HAL_REO_THRESHOLD_IDX_DESC_COUNTER2,970HAL_REO_THRESHOLD_IDX_DESC_COUNTER_SUM,971};972973struct hal_reo_status_desc_thresh_reached {974enum hal_reo_threshold_idx threshold_idx;975u32 link_desc_counter0;976u32 link_desc_counter1;977u32 link_desc_counter2;978u32 link_desc_counter_sum;979};980981struct hal_reo_status {982struct hal_reo_status_header uniform_hdr;983u8 loop_cnt;984union {985struct hal_reo_status_queue_stats queue_stats;986struct hal_reo_status_flush_queue flush_queue;987struct hal_reo_status_flush_cache flush_cache;988struct hal_reo_status_unblock_cache unblock_cache;989struct hal_reo_status_flush_timeout_list timeout_list;990struct hal_reo_status_desc_thresh_reached desc_thresh_reached;991} u;992};993994/* HAL context to be used to access SRNG APIs (currently used by data path995* and transport (CE) modules)996*/997struct ath12k_hal {998/* HAL internal state for all SRNG rings.999*/1000struct hal_srng srng_list[HAL_SRNG_RING_ID_MAX];10011002/* SRNG configuration table */1003struct hal_srng_config *srng_config;10041005/* Remote pointer memory for HW/FW updates */1006struct {1007u32 *vaddr;1008dma_addr_t paddr;1009} rdp;10101011/* Shared memory for ring pointer updates from host to FW */1012struct {1013u32 *vaddr;1014dma_addr_t paddr;1015} wrp;10161017/* Available REO blocking resources bitmap */1018u8 avail_blk_resource;10191020u8 current_blk_index;10211022/* shadow register configuration */1023u32 shadow_reg_addr[HAL_SHADOW_NUM_REGS];1024int num_shadow_reg_configured;1025};10261027/* Maps WBM ring number and Return Buffer Manager Id per TCL ring */1028struct ath12k_hal_tcl_to_wbm_rbm_map {1029u8 wbm_ring_num;1030u8 rbm_id;1031};10321033struct hal_ops {1034bool (*rx_desc_get_first_msdu)(struct hal_rx_desc *desc);1035bool (*rx_desc_get_last_msdu)(struct hal_rx_desc *desc);1036u8 (*rx_desc_get_l3_pad_bytes)(struct hal_rx_desc *desc);1037u8 *(*rx_desc_get_hdr_status)(struct hal_rx_desc *desc);1038bool (*rx_desc_encrypt_valid)(struct hal_rx_desc *desc);1039u32 (*rx_desc_get_encrypt_type)(struct hal_rx_desc *desc);1040u8 (*rx_desc_get_decap_type)(struct hal_rx_desc *desc);1041u8 (*rx_desc_get_mesh_ctl)(struct hal_rx_desc *desc);1042bool (*rx_desc_get_mpdu_seq_ctl_vld)(struct hal_rx_desc *desc);1043bool (*rx_desc_get_mpdu_fc_valid)(struct hal_rx_desc *desc);1044u16 (*rx_desc_get_mpdu_start_seq_no)(struct hal_rx_desc *desc);1045u16 (*rx_desc_get_msdu_len)(struct hal_rx_desc *desc);1046u8 (*rx_desc_get_msdu_sgi)(struct hal_rx_desc *desc);1047u8 (*rx_desc_get_msdu_rate_mcs)(struct hal_rx_desc *desc);1048u8 (*rx_desc_get_msdu_rx_bw)(struct hal_rx_desc *desc);1049u32 (*rx_desc_get_msdu_freq)(struct hal_rx_desc *desc);1050u8 (*rx_desc_get_msdu_pkt_type)(struct hal_rx_desc *desc);1051u8 (*rx_desc_get_msdu_nss)(struct hal_rx_desc *desc);1052u8 (*rx_desc_get_mpdu_tid)(struct hal_rx_desc *desc);1053u16 (*rx_desc_get_mpdu_peer_id)(struct hal_rx_desc *desc);1054void (*rx_desc_copy_end_tlv)(struct hal_rx_desc *fdesc,1055struct hal_rx_desc *ldesc);1056u32 (*rx_desc_get_mpdu_start_tag)(struct hal_rx_desc *desc);1057u32 (*rx_desc_get_mpdu_ppdu_id)(struct hal_rx_desc *desc);1058void (*rx_desc_set_msdu_len)(struct hal_rx_desc *desc, u16 len);1059struct rx_attention *(*rx_desc_get_attention)(struct hal_rx_desc *desc);1060u8 *(*rx_desc_get_msdu_payload)(struct hal_rx_desc *desc);1061u32 (*rx_desc_get_mpdu_start_offset)(void);1062u32 (*rx_desc_get_msdu_end_offset)(void);1063bool (*rx_desc_mac_addr2_valid)(struct hal_rx_desc *desc);1064u8* (*rx_desc_mpdu_start_addr2)(struct hal_rx_desc *desc);1065bool (*rx_desc_is_da_mcbc)(struct hal_rx_desc *desc);1066void (*rx_desc_get_dot11_hdr)(struct hal_rx_desc *desc,1067struct ieee80211_hdr *hdr);1068u16 (*rx_desc_get_mpdu_frame_ctl)(struct hal_rx_desc *desc);1069void (*rx_desc_get_crypto_header)(struct hal_rx_desc *desc,1070u8 *crypto_hdr,1071enum hal_encrypt_type enctype);1072int (*create_srng_config)(struct ath12k_base *ab);1073bool (*dp_rx_h_msdu_done)(struct hal_rx_desc *desc);1074bool (*dp_rx_h_l4_cksum_fail)(struct hal_rx_desc *desc);1075bool (*dp_rx_h_ip_cksum_fail)(struct hal_rx_desc *desc);1076bool (*dp_rx_h_is_decrypted)(struct hal_rx_desc *desc);1077u32 (*dp_rx_h_mpdu_err)(struct hal_rx_desc *desc);1078const struct ath12k_hal_tcl_to_wbm_rbm_map *tcl_to_wbm_rbm_map;1079};10801081extern const struct hal_ops hal_qcn9274_ops;1082extern const struct hal_ops hal_wcn7850_ops;10831084u32 ath12k_hal_reo_qdesc_size(u32 ba_window_size, u8 tid);1085void ath12k_hal_reo_qdesc_setup(struct hal_rx_reo_queue *qdesc,1086int tid, u32 ba_window_size,1087u32 start_seq, enum hal_pn_type type);1088void ath12k_hal_reo_init_cmd_ring(struct ath12k_base *ab,1089struct hal_srng *srng);1090void ath12k_hal_reo_hw_setup(struct ath12k_base *ab, u32 ring_hash_map);1091void ath12k_hal_setup_link_idle_list(struct ath12k_base *ab,1092struct hal_wbm_idle_scatter_list *sbuf,1093u32 nsbufs, u32 tot_link_desc,1094u32 end_offset);10951096dma_addr_t ath12k_hal_srng_get_tp_addr(struct ath12k_base *ab,1097struct hal_srng *srng);1098dma_addr_t ath12k_hal_srng_get_hp_addr(struct ath12k_base *ab,1099struct hal_srng *srng);1100void ath12k_hal_set_link_desc_addr(struct hal_wbm_link_desc *desc, u32 cookie,1101dma_addr_t paddr);1102u32 ath12k_hal_ce_get_desc_size(enum hal_ce_desc type);1103void ath12k_hal_ce_src_set_desc(struct hal_ce_srng_src_desc *desc, dma_addr_t paddr,1104u32 len, u32 id, u8 byte_swap_data);1105void ath12k_hal_ce_dst_set_desc(struct hal_ce_srng_dest_desc *desc, dma_addr_t paddr);1106u32 ath12k_hal_ce_dst_status_get_length(struct hal_ce_srng_dst_status_desc *desc);1107int ath12k_hal_srng_get_entrysize(struct ath12k_base *ab, u32 ring_type);1108int ath12k_hal_srng_get_max_entries(struct ath12k_base *ab, u32 ring_type);1109void ath12k_hal_srng_get_params(struct ath12k_base *ab, struct hal_srng *srng,1110struct hal_srng_params *params);1111void *ath12k_hal_srng_dst_get_next_entry(struct ath12k_base *ab,1112struct hal_srng *srng);1113void *ath12k_hal_srng_dst_peek(struct ath12k_base *ab, struct hal_srng *srng);1114int ath12k_hal_srng_dst_num_free(struct ath12k_base *ab, struct hal_srng *srng,1115bool sync_hw_ptr);1116void *ath12k_hal_srng_src_get_next_reaped(struct ath12k_base *ab,1117struct hal_srng *srng);1118void *ath12k_hal_srng_src_reap_next(struct ath12k_base *ab,1119struct hal_srng *srng);1120void *ath12k_hal_srng_src_get_next_entry(struct ath12k_base *ab,1121struct hal_srng *srng);1122int ath12k_hal_srng_src_num_free(struct ath12k_base *ab, struct hal_srng *srng,1123bool sync_hw_ptr);1124void ath12k_hal_srng_access_begin(struct ath12k_base *ab,1125struct hal_srng *srng);1126void ath12k_hal_srng_access_end(struct ath12k_base *ab, struct hal_srng *srng);1127int ath12k_hal_srng_setup(struct ath12k_base *ab, enum hal_ring_type type,1128int ring_num, int mac_id,1129struct hal_srng_params *params);1130int ath12k_hal_srng_init(struct ath12k_base *ath12k);1131void ath12k_hal_srng_deinit(struct ath12k_base *ath12k);1132void ath12k_hal_dump_srng_stats(struct ath12k_base *ab);1133void ath12k_hal_srng_get_shadow_config(struct ath12k_base *ab,1134u32 **cfg, u32 *len);1135int ath12k_hal_srng_update_shadow_config(struct ath12k_base *ab,1136enum hal_ring_type ring_type,1137int ring_num);1138void ath12k_hal_srng_shadow_config(struct ath12k_base *ab);1139void ath12k_hal_srng_shadow_update_hp_tp(struct ath12k_base *ab,1140struct hal_srng *srng);1141#endif114211431144