Merge tag 'livepatching-for-5.12' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / gpu / drm / drm_prime.c
index 7db55fc..2a54f86 100644 (file)
@@ -717,6 +717,8 @@ int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
        vma->vm_pgoff += drm_vma_node_start(&obj->vma_node);
 
        if (obj->funcs && obj->funcs->mmap) {
+               vma->vm_ops = obj->funcs->vm_ops;
+
                ret = obj->funcs->mmap(obj, vma);
                if (ret)
                        return ret;
@@ -978,44 +980,58 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
 EXPORT_SYMBOL(drm_gem_prime_import);
 
 /**
- * drm_prime_sg_to_page_addr_arrays - convert an sg table into a page array
+ * drm_prime_sg_to_page_array - convert an sg table into a page array
+ * @sgt: scatter-gather table to convert
+ * @pages: array of page pointers to store the pages in
+ * @max_entries: size of the passed-in array
+ *
+ * Exports an sg table into an array of pages.
+ *
+ * This function is deprecated and strongly discouraged to be used.
+ * The page array is only useful for page faults and those can corrupt fields
+ * in the struct page if they are not handled by the exporting driver.
+ */
+int __deprecated drm_prime_sg_to_page_array(struct sg_table *sgt,
+                                           struct page **pages,
+                                           int max_entries)
+{
+       struct sg_page_iter page_iter;
+       struct page **p = pages;
+
+       for_each_sgtable_page(sgt, &page_iter, 0) {
+               if (WARN_ON(p - pages >= max_entries))
+                       return -1;
+               *p++ = sg_page_iter_page(&page_iter);
+       }
+       return 0;
+}
+EXPORT_SYMBOL(drm_prime_sg_to_page_array);
+
+/**
+ * drm_prime_sg_to_dma_addr_array - convert an sg table into a dma addr array
  * @sgt: scatter-gather table to convert
- * @pages: optional array of page pointers to store the page array in
- * @addrs: optional array to store the dma bus address of each page
+ * @addrs: array to store the dma bus address of each page
  * @max_entries: size of both the passed-in arrays
  *
- * Exports an sg table into an array of pages and addresses. This is currently
- * required by the TTM driver in order to do correct fault handling.
+ * Exports an sg table into an array of addresses.
  *
- * Drivers can use this in their &drm_driver.gem_prime_import_sg_table
+ * Drivers should use this in their &drm_driver.gem_prime_import_sg_table
  * implementation.
  */
-int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
-                                    dma_addr_t *addrs, int max_entries)
+int drm_prime_sg_to_dma_addr_array(struct sg_table *sgt, dma_addr_t *addrs,
+                                  int max_entries)
 {
        struct sg_dma_page_iter dma_iter;
-       struct sg_page_iter page_iter;
-       struct page **p = pages;
        dma_addr_t *a = addrs;
 
-       if (pages) {
-               for_each_sgtable_page(sgt, &page_iter, 0) {
-                       if (WARN_ON(p - pages >= max_entries))
-                               return -1;
-                       *p++ = sg_page_iter_page(&page_iter);
-               }
+       for_each_sgtable_dma_page(sgt, &dma_iter, 0) {
+               if (WARN_ON(a - addrs >= max_entries))
+                       return -1;
+               *a++ = sg_page_iter_dma_address(&dma_iter);
        }
-       if (addrs) {
-               for_each_sgtable_dma_page(sgt, &dma_iter, 0) {
-                       if (WARN_ON(a - addrs >= max_entries))
-                               return -1;
-                       *a++ = sg_page_iter_dma_address(&dma_iter);
-               }
-       }
-
        return 0;
 }
-EXPORT_SYMBOL(drm_prime_sg_to_page_addr_arrays);
+EXPORT_SYMBOL(drm_prime_sg_to_dma_addr_array);
 
 /**
  * drm_prime_gem_destroy - helper to clean up a PRIME-imported GEM object