2022-10-19 15:07:26

by Niklas Schnelle

[permalink] [raw]
Subject: [RFC 1/6] s390/ism: Set DMA coherent mask

A future change will convert the DMA API implementation from the
architecture specific arch/s390/pci/pci_dma.c to using the common code
drivers/iommu/dma-iommu.c which the utilizes the same IOMMU hardware
through the s390-iommu driver. Unlike the s390 specific DMA API this
requires devices to correctly call dma_set_coherent_mask() to be allowed
to use IOVAs >2^32 in dma_alloc_coherent(). This was however not done
for ISM devices which require such addresses since currently the DMA
aperture for PCI devices starts a 2^32 and all calls to
dma_alloc_coherent() would thus fail.

Signed-off-by: Niklas Schnelle <[email protected]>
---
drivers/s390/net/ism_drv.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/drivers/s390/net/ism_drv.c b/drivers/s390/net/ism_drv.c
index d34bb6ec1490..5890c32a9e1f 100644
--- a/drivers/s390/net/ism_drv.c
+++ b/drivers/s390/net/ism_drv.c
@@ -560,6 +560,10 @@ static int ism_probe(struct pci_dev *pdev, const struct pci_device_id *id)
if (ret)
goto err_resource;

+ ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
+ if (ret)
+ goto err_resource;
+
dma_set_seg_boundary(&pdev->dev, SZ_1M - 1);
dma_set_max_seg_size(&pdev->dev, SZ_1M);
pci_set_master(pdev);
--
2.34.1


2022-10-20 08:31:09

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [RFC 1/6] s390/ism: Set DMA coherent mask

On Wed, Oct 19, 2022 at 04:44:30PM +0200, Niklas Schnelle wrote:
> if (ret)
> goto err_resource;
>
> + ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));

Nit: but you could also just replace the call to dma_set_mask abobe with
a call to dma_set_mask_and_coherent.

2022-10-20 13:41:46

by Niklas Schnelle

[permalink] [raw]
Subject: Re: [RFC 1/6] s390/ism: Set DMA coherent mask

On Thu, 2022-10-20 at 01:07 -0700, Christoph Hellwig wrote:
> On Wed, Oct 19, 2022 at 04:44:30PM +0200, Niklas Schnelle wrote:
> > if (ret)
> > goto err_resource;
> >
> > + ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
>
> Nit: but you could also just replace the call to dma_set_mask abobe with
> a call to dma_set_mask_and_coherent.

That makes sense, thanks. Will be added for v2. Also obviously this
change is only a prerequisite and could be applied separately, the
changed coherent mask won't affect use with the existing DMA
implementation.