mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
Merge drm/drm-fixes into drm-misc-fixes
Backmerging to get latest upstream. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
This commit is contained in:
@@ -79,8 +79,10 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private)
|
||||
} else {
|
||||
ret = drm_gem_object_init(dev, obj, size);
|
||||
}
|
||||
if (ret)
|
||||
if (ret) {
|
||||
drm_gem_private_object_fini(obj);
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
ret = drm_gem_create_mmap_offset(obj);
|
||||
if (ret)
|
||||
@@ -413,7 +415,7 @@ void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem,
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_shmem_vunmap);
|
||||
|
||||
static struct drm_gem_shmem_object *
|
||||
static int
|
||||
drm_gem_shmem_create_with_handle(struct drm_file *file_priv,
|
||||
struct drm_device *dev, size_t size,
|
||||
uint32_t *handle)
|
||||
@@ -423,7 +425,7 @@ drm_gem_shmem_create_with_handle(struct drm_file *file_priv,
|
||||
|
||||
shmem = drm_gem_shmem_create(dev, size);
|
||||
if (IS_ERR(shmem))
|
||||
return shmem;
|
||||
return PTR_ERR(shmem);
|
||||
|
||||
/*
|
||||
* Allocate an id of idr table where the obj is registered
|
||||
@@ -432,10 +434,8 @@ drm_gem_shmem_create_with_handle(struct drm_file *file_priv,
|
||||
ret = drm_gem_handle_create(file_priv, &shmem->base, handle);
|
||||
/* drop reference from allocate - handle holds it now. */
|
||||
drm_gem_object_put(&shmem->base);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
return shmem;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Update madvise status, returns true if not purged, else
|
||||
@@ -518,7 +518,6 @@ int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
|
||||
struct drm_mode_create_dumb *args)
|
||||
{
|
||||
u32 min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
|
||||
struct drm_gem_shmem_object *shmem;
|
||||
|
||||
if (!args->pitch || !args->size) {
|
||||
args->pitch = min_pitch;
|
||||
@@ -531,9 +530,7 @@ int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
|
||||
args->size = PAGE_ALIGN(args->pitch * args->height);
|
||||
}
|
||||
|
||||
shmem = drm_gem_shmem_create_with_handle(file, dev, args->size, &args->handle);
|
||||
|
||||
return PTR_ERR_OR_ZERO(shmem);
|
||||
return drm_gem_shmem_create_with_handle(file, dev, args->size, &args->handle);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_gem_shmem_dumb_create);
|
||||
|
||||
@@ -636,7 +633,7 @@ int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_struct
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
vma->vm_flags |= VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP;
|
||||
vm_flags_set(vma, VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
if (shmem->map_wc)
|
||||
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
|
||||
@@ -684,23 +681,7 @@ struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_shmem_object *shmem)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_gem_shmem_get_sg_table);
|
||||
|
||||
/**
|
||||
* drm_gem_shmem_get_pages_sgt - Pin pages, dma map them, and return a
|
||||
* scatter/gather table for a shmem GEM object.
|
||||
* @shmem: shmem GEM object
|
||||
*
|
||||
* This function returns a scatter/gather table suitable for driver usage. If
|
||||
* the sg table doesn't exist, the pages are pinned, dma-mapped, and a sg
|
||||
* table created.
|
||||
*
|
||||
* This is the main function for drivers to get at backing storage, and it hides
|
||||
* and difference between dma-buf imported and natively allocated objects.
|
||||
* drm_gem_shmem_get_sg_table() should not be directly called by drivers.
|
||||
*
|
||||
* Returns:
|
||||
* A pointer to the scatter/gather table of pinned pages or errno on failure.
|
||||
*/
|
||||
struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_shmem_object *shmem)
|
||||
static struct sg_table *drm_gem_shmem_get_pages_sgt_locked(struct drm_gem_shmem_object *shmem)
|
||||
{
|
||||
struct drm_gem_object *obj = &shmem->base;
|
||||
int ret;
|
||||
@@ -711,7 +692,7 @@ struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_shmem_object *shmem)
|
||||
|
||||
WARN_ON(obj->import_attach);
|
||||
|
||||
ret = drm_gem_shmem_get_pages(shmem);
|
||||
ret = drm_gem_shmem_get_pages_locked(shmem);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
@@ -733,9 +714,39 @@ err_free_sgt:
|
||||
sg_free_table(sgt);
|
||||
kfree(sgt);
|
||||
err_put_pages:
|
||||
drm_gem_shmem_put_pages(shmem);
|
||||
drm_gem_shmem_put_pages_locked(shmem);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_gem_shmem_get_pages_sgt - Pin pages, dma map them, and return a
|
||||
* scatter/gather table for a shmem GEM object.
|
||||
* @shmem: shmem GEM object
|
||||
*
|
||||
* This function returns a scatter/gather table suitable for driver usage. If
|
||||
* the sg table doesn't exist, the pages are pinned, dma-mapped, and a sg
|
||||
* table created.
|
||||
*
|
||||
* This is the main function for drivers to get at backing storage, and it hides
|
||||
* and difference between dma-buf imported and natively allocated objects.
|
||||
* drm_gem_shmem_get_sg_table() should not be directly called by drivers.
|
||||
*
|
||||
* Returns:
|
||||
* A pointer to the scatter/gather table of pinned pages or errno on failure.
|
||||
*/
|
||||
struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_shmem_object *shmem)
|
||||
{
|
||||
int ret;
|
||||
struct sg_table *sgt;
|
||||
|
||||
ret = mutex_lock_interruptible(&shmem->pages_lock);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
sgt = drm_gem_shmem_get_pages_sgt_locked(shmem);
|
||||
mutex_unlock(&shmem->pages_lock);
|
||||
|
||||
return sgt;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_gem_shmem_get_pages_sgt);
|
||||
|
||||
/**
|
||||
@@ -767,7 +778,7 @@ drm_gem_shmem_prime_import_sg_table(struct drm_device *dev,
|
||||
|
||||
shmem->sgt = sgt;
|
||||
|
||||
DRM_DEBUG_PRIME("size = %zu\n", size);
|
||||
drm_dbg_prime(dev, "size = %zu\n", size);
|
||||
|
||||
return &shmem->base;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user