Explorar o código

disp: msm: dp: create dp aux log ipc context at probe time

Currently the ipc context for drm_dp_aux is being created
during dp_aux_init. This limits the IPC logs to be only
readable when the external display is in connected state
and it gets destroyed on unplug. This change moves the
context creation to probe time and the aux context will
be passed to the aux driver during initialization.

Change-Id: Id8d26c907c9cb2fd8c89b2842b98e7a908816abe
Signed-off-by: Rajkumar Subbiah <[email protected]>
Rajkumar Subbiah %!s(int64=2) %!d(string=hai) anos
pai
achega
ae1ea3d993
Modificáronse 4 ficheiros con 17 adicións e 15 borrados
  1. 3 11
      msm/dp/dp_aux.c
  2. 2 2
      msm/dp/dp_aux.h
  3. 11 2
      msm/dp/dp_display.c
  4. 1 0
      msm/dp/dp_display.h

+ 3 - 11
msm/dp/dp_aux.c

@@ -229,7 +229,7 @@ static int dp_aux_cmd_fifo_tx(struct dp_aux_private *aux,
 		ret = len;
 	} else {
 		DP_AUX_ERR_RATELIMITED(dp_aux, "aux err: %s\n",
-			dp_aux_get_error(aux->aux_error_num));
+				dp_aux_get_error(aux->aux_error_num));
 		ret = -EINVAL;
 	}
 
@@ -655,10 +655,6 @@ static void dp_aux_init(struct dp_aux *dp_aux, struct dp_aux_cfg *aux_cfg)
 	if (aux->enabled)
 		return;
 
-	dp_aux->ipc_log_context = ipc_log_context_create(DP_AUX_IPC_NUM_PAGES, "drm_dp_aux", 0);
-	if (!dp_aux->ipc_log_context)
-		DP_AUX_WARN(dp_aux, "Error in creating dp_aux_ipc_log context\n");
-
 	dp_aux_reset_phy_config_indices(aux_cfg);
 	aux->catalog->setup(aux->catalog, aux_cfg);
 	aux->catalog->reset(aux->catalog);
@@ -682,11 +678,6 @@ static void dp_aux_deinit(struct dp_aux *dp_aux)
 	if (!aux->enabled)
 		return;
 
-	if (dp_aux->ipc_log_context) {
-		ipc_log_context_destroy(dp_aux->ipc_log_context);
-		dp_aux->ipc_log_context = NULL;
-	}
-
 	atomic_set(&aux->aborted, 1);
 	aux->catalog->enable(aux->catalog, false);
 	aux->enabled = false;
@@ -870,7 +861,7 @@ end:
 
 struct dp_aux *dp_aux_get(struct device *dev, struct dp_catalog_aux *catalog,
 		struct dp_parser *parser, struct device_node *aux_switch,
-		struct dp_aux_bridge *aux_bridge)
+		struct dp_aux_bridge *aux_bridge, void *ipc_log_context)
 {
 	int rc = 0;
 	struct dp_aux_private *aux;
@@ -908,6 +899,7 @@ struct dp_aux *dp_aux_get(struct device *dev, struct dp_catalog_aux *catalog,
 	dp_aux->reconfig = dp_aux_reconfig;
 	dp_aux->abort = dp_aux_abort_transaction;
 	dp_aux->set_sim_mode = dp_aux_set_sim_mode;
+	dp_aux->ipc_log_context = ipc_log_context;
 
 #if IS_ENABLED(CONFIG_QCOM_FSA4480_I2C)
 	dp_aux->switch_configure = dp_aux_configure_fsa_switch;

+ 2 - 2
msm/dp/dp_aux.h

@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
- * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
  * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
  */
 
@@ -64,7 +64,7 @@ struct dp_aux {
 
 struct dp_aux *dp_aux_get(struct device *dev, struct dp_catalog_aux *catalog,
 		struct dp_parser *parser, struct device_node *aux_switch,
-		struct dp_aux_bridge *aux_bridge);
+		struct dp_aux_bridge *aux_bridge, void *ipc_log_context);
 void dp_aux_put(struct dp_aux *aux);
 
 #endif /*__DP_AUX_H_*/

+ 11 - 2
msm/dp/dp_display.c

@@ -2106,7 +2106,7 @@ static int dp_init_sub_modules(struct dp_display_private *dp)
 	}
 
 	dp->aux = dp_aux_get(dev, &dp->catalog->aux, dp->parser,
-			dp->aux_switch_node, dp->aux_bridge);
+			dp->aux_switch_node, dp->aux_bridge, g_dp_display->dp_aux_ipc_log);
 	if (IS_ERR(dp->aux)) {
 		rc = PTR_ERR(dp->aux);
 		DP_ERR("failed to initialize aux, rc = %d\n", rc);
@@ -3668,7 +3668,11 @@ static int dp_display_probe(struct platform_device *pdev)
 
 	g_dp_display->dp_ipc_log = ipc_log_context_create(DRM_DP_IPC_NUM_PAGES, "drm_dp", 0);
 	if (!g_dp_display->dp_ipc_log)
-		DP_WARN("Error in creating ipc_log_context\n");
+		DP_WARN("Error in creating ipc_log_context for drm_dp\n");
+	g_dp_display->dp_aux_ipc_log = ipc_log_context_create(DRM_DP_IPC_NUM_PAGES, "drm_dp_aux",
+			0);
+	if (!g_dp_display->dp_aux_ipc_log)
+		DP_WARN("Error in creating ipc_log_context for drm_dp_aux\n");
 
 	g_dp_display->enable        = dp_display_enable;
 	g_dp_display->post_enable   = dp_display_post_enable;
@@ -3788,6 +3792,11 @@ static int dp_display_remove(struct platform_device *pdev)
 		g_dp_display->dp_ipc_log = NULL;
 	}
 
+	if (g_dp_display->dp_aux_ipc_log) {
+		ipc_log_context_destroy(g_dp_display->dp_aux_ipc_log);
+		g_dp_display->dp_aux_ipc_log = NULL;
+	}
+
 	return 0;
 }
 

+ 1 - 0
msm/dp/dp_display.h

@@ -51,6 +51,7 @@ struct dp_display {
 	u32 max_mixer_count;
 	u32 max_dsc_count;
 	void *dp_ipc_log;
+	void *dp_aux_ipc_log;
 
 	int (*enable)(struct dp_display *dp_display, void *panel);
 	int (*post_enable)(struct dp_display *dp_display, void *panel);