]> Git Repo - J-linux.git/blobdiff - drivers/gpu/drm/drm_prime.c
Merge tag 'drm-misc-next-2020-09-21' of git://anongit.freedesktop.org/drm/drm-misc...
[J-linux.git] / drivers / gpu / drm / drm_prime.c
index b8c7f068a5a417c4169bd9874495cd998d41814f..11fe9ff76fd57227798e00e7e2954e80a9c6b57c 100644 (file)
@@ -803,9 +803,11 @@ static const struct dma_buf_ops drm_gem_prime_dmabuf_ops =  {
  *
  * This is useful for implementing &drm_gem_object_funcs.get_sg_table.
  */
-struct sg_table *drm_prime_pages_to_sg(struct page **pages, unsigned int nr_pages)
+struct sg_table *drm_prime_pages_to_sg(struct drm_device *dev,
+                                      struct page **pages, unsigned int nr_pages)
 {
        struct sg_table *sg = NULL;
+       size_t max_segment = 0;
        int ret;
 
        sg = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
@@ -814,8 +816,13 @@ struct sg_table *drm_prime_pages_to_sg(struct page **pages, unsigned int nr_page
                goto out;
        }
 
-       ret = sg_alloc_table_from_pages(sg, pages, nr_pages, 0,
-                               nr_pages << PAGE_SHIFT, GFP_KERNEL);
+       if (dev)
+               max_segment = dma_max_mapping_size(dev->dev);
+       if (max_segment == 0 || max_segment > SCATTERLIST_MAX_SEGMENT)
+               max_segment = SCATTERLIST_MAX_SEGMENT;
+       ret = __sg_alloc_table_from_pages(sg, pages, nr_pages, 0,
+                                         nr_pages << PAGE_SHIFT,
+                                         max_segment, GFP_KERNEL);
        if (ret)
                goto out;
 
This page took 0.028177 seconds and 4 git commands to generate.