ASoC: loongson: fix address space confusion

Message ID 20230622101235.3230941-1-arnd@kernel.org
State New
Headers
Series ASoC: loongson: fix address space confusion |

Commit Message

Arnd Bergmann June 22, 2023, 10:12 a.m. UTC
  From: Arnd Bergmann <arnd@arndb.de>

The i2s driver uses the mapped __iomem address of the FIFO as the DMA
address for the device. This apparently works on loongarch because of
the way it handles __iomem pointers as aliases of physical addresses,
but this is not portable to other architectures and causes a compiler
warning when dma addresses are not the same size as pointers:

sound/soc/loongson/loongson_i2s_pci.c: In function 'loongson_i2s_pci_probe':
sound/soc/loongson/loongson_i2s_pci.c:110:29: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
  110 |         tx_data->dev_addr = (dma_addr_t)i2s->reg_base + LS_I2S_TX_DATA;
      |                             ^
sound/soc/loongson/loongson_i2s_pci.c:113:29: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
  113 |         rx_data->dev_addr = (dma_addr_t)i2s->reg_base + LS_I2S_RX_DATA;
      |                             ^

Change the driver to instead use the physical address as stored in the
PCI BAR resource directly. Since 'dev_addr' is a 32-bit address, I think
this results in the same truncated address on loongarch but is otherwise
closer to portable code and avoids the warning.

Fixes: d84881e06836d ("ASoC: Add support for Loongson I2S controller")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
This is only build tested and I don't understand the loongarch specifics
that well, please review or test for actual hardware requirements.
---
 sound/soc/loongson/loongson_i2s_pci.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
  

Comments

Mark Brown June 22, 2023, 10:33 p.m. UTC | #1
On Thu, 22 Jun 2023 12:12:22 +0200, Arnd Bergmann wrote:
> The i2s driver uses the mapped __iomem address of the FIFO as the DMA
> address for the device. This apparently works on loongarch because of
> the way it handles __iomem pointers as aliases of physical addresses,
> but this is not portable to other architectures and causes a compiler
> warning when dma addresses are not the same size as pointers:
> 
> sound/soc/loongson/loongson_i2s_pci.c: In function 'loongson_i2s_pci_probe':
> sound/soc/loongson/loongson_i2s_pci.c:110:29: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
>   110 |         tx_data->dev_addr = (dma_addr_t)i2s->reg_base + LS_I2S_TX_DATA;
>       |                             ^
> sound/soc/loongson/loongson_i2s_pci.c:113:29: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
>   113 |         rx_data->dev_addr = (dma_addr_t)i2s->reg_base + LS_I2S_RX_DATA;
>       |                             ^
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/1] ASoC: loongson: fix address space confusion
      commit: 012fa2622e30675f61413485785e708ba02be78b

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark
  
Christoph Hellwig June 26, 2023, 7:58 a.m. UTC | #2
On Thu, Jun 22, 2023 at 12:12:22PM +0200, Arnd Bergmann wrote:
> Change the driver to instead use the physical address as stored in the
> PCI BAR resource directly. Since 'dev_addr' is a 32-bit address, I think
> this results in the same truncated address on loongarch but is otherwise
> closer to portable code and avoids the warning.

This gets rid of the warning, but is still broken.
pci_resource_start retuns a resource_size_t, which really is a
phys_addr_t, but certainly no DMA address.  To map PCI(e) resources
for DMA the driver needs to call dma_map_resource.
  

Patch

diff --git a/sound/soc/loongson/loongson_i2s_pci.c b/sound/soc/loongson/loongson_i2s_pci.c
index 6dcfb17d3276d..fa90361865c6c 100644
--- a/sound/soc/loongson/loongson_i2s_pci.c
+++ b/sound/soc/loongson/loongson_i2s_pci.c
@@ -107,10 +107,10 @@  static int loongson_i2s_pci_probe(struct pci_dev *pdev,
 	tx_data = &i2s->tx_dma_data;
 	rx_data = &i2s->rx_dma_data;
 
-	tx_data->dev_addr = (dma_addr_t)i2s->reg_base + LS_I2S_TX_DATA;
+	tx_data->dev_addr = pci_resource_start(pdev, 0) + LS_I2S_TX_DATA;
 	tx_data->order_addr = i2s->reg_base + LS_I2S_TX_ORDER;
 
-	rx_data->dev_addr = (dma_addr_t)i2s->reg_base + LS_I2S_RX_DATA;
+	rx_data->dev_addr = pci_resource_start(pdev, 0) + LS_I2S_RX_DATA;
 	rx_data->order_addr = i2s->reg_base + LS_I2S_RX_ORDER;
 
 	tx_data->irq = fwnode_irq_get_byname(fwnode, "tx");