From a42ab6f94e7d8e9322bc1eceba47220f72acf2a6 Mon Sep 17 00:00:00 2001 From: Rakesh Pillai Date: Tue, 16 Feb 2021 23:42:54 -0800 Subject: [PATCH] qcacmn: Add IPA api changes Add changes in IPA APIs due to hal API modifications for WCN7850. Change-Id: I13e3acc154cb22538eca0adcd312cb7f9bc1124c CRs-Fixed: 2888556 --- dp/wifi3.0/dp_ipa.c | 144 ++++++++++++++++++++++++++------------------ 1 file changed, 86 insertions(+), 58 deletions(-) diff --git a/dp/wifi3.0/dp_ipa.c b/dp/wifi3.0/dp_ipa.c index 329d7b1476..cac0bae320 100644 --- a/dp/wifi3.0/dp_ipa.c +++ b/dp/wifi3.0/dp_ipa.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -406,8 +407,7 @@ static int dp_ipa_tx_alt_pool_attach(struct dp_soc *soc) struct hal_srng *wbm_srng = (struct hal_srng *) soc->tx_comp_ring[IPA_TX_ALT_COMP_RING_IDX].hal_srng; struct hal_srng_params srng_params; - uint32_t paddr_lo; - uint32_t paddr_hi; + uint32_t wbm_sw0_bm_id = soc->wbm_sw0_bm_id; void *ring_entry; int num_entries; qdf_nbuf_t nbuf; @@ -478,11 +478,9 @@ static int dp_ipa_tx_alt_pool_attach(struct dp_soc *soc) qdf_mem_dp_tx_skb_cnt_inc(); qdf_mem_dp_tx_skb_inc(qdf_nbuf_get_end_offset(nbuf)); - paddr_lo = ((uint64_t)buffer_paddr & 0x00000000ffffffff); - paddr_hi = ((uint64_t)buffer_paddr & 0x0000001f00000000) >> 32; - HAL_RXDMA_PADDR_LO_SET(ring_entry, paddr_lo); - HAL_RXDMA_PADDR_HI_SET(ring_entry, paddr_hi); - HAL_RXDMA_MANAGER_SET(ring_entry, HAL_WBM_SW4_BM_ID); + hal_rxdma_buff_addr_info_set(soc->hal_soc, ring_entry, + buffer_paddr, 0, + HAL_WBM_SW4_BM_ID(wbm_sw0_bm_id)); soc->ipa_uc_tx_rsc_alt.tx_buf_pool_vaddr_unaligned[ tx_buffer_count] = (void *)nbuf; @@ -763,7 +761,8 @@ static void dp_ipa_wdi_tx_alt_pipe_params(struct dp_soc *soc, HAL_TX_DESC_SET_TLV_HDR(desc_addr, HAL_TX_TCL_DATA_TAG, desc_size); tcl_desc_ptr = (struct tcl_data_cmd *) (QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(tx) + 1); - tcl_desc_ptr->buf_addr_info.return_buffer_manager = HAL_WBM_SW4_BM_ID; + tcl_desc_ptr->buf_addr_info.return_buffer_manager = + HAL_WBM_SW4_BM_ID(soc->wbm_sw0_bm_id); tcl_desc_ptr->addrx_en = 1; /* Address X search enable in ASE */ tcl_desc_ptr->addry_en = 1; /* Address X search enable in ASE */ tcl_desc_ptr->encap_type = HAL_TX_ENCAP_TYPE_ETHERNET; @@ -814,7 +813,8 @@ dp_ipa_wdi_tx_alt_pipe_smmu_params(struct dp_soc *soc, HAL_TX_DESC_SET_TLV_HDR(desc_addr, HAL_TX_TCL_DATA_TAG, desc_size); tcl_desc_ptr = (struct tcl_data_cmd *) (QDF_IPA_WDI_SETUP_INFO_SMMU_DESC_FORMAT_TEMPLATE(tx_smmu) + 1); - tcl_desc_ptr->buf_addr_info.return_buffer_manager = HAL_WBM_SW4_BM_ID; + tcl_desc_ptr->buf_addr_info.return_buffer_manager = + HAL_WBM_SW4_BM_ID(soc->wbm_sw0_bm_id); tcl_desc_ptr->addrx_en = 1; /* Address X search enable in ASE */ tcl_desc_ptr->addry_en = 1; /* Address Y search enable in ASE */ tcl_desc_ptr->encap_type = HAL_TX_ENCAP_TYPE_ETHERNET; @@ -1192,8 +1192,6 @@ static int dp_tx_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev) struct hal_srng *wbm_srng = (struct hal_srng *) soc->tx_comp_ring[IPA_TX_COMP_RING_IDX].hal_srng; struct hal_srng_params srng_params; - uint32_t paddr_lo; - uint32_t paddr_hi; void *ring_entry; int num_entries; qdf_nbuf_t nbuf; @@ -1262,12 +1260,14 @@ static int dp_tx_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev) qdf_mem_dp_tx_skb_cnt_inc(); qdf_mem_dp_tx_skb_inc(qdf_nbuf_get_end_offset(nbuf)); - paddr_lo = ((uint64_t)buffer_paddr & 0x00000000ffffffff); - paddr_hi = ((uint64_t)buffer_paddr & 0x0000001f00000000) >> 32; - HAL_RXDMA_PADDR_LO_SET(ring_entry, paddr_lo); - HAL_RXDMA_PADDR_HI_SET(ring_entry, paddr_hi); - HAL_RXDMA_MANAGER_SET(ring_entry, (IPA_TCL_DATA_RING_IDX + - HAL_WBM_SW0_BM_ID)); + /* + * TODO - WCN7850 code can directly call the be handler + * instead of hal soc ops. + */ + hal_rxdma_buff_addr_info_set(soc->hal_soc, ring_entry, + buffer_paddr, 0, + (IPA_TCL_DATA_RING_IDX + + soc->wbm_sw0_bm_id)); soc->ipa_uc_tx_rsc.tx_buf_pool_vaddr_unaligned[tx_buffer_count] = (void *)nbuf; @@ -1361,6 +1361,7 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc, qdf_dma_addr_t hp_addr; unsigned long addr_offset, dev_base_paddr; uint32_t ix0; + uint8_t ix0_map[8]; if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) return QDF_STATUS_SUCCESS; @@ -1485,14 +1486,17 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc, * Set DEST_RING_MAPPING_4 to SW2 as default value for * DESTINATION_RING_CTRL_IX_0. */ - ix0 = HAL_REO_REMAP_IX0(REO_REMAP_TCL, 0) | - HAL_REO_REMAP_IX0(REO_REMAP_SW1, 1) | - HAL_REO_REMAP_IX0(REO_REMAP_SW2, 2) | - HAL_REO_REMAP_IX0(REO_REMAP_SW3, 3) | - HAL_REO_REMAP_IX0(REO_REMAP_SW2, 4) | - HAL_REO_REMAP_IX0(REO_REMAP_RELEASE, 5) | - HAL_REO_REMAP_IX0(REO_REMAP_FW, 6) | - HAL_REO_REMAP_IX0(REO_REMAP_FW, 7); + ix0_map[0] = REO_REMAP_TCL; + ix0_map[1] = REO_REMAP_SW1; + ix0_map[2] = REO_REMAP_SW2; + ix0_map[3] = REO_REMAP_SW3; + ix0_map[4] = REO_REMAP_SW2; + ix0_map[5] = REO_REMAP_RELEASE; + ix0_map[6] = REO_REMAP_FW; + ix0_map[7] = REO_REMAP_FW; + + ix0 = hal_gen_reo_remap_val(soc->hal_soc, HAL_REO_REMAP_REG_IX0, + ix0_map); hal_reo_read_write_ctrl_ix(soc->hal_soc, false, &ix0, NULL, NULL, NULL); @@ -1696,6 +1700,7 @@ QDF_STATUS dp_ipa_enable_autonomy(struct cdp_soc_t *soc_hdl, uint8_t pdev_id) dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); uint32_t ix0; uint32_t ix2; + uint8_t ix_map[8]; if (!pdev) { dp_err("Invalid instance"); @@ -1709,24 +1714,30 @@ QDF_STATUS dp_ipa_enable_autonomy(struct cdp_soc_t *soc_hdl, uint8_t pdev_id) return QDF_STATUS_E_AGAIN; /* Call HAL API to remap REO rings to REO2IPA ring */ - ix0 = HAL_REO_REMAP_IX0(REO_REMAP_TCL, 0) | - HAL_REO_REMAP_IX0(REO_REMAP_SW4, 1) | - HAL_REO_REMAP_IX0(REO_REMAP_SW1, 2) | - HAL_REO_REMAP_IX0(REO_REMAP_SW4, 3) | - HAL_REO_REMAP_IX0(REO_REMAP_SW4, 4) | - HAL_REO_REMAP_IX0(REO_REMAP_RELEASE, 5) | - HAL_REO_REMAP_IX0(REO_REMAP_FW, 6) | - HAL_REO_REMAP_IX0(REO_REMAP_FW, 7); + ix_map[0] = REO_REMAP_TCL; + ix_map[1] = REO_REMAP_SW4; + ix_map[2] = REO_REMAP_SW1; + ix_map[3] = REO_REMAP_SW4; + ix_map[4] = REO_REMAP_SW4; + ix_map[5] = REO_REMAP_RELEASE; + ix_map[6] = REO_REMAP_FW; + ix_map[7] = REO_REMAP_FW; + + ix0 = hal_gen_reo_remap_val(soc->hal_soc, HAL_REO_REMAP_REG_IX0, + ix_map); if (wlan_cfg_is_rx_hash_enabled(soc->wlan_cfg_ctx)) { - ix2 = HAL_REO_REMAP_IX2(REO_REMAP_SW4, 16) | - HAL_REO_REMAP_IX2(REO_REMAP_SW4, 17) | - HAL_REO_REMAP_IX2(REO_REMAP_SW4, 18) | - HAL_REO_REMAP_IX2(REO_REMAP_SW4, 19) | - HAL_REO_REMAP_IX2(REO_REMAP_SW4, 20) | - HAL_REO_REMAP_IX2(REO_REMAP_SW4, 21) | - HAL_REO_REMAP_IX2(REO_REMAP_SW4, 22) | - HAL_REO_REMAP_IX2(REO_REMAP_SW4, 23); + ix_map[0] = REO_REMAP_SW4; + ix_map[1] = REO_REMAP_SW4; + ix_map[2] = REO_REMAP_SW4; + ix_map[3] = REO_REMAP_SW4; + ix_map[4] = REO_REMAP_SW4; + ix_map[5] = REO_REMAP_SW4; + ix_map[6] = REO_REMAP_SW4; + ix_map[7] = REO_REMAP_SW4; + + ix2 = hal_gen_reo_remap_val(soc->hal_soc, HAL_REO_REMAP_REG_IX2, + ix_map); hal_reo_read_write_ctrl_ix(soc->hal_soc, false, &ix0, NULL, &ix2, &ix2); @@ -1745,6 +1756,7 @@ QDF_STATUS dp_ipa_disable_autonomy(struct cdp_soc_t *soc_hdl, uint8_t pdev_id) struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); + uint8_t ix0_map[8]; uint32_t ix0; uint32_t ix2; uint32_t ix3; @@ -1760,15 +1772,18 @@ QDF_STATUS dp_ipa_disable_autonomy(struct cdp_soc_t *soc_hdl, uint8_t pdev_id) if (!hif_is_target_ready(HIF_GET_SOFTC(soc->hif_handle))) return QDF_STATUS_E_AGAIN; + ix0_map[0] = REO_REMAP_TCL; + ix0_map[1] = REO_REMAP_SW1; + ix0_map[2] = REO_REMAP_SW2; + ix0_map[3] = REO_REMAP_SW3; + ix0_map[4] = REO_REMAP_SW2; + ix0_map[5] = REO_REMAP_RELEASE; + ix0_map[6] = REO_REMAP_FW; + ix0_map[7] = REO_REMAP_FW; + /* Call HAL API to remap REO rings to REO2IPA ring */ - ix0 = HAL_REO_REMAP_IX0(REO_REMAP_TCL, 0) | - HAL_REO_REMAP_IX0(REO_REMAP_SW1, 1) | - HAL_REO_REMAP_IX0(REO_REMAP_SW2, 2) | - HAL_REO_REMAP_IX0(REO_REMAP_SW3, 3) | - HAL_REO_REMAP_IX0(REO_REMAP_SW2, 4) | - HAL_REO_REMAP_IX0(REO_REMAP_RELEASE, 5) | - HAL_REO_REMAP_IX0(REO_REMAP_FW, 6) | - HAL_REO_REMAP_IX0(REO_REMAP_FW, 7); + ix0 = hal_gen_reo_remap_val(soc->hal_soc, HAL_REO_REMAP_REG_IX0, + ix0_map); if (wlan_cfg_is_rx_hash_enabled(soc->wlan_cfg_ctx)) { dp_reo_remap_config(soc, &ix2, &ix3); @@ -1859,14 +1874,20 @@ static void dp_ipa_wdi_tx_params(struct dp_soc *soc, desc_addr = (uint8_t *)QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(tx); desc_size = sizeof(struct tcl_data_cmd); +#ifndef DP_BE_WAR + /* TODO - WCN7850 does not have these fields */ HAL_TX_DESC_SET_TLV_HDR(desc_addr, HAL_TX_TCL_DATA_TAG, desc_size); +#endif tcl_desc_ptr = (struct tcl_data_cmd *) (QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(tx) + 1); tcl_desc_ptr->buf_addr_info.return_buffer_manager = - HAL_RX_BUF_RBM_SW2_BM; + HAL_RX_BUF_RBM_SW2_BM(soc->wbm_sw0_bm_id); +#ifndef DP_BE_WAR + /* TODO - WCN7850 does not have these fields */ tcl_desc_ptr->addrx_en = 1; /* Address X search enable in ASE */ tcl_desc_ptr->encap_type = HAL_TX_ENCAP_TYPE_ETHERNET; tcl_desc_ptr->packet_offset = 2; /* padding for alignment */ +#endif } static void dp_ipa_wdi_rx_params(struct dp_soc *soc, @@ -1906,7 +1927,7 @@ static void dp_ipa_wdi_rx_params(struct dp_soc *soc, QDF_IPA_WDI_SETUP_INFO_IS_EVT_RN_DB_PCIE_ADDR(rx) = false; QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(rx) = - RX_PKT_TLVS_LEN + L3_HEADER_PADDING; + soc->rx_pkt_tlv_size + L3_HEADER_PADDING; } static void @@ -1956,14 +1977,20 @@ dp_ipa_wdi_tx_smmu_params(struct dp_soc *soc, desc_addr = (uint8_t *)QDF_IPA_WDI_SETUP_INFO_SMMU_DESC_FORMAT_TEMPLATE( tx_smmu); desc_size = sizeof(struct tcl_data_cmd); +#ifndef DP_BE_WAR + /* TODO - WCN7850 does not have these fields */ HAL_TX_DESC_SET_TLV_HDR(desc_addr, HAL_TX_TCL_DATA_TAG, desc_size); +#endif tcl_desc_ptr = (struct tcl_data_cmd *) (QDF_IPA_WDI_SETUP_INFO_SMMU_DESC_FORMAT_TEMPLATE(tx_smmu) + 1); tcl_desc_ptr->buf_addr_info.return_buffer_manager = - HAL_RX_BUF_RBM_SW2_BM; + HAL_RX_BUF_RBM_SW2_BM(soc->wbm_sw0_bm_id); +#ifndef DP_BE_WAR + /* TODO - WCN7850 does not have these fields */ tcl_desc_ptr->addrx_en = 1; /* Address X search enable in ASE */ tcl_desc_ptr->encap_type = HAL_TX_ENCAP_TYPE_ETHERNET; tcl_desc_ptr->packet_offset = 2; /* padding for alignment */ +#endif } static void @@ -2003,7 +2030,7 @@ dp_ipa_wdi_rx_smmu_params(struct dp_soc *soc, QDF_IPA_WDI_SETUP_INFO_SMMU_IS_EVT_RN_DB_PCIE_ADDR(rx_smmu) = false; QDF_IPA_WDI_SETUP_INFO_SMMU_PKT_OFFSET(rx_smmu) = - RX_PKT_TLVS_LEN + L3_HEADER_PADDING; + soc->rx_pkt_tlv_size + L3_HEADER_PADDING; } QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, @@ -2326,7 +2353,7 @@ QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, /* FW Head Pointer Address */ QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(rx) = soc->ipa_uc_rx_rsc.ipa_rx_refill_buf_hp_paddr; - QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(rx) = RX_PKT_TLVS_LEN + + QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(rx) = soc->rx_pkt_tlv_size + L3_HEADER_PADDING; QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(&pipe_in) = ipa_w2i_cb; QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(&pipe_in) = ipa_priv; @@ -2815,12 +2842,13 @@ static qdf_nbuf_t dp_ipa_frag_nbuf_linearize(struct dp_soc *soc, /* first head nbuf */ if (is_nbuf_head) { qdf_mem_copy(dst_nbuf_data, src_nbuf_data, - RX_PKT_TLVS_LEN); + soc->rx_pkt_tlv_size); /* leave extra 2 bytes L3_HEADER_PADDING */ - dst_nbuf_data += (RX_PKT_TLVS_LEN + L3_HEADER_PADDING); - src_nbuf_data += RX_PKT_TLVS_LEN; + dst_nbuf_data += (soc->rx_pkt_tlv_size + + L3_HEADER_PADDING); + src_nbuf_data += soc->rx_pkt_tlv_size; copy_len = qdf_nbuf_headlen(temp_nbuf) - - RX_PKT_TLVS_LEN; + soc->rx_pkt_tlv_size; temp_nbuf = qdf_nbuf_get_ext_list(temp_nbuf); is_nbuf_head = false; } else {