162306a36Sopenharmony_ci/* SPDX-License-Identifier: BSD-3-Clause-Clear */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 462306a36Sopenharmony_ci * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef ATH12K_HW_H 862306a36Sopenharmony_ci#define ATH12K_HW_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/mhi.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include "wmi.h" 1362306a36Sopenharmony_ci#include "hal.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* Target configuration defines */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* Num VDEVS per radio */ 1862306a36Sopenharmony_ci#define TARGET_NUM_VDEVS (16 + 1) 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define TARGET_NUM_PEERS_PDEV (512 + TARGET_NUM_VDEVS) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* Num of peers for Single Radio mode */ 2362306a36Sopenharmony_ci#define TARGET_NUM_PEERS_SINGLE (TARGET_NUM_PEERS_PDEV) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* Num of peers for DBS */ 2662306a36Sopenharmony_ci#define TARGET_NUM_PEERS_DBS (2 * TARGET_NUM_PEERS_PDEV) 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* Num of peers for DBS_SBS */ 2962306a36Sopenharmony_ci#define TARGET_NUM_PEERS_DBS_SBS (3 * TARGET_NUM_PEERS_PDEV) 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* Max num of stations (per radio) */ 3262306a36Sopenharmony_ci#define TARGET_NUM_STATIONS 512 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define TARGET_NUM_PEERS(x) TARGET_NUM_PEERS_##x 3562306a36Sopenharmony_ci#define TARGET_NUM_PEER_KEYS 2 3662306a36Sopenharmony_ci#define TARGET_NUM_TIDS(x) (2 * TARGET_NUM_PEERS(x) + \ 3762306a36Sopenharmony_ci 4 * TARGET_NUM_VDEVS + 8) 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#define TARGET_AST_SKID_LIMIT 16 4062306a36Sopenharmony_ci#define TARGET_NUM_OFFLD_PEERS 4 4162306a36Sopenharmony_ci#define TARGET_NUM_OFFLD_REORDER_BUFFS 4 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define TARGET_TX_CHAIN_MASK (BIT(0) | BIT(1) | BIT(2) | BIT(4)) 4462306a36Sopenharmony_ci#define TARGET_RX_CHAIN_MASK (BIT(0) | BIT(1) | BIT(2) | BIT(4)) 4562306a36Sopenharmony_ci#define TARGET_RX_TIMEOUT_LO_PRI 100 4662306a36Sopenharmony_ci#define TARGET_RX_TIMEOUT_HI_PRI 40 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#define TARGET_DECAP_MODE_RAW 0 4962306a36Sopenharmony_ci#define TARGET_DECAP_MODE_NATIVE_WIFI 1 5062306a36Sopenharmony_ci#define TARGET_DECAP_MODE_ETH 2 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci#define TARGET_SCAN_MAX_PENDING_REQS 4 5362306a36Sopenharmony_ci#define TARGET_BMISS_OFFLOAD_MAX_VDEV 3 5462306a36Sopenharmony_ci#define TARGET_ROAM_OFFLOAD_MAX_VDEV 3 5562306a36Sopenharmony_ci#define TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES 8 5662306a36Sopenharmony_ci#define TARGET_GTK_OFFLOAD_MAX_VDEV 3 5762306a36Sopenharmony_ci#define TARGET_NUM_MCAST_GROUPS 12 5862306a36Sopenharmony_ci#define TARGET_NUM_MCAST_TABLE_ELEMS 64 5962306a36Sopenharmony_ci#define TARGET_MCAST2UCAST_MODE 2 6062306a36Sopenharmony_ci#define TARGET_TX_DBG_LOG_SIZE 1024 6162306a36Sopenharmony_ci#define TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK 1 6262306a36Sopenharmony_ci#define TARGET_VOW_CONFIG 0 6362306a36Sopenharmony_ci#define TARGET_NUM_MSDU_DESC (2500) 6462306a36Sopenharmony_ci#define TARGET_MAX_FRAG_ENTRIES 6 6562306a36Sopenharmony_ci#define TARGET_MAX_BCN_OFFLD 16 6662306a36Sopenharmony_ci#define TARGET_NUM_WDS_ENTRIES 32 6762306a36Sopenharmony_ci#define TARGET_DMA_BURST_SIZE 1 6862306a36Sopenharmony_ci#define TARGET_RX_BATCHMODE 1 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci#define ATH12K_HW_MAX_QUEUES 4 7162306a36Sopenharmony_ci#define ATH12K_QUEUE_LEN 4096 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#define ATH12K_HW_RATECODE_CCK_SHORT_PREAM_MASK 0x4 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci#define ATH12K_FW_DIR "ath12k" 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#define ATH12K_BOARD_MAGIC "QCA-ATH12K-BOARD" 7862306a36Sopenharmony_ci#define ATH12K_BOARD_API2_FILE "board-2.bin" 7962306a36Sopenharmony_ci#define ATH12K_DEFAULT_BOARD_FILE "board.bin" 8062306a36Sopenharmony_ci#define ATH12K_DEFAULT_CAL_FILE "caldata.bin" 8162306a36Sopenharmony_ci#define ATH12K_AMSS_FILE "amss.bin" 8262306a36Sopenharmony_ci#define ATH12K_M3_FILE "m3.bin" 8362306a36Sopenharmony_ci#define ATH12K_REGDB_FILE_NAME "regdb.bin" 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cienum ath12k_hw_rate_cck { 8662306a36Sopenharmony_ci ATH12K_HW_RATE_CCK_LP_11M = 0, 8762306a36Sopenharmony_ci ATH12K_HW_RATE_CCK_LP_5_5M, 8862306a36Sopenharmony_ci ATH12K_HW_RATE_CCK_LP_2M, 8962306a36Sopenharmony_ci ATH12K_HW_RATE_CCK_LP_1M, 9062306a36Sopenharmony_ci ATH12K_HW_RATE_CCK_SP_11M, 9162306a36Sopenharmony_ci ATH12K_HW_RATE_CCK_SP_5_5M, 9262306a36Sopenharmony_ci ATH12K_HW_RATE_CCK_SP_2M, 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cienum ath12k_hw_rate_ofdm { 9662306a36Sopenharmony_ci ATH12K_HW_RATE_OFDM_48M = 0, 9762306a36Sopenharmony_ci ATH12K_HW_RATE_OFDM_24M, 9862306a36Sopenharmony_ci ATH12K_HW_RATE_OFDM_12M, 9962306a36Sopenharmony_ci ATH12K_HW_RATE_OFDM_6M, 10062306a36Sopenharmony_ci ATH12K_HW_RATE_OFDM_54M, 10162306a36Sopenharmony_ci ATH12K_HW_RATE_OFDM_36M, 10262306a36Sopenharmony_ci ATH12K_HW_RATE_OFDM_18M, 10362306a36Sopenharmony_ci ATH12K_HW_RATE_OFDM_9M, 10462306a36Sopenharmony_ci}; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cienum ath12k_bus { 10762306a36Sopenharmony_ci ATH12K_BUS_PCI, 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define ATH12K_EXT_IRQ_GRP_NUM_MAX 11 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_cistruct hal_rx_desc; 11362306a36Sopenharmony_cistruct hal_tcl_data_cmd; 11462306a36Sopenharmony_cistruct htt_rx_ring_tlv_filter; 11562306a36Sopenharmony_cienum hal_encrypt_type; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_cistruct ath12k_hw_ring_mask { 11862306a36Sopenharmony_ci u8 tx[ATH12K_EXT_IRQ_GRP_NUM_MAX]; 11962306a36Sopenharmony_ci u8 rx_mon_dest[ATH12K_EXT_IRQ_GRP_NUM_MAX]; 12062306a36Sopenharmony_ci u8 rx[ATH12K_EXT_IRQ_GRP_NUM_MAX]; 12162306a36Sopenharmony_ci u8 rx_err[ATH12K_EXT_IRQ_GRP_NUM_MAX]; 12262306a36Sopenharmony_ci u8 rx_wbm_rel[ATH12K_EXT_IRQ_GRP_NUM_MAX]; 12362306a36Sopenharmony_ci u8 reo_status[ATH12K_EXT_IRQ_GRP_NUM_MAX]; 12462306a36Sopenharmony_ci u8 host2rxdma[ATH12K_EXT_IRQ_GRP_NUM_MAX]; 12562306a36Sopenharmony_ci u8 tx_mon_dest[ATH12K_EXT_IRQ_GRP_NUM_MAX]; 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistruct ath12k_hw_hal_params { 12962306a36Sopenharmony_ci enum hal_rx_buf_return_buf_manager rx_buf_rbm; 13062306a36Sopenharmony_ci u32 wbm2sw_cc_enable; 13162306a36Sopenharmony_ci}; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistruct ath12k_hw_params { 13462306a36Sopenharmony_ci const char *name; 13562306a36Sopenharmony_ci u16 hw_rev; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci struct { 13862306a36Sopenharmony_ci const char *dir; 13962306a36Sopenharmony_ci size_t board_size; 14062306a36Sopenharmony_ci size_t cal_offset; 14162306a36Sopenharmony_ci } fw; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci u8 max_radios; 14462306a36Sopenharmony_ci bool single_pdev_only:1; 14562306a36Sopenharmony_ci u32 qmi_service_ins_id; 14662306a36Sopenharmony_ci bool internal_sleep_clock:1; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci const struct ath12k_hw_ops *hw_ops; 14962306a36Sopenharmony_ci const struct ath12k_hw_ring_mask *ring_mask; 15062306a36Sopenharmony_ci const struct ath12k_hw_regs *regs; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci const struct ce_attr *host_ce_config; 15362306a36Sopenharmony_ci u32 ce_count; 15462306a36Sopenharmony_ci const struct ce_pipe_config *target_ce_config; 15562306a36Sopenharmony_ci u32 target_ce_count; 15662306a36Sopenharmony_ci const struct service_to_pipe *svc_to_ce_map; 15762306a36Sopenharmony_ci u32 svc_to_ce_map_len; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci const struct ath12k_hw_hal_params *hal_params; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci bool rxdma1_enable:1; 16262306a36Sopenharmony_ci int num_rxmda_per_pdev; 16362306a36Sopenharmony_ci int num_rxdma_dst_ring; 16462306a36Sopenharmony_ci bool rx_mac_buf_ring:1; 16562306a36Sopenharmony_ci bool vdev_start_delay:1; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci u16 interface_modes; 16862306a36Sopenharmony_ci bool supports_monitor:1; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci bool idle_ps:1; 17162306a36Sopenharmony_ci bool download_calib:1; 17262306a36Sopenharmony_ci bool supports_suspend:1; 17362306a36Sopenharmony_ci bool tcl_ring_retry:1; 17462306a36Sopenharmony_ci bool reoq_lut_support:1; 17562306a36Sopenharmony_ci bool supports_shadow_regs:1; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci u32 hal_desc_sz; 17862306a36Sopenharmony_ci u32 num_tcl_banks; 17962306a36Sopenharmony_ci u32 max_tx_ring; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci const struct mhi_controller_config *mhi_config; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci void (*wmi_init)(struct ath12k_base *ab, 18462306a36Sopenharmony_ci struct ath12k_wmi_resource_config_arg *config); 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci const struct hal_ops *hal_ops; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci u64 qmi_cnss_feature_bitmap; 18962306a36Sopenharmony_ci}; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_cistruct ath12k_hw_ops { 19262306a36Sopenharmony_ci u8 (*get_hw_mac_from_pdev_id)(int pdev_id); 19362306a36Sopenharmony_ci int (*mac_id_to_pdev_id)(const struct ath12k_hw_params *hw, int mac_id); 19462306a36Sopenharmony_ci int (*mac_id_to_srng_id)(const struct ath12k_hw_params *hw, int mac_id); 19562306a36Sopenharmony_ci int (*rxdma_ring_sel_config)(struct ath12k_base *ab); 19662306a36Sopenharmony_ci u8 (*get_ring_selector)(struct sk_buff *skb); 19762306a36Sopenharmony_ci bool (*dp_srng_is_tx_comp_ring)(int ring_num); 19862306a36Sopenharmony_ci}; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cistatic inline 20162306a36Sopenharmony_ciint ath12k_hw_get_mac_from_pdev_id(const struct ath12k_hw_params *hw, 20262306a36Sopenharmony_ci int pdev_idx) 20362306a36Sopenharmony_ci{ 20462306a36Sopenharmony_ci if (hw->hw_ops->get_hw_mac_from_pdev_id) 20562306a36Sopenharmony_ci return hw->hw_ops->get_hw_mac_from_pdev_id(pdev_idx); 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci return 0; 20862306a36Sopenharmony_ci} 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistatic inline int ath12k_hw_mac_id_to_pdev_id(const struct ath12k_hw_params *hw, 21162306a36Sopenharmony_ci int mac_id) 21262306a36Sopenharmony_ci{ 21362306a36Sopenharmony_ci if (hw->hw_ops->mac_id_to_pdev_id) 21462306a36Sopenharmony_ci return hw->hw_ops->mac_id_to_pdev_id(hw, mac_id); 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci return 0; 21762306a36Sopenharmony_ci} 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_cistatic inline int ath12k_hw_mac_id_to_srng_id(const struct ath12k_hw_params *hw, 22062306a36Sopenharmony_ci int mac_id) 22162306a36Sopenharmony_ci{ 22262306a36Sopenharmony_ci if (hw->hw_ops->mac_id_to_srng_id) 22362306a36Sopenharmony_ci return hw->hw_ops->mac_id_to_srng_id(hw, mac_id); 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci return 0; 22662306a36Sopenharmony_ci} 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistruct ath12k_fw_ie { 22962306a36Sopenharmony_ci __le32 id; 23062306a36Sopenharmony_ci __le32 len; 23162306a36Sopenharmony_ci u8 data[]; 23262306a36Sopenharmony_ci}; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_cienum ath12k_bd_ie_board_type { 23562306a36Sopenharmony_ci ATH12K_BD_IE_BOARD_NAME = 0, 23662306a36Sopenharmony_ci ATH12K_BD_IE_BOARD_DATA = 1, 23762306a36Sopenharmony_ci}; 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_cienum ath12k_bd_ie_type { 24062306a36Sopenharmony_ci /* contains sub IEs of enum ath12k_bd_ie_board_type */ 24162306a36Sopenharmony_ci ATH12K_BD_IE_BOARD = 0, 24262306a36Sopenharmony_ci ATH12K_BD_IE_BOARD_EXT = 1, 24362306a36Sopenharmony_ci}; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_cistruct ath12k_hw_regs { 24662306a36Sopenharmony_ci u32 hal_tcl1_ring_id; 24762306a36Sopenharmony_ci u32 hal_tcl1_ring_misc; 24862306a36Sopenharmony_ci u32 hal_tcl1_ring_tp_addr_lsb; 24962306a36Sopenharmony_ci u32 hal_tcl1_ring_tp_addr_msb; 25062306a36Sopenharmony_ci u32 hal_tcl1_ring_consumer_int_setup_ix0; 25162306a36Sopenharmony_ci u32 hal_tcl1_ring_consumer_int_setup_ix1; 25262306a36Sopenharmony_ci u32 hal_tcl1_ring_msi1_base_lsb; 25362306a36Sopenharmony_ci u32 hal_tcl1_ring_msi1_base_msb; 25462306a36Sopenharmony_ci u32 hal_tcl1_ring_msi1_data; 25562306a36Sopenharmony_ci u32 hal_tcl_ring_base_lsb; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci u32 hal_tcl_status_ring_base_lsb; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci u32 hal_wbm_idle_ring_base_lsb; 26062306a36Sopenharmony_ci u32 hal_wbm_idle_ring_misc_addr; 26162306a36Sopenharmony_ci u32 hal_wbm_r0_idle_list_cntl_addr; 26262306a36Sopenharmony_ci u32 hal_wbm_r0_idle_list_size_addr; 26362306a36Sopenharmony_ci u32 hal_wbm_scattered_ring_base_lsb; 26462306a36Sopenharmony_ci u32 hal_wbm_scattered_ring_base_msb; 26562306a36Sopenharmony_ci u32 hal_wbm_scattered_desc_head_info_ix0; 26662306a36Sopenharmony_ci u32 hal_wbm_scattered_desc_head_info_ix1; 26762306a36Sopenharmony_ci u32 hal_wbm_scattered_desc_tail_info_ix0; 26862306a36Sopenharmony_ci u32 hal_wbm_scattered_desc_tail_info_ix1; 26962306a36Sopenharmony_ci u32 hal_wbm_scattered_desc_ptr_hp_addr; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci u32 hal_wbm_sw_release_ring_base_lsb; 27262306a36Sopenharmony_ci u32 hal_wbm_sw1_release_ring_base_lsb; 27362306a36Sopenharmony_ci u32 hal_wbm0_release_ring_base_lsb; 27462306a36Sopenharmony_ci u32 hal_wbm1_release_ring_base_lsb; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci u32 pcie_qserdes_sysclk_en_sel; 27762306a36Sopenharmony_ci u32 pcie_pcs_osc_dtct_config_base; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci u32 hal_ppe_rel_ring_base; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci u32 hal_reo2_ring_base; 28262306a36Sopenharmony_ci u32 hal_reo1_misc_ctrl_addr; 28362306a36Sopenharmony_ci u32 hal_reo1_sw_cookie_cfg0; 28462306a36Sopenharmony_ci u32 hal_reo1_sw_cookie_cfg1; 28562306a36Sopenharmony_ci u32 hal_reo1_qdesc_lut_base0; 28662306a36Sopenharmony_ci u32 hal_reo1_qdesc_lut_base1; 28762306a36Sopenharmony_ci u32 hal_reo1_ring_base_lsb; 28862306a36Sopenharmony_ci u32 hal_reo1_ring_base_msb; 28962306a36Sopenharmony_ci u32 hal_reo1_ring_id; 29062306a36Sopenharmony_ci u32 hal_reo1_ring_misc; 29162306a36Sopenharmony_ci u32 hal_reo1_ring_hp_addr_lsb; 29262306a36Sopenharmony_ci u32 hal_reo1_ring_hp_addr_msb; 29362306a36Sopenharmony_ci u32 hal_reo1_ring_producer_int_setup; 29462306a36Sopenharmony_ci u32 hal_reo1_ring_msi1_base_lsb; 29562306a36Sopenharmony_ci u32 hal_reo1_ring_msi1_base_msb; 29662306a36Sopenharmony_ci u32 hal_reo1_ring_msi1_data; 29762306a36Sopenharmony_ci u32 hal_reo1_aging_thres_ix0; 29862306a36Sopenharmony_ci u32 hal_reo1_aging_thres_ix1; 29962306a36Sopenharmony_ci u32 hal_reo1_aging_thres_ix2; 30062306a36Sopenharmony_ci u32 hal_reo1_aging_thres_ix3; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci u32 hal_reo2_sw0_ring_base; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci u32 hal_sw2reo_ring_base; 30562306a36Sopenharmony_ci u32 hal_sw2reo1_ring_base; 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci u32 hal_reo_cmd_ring_base; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci u32 hal_reo_status_ring_base; 31062306a36Sopenharmony_ci}; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ciint ath12k_hw_init(struct ath12k_base *ab); 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci#endif 315