Re: Tegra-DRM: Tegra30: DMA mapping API (was: About dma mapping apis)

Hiroshi Doyu
2012-07-10T10:24:17Z

On Tue, 10 Jul 2012 10:14:01 +0200
markz <markz-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> wrote:

> On Mon, 2012-07-09 at 23:28 +0800, Hiroshi Doyu wrote:
> > Hi Mark, adding linux-tegra on Cc:....
> >
> > Mark Zhang <markz-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> wrote @ Mon, 9 Jul 2012 14:13:13 +0200:
> >
> > > > Hi Mark, Cc: Thierry & Ken,
> > > >
> > > > Can GEM allow DRM to use contigious memory? That could be easier.
> > > >
> > > > Otherwise, I think that you need to make drv->dev iommu'able before
> > > > calling DMA API if you want to use IOMMU. To make drv->dev iommu'able,
> > > > you need to call arm_iommu_create_mapping() and arm_iommu_attach_device().
> > >
> > > Thank you. Yes, we need to call these functions otherwise iommu will not be enabled at all.
> > > So my question is:
> > > 1. in arm_iommu_create_mapping, we need to specify the base address
> > > of the iova. Is these an API which can get this base address? I
> > > mean, SMMU serves a lot of clients and maybe every client will
> > > specify a range of iova which it needs. So as the center point of
> > > these clients, does SMMU module has a function which can be used by
> > > client to get this base address?
> >
> > The SMMU patch was sent but it depends on the following framework.
> >
> > [PATCH 0/5] IOMMU: Make IOMMU-API ready for GART-like hardware
> > https://lkml.org/lkml/2012/1/19/170
> >
>
> Got it. Seems this patch hasn't been integrated yet. Besides, SMMU
> module should do some implementations for this set/get attribute
> functions as well, right?

Yes, that's below:
http://lists.linuxfoundation.org/pipermail/iommu/2012-January/003531.html

> > > 2. I took a quick glance of tegra-smmu.c, I noticed that there is a
> > > dts property named dma-window, which it's value is: <0x0
> > > 0x40000000>. Does this means the iova which SMMU handles is from 0 -
> > > 1G? IIRC, SMMU handles 4G address space...
> >
> > It tries to avoid overwrapping 1-1 iovirt-phys mapping, which is
> > necessary for some drivers right now.
> >
>
> Sorry I didn't get it. What is overwrapping 1-1 iovirt-phys mapping?

To create the mapping,
Physical Address 0x12345678 == IO virtual Address 0x12345678
Then, even if device drivers are not aware of IOMMU, it should work.

> > > 3. Right now in my drm driver, arm_iommu_attach_device failed with
> > > an error code: -22(Invalid Argument). I think this is caused by
> > > these codes in function smmu_iommu_attach_dev:
> > >
> > > map = (unsigned long)dev->platform_data;
> > > if (!map)
> > > return -EINVAL;
> > >
> > > So, does this mean the drm_device should have a "platform_data"(right now it is NULL so -EINVAL returned)?
> > > I skimmed the codes of tegra-smmu.c, seems this "platform_data" has specific usage and should be composed in some rules.
> > > Could you explain a little bit about this?
> >
> > You can skip that check with the following patch.
> >
> Yes, it works. Right now the framebuffer works on my T30.

Great!