[PATCH 0/6] drm/msm: Add per-instance pagetables

Daniel Vetter daniel at ffwll.ch
Tue Mar 7 21:53:44 UTC 2017


On Tue, Mar 07, 2017 at 10:14:14AM -0700, Jordan Crouse wrote:
> Using the framework described here
> 
> https://lists.linuxfoundation.org/pipermail/iommu/2017-March/020716.html
> 
> This implements per-instance pagetables for the GPU driver creating an
> individual pagetable for each file descriptor (so not strictly per-process
> but in practice we can't share buffers between file descriptors anyway without
> importing them).

This is pretty much how it's done everywhere else. Or well, maybe at a
context level, if your driver allos creation of additional contexts.

Might be good to document that somewhere in drm-mm.rst as best practices
for gem drivers ... Volunteered?
-Daniel

> 
> This is the brief workflow for the process:
> 
>  - At init, the driver attaches an UNMANGED domain to the IOMMU (context bank 0)
> 
>  - All "global" buffers (kernel side GPU buffers such as ringbuffers, etc) are
>    mapped into the TTBR1 space which is defined as any address with bit 48 set.
>    In pratice we have discovered that for reasons yet uknown, bit 47 also has
>    to be set for the GPU to sign extend correctly, so the TTBR1 region is
>    defined as starting at 0xffff8_0000_0000_0000.
> 
>  - When a new file descriptor is opened, a dynamic domain is cloned from the
>    real domain - this does not program the hardware but it creates a pagetable
>    and returns a pointer that we can use to map memory to - this is wrapped in a
>    new addresss space and used for all allocations created with the file
>    descriptor.
> 
>  - At command submission time, a SMMU_TABLE_UPDATE packet is set before every
>    command which contains the physical address of the TTBR0 register for the
>    pagetable associated with the process - the GPU will automatically switch
>    the pagetable for the process.
> 
> Because no kernel side allocations are in the TTBR0 space there is no setup
> required to switch the TTBR0 pagetable and we do not need to reprogram it
> after the command is over since the next command will rewrite the register.
> This makes the code significantly more simple than it could be (*cough*
> downstream *cough*).
> 
> I'm sure there will be questions, and I'm sure that what we have won't be what
> is finally decided upon in the arm-smmu driver (in particular there are some
> nice parts of the arm-v3 SVM solution that we can borrow) but I think it is
> important to get eyeballs on this for posterity.
> 
> Thanks!
> Jordan
> 
> Jordan Crouse (6):
>   drm/msm: Enable 64 bit mode by default
>   drm/msm: Pass the MMU domain index in struct msm_file_private
>   drm/msm: Make separate iommu function tables for v1 and v2 MMUs
>   drm/msm: Use TTBR1 for kernel side GPU buffer objects
>   drm/msm: Support dynamic IOMMU domains
>   drm/msm: a5xx: Support per-instance pagetables
> 
>  arch/arm64/boot/dts/qcom/msm8996.dtsi     |   2 +
>  drivers/gpu/drm/msm/adreno/a5xx_gpu.c     |  78 ++++++++++++++-
>  drivers/gpu/drm/msm/adreno/a5xx_gpu.h     |  17 ++++
>  drivers/gpu/drm/msm/adreno/a5xx_preempt.c |  61 +++++++++---
>  drivers/gpu/drm/msm/adreno/adreno_gpu.c   |  18 +++-
>  drivers/gpu/drm/msm/adreno/adreno_gpu.h   |   2 +
>  drivers/gpu/drm/msm/msm_drv.c             |  60 +++++++++---
>  drivers/gpu/drm/msm/msm_drv.h             |   9 +-
>  drivers/gpu/drm/msm/msm_gem.h             |   1 +
>  drivers/gpu/drm/msm/msm_gem_submit.c      |  12 ++-
>  drivers/gpu/drm/msm/msm_gem_vma.c         |  38 ++++++--
>  drivers/gpu/drm/msm/msm_gpu.c             |   3 +-
>  drivers/gpu/drm/msm/msm_iommu.c           | 151 ++++++++++++++++++++++++------
>  drivers/gpu/drm/msm/msm_iommu.h           |  34 +++++++
>  drivers/gpu/drm/msm/msm_mmu.h             |   2 +-
>  15 files changed, 415 insertions(+), 73 deletions(-)
>  create mode 100644 drivers/gpu/drm/msm/msm_iommu.h
> 
> -- 
> 1.9.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list