[PATCH] drm/etnaviv: don't move linear memory window on 3D cores without MC2.0

Christian Gmeiner christian.gmeiner at gmail.com
Wed Apr 27 15:22:00 UTC 2016


2016-04-21 14:51 GMT+02:00 Lucas Stach <l.stach at pengutronix.de>:
> On cores with MC1.0 the memory window offset is not properly respected
> by all engines in the core, leading to different views of the memory
> if the offset in non-zero. This causes relocs for those engines to be
> wrong and might lead to other subtile problems.
>
> Rather than trying to work around this, just disable the linear memory
> window offset for those cores.
>
> Suggested-by: Russell King <linux at arm.linux.org.uk>
> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>

Reviewed-by: Christian Gmeiner <christian.gmeiner at gmail.com>

> ---
>  drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 31 ++++++++++++++++++-------------
>  1 file changed, 18 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> index a30d1c2b0f13..049d00d8ded5 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
> @@ -572,6 +572,24 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
>                 goto fail;
>         }
>
> +       /*
> +        * Set the GPU linear window to be at the end of the DMA window, where
> +        * the CMA area is likely to reside. This ensures that we are able to
> +        * map the command buffers while having the linear window overlap as
> +        * much RAM as possible, so we can optimize mappings for other buffers.
> +        *
> +        * For 3D cores only do this if MC2.0 is present, as with MC1.0 it leads
> +        * to different views of the memory on the individual engines.
> +        */
> +       if (!(gpu->identity.features & chipFeatures_PIPE_3D) ||
> +           (gpu->identity.minor_features0 & chipMinorFeatures0_MC20)) {
> +               u32 dma_mask = (u32)dma_get_required_mask(gpu->dev);
> +               if (dma_mask < PHYS_OFFSET + SZ_2G)
> +                       gpu->memory_base = PHYS_OFFSET;
> +               else
> +                       gpu->memory_base = dma_mask - SZ_2G + 1;
> +       }
> +
>         ret = etnaviv_hw_reset(gpu);
>         if (ret)
>                 goto fail;
> @@ -1566,7 +1584,6 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
>  {
>         struct device *dev = &pdev->dev;
>         struct etnaviv_gpu *gpu;
> -       u32 dma_mask;
>         int err = 0;
>
>         gpu = devm_kzalloc(dev, sizeof(*gpu), GFP_KERNEL);
> @@ -1576,18 +1593,6 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
>         gpu->dev = &pdev->dev;
>         mutex_init(&gpu->lock);
>
> -       /*
> -        * Set the GPU linear window to be at the end of the DMA window, where
> -        * the CMA area is likely to reside. This ensures that we are able to
> -        * map the command buffers while having the linear window overlap as
> -        * much RAM as possible, so we can optimize mappings for other buffers.
> -        */
> -       dma_mask = (u32)dma_get_required_mask(dev);
> -       if (dma_mask < PHYS_OFFSET + SZ_2G)
> -               gpu->memory_base = PHYS_OFFSET;
> -       else
> -               gpu->memory_base = dma_mask - SZ_2G + 1;
> -
>         /* Map registers: */
>         gpu->mmio = etnaviv_ioremap(pdev, NULL, dev_name(gpu->dev));
>         if (IS_ERR(gpu->mmio))
> --
> 2.8.0.rc3
>


More information about the dri-devel mailing list