1 | /* SPDX-License-Identifier: GPL-2.0 OR MIT */ |
2 | /************************************************************************** |
3 | * |
4 | * Copyright 2011-2012 VMware, Inc., Palo Alto, CA., USA |
5 | * |
6 | * Permission is hereby granted, free of charge, to any person obtaining a |
7 | * copy of this software and associated documentation files (the |
8 | * "Software"), to deal in the Software without restriction, including |
9 | * without limitation the rights to use, copy, modify, merge, publish, |
10 | * distribute, sub license, and/or sell copies of the Software, and to |
11 | * permit persons to whom the Software is furnished to do so, subject to |
12 | * the following conditions: |
13 | * |
14 | * The above copyright notice and this permission notice (including the |
15 | * next paragraph) shall be included in all copies or substantial portions |
16 | * of the Software. |
17 | * |
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
20 | * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL |
21 | * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, |
22 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
23 | * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
24 | * USE OR OTHER DEALINGS IN THE SOFTWARE. |
25 | * |
26 | **************************************************************************/ |
27 | |
28 | #ifndef _VMWGFX_FENCE_H_ |
29 | |
30 | #include <linux/dma-fence.h> |
31 | #include <linux/dma-fence-array.h> |
32 | |
33 | #define VMW_FENCE_WAIT_TIMEOUT (5*HZ) |
34 | |
35 | struct drm_device; |
36 | struct drm_file; |
37 | struct drm_pending_event; |
38 | |
39 | struct vmw_private; |
40 | struct vmw_fence_manager; |
41 | |
42 | /** |
43 | * |
44 | * |
45 | */ |
46 | enum vmw_action_type { |
47 | VMW_ACTION_EVENT = 0, |
48 | VMW_ACTION_MAX |
49 | }; |
50 | |
51 | struct vmw_fence_action { |
52 | struct list_head head; |
53 | enum vmw_action_type type; |
54 | void (*seq_passed) (struct vmw_fence_action *action); |
55 | void (*cleanup) (struct vmw_fence_action *action); |
56 | }; |
57 | |
58 | struct vmw_fence_obj { |
59 | struct dma_fence base; |
60 | |
61 | struct list_head head; |
62 | struct list_head seq_passed_actions; |
63 | void (*destroy)(struct vmw_fence_obj *fence); |
64 | }; |
65 | |
66 | extern struct vmw_fence_manager * |
67 | vmw_fence_manager_init(struct vmw_private *dev_priv); |
68 | |
69 | extern void vmw_fence_manager_takedown(struct vmw_fence_manager *fman); |
70 | |
71 | static inline void |
72 | vmw_fence_obj_unreference(struct vmw_fence_obj **fence_p) |
73 | { |
74 | struct vmw_fence_obj *fence = *fence_p; |
75 | |
76 | *fence_p = NULL; |
77 | if (fence) |
78 | dma_fence_put(fence: &fence->base); |
79 | } |
80 | |
81 | static inline struct vmw_fence_obj * |
82 | vmw_fence_obj_reference(struct vmw_fence_obj *fence) |
83 | { |
84 | if (fence) |
85 | dma_fence_get(fence: &fence->base); |
86 | return fence; |
87 | } |
88 | |
89 | extern void vmw_fences_update(struct vmw_fence_manager *fman); |
90 | |
91 | extern bool vmw_fence_obj_signaled(struct vmw_fence_obj *fence); |
92 | |
93 | extern int vmw_fence_obj_wait(struct vmw_fence_obj *fence, |
94 | bool lazy, |
95 | bool interruptible, unsigned long timeout); |
96 | |
97 | extern int vmw_fence_create(struct vmw_fence_manager *fman, |
98 | uint32_t seqno, |
99 | struct vmw_fence_obj **p_fence); |
100 | |
101 | extern int vmw_user_fence_create(struct drm_file *file_priv, |
102 | struct vmw_fence_manager *fman, |
103 | uint32_t sequence, |
104 | struct vmw_fence_obj **p_fence, |
105 | uint32_t *p_handle); |
106 | |
107 | extern void vmw_fence_fifo_up(struct vmw_fence_manager *fman); |
108 | |
109 | extern void vmw_fence_fifo_down(struct vmw_fence_manager *fman); |
110 | |
111 | extern int vmw_fence_obj_wait_ioctl(struct drm_device *dev, void *data, |
112 | struct drm_file *file_priv); |
113 | |
114 | extern int vmw_fence_obj_signaled_ioctl(struct drm_device *dev, void *data, |
115 | struct drm_file *file_priv); |
116 | |
117 | extern int vmw_fence_obj_unref_ioctl(struct drm_device *dev, void *data, |
118 | struct drm_file *file_priv); |
119 | extern int vmw_fence_event_ioctl(struct drm_device *dev, void *data, |
120 | struct drm_file *file_priv); |
121 | extern int vmw_event_fence_action_queue(struct drm_file *filee_priv, |
122 | struct vmw_fence_obj *fence, |
123 | struct drm_pending_event *event, |
124 | uint32_t *tv_sec, |
125 | uint32_t *tv_usec, |
126 | bool interruptible); |
127 | #endif /* _VMWGFX_FENCE_H_ */ |
128 | |