Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: Pass panel inst to a PSR command

[why]
PSR set power command wasn't setting panel instance
and command version which caused both streams
to overwrite the same PSR state.
[how]
Pass panel instance to the set power command function
and to DMUB and set command version enum

Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Anson Jacob <Anson.Jacob@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Mikita Lipski <mikita.lipski@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Mikita Lipski and committed by
Alex Deucher
f0d0c391 ebd1e719

+5 -3
+1 -1
drivers/gpu/drm/amd/display/dc/core/dc_link.c
··· 2997 2997 link->psr_settings.psr_power_opt = *power_opts; 2998 2998 2999 2999 if (psr != NULL && link->psr_settings.psr_feature_enabled && psr->funcs->psr_set_power_opt) 3000 - psr->funcs->psr_set_power_opt(psr, link->psr_settings.psr_power_opt); 3000 + psr->funcs->psr_set_power_opt(psr, link->psr_settings.psr_power_opt, panel_inst); 3001 3001 } 3002 3002 3003 3003 /* Enable or Disable PSR */
+3 -1
drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c
··· 230 230 /** 231 231 * Set PSR power optimization flags. 232 232 */ 233 - static void dmub_psr_set_power_opt(struct dmub_psr *dmub, unsigned int power_opt) 233 + static void dmub_psr_set_power_opt(struct dmub_psr *dmub, unsigned int power_opt, uint8_t panel_inst) 234 234 { 235 235 union dmub_rb_cmd cmd; 236 236 struct dc_context *dc = dmub->ctx; ··· 239 239 cmd.psr_set_power_opt.header.type = DMUB_CMD__PSR; 240 240 cmd.psr_set_power_opt.header.sub_type = DMUB_CMD__SET_PSR_POWER_OPT; 241 241 cmd.psr_set_power_opt.header.payload_bytes = sizeof(struct dmub_cmd_psr_set_power_opt_data); 242 + cmd.psr_set_power_opt.psr_set_power_opt_data.cmd_version = DMUB_CMD_PSR_CONTROL_VERSION_1; 242 243 cmd.psr_set_power_opt.psr_set_power_opt_data.power_opt = power_opt; 244 + cmd.psr_set_power_opt.psr_set_power_opt_data.panel_inst = panel_inst; 243 245 244 246 dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); 245 247 dc_dmub_srv_cmd_execute(dc->dmub_srv);
+1 -1
drivers/gpu/drm/amd/display/dc/dce/dmub_psr.h
··· 46 46 void (*psr_force_static)(struct dmub_psr *dmub, uint8_t panel_inst); 47 47 void (*psr_get_residency)(struct dmub_psr *dmub, uint32_t *residency, 48 48 uint8_t panel_inst); 49 - void (*psr_set_power_opt)(struct dmub_psr *dmub, unsigned int power_opt); 49 + void (*psr_set_power_opt)(struct dmub_psr *dmub, unsigned int power_opt, uint8_t panel_inst); 50 50 }; 51 51 52 52 struct dmub_psr *dmub_psr_create(struct dc_context *ctx);