All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Ujfalusi <peter.ujfalusi@ti.com>
To: Christoph Hellwig <hch@lst.de>
Cc: Robin Murphy <robin.murphy@arm.com>, <vigneshr@ti.com>,
	<konrad.wilk@oracle.com>, <linux@armlinux.org.uk>,
	<linux-kernel@vger.kernel.org>,
	<iommu@lists.linux-foundation.org>,
	<linux-arm-kernel@lists.infradead.org>, <rogerq@ti.com>,
	<robh@kernel.org>
Subject: Re: [PoC] arm: dma-mapping: direct: Apply dma_pfn_offset only when it is valid
Date: Thu, 30 Jan 2020 15:04:37 +0200	[thread overview]
Message-ID: <b2b1cb21-3aae-2181-fd79-f63701f283c0@ti.com> (raw)
In-Reply-To: <20200130075332.GA30735@lst.de>



On 30/01/2020 9.53, Christoph Hellwig wrote:
> [skipping the DT bits, as I'm everything but an expert on that..]
> 
> On Mon, Jan 27, 2020 at 04:00:30PM +0200, Peter Ujfalusi wrote:
>> I agree on the phys_to_dma(). It should fail for addresses which does
>> not fall into any of the ranges.
>> It is just a that we in Linux don't have the concept atm for ranges, we
>> have only _one_ range which applies to every memory address.
> 
> what does atm here mean?

struct device have only single dma_pfn_offset, one can not have multiple
ranges defined. If we have then only the first is taken and the physical
address and dma address is discarded, only the dma_pfn_offset is stored
and used.

> We have needed multi-range support for quite a while, as common broadcom
> SOCs do need it.  So patches for that are welcome at least from the
> DMA layer perspective (kinda similar to your pseudo code earlier)

But do they have dma_pfn_offset != 0?

>>> Nobody's disputing that the current dma_direct_supported()
>>> implementation is broken for the case where ZONE_DMA itself is offset
>>> from PA 0; the more pressing question is why Christoph's diff, which was
>>> trying to take that into account, still didn't work.
>>
>> I understand that this is a bit more complex than I interpret it, but
>> the k2g is broken and currently the simplest way to make it work is to
>> use the arm dma_ops in case the pfn_offset is not 0.
>> It will be easy to test dma-direct changes trying to address the issue
>> in hand, but will allow k2g to be usable at the same time.
> 
> Well, using the legacy arm dma ops means we can't use swiotlb if there
> is an offset, which is also wrong for lots of common cases, including
> the Rpi 4.  I'm still curious why my patch didn't work, as I thought
> it should.

The dma_pfn_offset is _still_ applied to the mask we are trying to set
(and validate) via dma-direct.

in dma_direct_supported:
mask == 0xffffffff // DMA_BIT_MASK(32)
dev->dma_pfn_offset == 0x780000 // Keystone 2
min_mask == 0xffffff

tmp_mask = __phys_to_dma(dev, min_mask);
tmp_mask == 0xff880ffffff

within __phys_to_dma() converts the min_mask to pfn and calls
pfn_to_dma() which does:
if (dev)
	pfn -= dev->dma_pfn_offset;

the returned pfn is then converted back to address.

the mask (0xffffffff) is well under the tmp_mask (0xff880ffffff) so
dma_direct_supported() will tell us that DMA is not supported for
DMA_BIT_MASK(32), which is not true, because DMA is supporting 32 bits.

> We'll need to find the minimum change to make it work
> for now without switching ops, even if it isn't the correct one, and
> then work from there.

Sure, but can we fix the regression by reverting to arm_ops for now only
if dma_pfn_offset is not 0? It used to work fine in the past at least it
appeared to work on K2 platforms.

- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

WARNING: multiple messages have this Message-ID (diff)
From: Peter Ujfalusi via iommu <iommu@lists.linux-foundation.org>
To: Christoph Hellwig <hch@lst.de>
Cc: robh@kernel.org, vigneshr@ti.com, konrad.wilk@oracle.com,
	linux@armlinux.org.uk, linux-kernel@vger.kernel.org,
	iommu@lists.linux-foundation.org,
	Robin Murphy <robin.murphy@arm.com>,
	linux-arm-kernel@lists.infradead.org, rogerq@ti.com
Subject: Re: [PoC] arm: dma-mapping: direct: Apply dma_pfn_offset only when it is valid
Date: Thu, 30 Jan 2020 15:04:37 +0200	[thread overview]
Message-ID: <b2b1cb21-3aae-2181-fd79-f63701f283c0@ti.com> (raw)
In-Reply-To: <20200130075332.GA30735@lst.de>



On 30/01/2020 9.53, Christoph Hellwig wrote:
> [skipping the DT bits, as I'm everything but an expert on that..]
> 
> On Mon, Jan 27, 2020 at 04:00:30PM +0200, Peter Ujfalusi wrote:
>> I agree on the phys_to_dma(). It should fail for addresses which does
>> not fall into any of the ranges.
>> It is just a that we in Linux don't have the concept atm for ranges, we
>> have only _one_ range which applies to every memory address.
> 
> what does atm here mean?

struct device have only single dma_pfn_offset, one can not have multiple
ranges defined. If we have then only the first is taken and the physical
address and dma address is discarded, only the dma_pfn_offset is stored
and used.

> We have needed multi-range support for quite a while, as common broadcom
> SOCs do need it.  So patches for that are welcome at least from the
> DMA layer perspective (kinda similar to your pseudo code earlier)

But do they have dma_pfn_offset != 0?

>>> Nobody's disputing that the current dma_direct_supported()
>>> implementation is broken for the case where ZONE_DMA itself is offset
>>> from PA 0; the more pressing question is why Christoph's diff, which was
>>> trying to take that into account, still didn't work.
>>
>> I understand that this is a bit more complex than I interpret it, but
>> the k2g is broken and currently the simplest way to make it work is to
>> use the arm dma_ops in case the pfn_offset is not 0.
>> It will be easy to test dma-direct changes trying to address the issue
>> in hand, but will allow k2g to be usable at the same time.
> 
> Well, using the legacy arm dma ops means we can't use swiotlb if there
> is an offset, which is also wrong for lots of common cases, including
> the Rpi 4.  I'm still curious why my patch didn't work, as I thought
> it should.

The dma_pfn_offset is _still_ applied to the mask we are trying to set
(and validate) via dma-direct.

in dma_direct_supported:
mask == 0xffffffff // DMA_BIT_MASK(32)
dev->dma_pfn_offset == 0x780000 // Keystone 2
min_mask == 0xffffff

tmp_mask = __phys_to_dma(dev, min_mask);
tmp_mask == 0xff880ffffff

within __phys_to_dma() converts the min_mask to pfn and calls
pfn_to_dma() which does:
if (dev)
	pfn -= dev->dma_pfn_offset;

the returned pfn is then converted back to address.

the mask (0xffffffff) is well under the tmp_mask (0xff880ffffff) so
dma_direct_supported() will tell us that DMA is not supported for
DMA_BIT_MASK(32), which is not true, because DMA is supporting 32 bits.

> We'll need to find the minimum change to make it work
> for now without switching ops, even if it isn't the correct one, and
> then work from there.

Sure, but can we fix the regression by reverting to arm_ops for now only
if dma_pfn_offset is not 0? It used to work fine in the past at least it
appeared to work on K2 platforms.

- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

WARNING: multiple messages have this Message-ID (diff)
From: Peter Ujfalusi <peter.ujfalusi@ti.com>
To: Christoph Hellwig <hch@lst.de>
Cc: robh@kernel.org, vigneshr@ti.com, konrad.wilk@oracle.com,
	linux@armlinux.org.uk, linux-kernel@vger.kernel.org,
	iommu@lists.linux-foundation.org,
	Robin Murphy <robin.murphy@arm.com>,
	linux-arm-kernel@lists.infradead.org, rogerq@ti.com
Subject: Re: [PoC] arm: dma-mapping: direct: Apply dma_pfn_offset only when it is valid
Date: Thu, 30 Jan 2020 15:04:37 +0200	[thread overview]
Message-ID: <b2b1cb21-3aae-2181-fd79-f63701f283c0@ti.com> (raw)
In-Reply-To: <20200130075332.GA30735@lst.de>



On 30/01/2020 9.53, Christoph Hellwig wrote:
> [skipping the DT bits, as I'm everything but an expert on that..]
> 
> On Mon, Jan 27, 2020 at 04:00:30PM +0200, Peter Ujfalusi wrote:
>> I agree on the phys_to_dma(). It should fail for addresses which does
>> not fall into any of the ranges.
>> It is just a that we in Linux don't have the concept atm for ranges, we
>> have only _one_ range which applies to every memory address.
> 
> what does atm here mean?

struct device have only single dma_pfn_offset, one can not have multiple
ranges defined. If we have then only the first is taken and the physical
address and dma address is discarded, only the dma_pfn_offset is stored
and used.

> We have needed multi-range support for quite a while, as common broadcom
> SOCs do need it.  So patches for that are welcome at least from the
> DMA layer perspective (kinda similar to your pseudo code earlier)

But do they have dma_pfn_offset != 0?

>>> Nobody's disputing that the current dma_direct_supported()
>>> implementation is broken for the case where ZONE_DMA itself is offset
>>> from PA 0; the more pressing question is why Christoph's diff, which was
>>> trying to take that into account, still didn't work.
>>
>> I understand that this is a bit more complex than I interpret it, but
>> the k2g is broken and currently the simplest way to make it work is to
>> use the arm dma_ops in case the pfn_offset is not 0.
>> It will be easy to test dma-direct changes trying to address the issue
>> in hand, but will allow k2g to be usable at the same time.
> 
> Well, using the legacy arm dma ops means we can't use swiotlb if there
> is an offset, which is also wrong for lots of common cases, including
> the Rpi 4.  I'm still curious why my patch didn't work, as I thought
> it should.

The dma_pfn_offset is _still_ applied to the mask we are trying to set
(and validate) via dma-direct.

in dma_direct_supported:
mask == 0xffffffff // DMA_BIT_MASK(32)
dev->dma_pfn_offset == 0x780000 // Keystone 2
min_mask == 0xffffff

tmp_mask = __phys_to_dma(dev, min_mask);
tmp_mask == 0xff880ffffff

within __phys_to_dma() converts the min_mask to pfn and calls
pfn_to_dma() which does:
if (dev)
	pfn -= dev->dma_pfn_offset;

the returned pfn is then converted back to address.

the mask (0xffffffff) is well under the tmp_mask (0xff880ffffff) so
dma_direct_supported() will tell us that DMA is not supported for
DMA_BIT_MASK(32), which is not true, because DMA is supporting 32 bits.

> We'll need to find the minimum change to make it work
> for now without switching ops, even if it isn't the correct one, and
> then work from there.

Sure, but can we fix the regression by reverting to arm_ops for now only
if dma_pfn_offset is not 0? It used to work fine in the past at least it
appeared to work on K2 platforms.

- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2020-01-30 13:04 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-09 14:20 add swiotlb support to arm32 Christoph Hellwig
2019-07-09 14:20 ` Christoph Hellwig
2019-07-09 14:20 ` Christoph Hellwig
2019-07-09 14:20 ` [PATCH 1/2] dma-mapping check pfn validity in dma_common_{mmap,get_sgtable} Christoph Hellwig
2019-07-09 14:20   ` [PATCH 1/2] dma-mapping check pfn validity in dma_common_{mmap, get_sgtable} Christoph Hellwig
2019-07-09 14:20   ` Christoph Hellwig
2019-07-09 14:20 ` [PATCH 2/2] arm: use swiotlb for bounce buffer on LPAE configs Christoph Hellwig
2019-07-09 14:20   ` Christoph Hellwig
2019-07-09 14:20   ` Christoph Hellwig
2019-07-24 17:23   ` Nicolas Saenz Julienne
2019-07-24 17:23     ` Nicolas Saenz Julienne
2019-07-24 17:23     ` Nicolas Saenz Julienne
2019-07-24 17:55     ` Christoph Hellwig
2019-07-24 17:55       ` Christoph Hellwig
2019-07-24 17:55       ` Christoph Hellwig
2019-12-19 13:10   ` Peter Ujfalusi
2019-12-19 13:10     ` Peter Ujfalusi
2019-12-19 13:10     ` Peter Ujfalusi via iommu
2019-12-19 15:02     ` Christoph Hellwig
2019-12-19 15:02       ` Christoph Hellwig
2019-12-19 15:02       ` Christoph Hellwig
2019-12-19 15:20       ` Peter Ujfalusi
2019-12-19 15:20         ` Peter Ujfalusi
2019-12-19 15:20         ` Peter Ujfalusi via iommu
2020-01-08  8:28         ` Peter Ujfalusi
2020-01-08  8:28           ` Peter Ujfalusi
2020-01-08  8:28           ` Peter Ujfalusi via iommu
2020-01-08 12:21           ` Robin Murphy
2020-01-08 12:21             ` Robin Murphy
2020-01-08 12:21             ` Robin Murphy
2020-01-08 14:00             ` Peter Ujfalusi
2020-01-08 14:00               ` Peter Ujfalusi
2020-01-08 14:00               ` Peter Ujfalusi via iommu
2020-01-08 15:20               ` Robin Murphy
2020-01-08 15:20                 ` Robin Murphy
2020-01-08 15:20                 ` Robin Murphy
2020-01-09 14:49                 ` Christoph Hellwig
2020-01-09 14:49                   ` Christoph Hellwig
2020-01-09 14:49                   ` Christoph Hellwig
2020-01-14 10:43                   ` Peter Ujfalusi
2020-01-14 10:43                     ` Peter Ujfalusi
2020-01-14 10:43                     ` Peter Ujfalusi via iommu
2020-01-14 16:43                     ` [PoC] arm: dma-mapping: direct: Apply dma_pfn_offset only when it is valid Peter Ujfalusi
2020-01-14 16:43                       ` Peter Ujfalusi
2020-01-14 16:43                       ` Peter Ujfalusi via iommu
2020-01-14 18:19                       ` Robin Murphy
2020-01-14 18:19                         ` Robin Murphy
2020-01-14 18:19                         ` Robin Murphy
2020-01-15 11:50                         ` Peter Ujfalusi
2020-01-15 11:50                           ` Peter Ujfalusi
2020-01-15 11:50                           ` Peter Ujfalusi via iommu
2020-01-16 19:13                           ` Robin Murphy
2020-01-16 19:13                             ` Robin Murphy
2020-01-16 19:13                             ` Robin Murphy
2020-01-27 14:00                             ` Peter Ujfalusi
2020-01-27 14:00                               ` Peter Ujfalusi
2020-01-27 14:00                               ` Peter Ujfalusi via iommu
2020-01-30  7:53                               ` Christoph Hellwig
2020-01-30  7:53                                 ` Christoph Hellwig
2020-01-30  7:53                                 ` Christoph Hellwig
2020-01-30 13:04                                 ` Peter Ujfalusi [this message]
2020-01-30 13:04                                   ` Peter Ujfalusi
2020-01-30 13:04                                   ` Peter Ujfalusi via iommu
2020-01-30 16:40                                   ` Christoph Hellwig
2020-01-30 16:40                                     ` Christoph Hellwig
2020-01-30 16:40                                     ` Christoph Hellwig
2020-01-31 13:59                                     ` Peter Ujfalusi
2020-01-31 13:59                                       ` Peter Ujfalusi
2020-01-31 13:59                                       ` Peter Ujfalusi via iommu
2020-01-31 14:00                                     ` Peter Ujfalusi
2020-01-31 14:00                                       ` Peter Ujfalusi
2020-01-31 14:00                                       ` Peter Ujfalusi via iommu
2020-01-31 14:00                                     ` Peter Ujfalusi
2020-01-31 14:00                                       ` Peter Ujfalusi
2020-01-31 14:00                                       ` Peter Ujfalusi via iommu
2020-02-03 17:08                                       ` Christoph Hellwig
2020-02-03 17:08                                         ` Christoph Hellwig
2020-02-03 17:08                                         ` Christoph Hellwig
2020-02-05 10:19                                         ` Peter Ujfalusi
2020-02-05 10:19                                           ` Peter Ujfalusi
2020-02-05 10:19                                           ` Peter Ujfalusi via iommu
2019-07-17 13:21 ` add swiotlb support to arm32 Vignesh Raghavendra
2019-07-17 13:21   ` Vignesh Raghavendra
2019-07-17 13:21   ` Vignesh Raghavendra via iommu
2019-07-19 12:33   ` Christoph Hellwig
2019-07-19 12:33     ` Christoph Hellwig
2019-07-19 12:33     ` Christoph Hellwig
2019-07-24 15:37   ` Christoph Hellwig
2019-07-24 15:37     ` Christoph Hellwig
2019-07-24 15:37     ` Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b2b1cb21-3aae-2181-fd79-f63701f283c0@ti.com \
    --to=peter.ujfalusi@ti.com \
    --cc=hch@lst.de \
    --cc=iommu@lists.linux-foundation.org \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=robh@kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=rogerq@ti.com \
    --cc=vigneshr@ti.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.