From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760237AbdAKVKU (ORCPT ); Wed, 11 Jan 2017 16:10:20 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:54116 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756926AbdAKVJg (ORCPT ); Wed, 11 Jan 2017 16:09:36 -0500 From: Arnd Bergmann To: Nikita Yushchenko Cc: Robin Murphy , Will Deacon , linux-arm-kernel@lists.infradead.org, linux-renesas-soc@vger.kernel.org, Simon Horman , Bjorn Helgaas , fkan@apm.com, linux-kernel@vger.kernel.org, Artemi Ivanov Subject: Re: [PATCH 1/2] dma-mapping: let arch know origin of dma range passed to arch_setup_dma_ops() Date: Wed, 11 Jan 2017 22:08:56 +0100 Message-ID: <30025121.yS4lyZEDrk@wuerfel> User-Agent: KMail/5.1.3 (Linux/4.4.0-34-generic; KDE/5.18.0; x86_64; ; ) In-Reply-To: <1484159512-28515-2-git-send-email-nikita.yoush@cogentembedded.com> References: <1484159512-28515-1-git-send-email-nikita.yoush@cogentembedded.com> <1484159512-28515-2-git-send-email-nikita.yoush@cogentembedded.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V03:K0:sNu9SPX4hVTHSW+LwWFxTGqEFofQBQVkQx7p/EkJf6dfeqNrJ0d Ldk7yALK8jkRi5rmObknN73hh0n3G73+/VtwnR/7cN5mw+8dTEo6W8JR1EToK2cjgw/Y2Fc ZME5AlTUYX5VaS1FH5gBQ25WqaXbkbsHiRgB4lWgIjbaqVwIKMm+dp+t0P2/LcoqCGTf/eN x6rViQhJl+YuH5Z9uozoA== X-UI-Out-Filterresults: notjunk:1;V01:K0:HShG6E1oMAI=:qTTwPewPKVZ3IyCtwsK5qH HkJsDVD9wlDrKrwWP6bk7HNazHU3TmegC2cd+2IzxsD/3XupyoL5xzjruVYSwA/nJjH4NYfCz RNV8NhL1oFuP64cKGb6yrLYrwsfsbknqteVsg7ZxBtGqIuRtEoUgzYR+7Ml9xbPHy41ZUWv+4 pvQHDaZfyh15xUb7+EiAeSmg8QDBAGOMV4KUvgYTjCB2x/w8kzWNkRhZssdaBCHs19Hhw5jwf 6FfLkmew69LAzlQYPSwAIHdGggojjn/m7qNzlvzvE97Op+l/zdOOyotU09PctCk/NnUWkg9Fz W8njp48T7r4ylaFOzRrGT3JGAzWt4hkVkfSalKQwvbWIHAwRtfUvM1EPSh6I2ZTV80tJEHtC0 tzGOsa+6Al9oQF+UYGodOCAYHKdFfR9bX7Obbjeiu8PLHjWLNzJ6JeAxg0GgRXD983+RCIO06 8ZUtl2lslCSnWfmNsuEIJHjrA/+mL1ChwCKqJfUOPqAf/k/PZ0ZdhpLZikfywSOQTqudp1inh sw2IkvS1ej9GalT456nwA2V85w9IB2c98bsDV04loV/rTRTJL3B65fsC4KPBF1zDJPSRssYKK cfPKrbcBAVHQShExTsDhO6OY+nXwJB4wG0bkdyTOqDBTAy742aVaoaExsWY+UostflF7LcsZF +ZkPEy3c4J4tsU9jiKlNv8YkpJnLwQzNIxcKylUvhRFuuM9iImpzRwJcDJHfA3hCSb9FFvYdw D/RNK8Ujb8B1rnAZ Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wednesday, January 11, 2017 9:31:51 PM CET Nikita Yushchenko wrote: > diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c > index 9afcbf7..0995ab3 100644 > --- a/drivers/iommu/rockchip-iommu.c > +++ b/drivers/iommu/rockchip-iommu.c > @@ -1096,7 +1096,7 @@ static int rk_iommu_domain_probe(struct platform_device *pdev) > return -ENOMEM; > > /* Set dma_ops for dev, otherwise it would be dummy_dma_ops */ > - arch_setup_dma_ops(dev, 0, DMA_BIT_MASK(32), NULL, false); > + arch_setup_dma_ops(dev, 0, DMA_BIT_MASK(32), false, NULL, false); > > dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); > dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32)); > diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c > index c9b7ad6..19f70d8 100644 > --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c > +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c > @@ -2533,7 +2533,7 @@ static int dpaa_eth_probe(struct platform_device *pdev) > priv->buf_layout[TX].priv_data_size = DPAA_TX_PRIV_DATA_SIZE; /* Tx */ > > /* device used for DMA mapping */ > - arch_setup_dma_ops(dev, 0, 0, NULL, false); > + arch_setup_dma_ops(dev, 0, 0, false, NULL, false); > err = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(40)); > if (err) { > dev_err(dev, "dma_coerce_mask_and_coherent() failed\n"); > diff --git a/drivers/staging/fsl-mc/bus/fsl-mc-bus.c b/drivers/staging/fsl-mc/bus/fsl-mc-bus.c > index 5ac373c..480b644 100644 > --- a/drivers/staging/fsl-mc/bus/fsl-mc-bus.c > +++ b/drivers/staging/fsl-mc/bus/fsl-mc-bus.c > @@ -540,7 +540,7 @@ int fsl_mc_device_add(struct dprc_obj_desc *obj_desc, > > /* Objects are coherent, unless 'no shareability' flag set. */ > if (!(obj_desc->flags & DPRC_OBJ_FLAG_NO_MEM_SHAREABILITY)) > - arch_setup_dma_ops(&mc_dev->dev, 0, 0, NULL, true); > + arch_setup_dma_ops(&mc_dev->dev, 0, 0, false, NULL, true); > > /* > * The device-specific probe callback will get invoked by device_add() Why are these actually calling arch_setup_dma_ops() here in the first place? Are these all devices that are DMA masters without an OF node? > diff --git a/drivers/of/device.c b/drivers/of/device.c > index fd5cfad..1cc2115 100644 > --- a/drivers/of/device.c > +++ b/drivers/of/device.c > @@ -89,6 +89,7 @@ void of_dma_configure(struct device *dev, struct device_node *np) > bool coherent; > unsigned long offset; > const struct iommu_ops *iommu; > + bool enforce_range = false; > > /* > * Set default coherent_dma_mask to 32 bit. Drivers are expected to > @@ -126,6 +127,8 @@ void of_dma_configure(struct device *dev, struct device_node *np) > return; > } > dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", offset); > + > + enforce_range = true; > } > > dev->dma_pfn_offset = offset; Hmm, I think when the dma-ranges are missing, we should either enforce a 32-bit mask, or disallow DMA completely. It's probably too late for the latter, I wish we had done this earlier in order to force everyone on ARM64 to have a valid dma-ranges property for any DMA master. Arnd From mboxrd@z Thu Jan 1 00:00:00 1970 From: arnd@arndb.de (Arnd Bergmann) Date: Wed, 11 Jan 2017 22:08:56 +0100 Subject: [PATCH 1/2] dma-mapping: let arch know origin of dma range passed to arch_setup_dma_ops() In-Reply-To: <1484159512-28515-2-git-send-email-nikita.yoush@cogentembedded.com> References: <1484159512-28515-1-git-send-email-nikita.yoush@cogentembedded.com> <1484159512-28515-2-git-send-email-nikita.yoush@cogentembedded.com> Message-ID: <30025121.yS4lyZEDrk@wuerfel> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Wednesday, January 11, 2017 9:31:51 PM CET Nikita Yushchenko wrote: > diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c > index 9afcbf7..0995ab3 100644 > --- a/drivers/iommu/rockchip-iommu.c > +++ b/drivers/iommu/rockchip-iommu.c > @@ -1096,7 +1096,7 @@ static int rk_iommu_domain_probe(struct platform_device *pdev) > return -ENOMEM; > > /* Set dma_ops for dev, otherwise it would be dummy_dma_ops */ > - arch_setup_dma_ops(dev, 0, DMA_BIT_MASK(32), NULL, false); > + arch_setup_dma_ops(dev, 0, DMA_BIT_MASK(32), false, NULL, false); > > dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); > dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32)); > diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c > index c9b7ad6..19f70d8 100644 > --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c > +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c > @@ -2533,7 +2533,7 @@ static int dpaa_eth_probe(struct platform_device *pdev) > priv->buf_layout[TX].priv_data_size = DPAA_TX_PRIV_DATA_SIZE; /* Tx */ > > /* device used for DMA mapping */ > - arch_setup_dma_ops(dev, 0, 0, NULL, false); > + arch_setup_dma_ops(dev, 0, 0, false, NULL, false); > err = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(40)); > if (err) { > dev_err(dev, "dma_coerce_mask_and_coherent() failed\n"); > diff --git a/drivers/staging/fsl-mc/bus/fsl-mc-bus.c b/drivers/staging/fsl-mc/bus/fsl-mc-bus.c > index 5ac373c..480b644 100644 > --- a/drivers/staging/fsl-mc/bus/fsl-mc-bus.c > +++ b/drivers/staging/fsl-mc/bus/fsl-mc-bus.c > @@ -540,7 +540,7 @@ int fsl_mc_device_add(struct dprc_obj_desc *obj_desc, > > /* Objects are coherent, unless 'no shareability' flag set. */ > if (!(obj_desc->flags & DPRC_OBJ_FLAG_NO_MEM_SHAREABILITY)) > - arch_setup_dma_ops(&mc_dev->dev, 0, 0, NULL, true); > + arch_setup_dma_ops(&mc_dev->dev, 0, 0, false, NULL, true); > > /* > * The device-specific probe callback will get invoked by device_add() Why are these actually calling arch_setup_dma_ops() here in the first place? Are these all devices that are DMA masters without an OF node? > diff --git a/drivers/of/device.c b/drivers/of/device.c > index fd5cfad..1cc2115 100644 > --- a/drivers/of/device.c > +++ b/drivers/of/device.c > @@ -89,6 +89,7 @@ void of_dma_configure(struct device *dev, struct device_node *np) > bool coherent; > unsigned long offset; > const struct iommu_ops *iommu; > + bool enforce_range = false; > > /* > * Set default coherent_dma_mask to 32 bit. Drivers are expected to > @@ -126,6 +127,8 @@ void of_dma_configure(struct device *dev, struct device_node *np) > return; > } > dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", offset); > + > + enforce_range = true; > } > > dev->dma_pfn_offset = offset; Hmm, I think when the dma-ranges are missing, we should either enforce a 32-bit mask, or disallow DMA completely. It's probably too late for the latter, I wish we had done this earlier in order to force everyone on ARM64 to have a valid dma-ranges property for any DMA master. Arnd