浏览代码

Merge "qcacmn: Add DP rings to SSR dump"

Linux Build Service Account 1 年之前
父节点
当前提交
288f8c09ea
共有 4 个文件被更改,包括 177 次插入2 次删除
  1. 4 0
      dp/wifi3.0/be/dp_be.c
  2. 66 0
      dp/wifi3.0/dp_internal.h
  3. 80 2
      dp/wifi3.0/dp_main.c
  4. 27 0
      dp/wifi3.0/dp_rings_main.c

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

@@ -2302,6 +2302,7 @@ static void dp_soc_srng_deinit_be(struct dp_soc *soc)
 
 	if (soc->features.dmac_cmn_src_rxbuf_ring_enabled) {
 		for (i = 0; i < soc->num_rx_refill_buf_rings; i++) {
+			dp_ssr_dump_srng_unregister("rx_refill_buf_ring", i);
 			dp_srng_deinit(soc, &soc->rx_refill_buf_ring[i],
 				       RXDMA_BUF, 0);
 		}
@@ -2364,6 +2365,9 @@ static QDF_STATUS dp_soc_srng_init_be(struct dp_soc *soc)
 				       soc);
 				goto fail;
 			}
+			dp_ssr_dump_srng_register("rx_refill_buf_ring",
+						  &soc->rx_refill_buf_ring[i],
+						  i);
 		}
 	}
 

+ 66 - 0
dp/wifi3.0/dp_internal.h

@@ -5560,4 +5560,70 @@ dp_tx_latency_stats_update_cca(struct dp_soc *soc, uint16_t peer_id,
  */
 void dp_tx_latency_stats_report(struct dp_soc *soc, struct dp_pdev *pdev);
 #endif
+#ifdef WLAN_FEATURE_SSR_DRIVER_DUMP
+/**
+ * dp_ssr_dump_srng_register() - Register DP ring with SSR dump.
+ * @region_name: ring name to register.
+ * @srng: dp srng handler.
+ * @num: Ring number
+ *
+ * num = -1. If there is only single ring
+ * num = ring number. If there are multiple rings pass ring number.
+ *	e.g. in case of REO pass reo number (0..n).
+ *
+ * Return: None.
+ */
+void
+dp_ssr_dump_srng_register(char *region_name, struct dp_srng *srng, int num);
+
+/**
+ * dp_ssr_dump_srng_unregister() - Unegister DP ring with SSR dump.
+ * @region_name: ring name to unregister.
+ * @num: Ring number
+ *
+ * num = -1. If there is only single ring
+ * num = ring number. If there are multiple rings pass ring number.
+ *      e.g. in case of REO pass reo number (0..n).
+ *
+ * Return: None.
+ */
+void dp_ssr_dump_srng_unregister(char *region_name, int num);
+
+/**
+ * dp_ssr_dump_pdev_register() - Register DP Pdev with SSR dump.
+ * @pdev: Pdev handle to register.
+ * @pdev_id: Pdev ID.
+ *
+ * Return: None.
+ */
+void dp_ssr_dump_pdev_register(struct dp_pdev *pdev, uint8_t pdev_id);
+
+/**
+ * dp_ssr_dump_pdev_unregister() - Unregister DP Pdev with SSR dump.
+ * @pdev_id: Pdev ID.
+ *
+ * Return: None.
+ */
+void dp_ssr_dump_pdev_unregister(uint8_t pdev_id);
+#else
+static inline
+void dp_ssr_dump_srng_register(char *region_name, struct dp_srng *srng, int num)
+{
+}
+
+static inline
+void dp_ssr_dump_srng_unregister(char *region_name, int num)
+{
+}
+
+static inline
+void dp_ssr_dump_pdev_register(struct dp_pdev *pdev, uint8_t pdev_id)
+{
+}
+
+static inline
+void dp_ssr_dump_pdev_unregister(uint8_t pdev_id)
+{
+}
+#endif
 #endif /* #ifndef _DP_INTERNAL_H_ */

+ 80 - 2
dp/wifi3.0/dp_main.c

@@ -109,6 +109,7 @@ cdp_dump_flow_pool_info(struct cdp_soc_t *soc)
 #ifdef WLAN_FEATURE_PEER_TXQ_FLUSH_CONF
 #include <target_if_dp.h>
 #endif
+#include "qdf_ssr_driver_dump.h"
 
 #ifdef QCA_DP_ENABLE_TX_COMP_RING4
 #define TXCOMP_RING4_NUM 3
@@ -2920,6 +2921,8 @@ static int dp_rxdma_ring_setup(struct dp_soc *soc, struct dp_pdev *pdev)
 			dp_init_err("%pK: failed rx mac ring setup", soc);
 			return QDF_STATUS_E_FAILURE;
 		}
+		dp_ssr_dump_srng_register("rx_mac_buf_ring",
+					  &pdev->rx_mac_buf_ring[i], i);
 	}
 	return QDF_STATUS_SUCCESS;
 }
@@ -2935,8 +2938,10 @@ static void dp_rxdma_ring_cleanup(struct dp_soc *soc, struct dp_pdev *pdev)
 {
 	int i;
 
-	for (i = 0; i < MAX_RX_MAC_RINGS; i++)
+	for (i = 0; i < MAX_RX_MAC_RINGS; i++) {
+		dp_ssr_dump_srng_unregister("rx_mac_buf_ring", i);
 		dp_srng_deinit(soc, &pdev->rx_mac_buf_ring[i], RXDMA_BUF, 1);
+	}
 
 	dp_reap_timer_deinit(soc);
 }
@@ -3580,10 +3585,11 @@ QDF_STATUS dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc,
 	pdev->soc = soc;
 	pdev->pdev_id = pdev_id;
 	soc->pdev_list[pdev_id] = pdev;
-
 	pdev->lmac_id = wlan_cfg_get_hw_mac_idx(soc->wlan_cfg_ctx, pdev_id);
 	soc->pdev_count++;
 
+	dp_ssr_dump_pdev_register(pdev, pdev_id);
+
 	/*sync DP pdev cfg items with profile support after cfg_pdev_attach*/
 	wlan_dp_pdev_cfg_sync_profile((struct cdp_soc_t *)soc, pdev_id);
 
@@ -3936,6 +3942,8 @@ static QDF_STATUS dp_pdev_detach_wifi3(struct cdp_soc_t *psoc, uint8_t pdev_id,
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	dp_ssr_dump_pdev_unregister(pdev_id);
+
 	soc->arch_ops.txrx_pdev_detach(pdev);
 
 	dp_pdev_detach((struct cdp_pdev *)pdev, force);
@@ -4002,6 +4010,11 @@ static void dp_soc_detach(struct cdp_soc_t *txrx_soc)
 
 	soc->arch_ops.txrx_soc_detach(soc);
 
+	qdf_ssr_driver_dump_unregister_region("wlan_cfg_ctx");
+	qdf_ssr_driver_dump_unregister_region("dp_soc");
+	qdf_ssr_driver_dump_unregister_region("tcl_wbm_map_array");
+	qdf_nbuf_ssr_unregister_region();
+
 	dp_runtime_deinit();
 
 	dp_soc_unset_qref_debug_list(soc);
@@ -13534,11 +13547,18 @@ dp_soc_attach(struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
 		goto fail2;
 	}
 
+	qdf_ssr_driver_dump_register_region("wlan_cfg_ctx", soc->wlan_cfg_ctx,
+					    sizeof(*soc->wlan_cfg_ctx));
+
 	/*sync DP soc cfg items with profile support after cfg_soc_attach*/
 	wlan_dp_soc_cfg_sync_profile((struct cdp_soc_t *)soc);
 
 	soc->arch_ops.soc_cfg_attach(soc);
 
+	qdf_ssr_driver_dump_register_region("tcl_wbm_map_array",
+					    &soc->wlan_cfg_ctx->tcl_wbm_map_array,
+					    sizeof(struct wlan_cfg_tcl_wbm_ring_num_map));
+
 	if (dp_hw_link_desc_pool_banks_alloc(soc, WLAN_INVALID_PDEV_ID)) {
 		dp_err("failed to allocate link desc pool banks");
 		goto fail3;
@@ -13588,6 +13608,8 @@ dp_soc_attach(struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
 	dp_soc_set_interrupt_mode(soc);
 	dp_soc_set_def_pdev(soc);
 	dp_soc_set_qref_debug_list(soc);
+	qdf_ssr_driver_dump_register_region("dp_soc", soc, sizeof(*soc));
+	qdf_nbuf_ssr_register_region();
 
 	dp_info("Mem stats: DMA = %u HEAP = %u SKB = %u",
 		qdf_dma_mem_stats_read(),
@@ -14621,3 +14643,59 @@ void dp_peer_multipass_list_init(struct dp_vdev *vdev)
 	qdf_spinlock_create(&vdev->mpass_peer_mutex);
 }
 #endif /* QCA_MULTIPASS_SUPPORT */
+
+#ifdef WLAN_FEATURE_SSR_DRIVER_DUMP
+#define MAX_STR_LEN 50
+#define MAX_SRNG_STR_LEN 30
+
+void dp_ssr_dump_srng_register(char *region_name, struct dp_srng *srng, int num)
+{
+	char ring[MAX_SRNG_STR_LEN], ring_handle[MAX_STR_LEN];
+
+	if (num >= 0)
+		qdf_snprint(ring, MAX_SRNG_STR_LEN, "%s%s%d",
+			    region_name, "_", num);
+	else
+		qdf_snprint(ring, MAX_SRNG_STR_LEN, "%s", region_name);
+
+	qdf_snprint(ring_handle, MAX_STR_LEN, "%s%s", ring, "_handle");
+
+	qdf_ssr_driver_dump_register_region(ring_handle, srng->hal_srng,
+					    sizeof(struct hal_srng));
+	qdf_ssr_driver_dump_register_region(ring,
+					    srng->base_vaddr_aligned,
+					    srng->alloc_size);
+}
+
+void dp_ssr_dump_srng_unregister(char *region_name, int num)
+{
+	char ring[MAX_SRNG_STR_LEN], ring_handle[MAX_STR_LEN];
+
+	if (num >= 0)
+		qdf_snprint(ring, MAX_SRNG_STR_LEN, "%s%s%d",
+			    region_name, "_", num);
+	else
+		qdf_snprint(ring, MAX_SRNG_STR_LEN, "%s", region_name);
+
+	qdf_snprint(ring_handle, MAX_STR_LEN, "%s%s", ring, "_handle");
+
+	qdf_ssr_driver_dump_unregister_region(ring);
+	qdf_ssr_driver_dump_unregister_region(ring_handle);
+}
+
+void dp_ssr_dump_pdev_register(struct dp_pdev *pdev, uint8_t pdev_id)
+{
+	char pdev_str[MAX_STR_LEN];
+
+	qdf_snprint(pdev_str, MAX_STR_LEN, "%s%s%d", "dp_pdev", "_", pdev_id);
+	qdf_ssr_driver_dump_register_region(pdev_str, pdev, sizeof(*pdev));
+}
+
+void dp_ssr_dump_pdev_unregister(uint8_t pdev_id)
+{
+	char pdev_str[MAX_STR_LEN];
+
+	qdf_snprint(pdev_str, MAX_STR_LEN, "%s%s%d", "dp_pdev", "_", pdev_id);
+	qdf_ssr_driver_dump_unregister_region(pdev_str);
+}
+#endif

+ 27 - 0
dp/wifi3.0/dp_rings_main.c

@@ -56,6 +56,7 @@
 #ifdef WIFI_MONITOR_SUPPORT
 #include <dp_mon.h>
 #endif
+#include "qdf_ssr_driver_dump.h"
 
 #ifdef WLAN_FEATURE_STATS_EXT
 #define INIT_RX_HW_STATS_LOCK(_soc) \
@@ -2016,6 +2017,9 @@ static void dp_deinit_tx_pair_by_index(struct dp_soc *soc, int index)
 		return;
 	}
 
+	dp_ssr_dump_srng_unregister("tcl_data_ring", index);
+	dp_ssr_dump_srng_unregister("tx_comp_ring", index);
+
 	wlan_minidump_remove(soc->tcl_data_ring[index].base_vaddr_unaligned,
 			     soc->tcl_data_ring[index].alloc_size,
 			     soc->ctrl_psoc,
@@ -2088,6 +2092,11 @@ static QDF_STATUS dp_init_tx_ring_pair_by_index(struct dp_soc *soc,
 		goto fail1;
 	}
 
+	dp_ssr_dump_srng_register("tcl_data_ring",
+				  &soc->tcl_data_ring[index], index);
+	dp_ssr_dump_srng_register("tx_comp_ring",
+				  &soc->tx_comp_ring[index], index);
+
 	wlan_minidump_log(soc->tx_comp_ring[index].base_vaddr_unaligned,
 			  soc->tx_comp_ring[index].alloc_size,
 			  soc->ctrl_psoc,
@@ -3745,6 +3754,7 @@ void dp_soc_srng_deinit(struct dp_soc *soc)
 			     soc->ctrl_psoc, WLAN_MD_DP_SRNG_WBM_DESC_REL,
 			     "wbm_desc_rel_ring");
 	dp_srng_deinit(soc, &soc->wbm_desc_rel_ring, SW2WBM_RELEASE, 0);
+	dp_ssr_dump_srng_unregister("wbm_desc_rel_ring", -1);
 
 	/* Tx data rings */
 	for (i = 0; i < soc->num_tcl_data_rings; i++)
@@ -3763,6 +3773,7 @@ void dp_soc_srng_deinit(struct dp_soc *soc)
 		/* TODO: Get number of rings and ring sizes
 		 * from wlan_cfg
 		 */
+		dp_ssr_dump_srng_unregister("reo_dest_ring", i);
 		wlan_minidump_remove(soc->reo_dest_ring[i].base_vaddr_unaligned,
 				     soc->reo_dest_ring[i].alloc_size,
 				     soc->ctrl_psoc, WLAN_MD_DP_SRNG_REO_DEST,
@@ -3770,6 +3781,7 @@ void dp_soc_srng_deinit(struct dp_soc *soc)
 		dp_srng_deinit(soc, &soc->reo_dest_ring[i], REO_DST, i);
 	}
 
+	dp_ssr_dump_srng_unregister("reo_reinject_ring", -1);
 	/* REO reinjection ring */
 	wlan_minidump_remove(soc->reo_reinject_ring.base_vaddr_unaligned,
 			     soc->reo_reinject_ring.alloc_size,
@@ -3777,6 +3789,7 @@ void dp_soc_srng_deinit(struct dp_soc *soc)
 			     "reo_reinject_ring");
 	dp_srng_deinit(soc, &soc->reo_reinject_ring, REO_REINJECT, 0);
 
+	dp_ssr_dump_srng_unregister("rx_rel_ring", -1);
 	/* Rx release ring */
 	wlan_minidump_remove(soc->rx_rel_ring.base_vaddr_unaligned,
 			     soc->rx_rel_ring.alloc_size,
@@ -3788,6 +3801,7 @@ void dp_soc_srng_deinit(struct dp_soc *soc)
 	/* TODO: Better to store ring_type and ring_num in
 	 * dp_srng during setup
 	 */
+	dp_ssr_dump_srng_unregister("reo_exception_ring", -1);
 	wlan_minidump_remove(soc->reo_exception_ring.base_vaddr_unaligned,
 			     soc->reo_exception_ring.alloc_size,
 			     soc->ctrl_psoc, WLAN_MD_DP_SRNG_REO_EXCEPTION,
@@ -3795,11 +3809,13 @@ void dp_soc_srng_deinit(struct dp_soc *soc)
 	dp_srng_deinit(soc, &soc->reo_exception_ring, REO_EXCEPTION, 0);
 
 	/* REO command and status rings */
+	dp_ssr_dump_srng_unregister("reo_cmd_ring", -1);
 	wlan_minidump_remove(soc->reo_cmd_ring.base_vaddr_unaligned,
 			     soc->reo_cmd_ring.alloc_size,
 			     soc->ctrl_psoc, WLAN_MD_DP_SRNG_REO_CMD,
 			     "reo_cmd_ring");
 	dp_srng_deinit(soc, &soc->reo_cmd_ring, REO_CMD, 0);
+	dp_ssr_dump_srng_unregister("reo_status_ring", -1);
 	wlan_minidump_remove(soc->reo_status_ring.base_vaddr_unaligned,
 			     soc->reo_status_ring.alloc_size,
 			     soc->ctrl_psoc, WLAN_MD_DP_SRNG_REO_STATUS,
@@ -3829,6 +3845,8 @@ QDF_STATUS dp_soc_srng_init(struct dp_soc *soc)
 		dp_init_err("%pK: dp_srng_init failed for wbm_desc_rel_ring", soc);
 		goto fail1;
 	}
+	dp_ssr_dump_srng_register("wbm_desc_rel_ring",
+				  &soc->wbm_desc_rel_ring, -1);
 
 	wlan_minidump_log(soc->wbm_desc_rel_ring.base_vaddr_unaligned,
 			  soc->wbm_desc_rel_ring.alloc_size,
@@ -3852,6 +3870,8 @@ QDF_STATUS dp_soc_srng_init(struct dp_soc *soc)
 		dp_init_err("%pK: dp_srng_init failed for reo_reinject_ring", soc);
 		goto fail1;
 	}
+	dp_ssr_dump_srng_register("reo_reinject_ring",
+				  &soc->reo_reinject_ring, -1);
 
 	wlan_minidump_log(soc->reo_reinject_ring.base_vaddr_unaligned,
 			  soc->reo_reinject_ring.alloc_size,
@@ -3866,6 +3886,7 @@ QDF_STATUS dp_soc_srng_init(struct dp_soc *soc)
 		dp_init_err("%pK: dp_srng_init failed for rx_rel_ring", soc);
 		goto fail1;
 	}
+	dp_ssr_dump_srng_register("rx_rel_ring", &soc->rx_rel_ring, -1);
 
 	wlan_minidump_log(soc->rx_rel_ring.base_vaddr_unaligned,
 			  soc->rx_rel_ring.alloc_size,
@@ -3879,6 +3900,8 @@ QDF_STATUS dp_soc_srng_init(struct dp_soc *soc)
 		dp_init_err("%pK: dp_srng_init failed - reo_exception", soc);
 		goto fail1;
 	}
+	dp_ssr_dump_srng_register("reo_exception_ring",
+				  &soc->reo_exception_ring, -1);
 
 	wlan_minidump_log(soc->reo_exception_ring.base_vaddr_unaligned,
 			  soc->reo_exception_ring.alloc_size,
@@ -3891,6 +3914,7 @@ QDF_STATUS dp_soc_srng_init(struct dp_soc *soc)
 		dp_init_err("%pK: dp_srng_init failed for reo_cmd_ring", soc);
 		goto fail1;
 	}
+	dp_ssr_dump_srng_register("reo_cmd_ring", &soc->reo_cmd_ring, -1);
 
 	wlan_minidump_log(soc->reo_cmd_ring.base_vaddr_unaligned,
 			  soc->reo_cmd_ring.alloc_size,
@@ -3906,6 +3930,7 @@ QDF_STATUS dp_soc_srng_init(struct dp_soc *soc)
 		dp_init_err("%pK: dp_srng_init failed for reo_status_ring", soc);
 		goto fail1;
 	}
+	dp_ssr_dump_srng_register("reo_status_ring", &soc->reo_status_ring, -1);
 
 	wlan_minidump_log(soc->reo_status_ring.base_vaddr_unaligned,
 			  soc->reo_status_ring.alloc_size,
@@ -3935,6 +3960,8 @@ QDF_STATUS dp_soc_srng_init(struct dp_soc *soc)
 			goto fail1;
 		}
 
+		dp_ssr_dump_srng_register("reo_dest_ring",
+					  &soc->reo_dest_ring[i], i);
 		wlan_minidump_log(soc->reo_dest_ring[i].base_vaddr_unaligned,
 				  soc->reo_dest_ring[i].alloc_size,
 				  soc->ctrl_psoc,