drm/amd/display: fix resource saving missing when power state switch
authorTao.Huang <Tao.Huang@amd.com>
Mon, 6 May 2019 08:26:54 +0000 (16:26 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 11 Jun 2019 17:48:56 +0000 (12:48 -0500)
Signed-off-by: Tao.Huang <Tao.Huang@amd.com>
Reviewed-by: Jun Lei <Jun.Lei@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c

index d89a29bd878592af16eb3c35c1d659c49257e7d9..0bff546d3727db6dd5db15e8a6fe40689196283c 100644 (file)
@@ -1930,6 +1930,12 @@ void dc_set_power_state(
        enum dc_acpi_cm_power_state power_state)
 {
        struct kref refcount;
+       struct display_mode_lib *dml = kzalloc(sizeof(struct display_mode_lib),
+                                               GFP_KERNEL);
+
+       ASSERT(dml);
+       if (!dml)
+               return;
 
        switch (power_state) {
        case DC_ACPI_CM_POWER_STATE_D0:
@@ -1946,15 +1952,20 @@ void dc_set_power_state(
 
                /* Preserve refcount */
                refcount = dc->current_state->refcount;
+               /* Preserve display mode lib */
+               memcpy(dml, &dc->current_state->bw_ctx.dml, sizeof(struct display_mode_lib));
+
                dc_resource_state_destruct(dc->current_state);
                memset(dc->current_state, 0,
                                sizeof(*dc->current_state));
 
                dc->current_state->refcount = refcount;
+               dc->current_state->bw_ctx.dml = *dml;
 
                break;
        }
 
+       kfree(dml);
 }
 
 void dc_resume(struct dc *dc)