|
@@ -134,12 +134,13 @@ int psb_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
|
|
|
* vma->vm_private_data points to the GEM object that is backing this
|
|
|
* mapping.
|
|
|
*/
|
|
|
-int psb_gem_fault(struct vm_fault *vmf)
|
|
|
+vm_fault_t psb_gem_fault(struct vm_fault *vmf)
|
|
|
{
|
|
|
struct vm_area_struct *vma = vmf->vma;
|
|
|
struct drm_gem_object *obj;
|
|
|
struct gtt_range *r;
|
|
|
- int ret;
|
|
|
+ int err;
|
|
|
+ vm_fault_t ret;
|
|
|
unsigned long pfn;
|
|
|
pgoff_t page_offset;
|
|
|
struct drm_device *dev;
|
|
@@ -158,9 +159,10 @@ int psb_gem_fault(struct vm_fault *vmf)
|
|
|
/* For now the mmap pins the object and it stays pinned. As things
|
|
|
stand that will do us no harm */
|
|
|
if (r->mmapping == 0) {
|
|
|
- ret = psb_gtt_pin(r);
|
|
|
- if (ret < 0) {
|
|
|
- dev_err(dev->dev, "gma500: pin failed: %d\n", ret);
|
|
|
+ err = psb_gtt_pin(r);
|
|
|
+ if (err < 0) {
|
|
|
+ dev_err(dev->dev, "gma500: pin failed: %d\n", err);
|
|
|
+ ret = vmf_error(err);
|
|
|
goto fail;
|
|
|
}
|
|
|
r->mmapping = 1;
|
|
@@ -175,18 +177,9 @@ int psb_gem_fault(struct vm_fault *vmf)
|
|
|
pfn = (dev_priv->stolen_base + r->offset) >> PAGE_SHIFT;
|
|
|
else
|
|
|
pfn = page_to_pfn(r->pages[page_offset]);
|
|
|
- ret = vm_insert_pfn(vma, vmf->address, pfn);
|
|
|
-
|
|
|
+ ret = vmf_insert_pfn(vma, vmf->address, pfn);
|
|
|
fail:
|
|
|
mutex_unlock(&dev_priv->mmap_mutex);
|
|
|
- switch (ret) {
|
|
|
- case 0:
|
|
|
- case -ERESTARTSYS:
|
|
|
- case -EINTR:
|
|
|
- return VM_FAULT_NOPAGE;
|
|
|
- case -ENOMEM:
|
|
|
- return VM_FAULT_OOM;
|
|
|
- default:
|
|
|
- return VM_FAULT_SIGBUS;
|
|
|
- }
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|