On Thu, 2025-11-06 at 13:49 -0300, 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() > > v7: > - put new edid-related helpers in dm_helpers (Harry) > > Signed-off-by: Melissa Wen <[email protected]> > --- > drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 5 +++++ > drivers/gpu/drm/amd/display/dc/core/dc_sink.c | 2 ++ > drivers/gpu/drm/amd/display/dc/dc.h | 1 + > drivers/gpu/drm/amd/display/dc/dm_helpers.h | 1 + > 4 files changed, 9 insertions(+) > > diff --git > a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c > index a7ad93c2eb5f..419852dfc237 100644 > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c > @@ -1007,6 +1007,11 @@ void dm_helpers_copy_edid_to_dc(struct dc_sink > *dc_sink, > dc_sink->dc_edid.length = len; > } > > +void dm_helpers_sink_edid_free(struct dc_sink *sink) > +{ > + drm_edid_free(sink->drm_edid); > +} > + > enum dc_edid_status dm_helpers_read_local_edid( > struct dc_context *ctx, > struct dc_link *link, > 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..a5b9081879e3 100644 > --- a/drivers/gpu/drm/amd/display/dc/core/dc_sink.c > +++ b/drivers/gpu/drm/amd/display/dc/core/dc_sink.c > @@ -65,6 +65,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); > + > + dm_helpers_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 2efb9add13ff..3cf7507d11fa 100644 > --- a/drivers/gpu/drm/amd/display/dc/dc.h > +++ b/drivers/gpu/drm/amd/display/dc/dc.h > @@ -2576,6 +2576,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 */
If we want DC to be platform-agnostic, I don't think we should use pointers to DRM structures here. I am not an expert, but I assume that DC needs an EDID on other platforms as well. How about something like this? const void *platform_edid; /* Pointer to platform specific EDID struct */ Then, on Linux this can be the drm_edid and on other platforms it can be an equivalent struct. > 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/drivers/gpu/drm/amd/display/dc/dm_helpers.h > b/drivers/gpu/drm/amd/display/dc/dm_helpers.h > index 0415cb50fe32..e23204fdd3f5 100644 > --- a/drivers/gpu/drm/amd/display/dc/dm_helpers.h > +++ b/drivers/gpu/drm/amd/display/dc/dm_helpers.h > @@ -68,6 +68,7 @@ bool dm_helpers_is_same_edid(struct dc_sink > *prev_sink, > void dm_helpers_copy_edid_to_dc(struct dc_sink *dc_sink, > const void *edid, int len); > > +void dm_helpers_sink_edid_free(struct dc_sink *sink); > > /* > * Update DP branch info
