diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_atomic_plane.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_atomic_plane.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_atomic_plane.c b/drivers/gpu/drm/i915/intel_atomic_plane.c index dbe9fb41ae53..8d3e515f27ba 100644 --- a/drivers/gpu/drm/i915/intel_atomic_plane.c +++ b/drivers/gpu/drm/i915/intel_atomic_plane.c | |||
@@ -85,6 +85,8 @@ intel_plane_duplicate_state(struct drm_plane *plane) | |||
85 | 85 | ||
86 | __drm_atomic_helper_plane_duplicate_state(plane, state); | 86 | __drm_atomic_helper_plane_duplicate_state(plane, state); |
87 | 87 | ||
88 | intel_state->vma = NULL; | ||
89 | |||
88 | return state; | 90 | return state; |
89 | } | 91 | } |
90 | 92 | ||
@@ -100,6 +102,24 @@ void | |||
100 | intel_plane_destroy_state(struct drm_plane *plane, | 102 | intel_plane_destroy_state(struct drm_plane *plane, |
101 | struct drm_plane_state *state) | 103 | struct drm_plane_state *state) |
102 | { | 104 | { |
105 | struct i915_vma *vma; | ||
106 | |||
107 | vma = fetch_and_zero(&to_intel_plane_state(state)->vma); | ||
108 | |||
109 | /* | ||
110 | * FIXME: Normally intel_cleanup_plane_fb handles destruction of vma. | ||
111 | * We currently don't clear all planes during driver unload, so we have | ||
112 | * to be able to unpin vma here for now. | ||
113 | * | ||
114 | * Normally this can only happen during unload when kmscon is disabled | ||
115 | * and userspace doesn't attempt to set a framebuffer at all. | ||
116 | */ | ||
117 | if (vma) { | ||
118 | mutex_lock(&plane->dev->struct_mutex); | ||
119 | intel_unpin_fb_vma(vma); | ||
120 | mutex_unlock(&plane->dev->struct_mutex); | ||
121 | } | ||
122 | |||
103 | drm_atomic_helper_plane_destroy_state(plane, state); | 123 | drm_atomic_helper_plane_destroy_state(plane, state); |
104 | } | 124 | } |
105 | 125 | ||