On 2025-06-18 11:19, Melissa Wen wrote: > 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> > > --- > > v3: > - remove uneccessary include (jani) > > v5: > - fix comment (Mario) > --- > 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 + > 4 files changed, 11 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 b4ccc111fa08..493815829aa5 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 "dc.h" > #include "dc_edid.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..63526b539bd3 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 */ On second thought I think I can live with this. DC will only ever treat this as an opaque pointer and never look at the actual struct (or know the struct definition). Harry > struct dc_edid_caps edid_caps; /* parse display caps */ > struct dc_container_id *dc_container_id; > uint32_t dongle_max_pix_clk;