diff mbox series

drm/msm/dpu: set geometry for iommu domain

Message ID 1543363093-19169-1-git-send-email-jsanka@codeaurora.org (mailing list archive)
State New, archived
Headers show
Series drm/msm/dpu: set geometry for iommu domain | expand

Commit Message

Jeykumar Sankaran Nov. 27, 2018, 11:58 p.m. UTC
Specify geometry for DPU iommu domain which sets
the address space for gem allocations.

Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
Suggested-by: Jordan Crouse <jcrouse@codeaurora.org>
Suggested-by: Vivek Gautam <vivek.gautam@codeaurora.org>
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Jordan Crouse Nov. 28, 2018, 3:38 p.m. UTC | #1
On Tue, Nov 27, 2018 at 03:58:13PM -0800, Jeykumar Sankaran wrote:
> Specify geometry for DPU iommu domain which sets
> the address space for gem allocations.
> 
> Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
> Suggested-by: Jordan Crouse <jcrouse@codeaurora.org>
> Suggested-by: Vivek Gautam <vivek.gautam@codeaurora.org>

There is a lot of confusion surrounding all of this, so let me spend a bit of
time to explain.

Like other platform devices with a iommu attached the mdss and gpu devices have
a default DMA IOMMU domain attached to them at enumeration time. The intent is
that if a device uses the DMA API it hides the mechanics of iova management.

However in the case of the GPU (and by extension the display) we *DO* want to
manage our own IOMMU space. This is partially for historical reasons (we
started doing so in the era just before the DMA API became a thing) and also for
future reasons. Eventually we will want to be able to do per-process pagetables
for the GPU and for that we need manual control of the iova domain.

So long story shortx, we don't want to be involved with the DMA domain. In fact,
we would GREATLY prefer if we didn't have it, but thats much wider reaching
discussion that doesn't make sense here (but if you want to get involved in the
fight let me know).

In the place of the dma domain we have the internal concept of address spaces
which manages iova allocation for a specific IOMMU domain. Today this is either
the mdss or the gpu domain (because we use different iommus) but in the future
there will be a new address space for each process for per-process pagetables.

In the upstream code we reuse the domain geometry struct to set up the range for
the address space allocator which is why this patch is needed because the dpu
needs to provide that clue to the address space.

That said, some folks are getting this patch confused with the patch that
Vivek sent out [1] (drm: msm: Replace dma_map_sg with dma_sync_sg). 

A pre-release iteration of this patch did an additional thing - instead
of creating a new iommu domain it re-used the DMA domain and registered it with
the msm iommu engine which meant that we started crossing the streams and
mapping the GEM buffers manually onto the DMA space. This is bad. In fact it
started to conflict with the DMA domain which lead directly to Vivek's patch.

This isn't to say that Vivek's patch isn't appropriate - we knew all along we
were abusing the DMA API for fun and profit, and we might as well abuse
dma_sync_sg instead of dma_map_sg. But it isn't strictly needed if we create a
new domain and not reuse the DMA domain.

Hopefully this clarifies things. If not, hit me up in IRC and I'll try to
explain it again. In the meantime, this patch is correct and useful so:

Acked-by: Jordan Crouse <jcrouse@codeaurora.org>

[1] https://patchwork.freedesktop.org/patch/263914/


> ---
>  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index 7d931ae..efceddf1 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -823,6 +823,9 @@ static int _dpu_kms_mmu_init(struct dpu_kms *dpu_kms)
>  	if (!domain)
>  		return 0;
>  
> +	domain->geometry.aperture_start = 0x1000;
> +	domain->geometry.aperture_end = 0xffffffff;
> +
>  	aspace = msm_gem_address_space_create(dpu_kms->dev->dev,
>  			domain, "dpu1");
>  	if (IS_ERR(aspace)) {
diff mbox series

Patch

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 7d931ae..efceddf1 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -823,6 +823,9 @@  static int _dpu_kms_mmu_init(struct dpu_kms *dpu_kms)
 	if (!domain)
 		return 0;
 
+	domain->geometry.aperture_start = 0x1000;
+	domain->geometry.aperture_end = 0xffffffff;
+
 	aspace = msm_gem_address_space_create(dpu_kms->dev->dev,
 			domain, "dpu1");
 	if (IS_ERR(aspace)) {