-
-
Save tiagovignatti/38358b4ab093ee53c31e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- /media/git/drm-intel/drivers/gpu/drm/vgem/vgem_drv.c 2015-05-14 18:25:58.743234338 -0300 | |
+++ /media/chromiumos/src/third_party/kernel/v3.14/drivers/gpu/drm/vgem/vgem_drv.c 2015-04-16 21:04:40.173736984 -0300 | |
@@ -30,6 +30,7 @@ | |
* software renderer and the X server for efficient buffer sharing. | |
*/ | |
+#include "drmP.h" | |
#include <linux/module.h> | |
#include <linux/ramfs.h> | |
#include <linux/shmem_fs.h> | |
@@ -44,7 +45,16 @@ | |
void vgem_gem_put_pages(struct drm_vgem_gem_object *obj) | |
{ | |
- drm_gem_put_pages(&obj->base, obj->pages, false, false); | |
+ int num_pages = obj->base.size / PAGE_SIZE; | |
+ int i; | |
+ | |
+ for (i = 0; i < num_pages; i++) { | |
+ if (obj->pages[i] == NULL) | |
+ break; | |
+ page_cache_release(obj->pages[i]); | |
+ } | |
+ | |
+ drm_free_large(obj->pages); | |
obj->pages = NULL; | |
} | |
@@ -71,19 +81,37 @@ | |
int vgem_gem_get_pages(struct drm_vgem_gem_object *obj) | |
{ | |
- struct page **pages; | |
+ struct address_space *mapping; | |
+ gfp_t gfpmask = GFP_KERNEL; | |
+ int num_pages, i, ret = 0; | |
if (obj->pages || obj->use_dma_buf) | |
return 0; | |
- pages = drm_gem_get_pages(&obj->base); | |
- if (IS_ERR(pages)) { | |
- return PTR_ERR(pages); | |
+ num_pages = obj->base.size / PAGE_SIZE; | |
+ obj->pages = drm_malloc_ab(num_pages, sizeof(struct page *)); | |
+ if (obj->pages == NULL) | |
+ return -ENOMEM; | |
+ | |
+ mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping; | |
+ gfpmask |= mapping_gfp_mask(mapping); | |
+ | |
+ for (i = 0; i < num_pages; i++) { | |
+ struct page *page; | |
+ obj->pages[i] = NULL; | |
+ page = shmem_read_mapping_page_gfp(mapping, i, gfpmask); | |
+ if (IS_ERR(page)) { | |
+ ret = PTR_ERR(page); | |
+ goto err_out; | |
+ } | |
+ obj->pages[i] = page; | |
} | |
- obj->pages = pages; | |
+ return ret; | |
- return 0; | |
+err_out: | |
+ vgem_gem_put_pages(obj); | |
+ return ret; | |
} | |
static int vgem_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |
@@ -174,9 +202,8 @@ | |
{ | |
struct drm_gem_object *gem_object; | |
uint64_t size; | |
- uint64_t pitch = args->width * DIV_ROUND_UP(args->bpp, 8); | |
- size = args->height * pitch; | |
+ size = args->height * args->width * DIV_ROUND_UP(args->bpp, 8); | |
if (size == 0) | |
return -EINVAL; | |
@@ -188,7 +215,7 @@ | |
} | |
args->size = gem_object->size; | |
- args->pitch = pitch; | |
+ args->pitch = args->width; | |
DRM_DEBUG_DRIVER("Created object of size %lld\n", size); | |
@@ -289,6 +316,8 @@ | |
static struct drm_ioctl_desc vgem_ioctls[] = { | |
+ DRM_IOCTL_DEF_DRV(VGEM_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, | |
+ DRM_CONTROL_ALLOW|DRM_UNLOCKED|DRM_RENDER_ALLOW), | |
}; | |
static const struct file_operations vgem_driver_fops = { | |
@@ -302,7 +331,8 @@ | |
}; | |
static struct drm_driver vgem_driver = { | |
- .driver_features = DRIVER_GEM | DRIVER_PRIME, | |
+ .driver_features = | |
+ DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER, | |
.gem_free_object = vgem_gem_free_object, | |
.gem_vm_ops = &vgem_gem_vm_ops, | |
.ioctls = vgem_ioctls, | |
@@ -325,35 +355,65 @@ | |
.minor = DRIVER_MINOR, | |
}; | |
-struct drm_device *vgem_device; | |
+static int vgem_platform_probe(struct platform_device *pdev) | |
+{ | |
+ vgem_driver.num_ioctls = ARRAY_SIZE(vgem_ioctls); | |
+ | |
+ return drm_platform_init(&vgem_driver, pdev); | |
+} | |
+ | |
+static int vgem_platform_remove(struct platform_device *pdev) | |
+{ | |
+ drm_put_dev(platform_get_drvdata(pdev)); | |
+ return 0; | |
+} | |
+ | |
+static struct platform_driver vgem_platform_driver = { | |
+ .probe = vgem_platform_probe, | |
+ .remove = vgem_platform_remove, | |
+ .driver = { | |
+ .owner = THIS_MODULE, | |
+ .name = DRIVER_NAME, | |
+ }, | |
+}; | |
+ | |
+static struct platform_device *vgem_device; | |
static int __init vgem_init(void) | |
{ | |
int ret; | |
- vgem_device = drm_dev_alloc(&vgem_driver, NULL); | |
+ ret = platform_driver_register(&vgem_platform_driver); | |
+ if (ret) | |
+ goto out; | |
+ | |
+ vgem_device = platform_device_alloc("vgem", -1); | |
if (!vgem_device) { | |
ret = -ENOMEM; | |
- goto out; | |
+ goto unregister_out; | |
} | |
- ret = drm_dev_register(vgem_device, 0); | |
+ vgem_device->dev.coherent_dma_mask = ~0ULL; | |
+ vgem_device->dev.dma_mask = &vgem_device->dev.coherent_dma_mask; | |
+ ret = platform_device_add(vgem_device); | |
if (ret) | |
- goto out_unref; | |
+ goto put_out; | |
return 0; | |
-out_unref: | |
- drm_dev_unref(vgem_device); | |
+put_out: | |
+ platform_device_put(vgem_device); | |
+unregister_out: | |
+ platform_driver_unregister(&vgem_platform_driver); | |
out: | |
return ret; | |
} | |
static void __exit vgem_exit(void) | |
{ | |
- drm_dev_unregister(vgem_device); | |
- drm_dev_unref(vgem_device); | |
+ platform_device_unregister(vgem_device); | |
+ platform_driver_unregister(&vgem_platform_driver); | |
} | |
module_init(vgem_init); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment