Commit 427c4a06 authored by Maxime Ripard's avatar Maxime Ripard

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: 6d6e5003 ("drm/vc4: Allocate the right amount of space for boot-time CRTC state.")
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Tested-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.com>
Reviewed-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200923084032.218619-1-maxime@cerno.tech
parent de194561
...@@ -852,11 +852,18 @@ void vc4_crtc_destroy_state(struct drm_crtc *crtc, ...@@ -852,11 +852,18 @@ void vc4_crtc_destroy_state(struct drm_crtc *crtc,
void vc4_crtc_reset(struct drm_crtc *crtc) void vc4_crtc_reset(struct drm_crtc *crtc)
{ {
struct vc4_crtc_state *vc4_crtc_state;
if (crtc->state) if (crtc->state)
vc4_crtc_destroy_state(crtc, crtc->state); vc4_crtc_destroy_state(crtc, crtc->state);
crtc->state = kzalloc(sizeof(struct vc4_crtc_state), GFP_KERNEL);
if (crtc->state) vc4_crtc_state = kzalloc(sizeof(*vc4_crtc_state), GFP_KERNEL);
__drm_atomic_helper_crtc_reset(crtc, crtc->state); 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 = { static const struct drm_crtc_funcs vc4_crtc_funcs = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment