Переглянути джерело

qcacmn: Set up TX bank profile for IPA

bank id is newly added in TX descriptor for BE chipsets. As such,
with IPA Offload enabled, IPA needs the bank id information to do
offload WLAN TX.

From WLAN perspective, bank id is designed to be used on a per-vdev
role basis. E.g. STA vdev and SAP vdev have separate and different
bank profiles.

However from IPA perspective, bank id needs to be on a per TX ring
basis, because IPA GSI FW is not able to identify STA or SAP vdev
role on a per-packet basis.

Hence initialize last HOST owned bank id profile for IPA usage.

Change-Id: I0cf71b638f5999905069aff0551d8ebeb5477e17
CRs-Fixed: 3289558
Jia Ding 3 роки тому
батько
коміт
79a9d0dc1d
4 змінених файлів з 87 додано та 0 видалено
  1. 19 0
      dp/wifi3.0/be/dp_be.c
  2. 4 0
      dp/wifi3.0/be/dp_be.h
  3. 59 0
      dp/wifi3.0/be/dp_be_tx.c
  4. 5 0
      dp/wifi3.0/dp_types.h

+ 19 - 0
dp/wifi3.0/be/dp_be.c

@@ -1929,6 +1929,24 @@ static bool dp_reo_remap_config_be(struct dp_soc *soc,
 }
 #endif
 
+#ifdef IPA_OFFLOAD
+static int8_t dp_ipa_get_bank_id_be(struct dp_soc *soc)
+{
+	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
+
+	return be_soc->ipa_bank_id;
+}
+
+static inline void dp_initialize_arch_ops_be_ipa(struct dp_arch_ops *arch_ops)
+{
+	arch_ops->ipa_get_bank_id = dp_ipa_get_bank_id_be;
+}
+#else /* !IPA_OFFLOAD */
+static inline void dp_initialize_arch_ops_be_ipa(struct dp_arch_ops *arch_ops)
+{
+}
+#endif /* IPA_OFFLOAD */
+
 void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
 {
 #ifndef QCA_HOST_MODE_WIFI_DISABLED
@@ -1991,4 +2009,5 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
 	arch_ops->print_mlo_ast_stats = dp_print_mlo_ast_stats_be;
 	arch_ops->peer_get_reo_hash = dp_peer_get_reo_hash_be;
 	arch_ops->reo_remap_config = dp_reo_remap_config_be;
+	dp_initialize_arch_ops_be_ipa(arch_ops);
 }

+ 4 - 0
dp/wifi3.0/be/dp_be.h

@@ -236,6 +236,7 @@ struct dp_ppe_vp_profile {
  * @ppe_vp_tbl: PPE VP table
  * @ppe_vp_tbl_lock: PPE VP table lock
  * @num_ppe_vp_entries : Number of PPE VP entries
+ * @ipa_bank_id: TCL bank id used by IPA
  */
 struct dp_soc_be {
 	struct dp_soc soc;
@@ -276,6 +277,9 @@ struct dp_soc_be {
 	} mld_peer_hash;
 #endif
 #endif
+#ifdef IPA_OFFLOAD
+	int8_t ipa_bank_id;
+#endif
 };
 
 /* convert struct dp_soc_be pointer to struct dp_soc pointer */

+ 59 - 0
dp/wifi3.0/be/dp_be_tx.c

@@ -915,6 +915,62 @@ ring_access_fail:
 	return status;
 }
 
+#ifdef IPA_OFFLOAD
+static void
+dp_tx_get_ipa_bank_config(struct dp_soc_be *be_soc,
+			  union hal_tx_bank_config *bank_config)
+{
+	bank_config->epd = 0;
+	bank_config->encap_type = wlan_cfg_pkt_type(be_soc->soc.wlan_cfg_ctx);
+	bank_config->encrypt_type = 0;
+
+	bank_config->src_buffer_swap = 0;
+	bank_config->link_meta_swap = 0;
+
+	bank_config->index_lookup_enable = 0;
+	bank_config->mcast_pkt_ctrl = HAL_TX_MCAST_CTRL_FW_EXCEPTION;
+	bank_config->addrx_en = 1;
+	bank_config->addry_en = 1;
+
+	bank_config->mesh_enable = 0;
+	bank_config->dscp_tid_map_id = 0;
+	bank_config->vdev_id_check_en = 0;
+	bank_config->pmac_id = 0;
+}
+
+static void dp_tx_init_ipa_bank_profile(struct dp_soc_be *be_soc)
+{
+	union hal_tx_bank_config ipa_config = {0};
+	int bid;
+
+	if (!wlan_cfg_is_ipa_enabled(be_soc->soc.wlan_cfg_ctx)) {
+		be_soc->ipa_bank_id = DP_BE_INVALID_BANK_ID;
+		return;
+	}
+
+	dp_tx_get_ipa_bank_config(be_soc, &ipa_config);
+
+	/* Let IPA use last HOST owned bank */
+	bid = be_soc->num_bank_profiles - 1;
+
+	be_soc->bank_profiles[bid].is_configured = true;
+	be_soc->bank_profiles[bid].bank_config.val = ipa_config.val;
+	hal_tx_populate_bank_register(be_soc->soc.hal_soc,
+				      &be_soc->bank_profiles[bid].bank_config,
+				      bid);
+	qdf_atomic_inc(&be_soc->bank_profiles[bid].ref_count);
+
+	dp_info("IPA bank at slot %d config:0x%x", bid,
+		be_soc->bank_profiles[bid].bank_config.val);
+
+	be_soc->ipa_bank_id = bid;
+}
+#else /* !IPA_OFFLOAD */
+static inline void dp_tx_init_ipa_bank_profile(struct dp_soc_be *be_soc)
+{
+}
+#endif /* IPA_OFFLOAD */
+
 QDF_STATUS dp_tx_init_bank_profiles(struct dp_soc_be *be_soc)
 {
 	int i, num_tcl_banks;
@@ -938,6 +994,9 @@ QDF_STATUS dp_tx_init_bank_profiles(struct dp_soc_be *be_soc)
 		qdf_atomic_init(&be_soc->bank_profiles[i].ref_count);
 	}
 	dp_info("initialized %u bank profiles", be_soc->num_bank_profiles);
+
+	dp_tx_init_ipa_bank_profile(be_soc);
+
 	return QDF_STATUS_SUCCESS;
 }
 

+ 5 - 0
dp/wifi3.0/dp_types.h

@@ -1824,6 +1824,7 @@ enum dp_context_type {
  * @txrx_set_vdev_param: target specific ops while setting vdev params
  * @dp_srng_test_and_update_nf_params: Check if the srng is in near full state
  *				and set the near-full params.
+ * @ipa_get_bank_id: Get TCL bank id used by IPA
  */
 struct dp_arch_ops {
 	/* INIT/DEINIT Arch Ops */
@@ -1978,6 +1979,10 @@ struct dp_arch_ops {
 				     uint16_t peer_id);
 	void (*dp_partner_chips_unmap)(struct dp_soc *soc,
 				       uint16_t peer_id);
+
+#ifdef IPA_OFFLOAD
+	int8_t (*ipa_get_bank_id)(struct dp_soc *soc);
+#endif
 };
 
 /**