drm/vc4: crtc: Rework a bit the CRTC state code

The current CRTC state reset hook in vc4 allocates a vc4_crtc_state
structure as a drm_crtc_state, and relies on the fact that vc4_crtc_state
embeds drm_crtc_state as its first member, and therefore can be safely
cast.

However, this is pretty fragile especially since there's no check for this
in place, and we're going to need to access vc4_crtc_state member at reset
so this looks like a good occasion to make it more robust.

Fixes: 6d6e500391 ("drm/vc4: Allocate the right amount of space for boot-time CRTC state.")
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Tested-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200923084032.218619-1-maxime@cerno.tech
This commit is contained in:
Maxime Ripard 2020-09-23 10:40:31 +02:00
parent de19456135
commit 427c4a0680
No known key found for this signature in database
GPG Key ID: E3EF0D6F671851C5

View File

@ -852,11 +852,18 @@ void vc4_crtc_destroy_state(struct drm_crtc *crtc,
void vc4_crtc_reset(struct drm_crtc *crtc)
{
struct vc4_crtc_state *vc4_crtc_state;
if (crtc->state)
vc4_crtc_destroy_state(crtc, crtc->state);
crtc->state = kzalloc(sizeof(struct vc4_crtc_state), GFP_KERNEL);
if (crtc->state)
__drm_atomic_helper_crtc_reset(crtc, crtc->state);
vc4_crtc_state = kzalloc(sizeof(*vc4_crtc_state), GFP_KERNEL);
if (!vc4_crtc_state) {
crtc->state = NULL;
return;
}
__drm_atomic_helper_crtc_reset(crtc, &vc4_crtc_state->base);
}
static const struct drm_crtc_funcs vc4_crtc_funcs = {