Selaa lähdekoodia

qcacmn: Add support to send Shadow config v3

Shadow config v2 can support max of 36 shadow
registers only. For KIWI target, there are 40
shadow registers supported.

Hence add support to send shadow config v3
for KIWI.

Change-Id: If57e6597397da3e239f25a6c0cc24f8fd37dcdf1
CRs-Fixed: 3167758
Rakesh Pillai 3 vuotta sitten
vanhempi
sitoutus
68f96a8c79

+ 18 - 4
hal/wifi3.0/hal_api.h

@@ -1029,14 +1029,28 @@ QDF_STATUS hal_construct_srng_shadow_regs(void *hal_soc);
 QDF_STATUS hal_set_one_shadow_config(void *hal_soc, int ring_type,
 				     int ring_num);
 /**
- * hal_get_shadow_config() - retrieve the config table
+ * hal_get_shadow_config() - retrieve the config table for shadow cfg v2
  * @hal_soc: hal handle
  * @shadow_config: will point to the table after
  * @num_shadow_registers_configured: will contain the number of valid entries
  */
-extern void hal_get_shadow_config(void *hal_soc,
-				  struct pld_shadow_reg_v2_cfg **shadow_config,
-				  int *num_shadow_registers_configured);
+extern void
+hal_get_shadow_config(void *hal_soc,
+		      struct pld_shadow_reg_v2_cfg **shadow_config,
+		      int *num_shadow_registers_configured);
+
+#ifdef CONFIG_SHADOW_V3
+/**
+ * hal_get_shadow_v3_config() - retrieve the config table for shadow cfg v3
+ * @hal_soc: hal handle
+ * @shadow_config: will point to the table after
+ * @num_shadow_registers_configured: will contain the number of valid entries
+ */
+extern void
+hal_get_shadow_v3_config(void *hal_soc,
+			 struct pld_shadow_reg_v3_cfg **shadow_config,
+			 int *num_shadow_registers_configured);
+#endif
 
 #ifdef WLAN_FEATURE_NEAR_FULL_IRQ
 /**

+ 15 - 1
hal/wifi3.0/hal_internal.h

@@ -1147,6 +1147,20 @@ struct reo_queue_ref_table {
 	uint8_t reo_qref_table_en;
 };
 
+/**
+ * union hal_shadow_reg_cfg - Shadow register config
+ * @addr: Place holder where shadow address is saved
+ * @v2: shadow config v2 format
+ * @v3: shadow config v3 format
+ */
+union hal_shadow_reg_cfg {
+	uint32_t addr;
+	struct pld_shadow_reg_v2_cfg v2;
+#ifdef CONFIG_SHADOW_V3
+	struct pld_shadow_reg_v3_cfg v3;
+#endif
+};
+
 /**
  * struct hal_soc - HAL context to be used to access SRNG APIs
  *		    (currently used by data path and
@@ -1187,7 +1201,7 @@ struct hal_soc {
 	uint32_t target_type;
 
 	/* shadow register configuration */
-	struct pld_shadow_reg_v2_cfg shadow_config[MAX_SHADOW_REGISTERS];
+	union hal_shadow_reg_cfg shadow_config[MAX_SHADOW_REGISTERS];
 	int num_shadow_registers_configured;
 	bool use_register_windowing;
 	uint32_t register_window;

+ 16 - 3
hal/wifi3.0/hal_srng.c

@@ -351,13 +351,26 @@ void hal_get_shadow_config(void *hal_soc,
 {
 	struct hal_soc *hal = (struct hal_soc *)hal_soc;
 
-	*shadow_config = hal->shadow_config;
+	*shadow_config = &hal->shadow_config[0].v2;
 	*num_shadow_registers_configured =
 		hal->num_shadow_registers_configured;
 }
-
 qdf_export_symbol(hal_get_shadow_config);
 
+#ifdef CONFIG_SHADOW_V3
+void hal_get_shadow_v3_config(void *hal_soc,
+			      struct pld_shadow_reg_v3_cfg **shadow_config,
+			      int *num_shadow_registers_configured)
+{
+	struct hal_soc *hal = (struct hal_soc *)hal_soc;
+
+	*shadow_config = &hal->shadow_config[0].v3;
+	*num_shadow_registers_configured =
+		hal->num_shadow_registers_configured;
+}
+qdf_export_symbol(hal_get_shadow_v3_config);
+#endif
+
 static bool hal_validate_shadow_register(struct hal_soc *hal,
 					 uint32_t *destination,
 					 uint32_t *shadow_address)
@@ -1351,7 +1364,7 @@ static inline void hal_srng_hw_init(struct hal_soc *hal,
 		hal_srng_dst_hw_init(hal, srng);
 }
 
-#ifdef CONFIG_SHADOW_V2
+#if defined(CONFIG_SHADOW_V2) || defined(CONFIG_SHADOW_V3)
 #define ignore_shadow false
 #define CHECK_SHADOW_REGISTERS true
 #else

+ 6 - 0
hif/src/ce/ce_api.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -591,6 +592,11 @@ struct ce_ops {
 			    int *num_shadow_registers_configured);
 	int (*ce_get_index_info)(struct hif_softc *scn, void *ce_state,
 				 struct ce_index *info);
+#ifdef CONFIG_SHADOW_V3
+	void (*ce_prepare_shadow_register_v3_cfg)(struct hif_softc *scn,
+			    struct pld_shadow_reg_v3_cfg **shadow_config,
+			    int *num_shadow_registers_configured);
+#endif
 };
 
 int hif_ce_bus_early_suspend(struct hif_softc *scn);

+ 48 - 4
hif/src/ce/ce_main.c

@@ -1721,6 +1721,28 @@ static void hif_prepare_hal_shadow_register_cfg(struct hif_softc *scn,
 	return;
 }
 
+#ifdef CONFIG_SHADOW_V3
+static inline void
+hif_prepare_hal_shadow_reg_cfg_v3(struct hif_softc *scn,
+				  struct pld_wlan_enable_cfg *cfg)
+{
+	struct HIF_CE_state *hif_state = HIF_GET_CE_STATE(scn);
+
+	if (!hif_state->ce_services->ce_prepare_shadow_register_v3_cfg)
+		return;
+
+	hif_state->ce_services->ce_prepare_shadow_register_v3_cfg(
+			scn, &cfg->shadow_reg_v3_cfg,
+			&cfg->num_shadow_reg_v3_cfg);
+}
+#else
+static inline void
+hif_prepare_hal_shadow_reg_cfg_v3(struct hif_softc *scn,
+				  struct pld_wlan_enable_cfg *cfg)
+{
+}
+#endif
+
 static inline uint32_t ce_get_desc_size(struct hif_softc *scn,
 						uint8_t ring_type)
 {
@@ -3552,7 +3574,19 @@ void hif_get_target_ce_config(struct hif_softc *scn,
 			       shadow_cfg_sz_ret);
 }
 
-#ifdef CONFIG_SHADOW_V2
+#ifdef CONFIG_SHADOW_V3
+static void hif_print_hal_shadow_register_cfg(struct pld_wlan_enable_cfg *cfg)
+{
+	int i;
+
+	hif_err("num_config %d", cfg->num_shadow_reg_v2_cfg);
+
+	for (i = 0; i < cfg->num_shadow_reg_v2_cfg; i++) {
+		hif_err("i %d, val %x", i, cfg->shadow_reg_v2_cfg[i].addr);
+	}
+}
+
+#elif defined(CONFIG_SHADOW_V2)
 static void hif_print_hal_shadow_register_cfg(struct pld_wlan_enable_cfg *cfg)
 {
 	int i;
@@ -3570,7 +3604,7 @@ static void hif_print_hal_shadow_register_cfg(struct pld_wlan_enable_cfg *cfg)
 static void hif_print_hal_shadow_register_cfg(struct pld_wlan_enable_cfg *cfg)
 {
 	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
-		  "%s: CONFIG_SHADOW_V2 not defined", __func__);
+		  "%s: CONFIG_SHADOW V2/V3 not defined", __func__);
 }
 #endif
 
@@ -3751,6 +3785,8 @@ static void hif_update_rri_over_ddr_config(struct hif_softc *scn,
  */
 int hif_wlan_enable(struct hif_softc *scn)
 {
+	struct hif_opaque_softc *hif_hdl = GET_HIF_OPAQUE_HDL(scn);
+	struct hif_target_info *tgt_info = hif_get_target_info_handle(hif_hdl);
 	struct pld_wlan_enable_cfg cfg = { 0 };
 	enum pld_driver_mode mode;
 	uint32_t con_mode = hif_get_conparam(scn);
@@ -3768,8 +3804,16 @@ int hif_wlan_enable(struct hif_softc *scn)
 	cfg.num_ce_svc_pipe_cfg /= sizeof(struct service_to_pipe);
 	cfg.num_shadow_reg_cfg /= sizeof(struct shadow_reg_cfg);
 
-	hif_prepare_hal_shadow_register_cfg(scn, &cfg.shadow_reg_v2_cfg,
-			      &cfg.num_shadow_reg_v2_cfg);
+	switch (tgt_info->target_type) {
+	case TARGET_TYPE_KIWI:
+		hif_prepare_hal_shadow_reg_cfg_v3(scn, &cfg);
+		break;
+	default:
+		hif_prepare_hal_shadow_register_cfg(scn,
+						    &cfg.shadow_reg_v2_cfg,
+						    &cfg.num_shadow_reg_v2_cfg);
+		break;
+	}
 
 	hif_print_hal_shadow_register_cfg(&cfg);
 

+ 34 - 1
hif/src/ce/ce_service_srng.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -1008,6 +1008,35 @@ static void ce_prepare_shadow_register_v2_cfg_srng(struct hif_softc *scn,
 			      num_shadow_registers_configured);
 }
 
+#ifdef CONFIG_SHADOW_V3
+static void ce_prepare_shadow_register_v3_cfg_srng(struct hif_softc *scn,
+		struct pld_shadow_reg_v3_cfg **shadow_config,
+		int *num_shadow_registers_configured)
+{
+	if (!scn->hal_soc) {
+		hif_err("hal not initialized: not initializing shadow config");
+		return;
+	}
+
+	hal_get_shadow_v3_config(scn->hal_soc, shadow_config,
+				 num_shadow_registers_configured);
+
+	if (*num_shadow_registers_configured != 0) {
+		hif_err("hal shadow register configuration allready constructed");
+
+		/* return with original configuration*/
+		return;
+	}
+	hal_construct_srng_shadow_regs(scn->hal_soc);
+	ce_construct_shadow_config_srng(scn);
+	hal_set_shadow_regs(scn->hal_soc);
+	hal_construct_shadow_regs(scn->hal_soc);
+	/* get updated configuration */
+	hal_get_shadow_v3_config(scn->hal_soc, shadow_config,
+				 num_shadow_registers_configured);
+}
+#endif
+
 #ifdef HIF_CE_LOG_INFO
 /**
  * ce_get_index_info_srng(): Get CE index info
@@ -1062,6 +1091,10 @@ static struct ce_ops ce_service_srng = {
 	.ce_send_entries_done_nolock = ce_send_entries_done_nolock_srng,
 	.ce_prepare_shadow_register_v2_cfg =
 		ce_prepare_shadow_register_v2_cfg_srng,
+#ifdef CONFIG_SHADOW_V3
+	.ce_prepare_shadow_register_v3_cfg =
+		ce_prepare_shadow_register_v3_cfg_srng,
+#endif
 #ifdef HIF_CE_LOG_INFO
 	.ce_get_index_info =
 		ce_get_index_info_srng,