diff options
| author | Maxime Ripard <mripard@kernel.org> | 2025-09-02 10:32:50 +0200 |
|---|---|---|
| committer | Maxime Ripard <mripard@kernel.org> | 2025-09-30 11:57:12 +0200 |
| commit | b83c30ac9d3d2c15cd7e1d013ec9ff73ef945405 (patch) | |
| tree | b79f4c8b798eca330a16349c021275c91d1f7217 /drivers/gpu/drm/tidss | |
| parent | ec1049f66df4751e87c036cd2e45a38a7649d8af (diff) | |
drm/tidss: crtc: Cleanup reset implementation
The tidss_crtc_reset() function will (rightfully) destroy any
pre-existing state.
However, the tidss CRTC driver has its own CRTC state structure that
subclasses drm_crtc_state, and yet will destroy the previous state
by calling __drm_atomic_helper_crtc_destroy_state() and kfree() on its
drm_crtc_state pointer.
It works only because the drm_crtc_state is the first field in the
structure, and thus its offset is 0. It's incredibly fragile however, so
let's call our destroy implementation in such a case to deal with it
properly.
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://lore.kernel.org/r/20250902-drm-state-readout-v1-22-14ad5315da3f@kernel.org
Signed-off-by: Maxime Ripard <mripard@kernel.org>
Link: https://lore.kernel.org/r/20250902-drm-state-readout-v1-22-14ad5315da3f@kernel.org
Diffstat (limited to 'drivers/gpu/drm/tidss')
| -rw-r--r-- | drivers/gpu/drm/tidss/tidss_crtc.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/drivers/gpu/drm/tidss/tidss_crtc.c b/drivers/gpu/drm/tidss/tidss_crtc.c index eb431a238b11..8fcc6a2f9477 100644 --- a/drivers/gpu/drm/tidss/tidss_crtc.c +++ b/drivers/gpu/drm/tidss/tidss_crtc.c @@ -357,9 +357,7 @@ static void tidss_crtc_reset(struct drm_crtc *crtc) struct tidss_crtc_state *tstate; if (crtc->state) - __drm_atomic_helper_crtc_destroy_state(crtc->state); - - kfree(crtc->state); + tidss_crtc_destroy_state(crtc, crtc->state); tstate = kzalloc(sizeof(*tstate), GFP_KERNEL); if (!tstate) { |