@@ -303,11 +303,28 @@ static const struct drm_plane_helper_funcs apple_plane_helper_funcs = {
303303 .atomic_update = apple_plane_atomic_update ,
304304};
305305
306+ // Duplicate drm_atomic_helper_plane_reset but allocate struct apple_plane_state
307+ static void apple_plane_reset (struct drm_plane * plane )
308+ {
309+ struct apple_plane_state * state = to_apple_plane_state (plane -> state );
310+ if (state )
311+ __drm_atomic_helper_plane_destroy_state (& state -> base );
312+
313+ kfree (state );
314+ plane -> state = NULL ;
315+ state = kzalloc (sizeof (* state ), GFP_KERNEL );
316+ if (state )
317+ __drm_atomic_helper_plane_reset (plane , & state -> base );
318+ }
319+
306320static struct drm_plane_state *
307321apple_plane_duplicate_state (struct drm_plane * plane )
308322{
309323 struct apple_plane_state * apple_plane_state , * old_apple_plane_state ;
310324
325+ if (!plane -> state )
326+ return NULL ;
327+
311328 old_apple_plane_state = to_apple_plane_state (plane -> state );
312329 apple_plane_state = kzalloc (sizeof (* apple_plane_state ), GFP_KERNEL );
313330 if (!apple_plane_state )
@@ -329,7 +346,7 @@ apple_plane_duplicate_state(struct drm_plane *plane)
329346static const struct drm_plane_funcs apple_plane_funcs = {
330347 .update_plane = drm_atomic_helper_update_plane ,
331348 .disable_plane = drm_atomic_helper_disable_plane ,
332- .reset = drm_atomic_helper_plane_reset ,
349+ .reset = apple_plane_reset ,
333350 .atomic_duplicate_state = apple_plane_duplicate_state ,
334351 // .atomic_destroy_state = apple_plane_destroy_state,
335352 .atomic_destroy_state = drm_atomic_helper_plane_destroy_state ,
0 commit comments