diff options
| -rw-r--r-- | Documentation/dma-buf-sharing.txt | 23 | ||||
| -rw-r--r-- | drivers/dma-buf/dma-buf.c | 47 | ||||
| -rw-r--r-- | drivers/gpu/drm/armada/armada_gem.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_prime.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_dmabuf.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/gem.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_object.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/udl/udl_dmabuf.c | 9 | ||||
| -rw-r--r-- | drivers/media/v4l2-core/videobuf2-dma-contig.c | 8 | ||||
| -rw-r--r-- | drivers/media/v4l2-core/videobuf2-dma-sg.c | 8 | ||||
| -rw-r--r-- | drivers/media/v4l2-core/videobuf2-vmalloc.c | 8 | ||||
| -rw-r--r-- | drivers/staging/android/ion/ion.c | 9 | ||||
| -rw-r--r-- | include/linux/dma-buf.h | 34 |
15 files changed, 152 insertions, 63 deletions
diff --git a/Documentation/dma-buf-sharing.txt b/Documentation/dma-buf-sharing.txt index bb9753b635a3..480c8de3c2c4 100644 --- a/Documentation/dma-buf-sharing.txt +++ b/Documentation/dma-buf-sharing.txt | |||
| @@ -49,25 +49,26 @@ The dma_buf buffer sharing API usage contains the following steps: | |||
| 49 | The buffer exporter announces its wish to export a buffer. In this, it | 49 | The buffer exporter announces its wish to export a buffer. In this, it |
| 50 | connects its own private buffer data, provides implementation for operations | 50 | connects its own private buffer data, provides implementation for operations |
| 51 | that can be performed on the exported dma_buf, and flags for the file | 51 | that can be performed on the exported dma_buf, and flags for the file |
| 52 | associated with this buffer. | 52 | associated with this buffer. All these fields are filled in struct |
| 53 | dma_buf_export_info, defined via the DEFINE_DMA_BUF_EXPORT_INFO macro. | ||
| 53 | 54 | ||
| 54 | Interface: | 55 | Interface: |
| 55 | struct dma_buf *dma_buf_export_named(void *priv, struct dma_buf_ops *ops, | 56 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info) |
| 56 | size_t size, int flags, | 57 | struct dma_buf *dma_buf_export(struct dma_buf_export_info *exp_info) |
| 57 | const char *exp_name) | ||
| 58 | 58 | ||
| 59 | If this succeeds, dma_buf_export_named allocates a dma_buf structure, and | 59 | If this succeeds, dma_buf_export allocates a dma_buf structure, and |
| 60 | returns a pointer to the same. It also associates an anonymous file with this | 60 | returns a pointer to the same. It also associates an anonymous file with this |
| 61 | buffer, so it can be exported. On failure to allocate the dma_buf object, | 61 | buffer, so it can be exported. On failure to allocate the dma_buf object, |
| 62 | it returns NULL. | 62 | it returns NULL. |
| 63 | 63 | ||
| 64 | 'exp_name' is the name of exporter - to facilitate information while | 64 | 'exp_name' in struct dma_buf_export_info is the name of exporter - to |
| 65 | debugging. | 65 | facilitate information while debugging. It is set to KBUILD_MODNAME by |
| 66 | default, so exporters don't have to provide a specific name, if they don't | ||
| 67 | wish to. | ||
| 68 | |||
| 69 | DEFINE_DMA_BUF_EXPORT_INFO macro defines the struct dma_buf_export_info, | ||
| 70 | zeroes it out and pre-populates exp_name in it. | ||
| 66 | 71 | ||
| 67 | Exporting modules which do not wish to provide any specific name may use the | ||
| 68 | helper define 'dma_buf_export()', with the same arguments as above, but | ||
| 69 | without the last argument; a KBUILD_MODNAME pre-processor directive will be | ||
| 70 | inserted in place of 'exp_name' instead. | ||
| 71 | 72 | ||
| 72 | 2. Userspace gets a handle to pass around to potential buffer-users | 73 | 2. Userspace gets a handle to pass around to potential buffer-users |
| 73 | 74 | ||
diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index 5be225c2ba98..c5a9138a6a8d 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c | |||
| @@ -265,43 +265,40 @@ static inline int is_dma_buf_file(struct file *file) | |||
| 265 | } | 265 | } |
| 266 | 266 | ||
| 267 | /** | 267 | /** |
| 268 | * dma_buf_export_named - Creates a new dma_buf, and associates an anon file | 268 | * dma_buf_export - Creates a new dma_buf, and associates an anon file |
| 269 | * with this buffer, so it can be exported. | 269 | * with this buffer, so it can be exported. |
| 270 | * Also connect the allocator specific data and ops to the buffer. | 270 | * Also connect the allocator specific data and ops to the buffer. |
| 271 | * Additionally, provide a name string for exporter; useful in debugging. | 271 | * Additionally, provide a name string for exporter; useful in debugging. |
| 272 | * | 272 | * |
| 273 | * @priv: [in] Attach private data of allocator to this buffer | 273 | * @exp_info: [in] holds all the export related information provided |
| 274 | * @ops: [in] Attach allocator-defined dma buf ops to the new buffer. | 274 | * by the exporter. see struct dma_buf_export_info |
| 275 | * @size: [in] Size of the buffer | 275 | * for further details. |
| 276 | * @flags: [in] mode flags for the file. | ||
| 277 | * @exp_name: [in] name of the exporting module - useful for debugging. | ||
| 278 | * @resv: [in] reservation-object, NULL to allocate default one. | ||
| 279 | * | 276 | * |
| 280 | * Returns, on success, a newly created dma_buf object, which wraps the | 277 | * Returns, on success, a newly created dma_buf object, which wraps the |
| 281 | * supplied private data and operations for dma_buf_ops. On either missing | 278 | * supplied private data and operations for dma_buf_ops. On either missing |
| 282 | * ops, or error in allocating struct dma_buf, will return negative error. | 279 | * ops, or error in allocating struct dma_buf, will return negative error. |
| 283 | * | 280 | * |
| 284 | */ | 281 | */ |
| 285 | struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops, | 282 | struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info) |
| 286 | size_t size, int flags, const char *exp_name, | ||
| 287 | struct reservation_object *resv) | ||
| 288 | { | 283 | { |
| 289 | struct dma_buf *dmabuf; | 284 | struct dma_buf *dmabuf; |
| 285 | struct reservation_object *resv = exp_info->resv; | ||
| 290 | struct file *file; | 286 | struct file *file; |
| 291 | size_t alloc_size = sizeof(struct dma_buf); | 287 | size_t alloc_size = sizeof(struct dma_buf); |
| 292 | if (!resv) | 288 | if (!exp_info->resv) |
| 293 | alloc_size += sizeof(struct reservation_object); | 289 | alloc_size += sizeof(struct reservation_object); |
| 294 | else | 290 | else |
| 295 | /* prevent &dma_buf[1] == dma_buf->resv */ | 291 | /* prevent &dma_buf[1] == dma_buf->resv */ |
| 296 | alloc_size += 1; | 292 | alloc_size += 1; |
| 297 | 293 | ||
| 298 | if (WARN_ON(!priv || !ops | 294 | if (WARN_ON(!exp_info->priv |
| 299 | || !ops->map_dma_buf | 295 | || !exp_info->ops |
| 300 | || !ops->unmap_dma_buf | 296 | || !exp_info->ops->map_dma_buf |
| 301 | || !ops->release | 297 | || !exp_info->ops->unmap_dma_buf |
| 302 | || !ops->kmap_atomic | 298 | || !exp_info->ops->release |
| 303 | || !ops->kmap | 299 | || !exp_info->ops->kmap_atomic |
| 304 | || !ops->mmap)) { | 300 | || !exp_info->ops->kmap |
| 301 | || !exp_info->ops->mmap)) { | ||
| 305 | return ERR_PTR(-EINVAL); | 302 | return ERR_PTR(-EINVAL); |
| 306 | } | 303 | } |
| 307 | 304 | ||
| @@ -309,10 +306,10 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops, | |||
| 309 | if (dmabuf == NULL) | 306 | if (dmabuf == NULL) |
| 310 | return ERR_PTR(-ENOMEM); | 307 | return ERR_PTR(-ENOMEM); |
| 311 | 308 | ||
| 312 | dmabuf->priv = priv; | 309 | dmabuf->priv = exp_info->priv; |
| 313 | dmabuf->ops = ops; | 310 | dmabuf->ops = exp_info->ops; |
| 314 | dmabuf->size = size; | 311 | dmabuf->size = exp_info->size; |
| 315 | dmabuf->exp_name = exp_name; | 312 | dmabuf->exp_name = exp_info->exp_name; |
| 316 | init_waitqueue_head(&dmabuf->poll); | 313 | init_waitqueue_head(&dmabuf->poll); |
| 317 | dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll; | 314 | dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll; |
| 318 | dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0; | 315 | dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0; |
| @@ -323,7 +320,8 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops, | |||
| 323 | } | 320 | } |
| 324 | dmabuf->resv = resv; | 321 | dmabuf->resv = resv; |
| 325 | 322 | ||
| 326 | file = anon_inode_getfile("dmabuf", &dma_buf_fops, dmabuf, flags); | 323 | file = anon_inode_getfile("dmabuf", &dma_buf_fops, dmabuf, |
| 324 | exp_info->flags); | ||
| 327 | if (IS_ERR(file)) { | 325 | if (IS_ERR(file)) { |
| 328 | kfree(dmabuf); | 326 | kfree(dmabuf); |
| 329 | return ERR_CAST(file); | 327 | return ERR_CAST(file); |
| @@ -341,8 +339,7 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops, | |||
| 341 | 339 | ||
| 342 | return dmabuf; | 340 | return dmabuf; |
| 343 | } | 341 | } |
| 344 | EXPORT_SYMBOL_GPL(dma_buf_export_named); | 342 | EXPORT_SYMBOL_GPL(dma_buf_export); |
| 345 | |||
| 346 | 343 | ||
| 347 | /** | 344 | /** |
| 348 | * dma_buf_fd - returns a file descriptor for the given dma_buf | 345 | * dma_buf_fd - returns a file descriptor for the given dma_buf |
diff --git a/drivers/gpu/drm/armada/armada_gem.c b/drivers/gpu/drm/armada/armada_gem.c index ef5feeecec84..580e10acaa3a 100644 --- a/drivers/gpu/drm/armada/armada_gem.c +++ b/drivers/gpu/drm/armada/armada_gem.c | |||
| @@ -538,8 +538,14 @@ struct dma_buf * | |||
| 538 | armada_gem_prime_export(struct drm_device *dev, struct drm_gem_object *obj, | 538 | armada_gem_prime_export(struct drm_device *dev, struct drm_gem_object *obj, |
| 539 | int flags) | 539 | int flags) |
| 540 | { | 540 | { |
| 541 | return dma_buf_export(obj, &armada_gem_prime_dmabuf_ops, obj->size, | 541 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info); |
| 542 | O_RDWR, NULL); | 542 | |
| 543 | exp_info.ops = &armada_gem_prime_dmabuf_ops; | ||
| 544 | exp_info.size = obj->size; | ||
| 545 | exp_info.flags = O_RDWR; | ||
| 546 | exp_info.priv = obj; | ||
| 547 | |||
| 548 | return dma_buf_export(&exp_info); | ||
| 543 | } | 549 | } |
| 544 | 550 | ||
| 545 | struct drm_gem_object * | 551 | struct drm_gem_object * |
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c index 7482b06cd08f..7fec191b45f7 100644 --- a/drivers/gpu/drm/drm_prime.c +++ b/drivers/gpu/drm/drm_prime.c | |||
| @@ -339,13 +339,17 @@ static const struct dma_buf_ops drm_gem_prime_dmabuf_ops = { | |||
| 339 | struct dma_buf *drm_gem_prime_export(struct drm_device *dev, | 339 | struct dma_buf *drm_gem_prime_export(struct drm_device *dev, |
| 340 | struct drm_gem_object *obj, int flags) | 340 | struct drm_gem_object *obj, int flags) |
| 341 | { | 341 | { |
| 342 | struct reservation_object *robj = NULL; | 342 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info); |
| 343 | |||
| 344 | exp_info.ops = &drm_gem_prime_dmabuf_ops; | ||
| 345 | exp_info.size = obj->size; | ||
| 346 | exp_info.flags = flags; | ||
| 347 | exp_info.priv = obj; | ||
| 343 | 348 | ||
| 344 | if (dev->driver->gem_prime_res_obj) | 349 | if (dev->driver->gem_prime_res_obj) |
| 345 | robj = dev->driver->gem_prime_res_obj(obj); | 350 | exp_info.resv = dev->driver->gem_prime_res_obj(obj); |
| 346 | 351 | ||
| 347 | return dma_buf_export(obj, &drm_gem_prime_dmabuf_ops, obj->size, | 352 | return dma_buf_export(&exp_info); |
| 348 | flags, robj); | ||
| 349 | } | 353 | } |
| 350 | EXPORT_SYMBOL(drm_gem_prime_export); | 354 | EXPORT_SYMBOL(drm_gem_prime_export); |
| 351 | 355 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c index 3833bf8ca025..cd485c091b30 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | |||
| @@ -185,9 +185,14 @@ struct dma_buf *exynos_dmabuf_prime_export(struct drm_device *drm_dev, | |||
| 185 | struct drm_gem_object *obj, int flags) | 185 | struct drm_gem_object *obj, int flags) |
| 186 | { | 186 | { |
| 187 | struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj); | 187 | struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj); |
| 188 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info); | ||
| 188 | 189 | ||
| 189 | return dma_buf_export(obj, &exynos_dmabuf_ops, | 190 | exp_info.ops = &exynos_dmabuf_ops; |
| 190 | exynos_gem_obj->base.size, flags, NULL); | 191 | exp_info.size = exynos_gem_obj->base.size; |
| 192 | exp_info.flags = flags; | ||
| 193 | exp_info.priv = obj; | ||
| 194 | |||
| 195 | return dma_buf_export(&exp_info); | ||
| 191 | } | 196 | } |
| 192 | 197 | ||
| 193 | struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, | 198 | struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, |
diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c index 82a1f4b57778..7998da27c500 100644 --- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c +++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c | |||
| @@ -230,6 +230,13 @@ struct dma_buf *i915_gem_prime_export(struct drm_device *dev, | |||
| 230 | struct drm_gem_object *gem_obj, int flags) | 230 | struct drm_gem_object *gem_obj, int flags) |
| 231 | { | 231 | { |
| 232 | struct drm_i915_gem_object *obj = to_intel_bo(gem_obj); | 232 | struct drm_i915_gem_object *obj = to_intel_bo(gem_obj); |
| 233 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info); | ||
| 234 | |||
| 235 | exp_info.ops = &i915_dmabuf_ops; | ||
| 236 | exp_info.size = gem_obj->size; | ||
| 237 | exp_info.flags = flags; | ||
| 238 | exp_info.priv = gem_obj; | ||
| 239 | |||
| 233 | 240 | ||
| 234 | if (obj->ops->dmabuf_export) { | 241 | if (obj->ops->dmabuf_export) { |
| 235 | int ret = obj->ops->dmabuf_export(obj); | 242 | int ret = obj->ops->dmabuf_export(obj); |
| @@ -237,8 +244,7 @@ struct dma_buf *i915_gem_prime_export(struct drm_device *dev, | |||
| 237 | return ERR_PTR(ret); | 244 | return ERR_PTR(ret); |
| 238 | } | 245 | } |
| 239 | 246 | ||
| 240 | return dma_buf_export(gem_obj, &i915_dmabuf_ops, gem_obj->size, flags, | 247 | return dma_buf_export(&exp_info); |
| 241 | NULL); | ||
| 242 | } | 248 | } |
| 243 | 249 | ||
| 244 | static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj) | 250 | static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj) |
diff --git a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c index b46dabd9faf7..344fd789170d 100644 --- a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c +++ b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c | |||
| @@ -171,7 +171,14 @@ static struct dma_buf_ops omap_dmabuf_ops = { | |||
| 171 | struct dma_buf *omap_gem_prime_export(struct drm_device *dev, | 171 | struct dma_buf *omap_gem_prime_export(struct drm_device *dev, |
| 172 | struct drm_gem_object *obj, int flags) | 172 | struct drm_gem_object *obj, int flags) |
| 173 | { | 173 | { |
| 174 | return dma_buf_export(obj, &omap_dmabuf_ops, obj->size, flags, NULL); | 174 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info); |
| 175 | |||
| 176 | exp_info.ops = &omap_dmabuf_ops; | ||
| 177 | exp_info.size = obj->size; | ||
| 178 | exp_info.flags = flags; | ||
| 179 | exp_info.priv = obj; | ||
| 180 | |||
| 181 | return dma_buf_export(&exp_info); | ||
| 175 | } | 182 | } |
| 176 | 183 | ||
| 177 | struct drm_gem_object *omap_gem_prime_import(struct drm_device *dev, | 184 | struct drm_gem_object *omap_gem_prime_import(struct drm_device *dev, |
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c index cfb481943b6b..1217272a51f2 100644 --- a/drivers/gpu/drm/tegra/gem.c +++ b/drivers/gpu/drm/tegra/gem.c | |||
| @@ -627,8 +627,14 @@ struct dma_buf *tegra_gem_prime_export(struct drm_device *drm, | |||
| 627 | struct drm_gem_object *gem, | 627 | struct drm_gem_object *gem, |
| 628 | int flags) | 628 | int flags) |
| 629 | { | 629 | { |
| 630 | return dma_buf_export(gem, &tegra_gem_prime_dmabuf_ops, gem->size, | 630 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info); |
| 631 | flags, NULL); | 631 | |
| 632 | exp_info.ops = &tegra_gem_prime_dmabuf_ops; | ||
| 633 | exp_info.size = gem->size; | ||
| 634 | exp_info.flags = flags; | ||
| 635 | exp_info.priv = gem; | ||
| 636 | |||
| 637 | return dma_buf_export(&exp_info); | ||
| 632 | } | 638 | } |
| 633 | 639 | ||
| 634 | struct drm_gem_object *tegra_gem_prime_import(struct drm_device *drm, | 640 | struct drm_gem_object *tegra_gem_prime_import(struct drm_device *drm, |
diff --git a/drivers/gpu/drm/ttm/ttm_object.c b/drivers/gpu/drm/ttm/ttm_object.c index 12c87110db3a..4f5fa8d65fe9 100644 --- a/drivers/gpu/drm/ttm/ttm_object.c +++ b/drivers/gpu/drm/ttm/ttm_object.c | |||
| @@ -683,6 +683,12 @@ int ttm_prime_handle_to_fd(struct ttm_object_file *tfile, | |||
| 683 | 683 | ||
| 684 | dma_buf = prime->dma_buf; | 684 | dma_buf = prime->dma_buf; |
| 685 | if (!dma_buf || !get_dma_buf_unless_doomed(dma_buf)) { | 685 | if (!dma_buf || !get_dma_buf_unless_doomed(dma_buf)) { |
| 686 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info); | ||
| 687 | |||
| 688 | exp_info.ops = &tdev->ops; | ||
| 689 | exp_info.size = prime->size; | ||
| 690 | exp_info.flags = flags; | ||
| 691 | exp_info.priv = prime; | ||
| 686 | 692 | ||
| 687 | /* | 693 | /* |
| 688 | * Need to create a new dma_buf, with memory accounting. | 694 | * Need to create a new dma_buf, with memory accounting. |
| @@ -694,8 +700,7 @@ int ttm_prime_handle_to_fd(struct ttm_object_file *tfile, | |||
| 694 | goto out_unref; | 700 | goto out_unref; |
| 695 | } | 701 | } |
| 696 | 702 | ||
| 697 | dma_buf = dma_buf_export(prime, &tdev->ops, | 703 | dma_buf = dma_buf_export(&exp_info); |
| 698 | prime->size, flags, NULL); | ||
| 699 | if (IS_ERR(dma_buf)) { | 704 | if (IS_ERR(dma_buf)) { |
| 700 | ret = PTR_ERR(dma_buf); | 705 | ret = PTR_ERR(dma_buf); |
| 701 | ttm_mem_global_free(tdev->mem_glob, | 706 | ttm_mem_global_free(tdev->mem_glob, |
diff --git a/drivers/gpu/drm/udl/udl_dmabuf.c b/drivers/gpu/drm/udl/udl_dmabuf.c index ac8a66b4dfc2..e2243edd1ce3 100644 --- a/drivers/gpu/drm/udl/udl_dmabuf.c +++ b/drivers/gpu/drm/udl/udl_dmabuf.c | |||
| @@ -202,7 +202,14 @@ static struct dma_buf_ops udl_dmabuf_ops = { | |||
| 202 | struct dma_buf *udl_gem_prime_export(struct drm_device *dev, | 202 | struct dma_buf *udl_gem_prime_export(struct drm_device *dev, |
| 203 | struct drm_gem_object *obj, int flags) | 203 | struct drm_gem_object *obj, int flags) |
| 204 | { | 204 | { |
| 205 | return dma_buf_export(obj, &udl_dmabuf_ops, obj->size, flags, NULL); | 205 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info); |
| 206 | |||
| 207 | exp_info.ops = &udl_dmabuf_ops; | ||
| 208 | exp_info.size = obj->size; | ||
| 209 | exp_info.flags = flags; | ||
| 210 | exp_info.priv = obj; | ||
| 211 | |||
| 212 | return dma_buf_export(&exp_info); | ||
| 206 | } | 213 | } |
| 207 | 214 | ||
| 208 | static int udl_prime_create(struct drm_device *dev, | 215 | static int udl_prime_create(struct drm_device *dev, |
diff --git a/drivers/media/v4l2-core/videobuf2-dma-contig.c b/drivers/media/v4l2-core/videobuf2-dma-contig.c index 69e0483adfee..644dec73d220 100644 --- a/drivers/media/v4l2-core/videobuf2-dma-contig.c +++ b/drivers/media/v4l2-core/videobuf2-dma-contig.c | |||
| @@ -402,6 +402,12 @@ static struct dma_buf *vb2_dc_get_dmabuf(void *buf_priv, unsigned long flags) | |||
| 402 | { | 402 | { |
| 403 | struct vb2_dc_buf *buf = buf_priv; | 403 | struct vb2_dc_buf *buf = buf_priv; |
| 404 | struct dma_buf *dbuf; | 404 | struct dma_buf *dbuf; |
| 405 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info); | ||
| 406 | |||
| 407 | exp_info.ops = &vb2_dc_dmabuf_ops; | ||
| 408 | exp_info.size = buf->size; | ||
| 409 | exp_info.flags = flags; | ||
| 410 | exp_info.priv = buf; | ||
| 405 | 411 | ||
| 406 | if (!buf->sgt_base) | 412 | if (!buf->sgt_base) |
| 407 | buf->sgt_base = vb2_dc_get_base_sgt(buf); | 413 | buf->sgt_base = vb2_dc_get_base_sgt(buf); |
| @@ -409,7 +415,7 @@ static struct dma_buf *vb2_dc_get_dmabuf(void *buf_priv, unsigned long flags) | |||
| 409 | if (WARN_ON(!buf->sgt_base)) | 415 | if (WARN_ON(!buf->sgt_base)) |
| 410 | return NULL; | 416 | return NULL; |
| 411 | 417 | ||
| 412 | dbuf = dma_buf_export(buf, &vb2_dc_dmabuf_ops, buf->size, flags, NULL); | 418 | dbuf = dma_buf_export(&exp_info); |
| 413 | if (IS_ERR(dbuf)) | 419 | if (IS_ERR(dbuf)) |
| 414 | return NULL; | 420 | return NULL; |
| 415 | 421 | ||
diff --git a/drivers/media/v4l2-core/videobuf2-dma-sg.c b/drivers/media/v4l2-core/videobuf2-dma-sg.c index b1838abb6d00..45c708e463b9 100644 --- a/drivers/media/v4l2-core/videobuf2-dma-sg.c +++ b/drivers/media/v4l2-core/videobuf2-dma-sg.c | |||
| @@ -583,11 +583,17 @@ static struct dma_buf *vb2_dma_sg_get_dmabuf(void *buf_priv, unsigned long flags | |||
| 583 | { | 583 | { |
| 584 | struct vb2_dma_sg_buf *buf = buf_priv; | 584 | struct vb2_dma_sg_buf *buf = buf_priv; |
| 585 | struct dma_buf *dbuf; | 585 | struct dma_buf *dbuf; |
| 586 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info); | ||
| 587 | |||
| 588 | exp_info.ops = &vb2_dma_sg_dmabuf_ops; | ||
| 589 | exp_info.size = buf->size; | ||
| 590 | exp_info.flags = flags; | ||
| 591 | exp_info.priv = buf; | ||
| 586 | 592 | ||
| 587 | if (WARN_ON(!buf->dma_sgt)) | 593 | if (WARN_ON(!buf->dma_sgt)) |
| 588 | return NULL; | 594 | return NULL; |
| 589 | 595 | ||
| 590 | dbuf = dma_buf_export(buf, &vb2_dma_sg_dmabuf_ops, buf->size, flags, NULL); | 596 | dbuf = dma_buf_export(&exp_info); |
| 591 | if (IS_ERR(dbuf)) | 597 | if (IS_ERR(dbuf)) |
| 592 | return NULL; | 598 | return NULL; |
| 593 | 599 | ||
diff --git a/drivers/media/v4l2-core/videobuf2-vmalloc.c b/drivers/media/v4l2-core/videobuf2-vmalloc.c index bcde88572429..657ab302a5cf 100644 --- a/drivers/media/v4l2-core/videobuf2-vmalloc.c +++ b/drivers/media/v4l2-core/videobuf2-vmalloc.c | |||
| @@ -368,11 +368,17 @@ static struct dma_buf *vb2_vmalloc_get_dmabuf(void *buf_priv, unsigned long flag | |||
| 368 | { | 368 | { |
| 369 | struct vb2_vmalloc_buf *buf = buf_priv; | 369 | struct vb2_vmalloc_buf *buf = buf_priv; |
| 370 | struct dma_buf *dbuf; | 370 | struct dma_buf *dbuf; |
| 371 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info); | ||
| 372 | |||
| 373 | exp_info.ops = &vb2_vmalloc_dmabuf_ops; | ||
| 374 | exp_info.size = buf->size; | ||
| 375 | exp_info.flags = flags; | ||
| 376 | exp_info.priv = buf; | ||
| 371 | 377 | ||
| 372 | if (WARN_ON(!buf->vaddr)) | 378 | if (WARN_ON(!buf->vaddr)) |
| 373 | return NULL; | 379 | return NULL; |
| 374 | 380 | ||
| 375 | dbuf = dma_buf_export(buf, &vb2_vmalloc_dmabuf_ops, buf->size, flags, NULL); | 381 | dbuf = dma_buf_export(&exp_info); |
| 376 | if (IS_ERR(dbuf)) | 382 | if (IS_ERR(dbuf)) |
| 377 | return NULL; | 383 | return NULL; |
| 378 | 384 | ||
diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index 0e3d8c7add24..b94d69feff46 100644 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c | |||
| @@ -1106,6 +1106,12 @@ struct dma_buf *ion_share_dma_buf(struct ion_client *client, | |||
| 1106 | struct ion_buffer *buffer; | 1106 | struct ion_buffer *buffer; |
| 1107 | struct dma_buf *dmabuf; | 1107 | struct dma_buf *dmabuf; |
| 1108 | bool valid_handle; | 1108 | bool valid_handle; |
| 1109 | DEFINE_DMA_BUF_EXPORT_INFO(exp_info); | ||
| 1110 | |||
| 1111 | exp_info.ops = &dma_buf_ops; | ||
| 1112 | exp_info.size = buffer->size; | ||
| 1113 | exp_info.flags = O_RDWR; | ||
| 1114 | exp_info.priv = buffer; | ||
| 1109 | 1115 | ||
| 1110 | mutex_lock(&client->lock); | 1116 | mutex_lock(&client->lock); |
| 1111 | valid_handle = ion_handle_validate(client, handle); | 1117 | valid_handle = ion_handle_validate(client, handle); |
| @@ -1118,8 +1124,7 @@ struct dma_buf *ion_share_dma_buf(struct ion_client *client, | |||
| 1118 | ion_buffer_get(buffer); | 1124 | ion_buffer_get(buffer); |
| 1119 | mutex_unlock(&client->lock); | 1125 | mutex_unlock(&client->lock); |
| 1120 | 1126 | ||
| 1121 | dmabuf = dma_buf_export(buffer, &dma_buf_ops, buffer->size, O_RDWR, | 1127 | dmabuf = dma_buf_export(&exp_info); |
| 1122 | NULL); | ||
| 1123 | if (IS_ERR(dmabuf)) { | 1128 | if (IS_ERR(dmabuf)) { |
| 1124 | ion_buffer_put(buffer); | 1129 | ion_buffer_put(buffer); |
| 1125 | return dmabuf; | 1130 | return dmabuf; |
diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h index 694e1fe1c4b4..2f0b431b73e0 100644 --- a/include/linux/dma-buf.h +++ b/include/linux/dma-buf.h | |||
| @@ -163,6 +163,33 @@ struct dma_buf_attachment { | |||
| 163 | }; | 163 | }; |
| 164 | 164 | ||
| 165 | /** | 165 | /** |
| 166 | * struct dma_buf_export_info - holds information needed to export a dma_buf | ||
| 167 | * @exp_name: name of the exporting module - useful for debugging. | ||
| 168 | * @ops: Attach allocator-defined dma buf ops to the new buffer | ||
| 169 | * @size: Size of the buffer | ||
| 170 | * @flags: mode flags for the file | ||
| 171 | * @resv: reservation-object, NULL to allocate default one | ||
| 172 | * @priv: Attach private data of allocator to this buffer | ||
| 173 | * | ||
| 174 | * This structure holds the information required to export the buffer. Used | ||
| 175 | * with dma_buf_export() only. | ||
| 176 | */ | ||
| 177 | struct dma_buf_export_info { | ||
| 178 | const char *exp_name; | ||
| 179 | const struct dma_buf_ops *ops; | ||
| 180 | size_t size; | ||
| 181 | int flags; | ||
| 182 | struct reservation_object *resv; | ||
| 183 | void *priv; | ||
| 184 | }; | ||
| 185 | |||
| 186 | /** | ||
| 187 | * helper macro for exporters; zeros and fills in most common values | ||
| 188 | */ | ||
| 189 | #define DEFINE_DMA_BUF_EXPORT_INFO(a) \ | ||
| 190 | struct dma_buf_export_info a = { .exp_name = KBUILD_MODNAME } | ||
| 191 | |||
| 192 | /** | ||
| 166 | * get_dma_buf - convenience wrapper for get_file. | 193 | * get_dma_buf - convenience wrapper for get_file. |
| 167 | * @dmabuf: [in] pointer to dma_buf | 194 | * @dmabuf: [in] pointer to dma_buf |
| 168 | * | 195 | * |
| @@ -181,12 +208,7 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf, | |||
| 181 | void dma_buf_detach(struct dma_buf *dmabuf, | 208 | void dma_buf_detach(struct dma_buf *dmabuf, |
| 182 | struct dma_buf_attachment *dmabuf_attach); | 209 | struct dma_buf_attachment *dmabuf_attach); |
| 183 | 210 | ||
| 184 | struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops, | 211 | struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info); |
| 185 | size_t size, int flags, const char *, | ||
| 186 | struct reservation_object *); | ||
| 187 | |||
| 188 | #define dma_buf_export(priv, ops, size, flags, resv) \ | ||
| 189 | dma_buf_export_named(priv, ops, size, flags, KBUILD_MODNAME, resv) | ||
| 190 | 212 | ||
| 191 | int dma_buf_fd(struct dma_buf *dmabuf, int flags); | 213 | int dma_buf_fd(struct dma_buf *dmabuf, int flags); |
| 192 | struct dma_buf *dma_buf_get(int fd); | 214 | struct dma_buf *dma_buf_get(int fd); |
