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()
v3: - remove uneccessary include (jani) Signed-off-by: Melissa Wen <m...@igalia.com> --- drivers/gpu/drm/amd/display/amdgpu_dm/dc_edid.c | 6 ++++++ 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 | 1 + include/drm/drm_edid.h | 4 ++-- 5 files changed, 13 insertions(+), 2 deletions(-) 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 a90545b176cc..9e86dc15557b 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,8 @@ void dc_edid_copy_edid_to_dc(struct dc_sink *dc_sink, memmove(dc_sink->dc_edid.raw_edid, 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 86feef038de6..cf56a0405a4f 100644 --- a/drivers/gpu/drm/amd/display/dc/dc.h +++ b/drivers/gpu/drm/amd/display/dc/dc.h @@ -2466,6 +2466,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; diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index e7a9a4928b97..8617d2285f38 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h @@ -469,8 +469,8 @@ int drm_edid_connector_update(struct drm_connector *connector, const struct drm_edid *edid); int drm_edid_connector_add_modes(struct drm_connector *connector); bool drm_edid_is_digital(const struct drm_edid *drm_edid); -bool drm_edid_eq(const struct drm_edid *drm_edid_first, - const struct drm_edid *drm_edid_second); +bool drm_edid_eq(const struct drm_edid *drm_edid_1, + const struct drm_edid *drm_edid_2); void drm_edid_get_product_id(const struct drm_edid *drm_edid, struct drm_edid_product_id *id); void drm_edid_print_product_id(struct drm_printer *p, -- 2.47.2