| 1 | /* SPDX-License-Identifier: MIT */ | 
|---|
| 2 |  | 
|---|
| 3 | #ifndef _DRM_VBLANK_WORK_H_ | 
|---|
| 4 | #define _DRM_VBLANK_WORK_H_ | 
|---|
| 5 |  | 
|---|
| 6 | #include <linux/kthread.h> | 
|---|
| 7 |  | 
|---|
| 8 | struct drm_crtc; | 
|---|
| 9 |  | 
|---|
| 10 | /** | 
|---|
| 11 | * struct drm_vblank_work - A delayed work item which delays until a target | 
|---|
| 12 | * vblank passes, and then executes at realtime priority outside of IRQ | 
|---|
| 13 | * context. | 
|---|
| 14 | * | 
|---|
| 15 | * See also: | 
|---|
| 16 | * drm_vblank_work_schedule() | 
|---|
| 17 | * drm_vblank_work_init() | 
|---|
| 18 | * drm_vblank_work_cancel_sync() | 
|---|
| 19 | * drm_vblank_work_flush() | 
|---|
| 20 | * drm_vblank_work_flush_all() | 
|---|
| 21 | */ | 
|---|
| 22 | struct drm_vblank_work { | 
|---|
| 23 | /** | 
|---|
| 24 | * @base: The base &kthread_work item which will be executed by | 
|---|
| 25 | * &drm_vblank_crtc.worker. Drivers should not interact with this | 
|---|
| 26 | * directly, and instead rely on drm_vblank_work_init() to initialize | 
|---|
| 27 | * this. | 
|---|
| 28 | */ | 
|---|
| 29 | struct kthread_work base; | 
|---|
| 30 |  | 
|---|
| 31 | /** | 
|---|
| 32 | * @vblank: A pointer to &drm_vblank_crtc this work item belongs to. | 
|---|
| 33 | */ | 
|---|
| 34 | struct drm_vblank_crtc *vblank; | 
|---|
| 35 |  | 
|---|
| 36 | /** | 
|---|
| 37 | * @count: The target vblank this work will execute on. Drivers should | 
|---|
| 38 | * not modify this value directly, and instead use | 
|---|
| 39 | * drm_vblank_work_schedule() | 
|---|
| 40 | */ | 
|---|
| 41 | u64 count; | 
|---|
| 42 |  | 
|---|
| 43 | /** | 
|---|
| 44 | * @cancelling: The number of drm_vblank_work_cancel_sync() calls that | 
|---|
| 45 | * are currently running. A work item cannot be rescheduled until all | 
|---|
| 46 | * calls have finished. | 
|---|
| 47 | */ | 
|---|
| 48 | int cancelling; | 
|---|
| 49 |  | 
|---|
| 50 | /** | 
|---|
| 51 | * @node: The position of this work item in | 
|---|
| 52 | * &drm_vblank_crtc.pending_work. | 
|---|
| 53 | */ | 
|---|
| 54 | struct list_head node; | 
|---|
| 55 | }; | 
|---|
| 56 |  | 
|---|
| 57 | /** | 
|---|
| 58 | * to_drm_vblank_work - Retrieve the respective &drm_vblank_work item from a | 
|---|
| 59 | * &kthread_work | 
|---|
| 60 | * @_work: The &kthread_work embedded inside a &drm_vblank_work | 
|---|
| 61 | */ | 
|---|
| 62 | #define to_drm_vblank_work(_work) \ | 
|---|
| 63 | container_of((_work), struct drm_vblank_work, base) | 
|---|
| 64 |  | 
|---|
| 65 | int drm_vblank_work_schedule(struct drm_vblank_work *work, | 
|---|
| 66 | u64 count, bool nextonmiss); | 
|---|
| 67 | void drm_vblank_work_init(struct drm_vblank_work *work, struct drm_crtc *crtc, | 
|---|
| 68 | void (*func)(struct kthread_work *work)); | 
|---|
| 69 | bool drm_vblank_work_cancel_sync(struct drm_vblank_work *work); | 
|---|
| 70 | void drm_vblank_work_flush(struct drm_vblank_work *work); | 
|---|
| 71 | void drm_vblank_work_flush_all(struct drm_crtc *crtc); | 
|---|
| 72 |  | 
|---|
| 73 | #endif /* !_DRM_VBLANK_WORK_H_ */ | 
|---|
| 74 |  | 
|---|