Преглед на файлове

qcacmn: Add hif and CE rings to SSR dump

Add hif and CE rings to SSR dump

Change-Id: I6a859f46c9a8cf5813ce26a163b30286969edf4a
CRs-Fixed: 3604906
Amit Mehta преди 1 година
родител
ревизия
cf269aa28d
променени са 2 файла, в които са добавени 118 реда и са изтрити 0 реда
  1. 115 0
      hif/src/ce/ce_main.c
  2. 3 0
      hif/src/hif_main.c

+ 115 - 0
hif/src/ce/ce_main.c

@@ -66,6 +66,7 @@
 #ifdef QCA_WIFI_SUPPORT_SRNG
 #include <hal_api.h>
 #endif
+#include "qdf_ssr_driver_dump.h"
 
 /* Forward references */
 QDF_STATUS hif_post_recv_buffers_for_pipe(struct HIF_CE_pipe_info *pipe_info);
@@ -2507,6 +2508,116 @@ void ce_disable_polling(void *cestate)
 		CE_state->timer_inited = false;
 }
 
+#ifdef WLAN_FEATURE_SSR_DRIVER_DUMP
+#define MAX_CE_STR_LEN 50
+/**
+ * ce_ring_dump_register_region() - Register CE ring with SSR dump
+ * @CE_state: CE_state pointer
+ * @CE_id: CE id
+ *
+ * Return: None
+ */
+static inline
+void ce_ring_dump_register_region(struct CE_state *CE_state, unsigned int CE_id)
+{
+	struct CE_ring_state *ce_ring;
+	char ce[MAX_CE_STR_LEN];
+	char CE_ring_state[MAX_CE_STR_LEN];
+	char srng[MAX_CE_STR_LEN];
+
+	qdf_snprint(ce, MAX_CE_STR_LEN, "%s%d", "ce_", CE_id);
+	qdf_ssr_driver_dump_register_region(ce, CE_state, sizeof(*CE_state));
+
+	if (CE_state->status_ring) {
+		ce_ring = CE_state->status_ring;
+		qdf_snprint(CE_ring_state, MAX_CE_STR_LEN,
+			    "%s%s", ce, "_status_ring");
+		qdf_ssr_driver_dump_register_region(CE_ring_state, ce_ring,
+						    sizeof(struct CE_ring_state)
+						   );
+		qdf_snprint(srng, MAX_CE_STR_LEN,
+			    "%s%s", CE_ring_state, "_ctx");
+		qdf_ssr_driver_dump_register_region(srng, ce_ring->srng_ctx,
+						    sizeof(struct hal_srng));
+	}
+	if (CE_state->dest_ring) {
+		ce_ring = CE_state->dest_ring;
+		qdf_snprint(CE_ring_state, MAX_CE_STR_LEN,
+			    "%s%s", ce, "_dest_ring");
+		qdf_ssr_driver_dump_register_region(CE_ring_state, ce_ring,
+						    sizeof(struct CE_ring_state)
+						   );
+		qdf_snprint(srng, MAX_CE_STR_LEN,
+			    "%s%s", CE_ring_state, "_ctx");
+		qdf_ssr_driver_dump_register_region(srng, ce_ring->srng_ctx,
+						    sizeof(struct hal_srng));
+	}
+	if (CE_state->src_ring) {
+		ce_ring = CE_state->src_ring;
+		qdf_snprint(CE_ring_state, MAX_CE_STR_LEN,
+			    "%s%s", ce, "_src_ring");
+		qdf_ssr_driver_dump_register_region(CE_ring_state, ce_ring,
+						    sizeof(struct CE_ring_state)
+						   );
+		qdf_snprint(srng, MAX_CE_STR_LEN,
+			    "%s%s", CE_ring_state, "_ctx");
+		qdf_ssr_driver_dump_register_region(srng, ce_ring->srng_ctx,
+						    sizeof(struct hal_srng));
+	}
+}
+
+/**
+ * ce_ring_dump_unregister_region() - Unregister CE ring with SSR dump
+ * @CE_state: CE_state pointer
+ * @CE_id: CE id
+ *
+ * Return: None
+ */
+static inline void
+ce_ring_dump_unregister_region(struct CE_state *CE_state, unsigned int CE_id)
+{
+	char ce[MAX_CE_STR_LEN];
+	char CE_ring_state[MAX_CE_STR_LEN];
+	char srng[MAX_CE_STR_LEN];
+
+	qdf_snprint(ce, MAX_CE_STR_LEN, "%s%d", "ce_", CE_id);
+	qdf_ssr_driver_dump_unregister_region(ce);
+	if (CE_state->status_ring) {
+		qdf_snprint(CE_ring_state, MAX_CE_STR_LEN,
+			    "%s%s", ce, "_status_ring");
+		qdf_snprint(srng, MAX_CE_STR_LEN,
+			    "%s%s", CE_ring_state, "_ctx");
+		qdf_ssr_driver_dump_unregister_region(CE_ring_state);
+		qdf_ssr_driver_dump_unregister_region(srng);
+	}
+	if (CE_state->dest_ring) {
+		qdf_snprint(CE_ring_state, MAX_CE_STR_LEN,
+			    "%s%s", ce, "_dest_ring");
+		qdf_snprint(srng, MAX_CE_STR_LEN,
+			    "%s%s", CE_ring_state, "_ctx");
+		qdf_ssr_driver_dump_unregister_region(CE_ring_state);
+		qdf_ssr_driver_dump_unregister_region(srng);
+	}
+	if (CE_state->src_ring) {
+		qdf_snprint(CE_ring_state, MAX_CE_STR_LEN,
+			    "%s%s", ce, "_src_ring");
+		qdf_snprint(srng, MAX_CE_STR_LEN,
+			    "%s%s", CE_ring_state, "_ctx");
+		qdf_ssr_driver_dump_unregister_region(CE_ring_state);
+		qdf_ssr_driver_dump_unregister_region(srng);
+	}
+}
+#else
+static inline
+void ce_ring_dump_register_region(struct CE_state *CE_state, unsigned int CE_id)
+{
+}
+
+static inline void
+ce_ring_dump_unregister_region(struct CE_state *CE_state, unsigned int CE_id)
+{
+}
+#endif
 /*
  * Initialize a Copy Engine based on caller-supplied attributes.
  * This may be called once to initialize both source and destination
@@ -2727,6 +2838,8 @@ struct CE_handle *ce_init(struct hif_softc *scn,
 	ce_mark_datapath(CE_state);
 	scn->ce_id_to_state[CE_id] = CE_state;
 
+	ce_ring_dump_register_region(CE_state, CE_id);
+
 	mem_status = alloc_mem_ce_debug_history(scn, CE_id, attr->src_nentries);
 	if (mem_status != QDF_STATUS_SUCCESS)
 		goto error_target_access;
@@ -2982,6 +3095,8 @@ void ce_fini(struct CE_handle *copyeng)
 
 	qdf_lro_deinit(CE_state->lro_data);
 
+	ce_ring_dump_unregister_region(CE_state, CE_id);
+
 	if (CE_state->src_ring) {
 		/* Cleanup the datapath Tx ring */
 		ce_h2t_tx_ce_cleanup(copyeng);

+ 3 - 0
hif/src/hif_main.c

@@ -57,6 +57,7 @@
 #include <pld_common.h>
 #include "ce_internal.h"
 #include <qdf_tracepoint.h>
+#include "qdf_ssr_driver_dump.h"
 
 void hif_dump(struct hif_opaque_softc *hif_ctx, uint8_t cmd_id, bool start)
 {
@@ -1310,6 +1311,7 @@ struct hif_opaque_softc *hif_open(qdf_device_t qdf_ctx,
 	hif_init_direct_link_rcv_pipe_num(scn);
 	hif_ce_desc_history_log_register(scn);
 	hif_desc_history_log_register();
+	qdf_ssr_driver_dump_register_region("hif", scn, sizeof(*scn));
 
 out:
 	return GET_HIF_OPAQUE_HDL(scn);
@@ -1348,6 +1350,7 @@ void hif_close(struct hif_opaque_softc *hif_ctx)
 		return;
 	}
 
+	qdf_ssr_driver_dump_unregister_region("hif");
 	hif_desc_history_log_unregister();
 	hif_ce_desc_history_log_unregister();
 	hif_latency_detect_deinit(scn);