diff options
author | Dave Airlie <airlied@redhat.com> | 2018-09-13 19:43:06 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2018-09-13 19:43:16 -0400 |
commit | 2dc7bad71cd310dc94d1c9907909324dd2b0618f (patch) | |
tree | a087555dd4b1588eeac02c1af5d8dde7b5bb15fa /drivers/gpu/drm/drm_syncobj.c | |
parent | b1c1566822ab489a945dfdafee651aa29de160c7 (diff) | |
parent | 169cc4c7a14e988985c8833ddec2f3e897de2c28 (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.c | 73 |
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 | ||
59 | struct drm_syncobj_stub_fence { | ||
60 | struct dma_fence base; | ||
61 | spinlock_t lock; | ||
62 | }; | ||
63 | |||
64 | static const char *drm_syncobj_stub_fence_get_name(struct dma_fence *fence) | ||
65 | { | ||
66 | return "syncobjstub"; | ||
67 | } | ||
68 | |||
69 | static bool drm_syncobj_stub_fence_enable_signaling(struct dma_fence *fence) | ||
70 | { | ||
71 | return !dma_fence_is_signaled(fence); | ||
72 | } | ||
73 | |||
74 | static void drm_syncobj_stub_fence_release(struct dma_fence *f) | ||
75 | { | ||
76 | kfree(f); | ||
77 | } | ||
78 | static 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 | */ |
147 | void drm_syncobj_replace_fence(struct drm_syncobj *syncobj, | 175 | void 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 | } |
173 | EXPORT_SYMBOL(drm_syncobj_replace_fence); | 202 | EXPORT_SYMBOL(drm_syncobj_replace_fence); |
174 | 203 | ||
175 | struct drm_syncobj_null_fence { | ||
176 | struct dma_fence base; | ||
177 | spinlock_t lock; | ||
178 | }; | ||
179 | |||
180 | static const char *drm_syncobj_null_fence_get_name(struct dma_fence *fence) | ||
181 | { | ||
182 | return "syncobjnull"; | ||
183 | } | ||
184 | |||
185 | static 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 | |||
191 | static 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 | |||
198 | static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj) | 204 | static 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 | */ |
230 | int drm_syncobj_find_fence(struct drm_file *file_private, | 237 | int 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 | } |
263 | EXPORT_SYMBOL(drm_syncobj_free); | 270 | EXPORT_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 | ||