Re: [PATCH V3 1/3] mmc: sdhci: add support for using external DMA devices

From: Chunyan Zhang
Date: Thu Dec 06 2018 - 01:19:49 EST


On Tue, 4 Dec 2018 at 18:38, Faiz Abbas <faiz_abbas@xxxxxx> wrote:
>
> Hi,
>
> On 04/12/18 12:54 PM, Chunyan Zhang wrote:
> > Some standard SD host controllers can support both external dma
> > controllers as well as ADMA/SDMA in which the SD host controller
> > acts as DMA master. TI's omap controller is the case as an example.
> >
> > Currently the generic SDHCI code supports ADMA/SDMA integrated in
> > the host controller but does not have any support for external DMA
> > controllers implemented using dmaengine, meaning that custom code is
> > needed for any systems that use an external DMA controller with SDHCI.
> >
> ...
>
> > diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> > index b001cf4..8e50a97 100644
> > --- a/drivers/mmc/host/sdhci.h
> > +++ b/drivers/mmc/host/sdhci.h
> > @@ -475,6 +475,7 @@ struct sdhci_host {
> >
> > int irq; /* Device IRQ */
> > void __iomem *ioaddr; /* Mapped address */
> > + phys_addr_t mapbase; /* physical address base */
> > char *bounce_buffer; /* For packing SDMA reads/writes */
> > dma_addr_t bounce_addr;
> > unsigned int bounce_buffer_size;
> > @@ -524,6 +525,7 @@ struct sdhci_host {
> > bool pending_reset; /* Cmd/data reset is pending */
> > bool irq_wake_enabled; /* IRQ wakeup is enabled */
> > bool v4_mode; /* Host Version 4 Enable */
> > + bool use_external_dma;
> >
> > struct mmc_request *mrqs_done[SDHCI_MAX_MRQS]; /* Requests done */
> > struct mmc_command *cmd; /* Current command */
> > @@ -552,6 +554,11 @@ struct sdhci_host {
> > struct timer_list timer; /* Timer for timeouts */
> > struct timer_list data_timer; /* Timer for data timeouts */
> >
> > +#if IS_ENABLED(CONFIG_MMC_SDHCI_EXTERNAL_DMA)
> > + struct dma_chan *rx_chan;
> > + struct dma_chan *tx_chan;
> > +#endif
> > +
> > u32 caps; /* CAPABILITY_0 */
> > u32 caps1; /* CAPABILITY_1 */
> > bool read_caps; /* Capability flags have been read */
> > @@ -785,5 +792,6 @@ void sdhci_start_tuning(struct sdhci_host *host);
> > void sdhci_end_tuning(struct sdhci_host *host);
> > void sdhci_reset_tuning(struct sdhci_host *host);
> > void sdhci_send_tuning(struct sdhci_host *host, u32 opcode);
> > +void sdhci_switch_external_dma(struct sdhci_host *host, bool en);
> >
>
> Can you also add a new attribute in sdhci_host->flags for external dma
> in this file? The log still shows
>
> [ 3.675028] mmc2: SDHCI controller on 4809c000.mmc [4809c000.mmc]
> using ADMA

Ok, will try to add.

Thanks for your test and review.

Chunyan

>
> when using external dma.
>
> Thanks,
> Faiz