Jiri Slaby be46ab
From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Jiri Slaby be46ab
Date: Mon, 23 Jan 2023 14:59:28 -0500
Jiri Slaby be46ab
Subject: [PATCH] drm/amd/display: Move DCN314 DOMAIN power control to DMCUB
Jiri Slaby be46ab
References: bsc#1012628
Jiri Slaby be46ab
Patch-mainline: 6.2.2
Jiri Slaby be46ab
Git-commit: e383b12709e32d6494c948422070c2464b637e44
Jiri Slaby be46ab
Jiri Slaby be46ab
commit e383b12709e32d6494c948422070c2464b637e44 upstream.
Jiri Slaby be46ab
Jiri Slaby be46ab
[Why]
Jiri Slaby be46ab
DOMAIN power gating control is now required to be done via firmware
Jiri Slaby be46ab
due to interlock with other power features. This is to avoid
Jiri Slaby be46ab
intermittent issues in the LB memories.
Jiri Slaby be46ab
Jiri Slaby be46ab
[How]
Jiri Slaby be46ab
If the firmware supports the command then use the new firmware as
Jiri Slaby be46ab
the sequence can avoid potential display corruption issues.
Jiri Slaby be46ab
Jiri Slaby be46ab
The command will be ignored on firmware that does not support DOMAIN
Jiri Slaby be46ab
power control and the pipes will remain always on - frequent PG cycling
Jiri Slaby be46ab
can cause the issue to occur on the old sequence, so we should avoid it.
Jiri Slaby be46ab
Jiri Slaby be46ab
Reviewed-by: Hansen Dsouza <hansen.dsouza@amd.com>
Jiri Slaby be46ab
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Jiri Slaby be46ab
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Jiri Slaby be46ab
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Jiri Slaby be46ab
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Jiri Slaby be46ab
Cc: "Limonciello, Mario" <Mario.Limonciello@amd.com>
Jiri Slaby be46ab
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Jiri Slaby be46ab
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Jiri Slaby be46ab
---
Jiri Slaby be46ab
 .../drm/amd/display/dc/dcn314/dcn314_hwseq.c  | 24 ++++++++++++++++++
Jiri Slaby be46ab
 .../drm/amd/display/dc/dcn314/dcn314_hwseq.h  |  2 ++
Jiri Slaby be46ab
 .../drm/amd/display/dc/dcn314/dcn314_init.c   |  2 +-
Jiri Slaby be46ab
 .../gpu/drm/amd/display/dmub/inc/dmub_cmd.h   | 25 +++++++++++++++++++
Jiri Slaby be46ab
 4 files changed, 52 insertions(+), 1 deletion(-)
Jiri Slaby be46ab
Jiri Slaby be46ab
diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c
Jiri Slaby be46ab
index a0741794..8e824dc8 100644
Jiri Slaby be46ab
--- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c
Jiri Slaby be46ab
+++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c
Jiri Slaby be46ab
@@ -391,3 +391,27 @@ void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx)
Jiri Slaby be46ab
 		pipe_ctx->stream_res.stream_enc->funcs->set_input_mode(pipe_ctx->stream_res.stream_enc,
Jiri Slaby be46ab
 				pix_per_cycle);
Jiri Slaby be46ab
 }
Jiri Slaby be46ab
+
Jiri Slaby be46ab
+void dcn314_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool power_on)
Jiri Slaby be46ab
+{
Jiri Slaby be46ab
+	struct dc_context *ctx = hws->ctx;
Jiri Slaby be46ab
+	union dmub_rb_cmd cmd;
Jiri Slaby be46ab
+
Jiri Slaby be46ab
+	if (hws->ctx->dc->debug.disable_hubp_power_gate)
Jiri Slaby be46ab
+		return;
Jiri Slaby be46ab
+
Jiri Slaby be46ab
+	PERF_TRACE();
Jiri Slaby be46ab
+
Jiri Slaby be46ab
+	memset(&cmd, 0, sizeof(cmd));
Jiri Slaby be46ab
+	cmd.domain_control.header.type = DMUB_CMD__VBIOS;
Jiri Slaby be46ab
+	cmd.domain_control.header.sub_type = DMUB_CMD__VBIOS_DOMAIN_CONTROL;
Jiri Slaby be46ab
+	cmd.domain_control.header.payload_bytes = sizeof(cmd.domain_control.data);
Jiri Slaby be46ab
+	cmd.domain_control.data.inst = hubp_inst;
Jiri Slaby be46ab
+	cmd.domain_control.data.power_gate = !power_on;
Jiri Slaby be46ab
+
Jiri Slaby be46ab
+	dc_dmub_srv_cmd_queue(ctx->dmub_srv, &cmd);
Jiri Slaby be46ab
+	dc_dmub_srv_cmd_execute(ctx->dmub_srv);
Jiri Slaby be46ab
+	dc_dmub_srv_wait_idle(ctx->dmub_srv);
Jiri Slaby be46ab
+
Jiri Slaby be46ab
+	PERF_TRACE();
Jiri Slaby be46ab
+}
Jiri Slaby be46ab
diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h
Jiri Slaby be46ab
index 24428029..c419d3db 100644
Jiri Slaby be46ab
--- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h
Jiri Slaby be46ab
+++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h
Jiri Slaby be46ab
@@ -41,4 +41,6 @@ unsigned int dcn314_calculate_dccg_k1_k2_values(struct pipe_ctx *pipe_ctx, unsig
Jiri Slaby be46ab
 
Jiri Slaby be46ab
 void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx);
Jiri Slaby be46ab
 
Jiri Slaby be46ab
+void dcn314_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool power_on);
Jiri Slaby be46ab
+
Jiri Slaby be46ab
 #endif /* __DC_HWSS_DCN314_H__ */
Jiri Slaby be46ab
diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c
Jiri Slaby be46ab
index 31feb4b0..25f345ff 100644
Jiri Slaby be46ab
--- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c
Jiri Slaby be46ab
+++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c
Jiri Slaby be46ab
@@ -137,7 +137,7 @@ static const struct hwseq_private_funcs dcn314_private_funcs = {
Jiri Slaby be46ab
 	.plane_atomic_disable = dcn20_plane_atomic_disable,
Jiri Slaby be46ab
 	.plane_atomic_power_down = dcn10_plane_atomic_power_down,
Jiri Slaby be46ab
 	.enable_power_gating_plane = dcn314_enable_power_gating_plane,
Jiri Slaby be46ab
-	.hubp_pg_control = dcn31_hubp_pg_control,
Jiri Slaby be46ab
+	.hubp_pg_control = dcn314_hubp_pg_control,
Jiri Slaby be46ab
 	.program_all_writeback_pipes_in_tree = dcn30_program_all_writeback_pipes_in_tree,
Jiri Slaby be46ab
 	.update_odm = dcn314_update_odm,
Jiri Slaby be46ab
 	.dsc_pg_control = dcn314_dsc_pg_control,
Jiri Slaby be46ab
diff --git a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
Jiri Slaby be46ab
index 33907fee..8fea8e42 100644
Jiri Slaby be46ab
--- a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
Jiri Slaby be46ab
+++ b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
Jiri Slaby be46ab
@@ -457,6 +457,10 @@ enum dmub_cmd_vbios_type {
Jiri Slaby be46ab
 	 * Query DP alt status on a transmitter.
Jiri Slaby be46ab
 	 */
Jiri Slaby be46ab
 	DMUB_CMD__VBIOS_TRANSMITTER_QUERY_DP_ALT  = 26,
Jiri Slaby be46ab
+	/**
Jiri Slaby be46ab
+	 * Controls domain power gating
Jiri Slaby be46ab
+	 */
Jiri Slaby be46ab
+	DMUB_CMD__VBIOS_DOMAIN_CONTROL = 28,
Jiri Slaby be46ab
 };
Jiri Slaby be46ab
 
Jiri Slaby be46ab
 //==============================================================================
Jiri Slaby be46ab
@@ -1204,6 +1208,23 @@ struct dmub_rb_cmd_dig1_transmitter_control {
Jiri Slaby be46ab
 	union dmub_cmd_dig1_transmitter_control_data transmitter_control; /**< payload */
Jiri Slaby be46ab
 };
Jiri Slaby be46ab
 
Jiri Slaby be46ab
+/**
Jiri Slaby be46ab
+ * struct dmub_rb_cmd_domain_control_data - Data for DOMAIN power control
Jiri Slaby be46ab
+ */
Jiri Slaby be46ab
+struct dmub_rb_cmd_domain_control_data {
Jiri Slaby be46ab
+	uint8_t inst : 6; /**< DOMAIN instance to control */
Jiri Slaby be46ab
+	uint8_t power_gate : 1; /**< 1=power gate, 0=power up */
Jiri Slaby be46ab
+	uint8_t reserved[3]; /**< Reserved for future use */
Jiri Slaby be46ab
+};
Jiri Slaby be46ab
+
Jiri Slaby be46ab
+/**
Jiri Slaby be46ab
+ * struct dmub_rb_cmd_domain_control - Controls DOMAIN power gating
Jiri Slaby be46ab
+ */
Jiri Slaby be46ab
+struct dmub_rb_cmd_domain_control {
Jiri Slaby be46ab
+	struct dmub_cmd_header header; /**< header */
Jiri Slaby be46ab
+	struct dmub_rb_cmd_domain_control_data data; /**< payload */
Jiri Slaby be46ab
+};
Jiri Slaby be46ab
+
Jiri Slaby be46ab
 /**
Jiri Slaby be46ab
  * DPIA tunnel command parameters.
Jiri Slaby be46ab
  */
Jiri Slaby be46ab
@@ -3231,6 +3252,10 @@ union dmub_rb_cmd {
Jiri Slaby be46ab
 	 * Definition of a DMUB_CMD__VBIOS_DIG1_TRANSMITTER_CONTROL command.
Jiri Slaby be46ab
 	 */
Jiri Slaby be46ab
 	struct dmub_rb_cmd_dig1_transmitter_control dig1_transmitter_control;
Jiri Slaby be46ab
+	/**
Jiri Slaby be46ab
+	 * Definition of a DMUB_CMD__VBIOS_DOMAIN_CONTROL command.
Jiri Slaby be46ab
+	 */
Jiri Slaby be46ab
+	struct dmub_rb_cmd_domain_control domain_control;
Jiri Slaby be46ab
 	/**
Jiri Slaby be46ab
 	 * Definition of a DMUB_CMD__PSR_SET_VERSION command.
Jiri Slaby be46ab
 	 */
Jiri Slaby be46ab
-- 
Jiri Slaby be46ab
2.35.3
Jiri Slaby be46ab