Merge branch 'tip/perf/urgent-2' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / exynos / exynos_drm_gem.c
1 /* exynos_drm_gem.c
2  *
3  * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4  * Author: Inki Dae <inki.dae@samsung.com>
5  *
6  * This program is free software; you can redistribute  it and/or modify it
7  * under  the terms of  the GNU General  Public License as published by the
8  * Free Software Foundation;  either version 2 of the  License, or (at your
9  * option) any later version.
10  */
11
12 #include <drm/drmP.h>
13
14 #include <linux/shmem_fs.h>
15 #include <drm/exynos_drm.h>
16
17 #include "exynos_drm_drv.h"
18 #include "exynos_drm_gem.h"
19 #include "exynos_drm_buf.h"
20
21 static unsigned int convert_to_vm_err_msg(int msg)
22 {
23         unsigned int out_msg;
24
25         switch (msg) {
26         case 0:
27         case -ERESTARTSYS:
28         case -EINTR:
29                 out_msg = VM_FAULT_NOPAGE;
30                 break;
31
32         case -ENOMEM:
33                 out_msg = VM_FAULT_OOM;
34                 break;
35
36         default:
37                 out_msg = VM_FAULT_SIGBUS;
38                 break;
39         }
40
41         return out_msg;
42 }
43
44 static int check_gem_flags(unsigned int flags)
45 {
46         if (flags & ~(EXYNOS_BO_MASK)) {
47                 DRM_ERROR("invalid flags.\n");
48                 return -EINVAL;
49         }
50
51         return 0;
52 }
53
54 static void update_vm_cache_attr(struct exynos_drm_gem_obj *obj,
55                                         struct vm_area_struct *vma)
56 {
57         DRM_DEBUG_KMS("flags = 0x%x\n", obj->flags);
58
59         /* non-cachable as default. */
60         if (obj->flags & EXYNOS_BO_CACHABLE)
61                 vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
62         else if (obj->flags & EXYNOS_BO_WC)
63                 vma->vm_page_prot =
64                         pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
65         else
66                 vma->vm_page_prot =
67                         pgprot_noncached(vm_get_page_prot(vma->vm_flags));
68 }
69
70 static unsigned long roundup_gem_size(unsigned long size, unsigned int flags)
71 {
72         /* TODO */
73
74         return roundup(size, PAGE_SIZE);
75 }
76
77 static int exynos_drm_gem_map_buf(struct drm_gem_object *obj,
78                                         struct vm_area_struct *vma,
79                                         unsigned long f_vaddr,
80                                         pgoff_t page_offset)
81 {
82         struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);
83         struct exynos_drm_gem_buf *buf = exynos_gem_obj->buffer;
84         struct scatterlist *sgl;
85         unsigned long pfn;
86         int i;
87
88         if (!buf->sgt)
89                 return -EINTR;
90
91         if (page_offset >= (buf->size >> PAGE_SHIFT)) {
92                 DRM_ERROR("invalid page offset\n");
93                 return -EINVAL;
94         }
95
96         sgl = buf->sgt->sgl;
97         for_each_sg(buf->sgt->sgl, sgl, buf->sgt->nents, i) {
98                 if (page_offset < (sgl->length >> PAGE_SHIFT))
99                         break;
100                 page_offset -=  (sgl->length >> PAGE_SHIFT);
101         }
102
103         pfn = __phys_to_pfn(sg_phys(sgl)) + page_offset;
104
105         return vm_insert_mixed(vma, f_vaddr, pfn);
106 }
107
108 static int exynos_drm_gem_handle_create(struct drm_gem_object *obj,
109                                         struct drm_file *file_priv,
110                                         unsigned int *handle)
111 {
112         int ret;
113
114         /*
115          * allocate a id of idr table where the obj is registered
116          * and handle has the id what user can see.
117          */
118         ret = drm_gem_handle_create(file_priv, obj, handle);
119         if (ret)
120                 return ret;
121
122         DRM_DEBUG_KMS("gem handle = 0x%x\n", *handle);
123
124         /* drop reference from allocate - handle holds it now. */
125         drm_gem_object_unreference_unlocked(obj);
126
127         return 0;
128 }
129
130 void exynos_drm_gem_destroy(struct exynos_drm_gem_obj *exynos_gem_obj)
131 {
132         struct drm_gem_object *obj;
133         struct exynos_drm_gem_buf *buf;
134
135         DRM_DEBUG_KMS("%s\n", __FILE__);
136
137         obj = &exynos_gem_obj->base;
138         buf = exynos_gem_obj->buffer;
139
140         DRM_DEBUG_KMS("handle count = %d\n", atomic_read(&obj->handle_count));
141
142         /*
143          * do not release memory region from exporter.
144          *
145          * the region will be released by exporter
146          * once dmabuf's refcount becomes 0.
147          */
148         if (obj->import_attach)
149                 goto out;
150
151         exynos_drm_free_buf(obj->dev, exynos_gem_obj->flags, buf);
152
153 out:
154         exynos_drm_fini_buf(obj->dev, buf);
155         exynos_gem_obj->buffer = NULL;
156
157         if (obj->map_list.map)
158                 drm_gem_free_mmap_offset(obj);
159
160         /* release file pointer to gem object. */
161         drm_gem_object_release(obj);
162
163         kfree(exynos_gem_obj);
164         exynos_gem_obj = NULL;
165 }
166
167 struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev,
168                                                       unsigned long size)
169 {
170         struct exynos_drm_gem_obj *exynos_gem_obj;
171         struct drm_gem_object *obj;
172         int ret;
173
174         exynos_gem_obj = kzalloc(sizeof(*exynos_gem_obj), GFP_KERNEL);
175         if (!exynos_gem_obj) {
176                 DRM_ERROR("failed to allocate exynos gem object\n");
177                 return NULL;
178         }
179
180         exynos_gem_obj->size = size;
181         obj = &exynos_gem_obj->base;
182
183         ret = drm_gem_object_init(dev, obj, size);
184         if (ret < 0) {
185                 DRM_ERROR("failed to initialize gem object\n");
186                 kfree(exynos_gem_obj);
187                 return NULL;
188         }
189
190         DRM_DEBUG_KMS("created file object = 0x%x\n", (unsigned int)obj->filp);
191
192         return exynos_gem_obj;
193 }
194
195 struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev,
196                                                 unsigned int flags,
197                                                 unsigned long size)
198 {
199         struct exynos_drm_gem_obj *exynos_gem_obj;
200         struct exynos_drm_gem_buf *buf;
201         int ret;
202
203         if (!size) {
204                 DRM_ERROR("invalid size.\n");
205                 return ERR_PTR(-EINVAL);
206         }
207
208         size = roundup_gem_size(size, flags);
209         DRM_DEBUG_KMS("%s\n", __FILE__);
210
211         ret = check_gem_flags(flags);
212         if (ret)
213                 return ERR_PTR(ret);
214
215         buf = exynos_drm_init_buf(dev, size);
216         if (!buf)
217                 return ERR_PTR(-ENOMEM);
218
219         exynos_gem_obj = exynos_drm_gem_init(dev, size);
220         if (!exynos_gem_obj) {
221                 ret = -ENOMEM;
222                 goto err_fini_buf;
223         }
224
225         exynos_gem_obj->buffer = buf;
226
227         /* set memory type and cache attribute from user side. */
228         exynos_gem_obj->flags = flags;
229
230         ret = exynos_drm_alloc_buf(dev, buf, flags);
231         if (ret < 0) {
232                 drm_gem_object_release(&exynos_gem_obj->base);
233                 goto err_fini_buf;
234         }
235
236         return exynos_gem_obj;
237
238 err_fini_buf:
239         exynos_drm_fini_buf(dev, buf);
240         return ERR_PTR(ret);
241 }
242
243 int exynos_drm_gem_create_ioctl(struct drm_device *dev, void *data,
244                                 struct drm_file *file_priv)
245 {
246         struct drm_exynos_gem_create *args = data;
247         struct exynos_drm_gem_obj *exynos_gem_obj;
248         int ret;
249
250         DRM_DEBUG_KMS("%s\n", __FILE__);
251
252         exynos_gem_obj = exynos_drm_gem_create(dev, args->flags, args->size);
253         if (IS_ERR(exynos_gem_obj))
254                 return PTR_ERR(exynos_gem_obj);
255
256         ret = exynos_drm_gem_handle_create(&exynos_gem_obj->base, file_priv,
257                         &args->handle);
258         if (ret) {
259                 exynos_drm_gem_destroy(exynos_gem_obj);
260                 return ret;
261         }
262
263         return 0;
264 }
265
266 dma_addr_t *exynos_drm_gem_get_dma_addr(struct drm_device *dev,
267                                         unsigned int gem_handle,
268                                         struct drm_file *filp)
269 {
270         struct exynos_drm_gem_obj *exynos_gem_obj;
271         struct drm_gem_object *obj;
272
273         obj = drm_gem_object_lookup(dev, filp, gem_handle);
274         if (!obj) {
275                 DRM_ERROR("failed to lookup gem object.\n");
276                 return ERR_PTR(-EINVAL);
277         }
278
279         exynos_gem_obj = to_exynos_gem_obj(obj);
280
281         return &exynos_gem_obj->buffer->dma_addr;
282 }
283
284 void exynos_drm_gem_put_dma_addr(struct drm_device *dev,
285                                         unsigned int gem_handle,
286                                         struct drm_file *filp)
287 {
288         struct exynos_drm_gem_obj *exynos_gem_obj;
289         struct drm_gem_object *obj;
290
291         obj = drm_gem_object_lookup(dev, filp, gem_handle);
292         if (!obj) {
293                 DRM_ERROR("failed to lookup gem object.\n");
294                 return;
295         }
296
297         exynos_gem_obj = to_exynos_gem_obj(obj);
298
299         drm_gem_object_unreference_unlocked(obj);
300
301         /*
302          * decrease obj->refcount one more time because we has already
303          * increased it at exynos_drm_gem_get_dma_addr().
304          */
305         drm_gem_object_unreference_unlocked(obj);
306 }
307
308 int exynos_drm_gem_map_offset_ioctl(struct drm_device *dev, void *data,
309                                     struct drm_file *file_priv)
310 {
311         struct drm_exynos_gem_map_off *args = data;
312
313         DRM_DEBUG_KMS("%s\n", __FILE__);
314
315         DRM_DEBUG_KMS("handle = 0x%x, offset = 0x%lx\n",
316                         args->handle, (unsigned long)args->offset);
317
318         if (!(dev->driver->driver_features & DRIVER_GEM)) {
319                 DRM_ERROR("does not support GEM.\n");
320                 return -ENODEV;
321         }
322
323         return exynos_drm_gem_dumb_map_offset(file_priv, dev, args->handle,
324                         &args->offset);
325 }
326
327 static struct drm_file *exynos_drm_find_drm_file(struct drm_device *drm_dev,
328                                                         struct file *filp)
329 {
330         struct drm_file *file_priv;
331
332         /* find current process's drm_file from filelist. */
333         list_for_each_entry(file_priv, &drm_dev->filelist, lhead)
334                 if (file_priv->filp == filp)
335                         return file_priv;
336
337         WARN_ON(1);
338
339         return ERR_PTR(-EFAULT);
340 }
341
342 static int exynos_drm_gem_mmap_buffer(struct file *filp,
343                                       struct vm_area_struct *vma)
344 {
345         struct drm_gem_object *obj = filp->private_data;
346         struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);
347         struct drm_device *drm_dev = obj->dev;
348         struct exynos_drm_gem_buf *buffer;
349         struct drm_file *file_priv;
350         unsigned long vm_size;
351         int ret;
352
353         DRM_DEBUG_KMS("%s\n", __FILE__);
354
355         vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP;
356         vma->vm_private_data = obj;
357         vma->vm_ops = drm_dev->driver->gem_vm_ops;
358
359         /* restore it to driver's fops. */
360         filp->f_op = fops_get(drm_dev->driver->fops);
361
362         file_priv = exynos_drm_find_drm_file(drm_dev, filp);
363         if (IS_ERR(file_priv))
364                 return PTR_ERR(file_priv);
365
366         /* restore it to drm_file. */
367         filp->private_data = file_priv;
368
369         update_vm_cache_attr(exynos_gem_obj, vma);
370
371         vm_size = vma->vm_end - vma->vm_start;
372
373         /*
374          * a buffer contains information to physically continuous memory
375          * allocated by user request or at framebuffer creation.
376          */
377         buffer = exynos_gem_obj->buffer;
378
379         /* check if user-requested size is valid. */
380         if (vm_size > buffer->size)
381                 return -EINVAL;
382
383         ret = dma_mmap_attrs(drm_dev->dev, vma, buffer->pages,
384                                 buffer->dma_addr, buffer->size,
385                                 &buffer->dma_attrs);
386         if (ret < 0) {
387                 DRM_ERROR("failed to mmap.\n");
388                 return ret;
389         }
390
391         /*
392          * take a reference to this mapping of the object. And this reference
393          * is unreferenced by the corresponding vm_close call.
394          */
395         drm_gem_object_reference(obj);
396
397         drm_vm_open_locked(drm_dev, vma);
398
399         return 0;
400 }
401
402 static const struct file_operations exynos_drm_gem_fops = {
403         .mmap = exynos_drm_gem_mmap_buffer,
404 };
405
406 int exynos_drm_gem_mmap_ioctl(struct drm_device *dev, void *data,
407                               struct drm_file *file_priv)
408 {
409         struct drm_exynos_gem_mmap *args = data;
410         struct drm_gem_object *obj;
411         unsigned int addr;
412
413         DRM_DEBUG_KMS("%s\n", __FILE__);
414
415         if (!(dev->driver->driver_features & DRIVER_GEM)) {
416                 DRM_ERROR("does not support GEM.\n");
417                 return -ENODEV;
418         }
419
420         obj = drm_gem_object_lookup(dev, file_priv, args->handle);
421         if (!obj) {
422                 DRM_ERROR("failed to lookup gem object.\n");
423                 return -EINVAL;
424         }
425
426         /*
427          * We have to use gem object and its fops for specific mmaper,
428          * but vm_mmap() can deliver only filp. So we have to change
429          * filp->f_op and filp->private_data temporarily, then restore
430          * again. So it is important to keep lock until restoration the
431          * settings to prevent others from misuse of filp->f_op or
432          * filp->private_data.
433          */
434         mutex_lock(&dev->struct_mutex);
435
436         /*
437          * Set specific mmper's fops. And it will be restored by
438          * exynos_drm_gem_mmap_buffer to dev->driver->fops.
439          * This is used to call specific mapper temporarily.
440          */
441         file_priv->filp->f_op = &exynos_drm_gem_fops;
442
443         /*
444          * Set gem object to private_data so that specific mmaper
445          * can get the gem object. And it will be restored by
446          * exynos_drm_gem_mmap_buffer to drm_file.
447          */
448         file_priv->filp->private_data = obj;
449
450         addr = vm_mmap(file_priv->filp, 0, args->size,
451                         PROT_READ | PROT_WRITE, MAP_SHARED, 0);
452
453         drm_gem_object_unreference(obj);
454
455         if (IS_ERR((void *)addr)) {
456                 /* check filp->f_op, filp->private_data are restored */
457                 if (file_priv->filp->f_op == &exynos_drm_gem_fops) {
458                         file_priv->filp->f_op = fops_get(dev->driver->fops);
459                         file_priv->filp->private_data = file_priv;
460                 }
461                 mutex_unlock(&dev->struct_mutex);
462                 return PTR_ERR((void *)addr);
463         }
464
465         mutex_unlock(&dev->struct_mutex);
466
467         args->mapped = addr;
468
469         DRM_DEBUG_KMS("mapped = 0x%lx\n", (unsigned long)args->mapped);
470
471         return 0;
472 }
473
474 int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data,
475                                       struct drm_file *file_priv)
476 {       struct exynos_drm_gem_obj *exynos_gem_obj;
477         struct drm_exynos_gem_info *args = data;
478         struct drm_gem_object *obj;
479
480         mutex_lock(&dev->struct_mutex);
481
482         obj = drm_gem_object_lookup(dev, file_priv, args->handle);
483         if (!obj) {
484                 DRM_ERROR("failed to lookup gem object.\n");
485                 mutex_unlock(&dev->struct_mutex);
486                 return -EINVAL;
487         }
488
489         exynos_gem_obj = to_exynos_gem_obj(obj);
490
491         args->flags = exynos_gem_obj->flags;
492         args->size = exynos_gem_obj->size;
493
494         drm_gem_object_unreference(obj);
495         mutex_unlock(&dev->struct_mutex);
496
497         return 0;
498 }
499
500 struct vm_area_struct *exynos_gem_get_vma(struct vm_area_struct *vma)
501 {
502         struct vm_area_struct *vma_copy;
503
504         vma_copy = kmalloc(sizeof(*vma_copy), GFP_KERNEL);
505         if (!vma_copy)
506                 return NULL;
507
508         if (vma->vm_ops && vma->vm_ops->open)
509                 vma->vm_ops->open(vma);
510
511         if (vma->vm_file)
512                 get_file(vma->vm_file);
513
514         memcpy(vma_copy, vma, sizeof(*vma));
515
516         vma_copy->vm_mm = NULL;
517         vma_copy->vm_next = NULL;
518         vma_copy->vm_prev = NULL;
519
520         return vma_copy;
521 }
522
523 void exynos_gem_put_vma(struct vm_area_struct *vma)
524 {
525         if (!vma)
526                 return;
527
528         if (vma->vm_ops && vma->vm_ops->close)
529                 vma->vm_ops->close(vma);
530
531         if (vma->vm_file)
532                 fput(vma->vm_file);
533
534         kfree(vma);
535 }
536
537 int exynos_gem_get_pages_from_userptr(unsigned long start,
538                                                 unsigned int npages,
539                                                 struct page **pages,
540                                                 struct vm_area_struct *vma)
541 {
542         int get_npages;
543
544         /* the memory region mmaped with VM_PFNMAP. */
545         if (vma_is_io(vma)) {
546                 unsigned int i;
547
548                 for (i = 0; i < npages; ++i, start += PAGE_SIZE) {
549                         unsigned long pfn;
550                         int ret = follow_pfn(vma, start, &pfn);
551                         if (ret)
552                                 return ret;
553
554                         pages[i] = pfn_to_page(pfn);
555                 }
556
557                 if (i != npages) {
558                         DRM_ERROR("failed to get user_pages.\n");
559                         return -EINVAL;
560                 }
561
562                 return 0;
563         }
564
565         get_npages = get_user_pages(current, current->mm, start,
566                                         npages, 1, 1, pages, NULL);
567         get_npages = max(get_npages, 0);
568         if (get_npages != npages) {
569                 DRM_ERROR("failed to get user_pages.\n");
570                 while (get_npages)
571                         put_page(pages[--get_npages]);
572                 return -EFAULT;
573         }
574
575         return 0;
576 }
577
578 void exynos_gem_put_pages_to_userptr(struct page **pages,
579                                         unsigned int npages,
580                                         struct vm_area_struct *vma)
581 {
582         if (!vma_is_io(vma)) {
583                 unsigned int i;
584
585                 for (i = 0; i < npages; i++) {
586                         set_page_dirty_lock(pages[i]);
587
588                         /*
589                          * undo the reference we took when populating
590                          * the table.
591                          */
592                         put_page(pages[i]);
593                 }
594         }
595 }
596
597 int exynos_gem_map_sgt_with_dma(struct drm_device *drm_dev,
598                                 struct sg_table *sgt,
599                                 enum dma_data_direction dir)
600 {
601         int nents;
602
603         mutex_lock(&drm_dev->struct_mutex);
604
605         nents = dma_map_sg(drm_dev->dev, sgt->sgl, sgt->nents, dir);
606         if (!nents) {
607                 DRM_ERROR("failed to map sgl with dma.\n");
608                 mutex_unlock(&drm_dev->struct_mutex);
609                 return nents;
610         }
611
612         mutex_unlock(&drm_dev->struct_mutex);
613         return 0;
614 }
615
616 void exynos_gem_unmap_sgt_from_dma(struct drm_device *drm_dev,
617                                 struct sg_table *sgt,
618                                 enum dma_data_direction dir)
619 {
620         dma_unmap_sg(drm_dev->dev, sgt->sgl, sgt->nents, dir);
621 }
622
623 int exynos_drm_gem_init_object(struct drm_gem_object *obj)
624 {
625         DRM_DEBUG_KMS("%s\n", __FILE__);
626
627         return 0;
628 }
629
630 void exynos_drm_gem_free_object(struct drm_gem_object *obj)
631 {
632         struct exynos_drm_gem_obj *exynos_gem_obj;
633         struct exynos_drm_gem_buf *buf;
634
635         DRM_DEBUG_KMS("%s\n", __FILE__);
636
637         exynos_gem_obj = to_exynos_gem_obj(obj);
638         buf = exynos_gem_obj->buffer;
639
640         if (obj->import_attach)
641                 drm_prime_gem_destroy(obj, buf->sgt);
642
643         exynos_drm_gem_destroy(to_exynos_gem_obj(obj));
644 }
645
646 int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
647                                struct drm_device *dev,
648                                struct drm_mode_create_dumb *args)
649 {
650         struct exynos_drm_gem_obj *exynos_gem_obj;
651         int ret;
652
653         DRM_DEBUG_KMS("%s\n", __FILE__);
654
655         /*
656          * alocate memory to be used for framebuffer.
657          * - this callback would be called by user application
658          *      with DRM_IOCTL_MODE_CREATE_DUMB command.
659          */
660
661         args->pitch = args->width * ((args->bpp + 7) / 8);
662         args->size = args->pitch * args->height;
663
664         exynos_gem_obj = exynos_drm_gem_create(dev, args->flags, args->size);
665         if (IS_ERR(exynos_gem_obj))
666                 return PTR_ERR(exynos_gem_obj);
667
668         ret = exynos_drm_gem_handle_create(&exynos_gem_obj->base, file_priv,
669                         &args->handle);
670         if (ret) {
671                 exynos_drm_gem_destroy(exynos_gem_obj);
672                 return ret;
673         }
674
675         return 0;
676 }
677
678 int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv,
679                                    struct drm_device *dev, uint32_t handle,
680                                    uint64_t *offset)
681 {
682         struct drm_gem_object *obj;
683         int ret = 0;
684
685         DRM_DEBUG_KMS("%s\n", __FILE__);
686
687         mutex_lock(&dev->struct_mutex);
688
689         /*
690          * get offset of memory allocated for drm framebuffer.
691          * - this callback would be called by user application
692          *      with DRM_IOCTL_MODE_MAP_DUMB command.
693          */
694
695         obj = drm_gem_object_lookup(dev, file_priv, handle);
696         if (!obj) {
697                 DRM_ERROR("failed to lookup gem object.\n");
698                 ret = -EINVAL;
699                 goto unlock;
700         }
701
702         if (!obj->map_list.map) {
703                 ret = drm_gem_create_mmap_offset(obj);
704                 if (ret)
705                         goto out;
706         }
707
708         *offset = (u64)obj->map_list.hash.key << PAGE_SHIFT;
709         DRM_DEBUG_KMS("offset = 0x%lx\n", (unsigned long)*offset);
710
711 out:
712         drm_gem_object_unreference(obj);
713 unlock:
714         mutex_unlock(&dev->struct_mutex);
715         return ret;
716 }
717
718 int exynos_drm_gem_dumb_destroy(struct drm_file *file_priv,
719                                 struct drm_device *dev,
720                                 unsigned int handle)
721 {
722         int ret;
723
724         DRM_DEBUG_KMS("%s\n", __FILE__);
725
726         /*
727          * obj->refcount and obj->handle_count are decreased and
728          * if both them are 0 then exynos_drm_gem_free_object()
729          * would be called by callback to release resources.
730          */
731         ret = drm_gem_handle_delete(file_priv, handle);
732         if (ret < 0) {
733                 DRM_ERROR("failed to delete drm_gem_handle.\n");
734                 return ret;
735         }
736
737         return 0;
738 }
739
740 int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
741 {
742         struct drm_gem_object *obj = vma->vm_private_data;
743         struct drm_device *dev = obj->dev;
744         unsigned long f_vaddr;
745         pgoff_t page_offset;
746         int ret;
747
748         page_offset = ((unsigned long)vmf->virtual_address -
749                         vma->vm_start) >> PAGE_SHIFT;
750         f_vaddr = (unsigned long)vmf->virtual_address;
751
752         mutex_lock(&dev->struct_mutex);
753
754         ret = exynos_drm_gem_map_buf(obj, vma, f_vaddr, page_offset);
755         if (ret < 0)
756                 DRM_ERROR("failed to map a buffer with user.\n");
757
758         mutex_unlock(&dev->struct_mutex);
759
760         return convert_to_vm_err_msg(ret);
761 }
762
763 int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
764 {
765         struct exynos_drm_gem_obj *exynos_gem_obj;
766         struct drm_gem_object *obj;
767         int ret;
768
769         DRM_DEBUG_KMS("%s\n", __FILE__);
770
771         /* set vm_area_struct. */
772         ret = drm_gem_mmap(filp, vma);
773         if (ret < 0) {
774                 DRM_ERROR("failed to mmap.\n");
775                 return ret;
776         }
777
778         obj = vma->vm_private_data;
779         exynos_gem_obj = to_exynos_gem_obj(obj);
780
781         ret = check_gem_flags(exynos_gem_obj->flags);
782         if (ret) {
783                 drm_gem_vm_close(vma);
784                 drm_gem_free_mmap_offset(obj);
785                 return ret;
786         }
787
788         vma->vm_flags &= ~VM_PFNMAP;
789         vma->vm_flags |= VM_MIXEDMAP;
790
791         update_vm_cache_attr(exynos_gem_obj, vma);
792
793         return ret;
794 }