Message ID | 1579531122-28341-1-git-send-email-vbadigan@codeaurora.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [V3] mmc: sdhci: Let a vendor driver supply and update ADMA descriptor size | expand |
On Mon, 20 Jan 2020 at 15:39, Veerabhadrarao Badiganti <vbadigan@codeaurora.org> wrote: > > Let a vendor driver supply the maximum descriptor size that it > can operate on. ADMA descriptor table would be allocated using this > supplied size. > If any SD Host controller is of version prior to v4.10 spec > but supports 16byte descriptor, this change allows them to supply > correct descriptor size for ADMA table allocation. > > Also let a vendor driver update the descriptor size by overriding > sdhc_host->desc_size if it has to operates on a different descriptor > sizes in different conditions. > > Suggested-by: Adrian Hunter <adrian.hunter@intel.com> > Signed-off-by: Veerabhadrarao Badiganti <vbadigan@codeaurora.org> > Acked-by: Adrian Hunter <adrian.hunter@intel.com> > -- > Thanks Adrian. > > Hi Ulf, > Can you pick this patch instead of earlier one? This is more clean > change, sorry for the multiple interations. > Otherwise let me know, I will make these changes as seperate patch. Alright, I have replaced the previous version with this one. Kind regards Uffe > --- > drivers/mmc/host/sdhci.c | 16 +++++++--------- > drivers/mmc/host/sdhci.h | 3 ++- > 2 files changed, 9 insertions(+), 10 deletions(-) > > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c > index 3140fe2..7a7a18e 100644 > --- a/drivers/mmc/host/sdhci.c > +++ b/drivers/mmc/host/sdhci.c > @@ -3821,15 +3821,13 @@ int sdhci_setup_host(struct sdhci_host *host) > dma_addr_t dma; > void *buf; > > - if (host->flags & SDHCI_USE_64_BIT_DMA) { > - host->adma_table_sz = host->adma_table_cnt * > - SDHCI_ADMA2_64_DESC_SZ(host); > - host->desc_sz = SDHCI_ADMA2_64_DESC_SZ(host); > - } else { > - host->adma_table_sz = host->adma_table_cnt * > - SDHCI_ADMA2_32_DESC_SZ; > - host->desc_sz = SDHCI_ADMA2_32_DESC_SZ; > - } > + if (!(host->flags & SDHCI_USE_64_BIT_DMA)) > + host->alloc_desc_sz = SDHCI_ADMA2_32_DESC_SZ; > + else if (!host->alloc_desc_sz) > + host->alloc_desc_sz = SDHCI_ADMA2_64_DESC_SZ(host); > + > + host->desc_sz = host->alloc_desc_sz; > + host->adma_table_sz = host->adma_table_cnt * host->desc_sz; > > host->align_buffer_sz = SDHCI_MAX_SEGS * SDHCI_ADMA2_ALIGN; > /* > diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h > index 0ed3e0e..10bda3a 100644 > --- a/drivers/mmc/host/sdhci.h > +++ b/drivers/mmc/host/sdhci.h > @@ -554,7 +554,8 @@ struct sdhci_host { > dma_addr_t adma_addr; /* Mapped ADMA descr. table */ > dma_addr_t align_addr; /* Mapped bounce buffer */ > > - unsigned int desc_sz; /* ADMA descriptor size */ > + unsigned int desc_sz; /* ADMA current descriptor size */ > + unsigned int alloc_desc_sz; /* ADMA descr. max size host supports */ > > struct workqueue_struct *complete_wq; /* Request completion wq */ > struct work_struct complete_work; /* Request completion work */ > -- > Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc., is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 3140fe2..7a7a18e 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -3821,15 +3821,13 @@ int sdhci_setup_host(struct sdhci_host *host) dma_addr_t dma; void *buf; - if (host->flags & SDHCI_USE_64_BIT_DMA) { - host->adma_table_sz = host->adma_table_cnt * - SDHCI_ADMA2_64_DESC_SZ(host); - host->desc_sz = SDHCI_ADMA2_64_DESC_SZ(host); - } else { - host->adma_table_sz = host->adma_table_cnt * - SDHCI_ADMA2_32_DESC_SZ; - host->desc_sz = SDHCI_ADMA2_32_DESC_SZ; - } + if (!(host->flags & SDHCI_USE_64_BIT_DMA)) + host->alloc_desc_sz = SDHCI_ADMA2_32_DESC_SZ; + else if (!host->alloc_desc_sz) + host->alloc_desc_sz = SDHCI_ADMA2_64_DESC_SZ(host); + + host->desc_sz = host->alloc_desc_sz; + host->adma_table_sz = host->adma_table_cnt * host->desc_sz; host->align_buffer_sz = SDHCI_MAX_SEGS * SDHCI_ADMA2_ALIGN; /* diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 0ed3e0e..10bda3a 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -554,7 +554,8 @@ struct sdhci_host { dma_addr_t adma_addr; /* Mapped ADMA descr. table */ dma_addr_t align_addr; /* Mapped bounce buffer */ - unsigned int desc_sz; /* ADMA descriptor size */ + unsigned int desc_sz; /* ADMA current descriptor size */ + unsigned int alloc_desc_sz; /* ADMA descr. max size host supports */ struct workqueue_struct *complete_wq; /* Request completion wq */ struct work_struct complete_work; /* Request completion work */