drm/panfrost: Align GEM objects GPU VA to 2MB
authorRob Herring <robh@kernel.org>
Mon, 10 Jun 2019 16:58:06 +0000 (10:58 -0600)
committerRob Herring <robh@kernel.org>
Fri, 14 Jun 2019 15:15:14 +0000 (09:15 -0600)
In order to increase the chances of using 2MB pages, we need to align the
GPU VA mapping to 2MB. Only do this if the object size is 2MB or more.

Cc: Robin Murphy <robin.murphy@arm.com>
Cc: Steven Price <steven.price@arm.com>
Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Signed-off-by: Rob Herring <robh@kernel.org>
Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190610165806.24854-1-robh@kernel.org
drivers/gpu/drm/panfrost/panfrost_gem.c

index a5528a3..886875a 100644 (file)
@@ -52,6 +52,7 @@ struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t
        int ret;
        struct panfrost_device *pfdev = dev->dev_private;
        struct panfrost_gem_object *obj;
+       u64 align;
 
        obj = kzalloc(sizeof(*obj), GFP_KERNEL);
        if (!obj)
@@ -59,9 +60,12 @@ struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t
 
        obj->base.base.funcs = &panfrost_gem_funcs;
 
+       size = roundup(size, PAGE_SIZE);
+       align = size >= SZ_2M ? SZ_2M >> PAGE_SHIFT : 0;
+
        spin_lock(&pfdev->mm_lock);
-       ret = drm_mm_insert_node(&pfdev->mm, &obj->node,
-                                roundup(size, PAGE_SIZE) >> PAGE_SHIFT);
+       ret = drm_mm_insert_node_generic(&pfdev->mm, &obj->node,
+                                        size >> PAGE_SHIFT, align, 0, 0);
        spin_unlock(&pfdev->mm_lock);
        if (ret)
                goto free_obj;