|
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 |
|