Lines Matching +full:a +full:- +full:display

4  * Permission is hereby granted, free of charge, to any person obtaining a
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
33 * To be able to do so we track frontbuffers using a bitmask for all possible
37 * and when the frontbuffer is exchanged with a flip. Subsystems interested in
42 * On a high level there are two types of powersaving features. The first one
43 * work like a special cache (FBC and PSR) and are interested when they should
51 * The other type of display power saving feature only cares about busyness
70 * frontbuffer_flush - flush frontbuffer
86 spin_lock(&i915->display.fb_tracking.lock); in frontbuffer_flush()
87 frontbuffer_bits &= ~i915->display.fb_tracking.busy_bits; in frontbuffer_flush()
88 spin_unlock(&i915->display.fb_tracking.lock); in frontbuffer_flush()
102 * intel_frontbuffer_flip_prepare - prepare asynchronous frontbuffer flip
106 * This function gets called after scheduling a flip on @obj. The actual
116 spin_lock(&i915->display.fb_tracking.lock); in intel_frontbuffer_flip_prepare()
117 i915->display.fb_tracking.flip_bits |= frontbuffer_bits; in intel_frontbuffer_flip_prepare()
119 i915->display.fb_tracking.busy_bits &= ~frontbuffer_bits; in intel_frontbuffer_flip_prepare()
120 spin_unlock(&i915->display.fb_tracking.lock); in intel_frontbuffer_flip_prepare()
124 * intel_frontbuffer_flip_complete - complete asynchronous frontbuffer flip
136 spin_lock(&i915->display.fb_tracking.lock); in intel_frontbuffer_flip_complete()
138 frontbuffer_bits &= i915->display.fb_tracking.flip_bits; in intel_frontbuffer_flip_complete()
139 i915->display.fb_tracking.flip_bits &= ~frontbuffer_bits; in intel_frontbuffer_flip_complete()
140 spin_unlock(&i915->display.fb_tracking.lock); in intel_frontbuffer_flip_complete()
147 * intel_frontbuffer_flip - synchronous frontbuffer flip
151 * This function gets called after scheduling a flip on @obj. This is for
160 spin_lock(&i915->display.fb_tracking.lock); in intel_frontbuffer_flip()
162 i915->display.fb_tracking.busy_bits &= ~frontbuffer_bits; in intel_frontbuffer_flip()
163 spin_unlock(&i915->display.fb_tracking.lock); in intel_frontbuffer_flip()
172 struct drm_i915_private *i915 = intel_bo_to_i915(front->obj); in __intel_fb_invalidate()
175 spin_lock(&i915->display.fb_tracking.lock); in __intel_fb_invalidate()
176 i915->display.fb_tracking.busy_bits |= frontbuffer_bits; in __intel_fb_invalidate()
177 i915->display.fb_tracking.flip_bits &= ~frontbuffer_bits; in __intel_fb_invalidate()
178 spin_unlock(&i915->display.fb_tracking.lock); in __intel_fb_invalidate()
193 struct drm_i915_private *i915 = intel_bo_to_i915(front->obj); in __intel_fb_flush()
196 spin_lock(&i915->display.fb_tracking.lock); in __intel_fb_flush()
198 frontbuffer_bits &= i915->display.fb_tracking.busy_bits; in __intel_fb_flush()
199 i915->display.fb_tracking.busy_bits &= ~frontbuffer_bits; in __intel_fb_flush()
200 spin_unlock(&i915->display.fb_tracking.lock); in __intel_fb_flush()
212 i915_gem_object_flush_if_display(front->obj); in intel_frontbuffer_flush_work()
218 * intel_frontbuffer_queue_flush - queue flushing frontbuffer object
229 kref_get(&front->ref); in intel_frontbuffer_queue_flush()
230 if (!schedule_work(&front->flush_work)) in intel_frontbuffer_queue_flush()
239 kref_get(&front->ref); in frontbuffer_active()
253 __releases(&intel_bo_to_i915(front->obj)->display.fb_tracking.lock) in frontbuffer_release()
257 struct drm_i915_gem_object *obj = front->obj; in frontbuffer_release()
259 drm_WARN_ON(&intel_bo_to_i915(obj)->drm, atomic_read(&front->bits)); in frontbuffer_release()
264 drm_WARN_ON(&intel_bo_to_i915(obj)->drm, ret); in frontbuffer_release()
265 spin_unlock(&intel_bo_to_i915(obj)->display.fb_tracking.lock); in frontbuffer_release()
267 i915_active_fini(&front->write); in frontbuffer_release()
285 front->obj = obj; in intel_frontbuffer_get()
286 kref_init(&front->ref); in intel_frontbuffer_get()
287 atomic_set(&front->bits, 0); in intel_frontbuffer_get()
288 i915_active_init(&front->write, in intel_frontbuffer_get()
292 INIT_WORK(&front->flush_work, intel_frontbuffer_flush_work); in intel_frontbuffer_get()
294 spin_lock(&i915->display.fb_tracking.lock); in intel_frontbuffer_get()
296 spin_unlock(&i915->display.fb_tracking.lock); in intel_frontbuffer_get()
304 kref_put_lock(&front->ref, in intel_frontbuffer_put()
306 &intel_bo_to_i915(front->obj)->display.fb_tracking.lock); in intel_frontbuffer_put()
310 * intel_frontbuffer_track - update frontbuffer tracking
324 * the owning plane->mutex, i.e. we can never see concurrent in intel_frontbuffer_track()
325 * manipulation of individual bits. But since the bitfield as a whole in intel_frontbuffer_track()
335 drm_WARN_ON(&intel_bo_to_i915(old->obj)->drm, in intel_frontbuffer_track()
336 !(atomic_read(&old->bits) & frontbuffer_bits)); in intel_frontbuffer_track()
337 atomic_andnot(frontbuffer_bits, &old->bits); in intel_frontbuffer_track()
341 drm_WARN_ON(&intel_bo_to_i915(new->obj)->drm, in intel_frontbuffer_track()
342 atomic_read(&new->bits) & frontbuffer_bits); in intel_frontbuffer_track()
343 atomic_or(frontbuffer_bits, &new->bits); in intel_frontbuffer_track()