Add Linux opaque object to dc_sink for storing edid data cross driver, drm_edid. Also include the Linux call to free this object, the drm_edid_free()
Signed-off-by: Melissa Wen <m...@igalia.com> --- drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c | 7 +++++++ drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h | 1 + drivers/gpu/drm/amd/display/dc/core/dc_sink.c | 3 +++ drivers/gpu/drm/amd/display/dc/dc.h | 3 +++ 4 files changed, 14 insertions(+) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c index 39fcaa16a14a..fa0f0e61f05d 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT #include "amdgpu_dm/dc_edid.h" #include "dc.h" +#include <drm/drm_edid.h> bool dc_edid_is_same_edid(struct dc_sink *prev_sink, struct dc_sink *current_sink) @@ -25,3 +26,9 @@ void dc_edid_copy_edid_to_dc(struct dc_sink *dc_sink, memmove(dc_sink->dc_edid.raw_edid, (const uint8_t *) edid, len); dc_sink->dc_edid.length = len; } + + +void dc_edid_sink_edid_free(struct dc_sink *sink) +{ + drm_edid_free(sink->drm_edid); +} diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h index f42cd5bbc730..2c76768be459 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.h @@ -9,5 +9,6 @@ bool dc_edid_is_same_edid(struct dc_sink *prev_sink, struct dc_sink *current_sink); void dc_edid_copy_edid_to_dc(struct dc_sink *dc_sink, const void *edid, int len); +void dc_edid_sink_edid_free(struct dc_sink *sink); #endif /* __DC_EDID_H__ */ diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_sink.c b/drivers/gpu/drm/amd/display/dc/core/dc_sink.c index 455fa5dd1420..3774a3245506 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_sink.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_sink.c @@ -26,6 +26,7 @@ #include "dm_services.h" #include "dm_helpers.h" #include "core_types.h" +#include "dc_edid.h" /******************************************************************************* * Private functions @@ -65,6 +66,8 @@ void dc_sink_retain(struct dc_sink *sink) static void dc_sink_free(struct kref *kref) { struct dc_sink *sink = container_of(kref, struct dc_sink, refcount); + + dc_edid_sink_edid_free(sink); kfree(sink->dc_container_id); kfree(sink); } diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h index c93e074ea736..54f6ed33e373 100644 --- a/drivers/gpu/drm/amd/display/dc/dc.h +++ b/drivers/gpu/drm/amd/display/dc/dc.h @@ -46,6 +46,8 @@ #include "dmub/inc/dmub_cmd.h" +#include <drm/drm_edid.h> + struct abm_save_restore; /* forward declaration */ @@ -2433,6 +2435,7 @@ struct scdc_caps { struct dc_sink { enum signal_type sink_signal; struct dc_edid dc_edid; /* raw edid */ + const struct drm_edid *drm_edid; /* Linux DRM edid*/ struct dc_edid_caps edid_caps; /* parse display caps */ struct dc_container_id *dc_container_id; uint32_t dongle_max_pix_clk; -- 2.47.2