aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_syncobj.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2018-09-13 19:43:06 -0400
committerDave Airlie <airlied@redhat.com>2018-09-13 19:43:16 -0400
commit2dc7bad71cd310dc94d1c9907909324dd2b0618f (patch)
treea087555dd4b1588eeac02c1af5d8dde7b5bb15fa /drivers/gpu/drm/drm_syncobj.c
parentb1c1566822ab489a945dfdafee651aa29de160c7 (diff)
parent169cc4c7a14e988985c8833ddec2f3e897de2c28 (diff)
Merge tag 'drm-misc-next-2018-09-13' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
drm-misc-next for 4.20: UAPI Changes: - Add host endian variants for the most common formats (Gerd) - Fail ADDFB2 for big-endian drivers that don't advertise BE quirk (Gerd) - clear smem_start in fbdev for drm drivers to avoid leaking fb addr (Daniel) Cross-subsystem Changes: Core Changes: - fix drm_mode_addfb() on big endian machines (Gerd) - add timeline point to syncobj find+replace (Chunming) - more drmP.h removal effort (Daniel) - split uapi portions of drm_atomic.c into drm_atomic_uapi.c (Daniel) Driver Changes: - bochs: Convert open-coded portions to use helpers (Peter) - vkms: Add cursor support (Haneen) - udmabuf: Lots of fixups (mostly cosmetic afaict) (Gerd) - qxl: Convert to use fbdev helper (Peter) Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Chunming Zhou <david1.zhou@amd.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Peter Wu <peter@lekensteyn.nl> Cc: Haneen Mohammed <hamohammed.sa@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com> From: Sean Paul <sean@poorly.run> Link: https://patchwork.freedesktop.org/patch/msgid/20180913130254.GA156437@art_vandelay
Diffstat (limited to 'drivers/gpu/drm/drm_syncobj.c')
-rw-r--r--drivers/gpu/drm/drm_syncobj.c73
1 files changed, 40 insertions, 33 deletions
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 3a8837c49639..e9ce623d049e 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -56,6 +56,33 @@
56#include "drm_internal.h" 56#include "drm_internal.h"
57#include <drm/drm_syncobj.h> 57#include <drm/drm_syncobj.h>
58 58
59struct drm_syncobj_stub_fence {
60 struct dma_fence base;
61 spinlock_t lock;
62};
63
64static const char *drm_syncobj_stub_fence_get_name(struct dma_fence *fence)
65{
66 return "syncobjstub";
67}
68
69static bool drm_syncobj_stub_fence_enable_signaling(struct dma_fence *fence)
70{
71 return !dma_fence_is_signaled(fence);
72}
73
74static void drm_syncobj_stub_fence_release(struct dma_fence *f)
75{
76 kfree(f);
77}
78static const struct dma_fence_ops drm_syncobj_stub_fence_ops = {
79 .get_driver_name = drm_syncobj_stub_fence_get_name,
80 .get_timeline_name = drm_syncobj_stub_fence_get_name,
81 .enable_signaling = drm_syncobj_stub_fence_enable_signaling,
82 .release = drm_syncobj_stub_fence_release,
83};
84
85
59/** 86/**
60 * drm_syncobj_find - lookup and reference a sync object. 87 * drm_syncobj_find - lookup and reference a sync object.
61 * @file_private: drm file private pointer 88 * @file_private: drm file private pointer
@@ -140,11 +167,13 @@ void drm_syncobj_remove_callback(struct drm_syncobj *syncobj,
140/** 167/**
141 * drm_syncobj_replace_fence - replace fence in a sync object. 168 * drm_syncobj_replace_fence - replace fence in a sync object.
142 * @syncobj: Sync object to replace fence in 169 * @syncobj: Sync object to replace fence in
170 * @point: timeline point
143 * @fence: fence to install in sync file. 171 * @fence: fence to install in sync file.
144 * 172 *
145 * This replaces the fence on a sync object. 173 * This replaces the fence on a sync object, or a timeline point fence.
146 */ 174 */
147void drm_syncobj_replace_fence(struct drm_syncobj *syncobj, 175void drm_syncobj_replace_fence(struct drm_syncobj *syncobj,
176 u64 point,
148 struct dma_fence *fence) 177 struct dma_fence *fence)
149{ 178{
150 struct dma_fence *old_fence; 179 struct dma_fence *old_fence;
@@ -172,42 +201,19 @@ void drm_syncobj_replace_fence(struct drm_syncobj *syncobj,
172} 201}
173EXPORT_SYMBOL(drm_syncobj_replace_fence); 202EXPORT_SYMBOL(drm_syncobj_replace_fence);
174 203
175struct drm_syncobj_null_fence {
176 struct dma_fence base;
177 spinlock_t lock;
178};
179
180static const char *drm_syncobj_null_fence_get_name(struct dma_fence *fence)
181{
182 return "syncobjnull";
183}
184
185static bool drm_syncobj_null_fence_enable_signaling(struct dma_fence *fence)
186{
187 dma_fence_enable_sw_signaling(fence);
188 return !dma_fence_is_signaled(fence);
189}
190
191static const struct dma_fence_ops drm_syncobj_null_fence_ops = {
192 .get_driver_name = drm_syncobj_null_fence_get_name,
193 .get_timeline_name = drm_syncobj_null_fence_get_name,
194 .enable_signaling = drm_syncobj_null_fence_enable_signaling,
195 .release = NULL,
196};
197
198static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj) 204static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj)
199{ 205{
200 struct drm_syncobj_null_fence *fence; 206 struct drm_syncobj_stub_fence *fence;
201 fence = kzalloc(sizeof(*fence), GFP_KERNEL); 207 fence = kzalloc(sizeof(*fence), GFP_KERNEL);
202 if (fence == NULL) 208 if (fence == NULL)
203 return -ENOMEM; 209 return -ENOMEM;
204 210
205 spin_lock_init(&fence->lock); 211 spin_lock_init(&fence->lock);
206 dma_fence_init(&fence->base, &drm_syncobj_null_fence_ops, 212 dma_fence_init(&fence->base, &drm_syncobj_stub_fence_ops,
207 &fence->lock, 0, 0); 213 &fence->lock, 0, 0);
208 dma_fence_signal(&fence->base); 214 dma_fence_signal(&fence->base);
209 215
210 drm_syncobj_replace_fence(syncobj, &fence->base); 216 drm_syncobj_replace_fence(syncobj, 0, &fence->base);
211 217
212 dma_fence_put(&fence->base); 218 dma_fence_put(&fence->base);
213 219
@@ -218,6 +224,7 @@ static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj)
218 * drm_syncobj_find_fence - lookup and reference the fence in a sync object 224 * drm_syncobj_find_fence - lookup and reference the fence in a sync object
219 * @file_private: drm file private pointer 225 * @file_private: drm file private pointer
220 * @handle: sync object handle to lookup. 226 * @handle: sync object handle to lookup.
227 * @point: timeline point
221 * @fence: out parameter for the fence 228 * @fence: out parameter for the fence
222 * 229 *
223 * This is just a convenience function that combines drm_syncobj_find() and 230 * This is just a convenience function that combines drm_syncobj_find() and
@@ -228,7 +235,7 @@ static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj)
228 * dma_fence_put(). 235 * dma_fence_put().
229 */ 236 */
230int drm_syncobj_find_fence(struct drm_file *file_private, 237int drm_syncobj_find_fence(struct drm_file *file_private,
231 u32 handle, 238 u32 handle, u64 point,
232 struct dma_fence **fence) 239 struct dma_fence **fence)
233{ 240{
234 struct drm_syncobj *syncobj = drm_syncobj_find(file_private, handle); 241 struct drm_syncobj *syncobj = drm_syncobj_find(file_private, handle);
@@ -257,7 +264,7 @@ void drm_syncobj_free(struct kref *kref)
257 struct drm_syncobj *syncobj = container_of(kref, 264 struct drm_syncobj *syncobj = container_of(kref,
258 struct drm_syncobj, 265 struct drm_syncobj,
259 refcount); 266 refcount);
260 drm_syncobj_replace_fence(syncobj, NULL); 267 drm_syncobj_replace_fence(syncobj, 0, NULL);
261 kfree(syncobj); 268 kfree(syncobj);
262} 269}
263EXPORT_SYMBOL(drm_syncobj_free); 270EXPORT_SYMBOL(drm_syncobj_free);
@@ -297,7 +304,7 @@ int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
297 } 304 }
298 305
299 if (fence) 306 if (fence)
300 drm_syncobj_replace_fence(syncobj, fence); 307 drm_syncobj_replace_fence(syncobj, 0, fence);
301 308
302 *out_syncobj = syncobj; 309 *out_syncobj = syncobj;
303 return 0; 310 return 0;
@@ -482,7 +489,7 @@ static int drm_syncobj_import_sync_file_fence(struct drm_file *file_private,
482 return -ENOENT; 489 return -ENOENT;
483 } 490 }
484 491
485 drm_syncobj_replace_fence(syncobj, fence); 492 drm_syncobj_replace_fence(syncobj, 0, fence);
486 dma_fence_put(fence); 493 dma_fence_put(fence);
487 drm_syncobj_put(syncobj); 494 drm_syncobj_put(syncobj);
488 return 0; 495 return 0;
@@ -499,7 +506,7 @@ static int drm_syncobj_export_sync_file(struct drm_file *file_private,
499 if (fd < 0) 506 if (fd < 0)
500 return fd; 507 return fd;
501 508
502 ret = drm_syncobj_find_fence(file_private, handle, &fence); 509 ret = drm_syncobj_find_fence(file_private, handle, 0, &fence);
503 if (ret) 510 if (ret)
504 goto err_put_fd; 511 goto err_put_fd;
505 512
@@ -964,7 +971,7 @@ drm_syncobj_reset_ioctl(struct drm_device *dev, void *data,
964 return ret; 971 return ret;
965 972
966 for (i = 0; i < args->count_handles; i++) 973 for (i = 0; i < args->count_handles; i++)
967 drm_syncobj_replace_fence(syncobjs[i], NULL); 974 drm_syncobj_replace_fence(syncobjs[i], 0, NULL);
968 975
969 drm_syncobj_array_free(syncobjs, args->count_handles); 976 drm_syncobj_array_free(syncobjs, args->count_handles);
970 977