Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 963accbc authored by Manuel Lauss's avatar Manuel Lauss Committed by Ralf Baechle
Browse files

MIPS: Alchemy: change dbdma to accept physical memory addresses



DMA can only be done from physical addresses; move the "virt_to_phys"
source/destination buffer address translation from the dbdma queueing
functions (since the hardware can only DMA to/from physical addresses)
to their respective users.

Signed-off-by: default avatarManuel Lauss <manuel.lauss@gmail.com>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent ea071cc7
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -571,7 +571,7 @@ EXPORT_SYMBOL(au1xxx_dbdma_ring_alloc);
 * This updates the source pointer and byte count.  Normally used
 * This updates the source pointer and byte count.  Normally used
 * for memory to fifo transfers.
 * for memory to fifo transfers.
 */
 */
u32 au1xxx_dbdma_put_source(u32 chanid, void *buf, int nbytes, u32 flags)
u32 au1xxx_dbdma_put_source(u32 chanid, dma_addr_t buf, int nbytes, u32 flags)
{
{
	chan_tab_t		*ctp;
	chan_tab_t		*ctp;
	au1x_ddma_desc_t	*dp;
	au1x_ddma_desc_t	*dp;
@@ -597,7 +597,7 @@ u32 au1xxx_dbdma_put_source(u32 chanid, void *buf, int nbytes, u32 flags)
		return 0;
		return 0;


	/* Load up buffer address and byte count. */
	/* Load up buffer address and byte count. */
	dp->dscr_source0 = virt_to_phys(buf);
	dp->dscr_source0 = buf & ~0UL;
	dp->dscr_cmd1 = nbytes;
	dp->dscr_cmd1 = nbytes;
	/* Check flags */
	/* Check flags */
	if (flags & DDMA_FLAGS_IE)
	if (flags & DDMA_FLAGS_IE)
@@ -630,7 +630,7 @@ EXPORT_SYMBOL(au1xxx_dbdma_put_source);
 * This updates the destination pointer and byte count.  Normally used
 * This updates the destination pointer and byte count.  Normally used
 * to place an empty buffer into the ring for fifo to memory transfers.
 * to place an empty buffer into the ring for fifo to memory transfers.
 */
 */
u32 au1xxx_dbdma_put_dest(u32 chanid, void *buf, int nbytes, u32 flags)
u32 au1xxx_dbdma_put_dest(u32 chanid, dma_addr_t buf, int nbytes, u32 flags)
{
{
	chan_tab_t		*ctp;
	chan_tab_t		*ctp;
	au1x_ddma_desc_t	*dp;
	au1x_ddma_desc_t	*dp;
@@ -660,7 +660,7 @@ u32 au1xxx_dbdma_put_dest(u32 chanid, void *buf, int nbytes, u32 flags)
	if (flags & DDMA_FLAGS_NOIE)
	if (flags & DDMA_FLAGS_NOIE)
		dp->dscr_cmd0 &= ~DSCR_CMD0_IE;
		dp->dscr_cmd0 &= ~DSCR_CMD0_IE;


	dp->dscr_dest0 = virt_to_phys(buf);
	dp->dscr_dest0 = buf & ~0UL;
	dp->dscr_cmd1 = nbytes;
	dp->dscr_cmd1 = nbytes;
#if 0
#if 0
	printk(KERN_DEBUG "cmd0:%x cmd1:%x source0:%x source1:%x dest0:%x dest1:%x\n",
	printk(KERN_DEBUG "cmd0:%x cmd1:%x source0:%x source1:%x dest0:%x dest1:%x\n",
+2 −2
Original line number Original line Diff line number Diff line
@@ -339,8 +339,8 @@ u32 au1xxx_dbdma_set_devwidth(u32 chanid, int bits);
u32 au1xxx_dbdma_ring_alloc(u32 chanid, int entries);
u32 au1xxx_dbdma_ring_alloc(u32 chanid, int entries);


/* Put buffers on source/destination descriptors. */
/* Put buffers on source/destination descriptors. */
u32 au1xxx_dbdma_put_source(u32 chanid, void *buf, int nbytes, u32 flags);
u32 au1xxx_dbdma_put_source(u32 chanid, dma_addr_t buf, int nbytes, u32 flags);
u32 au1xxx_dbdma_put_dest(u32 chanid, void *buf, int nbytes, u32 flags);
u32 au1xxx_dbdma_put_dest(u32 chanid, dma_addr_t buf, int nbytes, u32 flags);


/* Get a buffer from the destination descriptor. */
/* Get a buffer from the destination descriptor. */
u32 au1xxx_dbdma_get_dest(u32 chanid, void **buf, int *nbytes);
u32 au1xxx_dbdma_get_dest(u32 chanid, void **buf, int *nbytes);
+4 −4
Original line number Original line Diff line number Diff line
@@ -56,7 +56,7 @@ static inline void auide_insw(unsigned long port, void *addr, u32 count)
	chan_tab_t *ctp;
	chan_tab_t *ctp;
	au1x_ddma_desc_t *dp;
	au1x_ddma_desc_t *dp;


	if (!au1xxx_dbdma_put_dest(ahwif->rx_chan, (void*)addr,
	if (!au1xxx_dbdma_put_dest(ahwif->rx_chan, virt_to_phys(addr),
				   count << 1, DDMA_FLAGS_NOIE)) {
				   count << 1, DDMA_FLAGS_NOIE)) {
		printk(KERN_ERR "%s failed %d\n", __func__, __LINE__);
		printk(KERN_ERR "%s failed %d\n", __func__, __LINE__);
		return;
		return;
@@ -74,7 +74,7 @@ static inline void auide_outsw(unsigned long port, void *addr, u32 count)
	chan_tab_t *ctp;
	chan_tab_t *ctp;
	au1x_ddma_desc_t *dp;
	au1x_ddma_desc_t *dp;


	if (!au1xxx_dbdma_put_source(ahwif->tx_chan, (void*)addr,
	if (!au1xxx_dbdma_put_source(ahwif->tx_chan, virt_to_phys(addr),
				     count << 1, DDMA_FLAGS_NOIE)) {
				     count << 1, DDMA_FLAGS_NOIE)) {
		printk(KERN_ERR "%s failed %d\n", __func__, __LINE__);
		printk(KERN_ERR "%s failed %d\n", __func__, __LINE__);
		return;
		return;
@@ -247,13 +247,13 @@ static int auide_build_dmatable(ide_drive_t *drive, struct ide_cmd *cmd)


			if (iswrite) {
			if (iswrite) {
				if (!au1xxx_dbdma_put_source(ahwif->tx_chan,
				if (!au1xxx_dbdma_put_source(ahwif->tx_chan,
					(void *)sg_virt(sg), tc, flags)) {
					sg_phys(sg), tc, flags)) {
					printk(KERN_ERR "%s failed %d\n", 
					printk(KERN_ERR "%s failed %d\n", 
					       __func__, __LINE__);
					       __func__, __LINE__);
				}
				}
			} else  {
			} else  {
				if (!au1xxx_dbdma_put_dest(ahwif->rx_chan,
				if (!au1xxx_dbdma_put_dest(ahwif->rx_chan,
					(void *)sg_virt(sg), tc, flags)) {
					sg_phys(sg), tc, flags)) {
					printk(KERN_ERR "%s failed %d\n", 
					printk(KERN_ERR "%s failed %d\n", 
					       __func__, __LINE__);
					       __func__, __LINE__);
				}
				}
+2 −2
Original line number Original line Diff line number Diff line
@@ -651,10 +651,10 @@ static int au1xmmc_prepare_data(struct au1xmmc_host *host,


			if (host->flags & HOST_F_XMIT) {
			if (host->flags & HOST_F_XMIT) {
				ret = au1xxx_dbdma_put_source(channel,
				ret = au1xxx_dbdma_put_source(channel,
					(void *)sg_virt(sg), len, flags);
					sg_phys(sg), len, flags);
			} else {
			} else {
				ret = au1xxx_dbdma_put_dest(channel,
				ret = au1xxx_dbdma_put_dest(channel,
					(void *)sg_virt(sg), len, flags);
					sg_phys(sg), len, flags);
			}
			}


			if (!ret)
			if (!ret)
+2 −2
Original line number Original line Diff line number Diff line
@@ -412,12 +412,12 @@ static int au1550_spi_dma_txrxb(struct spi_device *spi, struct spi_transfer *t)
	}
	}


	/* put buffers on the ring */
	/* put buffers on the ring */
	res = au1xxx_dbdma_put_dest(hw->dma_rx_ch, hw->rx,
	res = au1xxx_dbdma_put_dest(hw->dma_rx_ch, virt_to_phys(hw->rx),
				    t->len, DDMA_FLAGS_IE);
				    t->len, DDMA_FLAGS_IE);
	if (!res)
	if (!res)
		dev_err(hw->dev, "rx dma put dest error\n");
		dev_err(hw->dev, "rx dma put dest error\n");


	res = au1xxx_dbdma_put_source(hw->dma_tx_ch, (void *)hw->tx,
	res = au1xxx_dbdma_put_source(hw->dma_tx_ch, virt_to_phys(hw->tx),
				      t->len, DDMA_FLAGS_IE);
				      t->len, DDMA_FLAGS_IE);
	if (!res)
	if (!res)
		dev_err(hw->dev, "tx dma put source error\n");
		dev_err(hw->dev, "tx dma put source error\n");
Loading