|
@@ -20,97 +20,100 @@
|
|
|
#include "exynos_drm_gem.h"
|
|
|
#include "exynos_drm_iommu.h"
|
|
|
|
|
|
-static int exynos_drm_alloc_buf(struct exynos_drm_gem_obj *obj)
|
|
|
+static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem)
|
|
|
{
|
|
|
- struct drm_device *dev = obj->base.dev;
|
|
|
+ struct drm_device *dev = exynos_gem->base.dev;
|
|
|
enum dma_attr attr;
|
|
|
unsigned int nr_pages;
|
|
|
|
|
|
- if (obj->dma_addr) {
|
|
|
+ if (exynos_gem->dma_addr) {
|
|
|
DRM_DEBUG_KMS("already allocated.\n");
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- init_dma_attrs(&obj->dma_attrs);
|
|
|
+ init_dma_attrs(&exynos_gem->dma_attrs);
|
|
|
|
|
|
/*
|
|
|
* if EXYNOS_BO_CONTIG, fully physically contiguous memory
|
|
|
* region will be allocated else physically contiguous
|
|
|
* as possible.
|
|
|
*/
|
|
|
- if (!(obj->flags & EXYNOS_BO_NONCONTIG))
|
|
|
- dma_set_attr(DMA_ATTR_FORCE_CONTIGUOUS, &obj->dma_attrs);
|
|
|
+ if (!(exynos_gem->flags & EXYNOS_BO_NONCONTIG))
|
|
|
+ dma_set_attr(DMA_ATTR_FORCE_CONTIGUOUS, &exynos_gem->dma_attrs);
|
|
|
|
|
|
/*
|
|
|
* if EXYNOS_BO_WC or EXYNOS_BO_NONCACHABLE, writecombine mapping
|
|
|
* else cachable mapping.
|
|
|
*/
|
|
|
- if (obj->flags & EXYNOS_BO_WC || !(obj->flags & EXYNOS_BO_CACHABLE))
|
|
|
+ if (exynos_gem->flags & EXYNOS_BO_WC ||
|
|
|
+ !(exynos_gem->flags & EXYNOS_BO_CACHABLE))
|
|
|
attr = DMA_ATTR_WRITE_COMBINE;
|
|
|
else
|
|
|
attr = DMA_ATTR_NON_CONSISTENT;
|
|
|
|
|
|
- dma_set_attr(attr, &obj->dma_attrs);
|
|
|
- dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &obj->dma_attrs);
|
|
|
+ dma_set_attr(attr, &exynos_gem->dma_attrs);
|
|
|
+ dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &exynos_gem->dma_attrs);
|
|
|
|
|
|
- nr_pages = obj->size >> PAGE_SHIFT;
|
|
|
+ nr_pages = exynos_gem->size >> PAGE_SHIFT;
|
|
|
|
|
|
if (!is_drm_iommu_supported(dev)) {
|
|
|
- obj->pages = drm_calloc_large(nr_pages, sizeof(struct page *));
|
|
|
- if (!obj->pages) {
|
|
|
+ exynos_gem->pages = drm_calloc_large(nr_pages,
|
|
|
+ sizeof(struct page *));
|
|
|
+ if (!exynos_gem->pages) {
|
|
|
DRM_ERROR("failed to allocate pages.\n");
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- obj->cookie = dma_alloc_attrs(dev->dev, obj->size, &obj->dma_addr,
|
|
|
- GFP_KERNEL, &obj->dma_attrs);
|
|
|
- if (!obj->cookie) {
|
|
|
+ exynos_gem->cookie = dma_alloc_attrs(dev->dev, exynos_gem->size,
|
|
|
+ &exynos_gem->dma_addr, GFP_KERNEL,
|
|
|
+ &exynos_gem->dma_attrs);
|
|
|
+ if (!exynos_gem->cookie) {
|
|
|
DRM_ERROR("failed to allocate buffer.\n");
|
|
|
- if (obj->pages)
|
|
|
- drm_free_large(obj->pages);
|
|
|
+ if (exynos_gem->pages)
|
|
|
+ drm_free_large(exynos_gem->pages);
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- if (obj->pages) {
|
|
|
+ if (exynos_gem->pages) {
|
|
|
dma_addr_t start_addr;
|
|
|
unsigned int i = 0;
|
|
|
|
|
|
- start_addr = obj->dma_addr;
|
|
|
+ start_addr = exynos_gem->dma_addr;
|
|
|
while (i < nr_pages) {
|
|
|
- obj->pages[i] = pfn_to_page(dma_to_pfn(dev->dev,
|
|
|
- start_addr));
|
|
|
+ exynos_gem->pages[i] =
|
|
|
+ pfn_to_page(dma_to_pfn(dev->dev, start_addr));
|
|
|
start_addr += PAGE_SIZE;
|
|
|
i++;
|
|
|
}
|
|
|
} else {
|
|
|
- obj->pages = obj->cookie;
|
|
|
+ exynos_gem->pages = exynos_gem->cookie;
|
|
|
}
|
|
|
|
|
|
DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n",
|
|
|
- (unsigned long)obj->dma_addr,
|
|
|
- obj->size);
|
|
|
+ (unsigned long)exynos_gem->dma_addr, exynos_gem->size);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void exynos_drm_free_buf(struct exynos_drm_gem_obj *obj)
|
|
|
+static void exynos_drm_free_buf(struct exynos_drm_gem *exynos_gem)
|
|
|
{
|
|
|
- struct drm_device *dev = obj->base.dev;
|
|
|
+ struct drm_device *dev = exynos_gem->base.dev;
|
|
|
|
|
|
- if (!obj->dma_addr) {
|
|
|
+ if (!exynos_gem->dma_addr) {
|
|
|
DRM_DEBUG_KMS("dma_addr is invalid.\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n",
|
|
|
- (unsigned long)obj->dma_addr, obj->size);
|
|
|
+ (unsigned long)exynos_gem->dma_addr, exynos_gem->size);
|
|
|
|
|
|
- dma_free_attrs(dev->dev, obj->size, obj->cookie,
|
|
|
- (dma_addr_t)obj->dma_addr, &obj->dma_attrs);
|
|
|
+ dma_free_attrs(dev->dev, exynos_gem->size, exynos_gem->cookie,
|
|
|
+ (dma_addr_t)exynos_gem->dma_addr,
|
|
|
+ &exynos_gem->dma_attrs);
|
|
|
|
|
|
if (!is_drm_iommu_supported(dev))
|
|
|
- drm_free_large(obj->pages);
|
|
|
+ drm_free_large(exynos_gem->pages);
|
|
|
}
|
|
|
|
|
|
static int exynos_drm_gem_handle_create(struct drm_gem_object *obj,
|
|
@@ -135,9 +138,9 @@ static int exynos_drm_gem_handle_create(struct drm_gem_object *obj,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-void exynos_drm_gem_destroy(struct exynos_drm_gem_obj *exynos_gem_obj)
|
|
|
+void exynos_drm_gem_destroy(struct exynos_drm_gem *exynos_gem)
|
|
|
{
|
|
|
- struct drm_gem_object *obj = &exynos_gem_obj->base;
|
|
|
+ struct drm_gem_object *obj = &exynos_gem->base;
|
|
|
|
|
|
DRM_DEBUG_KMS("handle count = %d\n", obj->handle_count);
|
|
|
|
|
@@ -148,21 +151,21 @@ void exynos_drm_gem_destroy(struct exynos_drm_gem_obj *exynos_gem_obj)
|
|
|
* once dmabuf's refcount becomes 0.
|
|
|
*/
|
|
|
if (obj->import_attach)
|
|
|
- drm_prime_gem_destroy(obj, exynos_gem_obj->sgt);
|
|
|
+ drm_prime_gem_destroy(obj, exynos_gem->sgt);
|
|
|
else
|
|
|
- exynos_drm_free_buf(exynos_gem_obj);
|
|
|
+ exynos_drm_free_buf(exynos_gem);
|
|
|
|
|
|
/* release file pointer to gem object. */
|
|
|
drm_gem_object_release(obj);
|
|
|
|
|
|
- kfree(exynos_gem_obj);
|
|
|
+ kfree(exynos_gem);
|
|
|
}
|
|
|
|
|
|
unsigned long exynos_drm_gem_get_size(struct drm_device *dev,
|
|
|
unsigned int gem_handle,
|
|
|
struct drm_file *file_priv)
|
|
|
{
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
+ struct exynos_drm_gem *exynos_gem;
|
|
|
struct drm_gem_object *obj;
|
|
|
|
|
|
obj = drm_gem_object_lookup(dev, file_priv, gem_handle);
|
|
@@ -171,51 +174,51 @@ unsigned long exynos_drm_gem_get_size(struct drm_device *dev,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- exynos_gem_obj = to_exynos_gem_obj(obj);
|
|
|
+ exynos_gem = to_exynos_gem(obj);
|
|
|
|
|
|
drm_gem_object_unreference_unlocked(obj);
|
|
|
|
|
|
- return exynos_gem_obj->size;
|
|
|
+ return exynos_gem->size;
|
|
|
}
|
|
|
|
|
|
-static struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev,
|
|
|
- unsigned long size)
|
|
|
+static struct exynos_drm_gem *exynos_drm_gem_init(struct drm_device *dev,
|
|
|
+ unsigned long size)
|
|
|
{
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
+ struct exynos_drm_gem *exynos_gem;
|
|
|
struct drm_gem_object *obj;
|
|
|
int ret;
|
|
|
|
|
|
- exynos_gem_obj = kzalloc(sizeof(*exynos_gem_obj), GFP_KERNEL);
|
|
|
- if (!exynos_gem_obj)
|
|
|
+ exynos_gem = kzalloc(sizeof(*exynos_gem), GFP_KERNEL);
|
|
|
+ if (!exynos_gem)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- exynos_gem_obj->size = size;
|
|
|
- obj = &exynos_gem_obj->base;
|
|
|
+ exynos_gem->size = size;
|
|
|
+ obj = &exynos_gem->base;
|
|
|
|
|
|
ret = drm_gem_object_init(dev, obj, size);
|
|
|
if (ret < 0) {
|
|
|
DRM_ERROR("failed to initialize gem object\n");
|
|
|
- kfree(exynos_gem_obj);
|
|
|
+ kfree(exynos_gem);
|
|
|
return ERR_PTR(ret);
|
|
|
}
|
|
|
|
|
|
ret = drm_gem_create_mmap_offset(obj);
|
|
|
if (ret < 0) {
|
|
|
drm_gem_object_release(obj);
|
|
|
- kfree(exynos_gem_obj);
|
|
|
+ kfree(exynos_gem);
|
|
|
return ERR_PTR(ret);
|
|
|
}
|
|
|
|
|
|
DRM_DEBUG_KMS("created file object = 0x%x\n", (unsigned int)obj->filp);
|
|
|
|
|
|
- return exynos_gem_obj;
|
|
|
+ return exynos_gem;
|
|
|
}
|
|
|
|
|
|
-struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev,
|
|
|
- unsigned int flags,
|
|
|
- unsigned long size)
|
|
|
+struct exynos_drm_gem *exynos_drm_gem_create(struct drm_device *dev,
|
|
|
+ unsigned int flags,
|
|
|
+ unsigned long size)
|
|
|
{
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
+ struct exynos_drm_gem *exynos_gem;
|
|
|
int ret;
|
|
|
|
|
|
if (flags & ~(EXYNOS_BO_MASK)) {
|
|
@@ -230,38 +233,38 @@ struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev,
|
|
|
|
|
|
size = roundup(size, PAGE_SIZE);
|
|
|
|
|
|
- exynos_gem_obj = exynos_drm_gem_init(dev, size);
|
|
|
- if (IS_ERR(exynos_gem_obj))
|
|
|
- return exynos_gem_obj;
|
|
|
+ exynos_gem = exynos_drm_gem_init(dev, size);
|
|
|
+ if (IS_ERR(exynos_gem))
|
|
|
+ return exynos_gem;
|
|
|
|
|
|
/* set memory type and cache attribute from user side. */
|
|
|
- exynos_gem_obj->flags = flags;
|
|
|
+ exynos_gem->flags = flags;
|
|
|
|
|
|
- ret = exynos_drm_alloc_buf(exynos_gem_obj);
|
|
|
+ ret = exynos_drm_alloc_buf(exynos_gem);
|
|
|
if (ret < 0) {
|
|
|
- drm_gem_object_release(&exynos_gem_obj->base);
|
|
|
- kfree(exynos_gem_obj);
|
|
|
+ drm_gem_object_release(&exynos_gem->base);
|
|
|
+ kfree(exynos_gem);
|
|
|
return ERR_PTR(ret);
|
|
|
}
|
|
|
|
|
|
- return exynos_gem_obj;
|
|
|
+ return exynos_gem;
|
|
|
}
|
|
|
|
|
|
int exynos_drm_gem_create_ioctl(struct drm_device *dev, void *data,
|
|
|
struct drm_file *file_priv)
|
|
|
{
|
|
|
struct drm_exynos_gem_create *args = data;
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
+ struct exynos_drm_gem *exynos_gem;
|
|
|
int ret;
|
|
|
|
|
|
- exynos_gem_obj = exynos_drm_gem_create(dev, args->flags, args->size);
|
|
|
- if (IS_ERR(exynos_gem_obj))
|
|
|
- return PTR_ERR(exynos_gem_obj);
|
|
|
+ exynos_gem = exynos_drm_gem_create(dev, args->flags, args->size);
|
|
|
+ if (IS_ERR(exynos_gem))
|
|
|
+ return PTR_ERR(exynos_gem);
|
|
|
|
|
|
- ret = exynos_drm_gem_handle_create(&exynos_gem_obj->base, file_priv,
|
|
|
- &args->handle);
|
|
|
+ ret = exynos_drm_gem_handle_create(&exynos_gem->base, file_priv,
|
|
|
+ &args->handle);
|
|
|
if (ret) {
|
|
|
- exynos_drm_gem_destroy(exynos_gem_obj);
|
|
|
+ exynos_drm_gem_destroy(exynos_gem);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -272,7 +275,7 @@ dma_addr_t *exynos_drm_gem_get_dma_addr(struct drm_device *dev,
|
|
|
unsigned int gem_handle,
|
|
|
struct drm_file *filp)
|
|
|
{
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
+ struct exynos_drm_gem *exynos_gem;
|
|
|
struct drm_gem_object *obj;
|
|
|
|
|
|
obj = drm_gem_object_lookup(dev, filp, gem_handle);
|
|
@@ -281,9 +284,9 @@ dma_addr_t *exynos_drm_gem_get_dma_addr(struct drm_device *dev,
|
|
|
return ERR_PTR(-EINVAL);
|
|
|
}
|
|
|
|
|
|
- exynos_gem_obj = to_exynos_gem_obj(obj);
|
|
|
+ exynos_gem = to_exynos_gem(obj);
|
|
|
|
|
|
- return &exynos_gem_obj->dma_addr;
|
|
|
+ return &exynos_gem->dma_addr;
|
|
|
}
|
|
|
|
|
|
void exynos_drm_gem_put_dma_addr(struct drm_device *dev,
|
|
@@ -307,10 +310,10 @@ void exynos_drm_gem_put_dma_addr(struct drm_device *dev,
|
|
|
drm_gem_object_unreference_unlocked(obj);
|
|
|
}
|
|
|
|
|
|
-static int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem_obj *exynos_gem_obj,
|
|
|
+static int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem *exynos_gem,
|
|
|
struct vm_area_struct *vma)
|
|
|
{
|
|
|
- struct drm_device *drm_dev = exynos_gem_obj->base.dev;
|
|
|
+ struct drm_device *drm_dev = exynos_gem->base.dev;
|
|
|
unsigned long vm_size;
|
|
|
int ret;
|
|
|
|
|
@@ -320,12 +323,12 @@ static int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem_obj *exynos_gem_obj,
|
|
|
vm_size = vma->vm_end - vma->vm_start;
|
|
|
|
|
|
/* check if user-requested size is valid. */
|
|
|
- if (vm_size > exynos_gem_obj->size)
|
|
|
+ if (vm_size > exynos_gem->size)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- ret = dma_mmap_attrs(drm_dev->dev, vma, exynos_gem_obj->pages,
|
|
|
- exynos_gem_obj->dma_addr, exynos_gem_obj->size,
|
|
|
- &exynos_gem_obj->dma_attrs);
|
|
|
+ ret = dma_mmap_attrs(drm_dev->dev, vma, exynos_gem->pages,
|
|
|
+ exynos_gem->dma_addr, exynos_gem->size,
|
|
|
+ &exynos_gem->dma_attrs);
|
|
|
if (ret < 0) {
|
|
|
DRM_ERROR("failed to mmap.\n");
|
|
|
return ret;
|
|
@@ -337,7 +340,7 @@ static int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem_obj *exynos_gem_obj,
|
|
|
int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data,
|
|
|
struct drm_file *file_priv)
|
|
|
{
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
+ struct exynos_drm_gem *exynos_gem;
|
|
|
struct drm_exynos_gem_info *args = data;
|
|
|
struct drm_gem_object *obj;
|
|
|
|
|
@@ -350,10 +353,10 @@ int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- exynos_gem_obj = to_exynos_gem_obj(obj);
|
|
|
+ exynos_gem = to_exynos_gem(obj);
|
|
|
|
|
|
- args->flags = exynos_gem_obj->flags;
|
|
|
- args->size = exynos_gem_obj->size;
|
|
|
+ args->flags = exynos_gem->flags;
|
|
|
+ args->size = exynos_gem->size;
|
|
|
|
|
|
drm_gem_object_unreference(obj);
|
|
|
mutex_unlock(&dev->struct_mutex);
|
|
@@ -389,14 +392,14 @@ void exynos_gem_unmap_sgt_from_dma(struct drm_device *drm_dev,
|
|
|
|
|
|
void exynos_drm_gem_free_object(struct drm_gem_object *obj)
|
|
|
{
|
|
|
- exynos_drm_gem_destroy(to_exynos_gem_obj(obj));
|
|
|
+ exynos_drm_gem_destroy(to_exynos_gem(obj));
|
|
|
}
|
|
|
|
|
|
int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
|
|
|
struct drm_device *dev,
|
|
|
struct drm_mode_create_dumb *args)
|
|
|
{
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
+ struct exynos_drm_gem *exynos_gem;
|
|
|
unsigned int flags;
|
|
|
int ret;
|
|
|
|
|
@@ -414,16 +417,16 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
|
|
|
else
|
|
|
flags = EXYNOS_BO_CONTIG | EXYNOS_BO_WC;
|
|
|
|
|
|
- exynos_gem_obj = exynos_drm_gem_create(dev, flags, args->size);
|
|
|
- if (IS_ERR(exynos_gem_obj)) {
|
|
|
+ exynos_gem = exynos_drm_gem_create(dev, flags, args->size);
|
|
|
+ if (IS_ERR(exynos_gem)) {
|
|
|
dev_warn(dev->dev, "FB allocation failed.\n");
|
|
|
- return PTR_ERR(exynos_gem_obj);
|
|
|
+ return PTR_ERR(exynos_gem);
|
|
|
}
|
|
|
|
|
|
- ret = exynos_drm_gem_handle_create(&exynos_gem_obj->base, file_priv,
|
|
|
- &args->handle);
|
|
|
+ ret = exynos_drm_gem_handle_create(&exynos_gem->base, file_priv,
|
|
|
+ &args->handle);
|
|
|
if (ret) {
|
|
|
- exynos_drm_gem_destroy(exynos_gem_obj);
|
|
|
+ exynos_drm_gem_destroy(exynos_gem);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -464,7 +467,7 @@ unlock:
|
|
|
int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|
|
{
|
|
|
struct drm_gem_object *obj = vma->vm_private_data;
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);
|
|
|
+ struct exynos_drm_gem *exynos_gem = to_exynos_gem(obj);
|
|
|
unsigned long pfn;
|
|
|
pgoff_t page_offset;
|
|
|
int ret;
|
|
@@ -472,13 +475,13 @@ int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|
|
page_offset = ((unsigned long)vmf->virtual_address -
|
|
|
vma->vm_start) >> PAGE_SHIFT;
|
|
|
|
|
|
- if (page_offset >= (exynos_gem_obj->size >> PAGE_SHIFT)) {
|
|
|
+ if (page_offset >= (exynos_gem->size >> PAGE_SHIFT)) {
|
|
|
DRM_ERROR("invalid page offset\n");
|
|
|
ret = -EINVAL;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- pfn = page_to_pfn(exynos_gem_obj->pages[page_offset]);
|
|
|
+ pfn = page_to_pfn(exynos_gem->pages[page_offset]);
|
|
|
ret = vm_insert_mixed(vma, (unsigned long)vmf->virtual_address, pfn);
|
|
|
|
|
|
out:
|
|
@@ -496,7 +499,7 @@ out:
|
|
|
|
|
|
int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
|
|
|
{
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
+ struct exynos_drm_gem *exynos_gem;
|
|
|
struct drm_gem_object *obj;
|
|
|
int ret;
|
|
|
|
|
@@ -508,21 +511,21 @@ int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
|
|
|
}
|
|
|
|
|
|
obj = vma->vm_private_data;
|
|
|
- exynos_gem_obj = to_exynos_gem_obj(obj);
|
|
|
+ exynos_gem = to_exynos_gem(obj);
|
|
|
|
|
|
- DRM_DEBUG_KMS("flags = 0x%x\n", exynos_gem_obj->flags);
|
|
|
+ DRM_DEBUG_KMS("flags = 0x%x\n", exynos_gem->flags);
|
|
|
|
|
|
/* non-cachable as default. */
|
|
|
- if (exynos_gem_obj->flags & EXYNOS_BO_CACHABLE)
|
|
|
+ if (exynos_gem->flags & EXYNOS_BO_CACHABLE)
|
|
|
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
|
|
- else if (exynos_gem_obj->flags & EXYNOS_BO_WC)
|
|
|
+ else if (exynos_gem->flags & EXYNOS_BO_WC)
|
|
|
vma->vm_page_prot =
|
|
|
pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
|
|
|
else
|
|
|
vma->vm_page_prot =
|
|
|
pgprot_noncached(vm_get_page_prot(vma->vm_flags));
|
|
|
|
|
|
- ret = exynos_drm_gem_mmap_buffer(exynos_gem_obj, vma);
|
|
|
+ ret = exynos_drm_gem_mmap_buffer(exynos_gem, vma);
|
|
|
if (ret)
|
|
|
goto err_close_vm;
|
|
|
|
|
@@ -537,12 +540,12 @@ err_close_vm:
|
|
|
/* low-level interface prime helpers */
|
|
|
struct sg_table *exynos_drm_gem_prime_get_sg_table(struct drm_gem_object *obj)
|
|
|
{
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);
|
|
|
+ struct exynos_drm_gem *exynos_gem = to_exynos_gem(obj);
|
|
|
int npages;
|
|
|
|
|
|
- npages = exynos_gem_obj->size >> PAGE_SHIFT;
|
|
|
+ npages = exynos_gem->size >> PAGE_SHIFT;
|
|
|
|
|
|
- return drm_prime_pages_to_sg(exynos_gem_obj->pages, npages);
|
|
|
+ return drm_prime_pages_to_sg(exynos_gem->pages, npages);
|
|
|
}
|
|
|
|
|
|
struct drm_gem_object *
|
|
@@ -550,35 +553,35 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev,
|
|
|
struct dma_buf_attachment *attach,
|
|
|
struct sg_table *sgt)
|
|
|
{
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
+ struct exynos_drm_gem *exynos_gem;
|
|
|
int npages;
|
|
|
int ret;
|
|
|
|
|
|
- exynos_gem_obj = exynos_drm_gem_init(dev, attach->dmabuf->size);
|
|
|
- if (IS_ERR(exynos_gem_obj)) {
|
|
|
- ret = PTR_ERR(exynos_gem_obj);
|
|
|
+ exynos_gem = exynos_drm_gem_init(dev, attach->dmabuf->size);
|
|
|
+ if (IS_ERR(exynos_gem)) {
|
|
|
+ ret = PTR_ERR(exynos_gem);
|
|
|
return ERR_PTR(ret);
|
|
|
}
|
|
|
|
|
|
- exynos_gem_obj->dma_addr = sg_dma_address(sgt->sgl);
|
|
|
+ exynos_gem->dma_addr = sg_dma_address(sgt->sgl);
|
|
|
|
|
|
- npages = exynos_gem_obj->size >> PAGE_SHIFT;
|
|
|
- exynos_gem_obj->pages = drm_malloc_ab(npages, sizeof(struct page *));
|
|
|
- if (!exynos_gem_obj->pages) {
|
|
|
+ npages = exynos_gem->size >> PAGE_SHIFT;
|
|
|
+ exynos_gem->pages = drm_malloc_ab(npages, sizeof(struct page *));
|
|
|
+ if (!exynos_gem->pages) {
|
|
|
ret = -ENOMEM;
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
- ret = drm_prime_sg_to_page_addr_arrays(sgt, exynos_gem_obj->pages, NULL,
|
|
|
- npages);
|
|
|
+ ret = drm_prime_sg_to_page_addr_arrays(sgt, exynos_gem->pages, NULL,
|
|
|
+ npages);
|
|
|
if (ret < 0)
|
|
|
goto err_free_large;
|
|
|
|
|
|
- exynos_gem_obj->sgt = sgt;
|
|
|
+ exynos_gem->sgt = sgt;
|
|
|
|
|
|
if (sgt->nents == 1) {
|
|
|
/* always physically continuous memory if sgt->nents is 1. */
|
|
|
- exynos_gem_obj->flags |= EXYNOS_BO_CONTIG;
|
|
|
+ exynos_gem->flags |= EXYNOS_BO_CONTIG;
|
|
|
} else {
|
|
|
/*
|
|
|
* this case could be CONTIG or NONCONTIG type but for now
|
|
@@ -586,16 +589,16 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev,
|
|
|
* TODO. we have to find a way that exporter can notify
|
|
|
* the type of its own buffer to importer.
|
|
|
*/
|
|
|
- exynos_gem_obj->flags |= EXYNOS_BO_NONCONTIG;
|
|
|
+ exynos_gem->flags |= EXYNOS_BO_NONCONTIG;
|
|
|
}
|
|
|
|
|
|
- return &exynos_gem_obj->base;
|
|
|
+ return &exynos_gem->base;
|
|
|
|
|
|
err_free_large:
|
|
|
- drm_free_large(exynos_gem_obj->pages);
|
|
|
+ drm_free_large(exynos_gem->pages);
|
|
|
err:
|
|
|
- drm_gem_object_release(&exynos_gem_obj->base);
|
|
|
- kfree(exynos_gem_obj);
|
|
|
+ drm_gem_object_release(&exynos_gem->base);
|
|
|
+ kfree(exynos_gem);
|
|
|
return ERR_PTR(ret);
|
|
|
}
|
|
|
|