Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1627198

Re: [PATCH] [RFC] gpu: host1x: shut up warning about DMA API misuse

From Arnd Bergmann <arnd@arndb.de>
Newsgroups linux.kernel
Subject Re: [PATCH] [RFC] gpu: host1x: shut up warning about DMA API misuse
Date 2017-04-20 10:30 +0200
Message-ID <tyfDs-6zX-21@gated-at.bofh.it> (permalink)
References <ty2wy-6N4-3@gated-at.bofh.it> <tyeo3-5TJ-29@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


On Thu, Apr 20, 2017 at 9:02 AM, Mikko Perttunen <cyndis@kapsi.fi> wrote:
> On 19.04.2017 21:24, Arnd Bergmann wrote:
>>
>> When dma_addr_t and phys_addr_t are not the same size, we get a warning
>> from the dma_alloc_wc function:
>>
>> drivers/gpu/host1x/cdma.c: In function 'host1x_pushbuffer_init':
>> drivers/gpu/host1x/cdma.c:94:48: error: passing argument 3 of
>> 'dma_alloc_wc' from incompatible pointer type
>> [-Werror=incompatible-pointer-types]
>>    pb->mapped = dma_alloc_wc(host1x->dev, size, &pb->phys,
>>                                                 ^
>> In file included from drivers/gpu/host1x/cdma.c:22:0:
>> include/linux/dma-mapping.h:761:37: note: expected 'dma_addr_t * {aka long
>> long unsigned int *}' but argument is of type 'phys_addr_t * {aka unsigned
>> int *}'
>>  static noinline_if_stackbloat void *dma_alloc_wc(struct device *dev,
>> size_t size,
>>                                      ^~~~~~~~~~~~
>> drivers/gpu/host1x/cdma.c:113:48: error: passing argument 3 of
>> 'dma_alloc_wc' from incompatible pointer type
>> [-Werror=incompatible-pointer-types]
>>    pb->mapped = dma_alloc_wc(host1x->dev, size, &pb->phys,
>>                                                 ^
>> In file included from drivers/gpu/host1x/cdma.c:22:0:
>> include/linux/dma-mapping.h:761:37: note: expected 'dma_addr_t * {aka long
>> long unsigned int *}' but argument is of type 'phys_addr_t * {aka unsigned
>> int *}'
>>  static noinline_if_stackbloat void *dma_alloc_wc(struct device *dev,
>> size_t size,
>>                                      ^~~~~~~~~~~~
>>
>> The problem here is that dma_alloc_wc() returns a pointer to a dma_addr_t
>> that may already be translated by an IOMMU, but the driver passes this
>> into iommu_map() as a physical address. This works by accident only when
>> the IOMMU does not get registered with the DMA API and there is a 1:1
>> mapping between physical addresses as seen by the CPU and the device.
>>
>> The fundamental problem here is the lack of a generic API to do what the
>> driver wants: allocating CPU-visible memory for use by a device through
>> user-defined IOMMU settings. Neither the dma-mapping API nor the IOMMU
>> API can do this by itself, and combining the two is not well-defined.
>>
>> This patch addresses the type mismatch by adding a third pointer into the
>> push_buffer structure: in addition to the address as seen from the CPU
>> and the address inside of the local IOMMU domain, the pb->alloc pointer
>> is the token returned by dma_alloc_wc(), and this is what we later need
>> to pass into dma_free_wc().
>>
>> The address we pass into iommu_map() however is the physical address
>> computed from virt_to_phys(), assuming that the pointer we have here
>> is part of the linear mapping (which is also questionable, e.g. when we
>> have a non-coherent device on ARM32 this may be false). Also, when
>> the DMA API uses the IOMMU to allocate the pointer for the default
>> domain, we end up with two IOMMU mappings for the same physical address.
>>
>
> I think we have a "policy" on Tegra that the DMA API will never allocate
> using the IOMMU (Thierry can elaborate on this), which is why I wrote the
> code with that assumption. Essentially, we have made the DMA API into the
> API that allocates CPU-visible memory.

I don't think this can be a per-platform policy.

> Considering that, I'm wondering if we can just have a temporary local
> dma_addr_t and then cast that to phys_addr_t, combined with a good comment?

That was my first approach, and it does address the warning, but
I did not send it because it still felt too wrong.

     Arnd

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH] [RFC] gpu: host1x: shut up warning about DMA API misuse Arnd Bergmann <arnd@arndb.de> - 2017-04-19 20:30 +0200
  Re: [PATCH] [RFC] gpu: host1x: shut up warning about DMA API misuse Mikko Perttunen <cyndis@kapsi.fi> - 2017-04-20 09:10 +0200
    Re: [PATCH] [RFC] gpu: host1x: shut up warning about DMA API misuse Arnd Bergmann <arnd@arndb.de> - 2017-04-20 10:30 +0200
      Re: [PATCH] [RFC] gpu: host1x: shut up warning about DMA API misuse Mikko Perttunen <cyndis@kapsi.fi> - 2017-04-20 11:50 +0200
        Re: [PATCH] [RFC] gpu: host1x: shut up warning about DMA API misuse Arnd Bergmann <arnd@arndb.de> - 2017-04-20 12:10 +0200
          Re: [PATCH] [RFC] gpu: host1x: shut up warning about DMA API misuse Mikko Perttunen <cyndis@kapsi.fi> - 2017-04-20 12:20 +0200
      Re: [PATCH] [RFC] gpu: host1x: shut up warning about DMA API misuse Russell King - ARM Linux <linux@armlinux.org.uk> - 2017-04-20 11:50 +0200
        Re: [PATCH] [RFC] gpu: host1x: shut up warning about DMA API misuse Arnd Bergmann <arnd@arndb.de> - 2017-04-20 12:10 +0200

csiph-web