diff mbox series

drm/panfrost: Align GEM objects GPU VA to 2MB

Message ID 20190610165806.24854-1-robh@kernel.org
State Accepted
Commit a0e93c41eb75ab05bd07d4bd8027f30d484b3966
Headers show
Series drm/panfrost: Align GEM objects GPU VA to 2MB | expand

Commit Message

Rob Herring (Arm) June 10, 2019, 4:58 p.m. UTC
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>
---
 drivers/gpu/drm/panfrost/panfrost_gem.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

Comments

Tomeu Vizoso June 13, 2019, 1:38 p.m. UTC | #1
On Mon, 10 Jun 2019 at 18:58, Rob Herring <robh@kernel.org> wrote:
>
> 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>

Thanks!

Tomeu

> ---
>  drivers/gpu/drm/panfrost/panfrost_gem.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c
> index a5528a360ef4..886875ae31d3 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_gem.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_gem.c
> @@ -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;
> --
> 2.20.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff mbox series

Patch

diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c
index a5528a360ef4..886875ae31d3 100644
--- a/drivers/gpu/drm/panfrost/panfrost_gem.c
+++ b/drivers/gpu/drm/panfrost/panfrost_gem.c
@@ -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;