> -----Original Message----- > From: Greg Malysa <greg.mal...@timesys.com> > Sent: Tuesday, March 26, 2024 11:28 AM > To: u-boot@lists.denx.de; Peng Fan <peng....@nxp.com>; Jaehoon Chung > <jh80.ch...@samsung.com> > Cc: Greg Malysa <greg.mal...@timesys.com>; Nathan Barrett-Morrison > <nathan.morri...@timesys.com>; Ian > Roberts <ian.robe...@timesys.com>; Jonas Karlman <jo...@kwiboo.se>; Kever > Yang <kever.yang@rock- > chips.com>; Marek Vasut <marek.vasut+rene...@mailbox.org>; Oleksandr Suvorov > <oleksandr.suvo...@foundries.io>; Paul Barker > <paul.barker...@bp.renesas.com>; Peter Geis > <pgwipe...@gmail.com>; Sean Anderson <sean.ander...@seco.com>; Simon Glass > <s...@chromium.org>; Stefan > Roese <s...@denx.de>; Tom Rini <tr...@konsulko.com> > Subject: [PATCH] mmc: Support 32-bit only ADMA on 64-bit platforms > > Some arm64 platforms may include SDIO host controllers that > only support 32-bit ADMA. While the Linux kernel detects which > size is supported and adjusts the descriptor size used dynamically, > the previous u-boot implementation statically selected between the > two depending on whether DMA_ADDR_T_64BIT was defined. Because the > static selection is already in place and effective for most platforms, > this patch logically separates "64 bit addresses are used for DMA on > this platform" and "64 bit addresses are used by the SDIO host > controller for ADMA" in order to support the small number of platforms > where these statements are not equivalent. > > Using 32 bits is opt-in and existing 64 bit platforms should be > unaffected by this change. > > Co-developed-by: Nathan Barrett-Morrison <nathan.morri...@timesys.com> > Signed-off-by: Nathan Barrett-Morrison <nathan.morri...@timesys.com> > Co-developed-by: Ian Roberts <ian.robe...@timesys.com> > Signed-off-by: Ian Roberts <ian.robe...@timesys.com> > Signed-off-by: Greg Malysa <greg.mal...@timesys.com> Reviewed-by: Jaehoon Chung <jh80.ch...@samsung.com> Best Regards, Jaehoon Chung > > --- > > > --- > drivers/mmc/Kconfig | 18 ++++++++++++++++++ > drivers/mmc/sdhci-adma.c | 2 +- > drivers/mmc/sdhci.c | 9 ++++----- > include/sdhci.h | 4 ++-- > 4 files changed, 25 insertions(+), 8 deletions(-) > > diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig > index cef05790dd..4538286c64 100644 > --- a/drivers/mmc/Kconfig > +++ b/drivers/mmc/Kconfig > @@ -495,6 +495,24 @@ config SPL_MMC_SDHCI_ADMA > This enables support for the ADMA (Advanced DMA) defined > in the SD Host Controller Standard Specification Version 3.00 in SPL. > > +config MMC_SDHCI_ADMA_FORCE_32BIT > + bool "Force 32 bit mode for ADMA on 64 bit platforms" > + help > + This forces SDHCI ADMA to be built for 32 bit descriptors, even > + on a 64 bit platform where they would otherwise be assumed to > + be 64 bits. This is necessary for certain hardware platforms > + that are 64-bit but include only 32-bit support within the selected > + SD host controller IP. > + > +config MMC_SDHCI_ADMA_64BIT > + bool "Use SHDCI ADMA with 64 bit descriptors" > + depends on !MMC_SDHCI_ADMA_FORCE_32BIT > + default y if DMA_ADDR_T_64BIT > + help > + This selects 64 bit descriptors for SDHCI ADMA. It is enabled by > + default on 64 bit systems, but can be disabled if one of these > + systems includes 32-bit ADMA. > + > config FIXED_SDHCI_ALIGNED_BUFFER > hex "SDRAM address for fixed buffer" > depends on SPL && MVEBU_SPL_BOOT_DEVICE_MMC > diff --git a/drivers/mmc/sdhci-adma.c b/drivers/mmc/sdhci-adma.c > index 8213223d3f..474647c3fd 100644 > --- a/drivers/mmc/sdhci-adma.c > +++ b/drivers/mmc/sdhci-adma.c > @@ -22,7 +22,7 @@ static void sdhci_adma_desc(struct sdhci_adma_desc *desc, > desc->len = len; > desc->reserved = 0; > desc->addr_lo = lower_32_bits(addr); > -#ifdef CONFIG_DMA_ADDR_T_64BIT > +#ifdef CONFIG_MMC_SDHCI_ADMA_64BIT > desc->addr_hi = upper_32_bits(addr); > #endif > } > diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c > index 0178ed8a11..b27ce57d96 100644 > --- a/drivers/mmc/sdhci.c > +++ b/drivers/mmc/sdhci.c > @@ -900,11 +900,10 @@ int sdhci_setup_cfg(struct mmc_config *cfg, struct > sdhci_host *host, > host->adma_desc_table = sdhci_adma_init(); > host->adma_addr = (dma_addr_t)host->adma_desc_table; > > -#ifdef CONFIG_DMA_ADDR_T_64BIT > - host->flags |= USE_ADMA64; > -#else > - host->flags |= USE_ADMA; > -#endif > + if (IS_ENABLED(CONFIG_MMC_SDHCI_ADMA_64BIT)) > + host->flags |= USE_ADMA64; > + else > + host->flags |= USE_ADMA; > #endif > if (host->quirks & SDHCI_QUIRK_REG32_RW) > host->version = > diff --git a/include/sdhci.h b/include/sdhci.h > index a1b74e3bd7..07b84d6715 100644 > --- a/include/sdhci.h > +++ b/include/sdhci.h > @@ -294,7 +294,7 @@ struct sdhci_ops { > }; > > #define ADMA_MAX_LEN 65532 > -#ifdef CONFIG_DMA_ADDR_T_64BIT > +#ifdef CONFIG_MMC_SDHCI_ADMA_64BIT > #define ADMA_DESC_LEN 16 > #else > #define ADMA_DESC_LEN 8 > @@ -319,7 +319,7 @@ struct sdhci_adma_desc { > u8 reserved; > u16 len; > u32 addr_lo; > -#ifdef CONFIG_DMA_ADDR_T_64BIT > +#ifdef CONFIG_MMC_SDHCI_ADMA_64BIT > u32 addr_hi; > #endif > } __packed; > -- > 2.43.2