|
@@ -431,37 +431,24 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-int exynos_drm_gem_fault(struct vm_fault *vmf)
|
|
|
|
|
|
+vm_fault_t exynos_drm_gem_fault(struct vm_fault *vmf)
|
|
{
|
|
{
|
|
struct vm_area_struct *vma = vmf->vma;
|
|
struct vm_area_struct *vma = vmf->vma;
|
|
struct drm_gem_object *obj = vma->vm_private_data;
|
|
struct drm_gem_object *obj = vma->vm_private_data;
|
|
struct exynos_drm_gem *exynos_gem = to_exynos_gem(obj);
|
|
struct exynos_drm_gem *exynos_gem = to_exynos_gem(obj);
|
|
unsigned long pfn;
|
|
unsigned long pfn;
|
|
pgoff_t page_offset;
|
|
pgoff_t page_offset;
|
|
- int ret;
|
|
|
|
|
|
|
|
page_offset = (vmf->address - vma->vm_start) >> PAGE_SHIFT;
|
|
page_offset = (vmf->address - vma->vm_start) >> PAGE_SHIFT;
|
|
|
|
|
|
if (page_offset >= (exynos_gem->size >> PAGE_SHIFT)) {
|
|
if (page_offset >= (exynos_gem->size >> PAGE_SHIFT)) {
|
|
DRM_ERROR("invalid page offset\n");
|
|
DRM_ERROR("invalid page offset\n");
|
|
- ret = -EINVAL;
|
|
|
|
- goto out;
|
|
|
|
|
|
+ return VM_FAULT_SIGBUS;
|
|
}
|
|
}
|
|
|
|
|
|
pfn = page_to_pfn(exynos_gem->pages[page_offset]);
|
|
pfn = page_to_pfn(exynos_gem->pages[page_offset]);
|
|
- ret = vm_insert_mixed(vma, vmf->address, __pfn_to_pfn_t(pfn, PFN_DEV));
|
|
|
|
-
|
|
|
|
-out:
|
|
|
|
- switch (ret) {
|
|
|
|
- case 0:
|
|
|
|
- case -ERESTARTSYS:
|
|
|
|
- case -EINTR:
|
|
|
|
- return VM_FAULT_NOPAGE;
|
|
|
|
- case -ENOMEM:
|
|
|
|
- return VM_FAULT_OOM;
|
|
|
|
- default:
|
|
|
|
- return VM_FAULT_SIGBUS;
|
|
|
|
- }
|
|
|
|
|
|
+ return vmf_insert_mixed(vma, vmf->address,
|
|
|
|
+ __pfn_to_pfn_t(pfn, PFN_DEV));
|
|
}
|
|
}
|
|
|
|
|
|
static int exynos_drm_gem_mmap_obj(struct drm_gem_object *obj,
|
|
static int exynos_drm_gem_mmap_obj(struct drm_gem_object *obj,
|