From 0b0fde8706775236e93b80649f206261e723f04c Mon Sep 17 00:00:00 2001 From: Amit Mehta Date: Fri, 1 Sep 2023 02:18:57 -0700 Subject: [PATCH] qcacmn: Add DP rings to SSR dump Add DP rings to SSR dump Change-Id: If1d1fe0a66a0f836bd5344b14ba4187e58921568 CRs-Fixed: 3604903 --- dp/wifi3.0/be/dp_be.c | 4 ++ dp/wifi3.0/dp_internal.h | 66 ++++++++++++++++++++++++++++++ dp/wifi3.0/dp_main.c | 82 +++++++++++++++++++++++++++++++++++++- dp/wifi3.0/dp_rings_main.c | 27 +++++++++++++ 4 files changed, 177 insertions(+), 2 deletions(-) diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index 07a38e4dc1..c304279cca 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/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); } } diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 57db8d39fc..5c898bc0a3 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -5550,4 +5550,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_ */ diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 9cfafdb351..c8d23e8635 100644 --- a/dp/wifi3.0/dp_main.c +++ b/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 #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); @@ -13529,11 +13542,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; @@ -13583,6 +13603,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(), @@ -14593,3 +14615,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 diff --git a/dp/wifi3.0/dp_rings_main.c b/dp/wifi3.0/dp_rings_main.c index e6f3ef83c5..c6563a0f67 100644 --- a/dp/wifi3.0/dp_rings_main.c +++ b/dp/wifi3.0/dp_rings_main.c @@ -56,6 +56,7 @@ #ifdef WIFI_MONITOR_SUPPORT #include #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, @@ -3736,6 +3745,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++) @@ -3754,6 +3764,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, @@ -3761,6 +3772,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, @@ -3768,6 +3780,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, @@ -3779,6 +3792,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, @@ -3786,11 +3800,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, @@ -3820,6 +3836,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, @@ -3843,6 +3861,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, @@ -3857,6 +3877,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, @@ -3870,6 +3891,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, @@ -3882,6 +3905,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, @@ -3897,6 +3921,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, @@ -3926,6 +3951,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,