[PATCH] drm/etnaviv: trick drm_mm into giving out a low IOVA
Wladimir J. van der Laan
laanwj at gmail.com
Tue Dec 13 06:38:08 UTC 2016
On Mon, Dec 12, 2016 at 04:27:16PM +0100, Lucas Stach wrote:
> After rollover of the IOVA space, we want to get a low IOVA address,
> otherwise the the games we play by remembering the last IOVA are
> pointless. When we search for a free hole with DRM_MM_SEARCH_DEFAULT,
> drm_mm will pop the next entry from the free holes stack, which will
> likely be a high IOVA. By using DRM_MM_SEARCH_BELOW we can trick
> drm_mm into reversing the search and provide us with a low IOVA.
>
> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
I can confirm this solves the MMU issue for me, thanks,
Reviewed-By: Wladimir van der Laan <laanwj at gmail.com>
Regards,
Wladimir
> ---
> This is intended to fix the GPU MMU fault on a <= 4.10 kernel. Later
> kernels will hopefully fix this by removing the IOVA gaming completely,
> but this will need some bigger re-writes of the code in question.
> ---
> drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> index 169ac96e8f08..fe0e85b41310 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> @@ -116,9 +116,14 @@ static int etnaviv_iommu_find_iova(struct etnaviv_iommu *mmu,
> struct list_head list;
> bool found;
>
> + /*
> + * XXX: The DRM_MM_SEARCH_BELOW is really a hack to trick
> + * drm_mm into giving out a low IOVA after address space
> + * rollover. This needs a proper fix.
> + */
> ret = drm_mm_insert_node_in_range(&mmu->mm, node,
> size, 0, mmu->last_iova, ~0UL,
> - DRM_MM_SEARCH_DEFAULT);
> + mmu->last_iova ? DRM_MM_SEARCH_DEFAULT : DRM_MM_SEARCH_BELOW);
>
> if (ret != -ENOSPC)
> break;
> --
> 2.10.2
>
More information about the etnaviv
mailing list