diff mbox series

[1/2] arm: mvebu: clearfog: Fix MMC detection

Message ID 20230225014220.13166-2-martin.p.rowe@gmail.com
State Superseded
Delegated to: Stefan Roese
Headers show
Series arm: mvebu: clearfog: defconfig updates | expand

Commit Message

Martin Rowe Feb. 25, 2023, 1:42 a.m. UTC
A388 Clearfog MMC is either SD Card or eMMC with different behaviour for
both. Setting MMC_BROKEN_CD allows both to correctly detect MMC.

Signed-off-by: Martin Rowe <martin.p.rowe@gmail.com>
---
 configs/clearfog_defconfig      | 3 +--
 configs/clearfog_sata_defconfig | 8 ++++----
 2 files changed, 5 insertions(+), 6 deletions(-)

Comments

Pali Rohár Feb. 25, 2023, 9:49 p.m. UTC | #1
On Saturday 25 February 2023 11:42:19 Martin Rowe wrote:
> A388 Clearfog MMC is either SD Card or eMMC with different behaviour for
> both. Setting MMC_BROKEN_CD allows both to correctly detect MMC.
> 
> Signed-off-by: Martin Rowe <martin.p.rowe@gmail.com>

It looks like a hack but I think we do not have a better option for now.

If I understand the issue correctly then card-detect pin is unconnected
for eMMC variant and used for checking if SD card is present for SD
variant. Unconnected pin seems to have some internal pull-up/down which
reports not-present state for eMMC variant. eMMC does not have any
presence signal, so card-detect pin must be ignored for eMMC.

This looks like a chicken and egg problem and the only option to support
both variants is to ignore card-detect pin and always try to initialize
device connected to mmc controller (which may be eMMC or SD).

I do not know if there is a better option for ignoring card-detect pin
in u-boot, so:

Acked-by: Pali Rohár <pali@kernel.org>

> ---
>  configs/clearfog_defconfig      | 3 +--
>  configs/clearfog_sata_defconfig | 8 ++++----
>  2 files changed, 5 insertions(+), 6 deletions(-)
> 
> diff --git a/configs/clearfog_defconfig b/configs/clearfog_defconfig
> index 8cd35f9f1a..24e7c16ac7 100644
> --- a/configs/clearfog_defconfig
> +++ b/configs/clearfog_defconfig
> @@ -46,7 +46,6 @@ CONFIG_CMD_USB=y
>  CONFIG_CMD_TFTPPUT=y
>  CONFIG_CMD_CACHE=y
>  CONFIG_CMD_TIME=y
> -CONFIG_CMD_MVEBU_BUBT=y
>  CONFIG_ENV_OVERWRITE=y
>  CONFIG_ENV_MIN_ENTRIES=128
>  CONFIG_ARP_TIMEOUT=200
> @@ -59,7 +58,7 @@ CONFIG_DM_I2C=y
>  CONFIG_SYS_I2C_MVTWSI=y
>  CONFIG_I2C_EEPROM=y
>  CONFIG_SPL_I2C_EEPROM=y
> -CONFIG_SUPPORT_EMMC_BOOT=y
> +CONFIG_MMC_BROKEN_CD=y
>  CONFIG_MMC_SDHCI=y
>  CONFIG_MMC_SDHCI_SDMA=y
>  CONFIG_MMC_SDHCI_MV=y
> diff --git a/configs/clearfog_sata_defconfig b/configs/clearfog_sata_defconfig
> index e9b36150ea..84f900bf50 100644
> --- a/configs/clearfog_sata_defconfig
> +++ b/configs/clearfog_sata_defconfig
> @@ -6,11 +6,14 @@ CONFIG_TEXT_BASE=0x00800000
>  CONFIG_SPL_LIBCOMMON_SUPPORT=y
>  CONFIG_SPL_LIBGENERIC_SUPPORT=y
>  CONFIG_NR_DRAM_BANKS=2
> +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xff0000
>  CONFIG_TARGET_CLEARFOG=y
>  CONFIG_MVEBU_SPL_BOOT_DEVICE_SATA=y
>  CONFIG_DEFAULT_DEVICE_TREE="armada-388-clearfog"
>  CONFIG_SPL_TEXT_BASE=0x40000030
>  CONFIG_SPL_SERIAL=y
> +CONFIG_SPL_STACK=0x4002c000
>  CONFIG_SPL=y
>  CONFIG_DEBUG_UART_BASE=0xf1012000
>  CONFIG_DEBUG_UART_CLOCK=250000000
> @@ -18,8 +21,6 @@ CONFIG_SYS_LOAD_ADDR=0x800000
>  CONFIG_DEBUG_UART=y
>  CONFIG_AHCI=y
>  CONFIG_DISTRO_DEFAULTS=y
> -CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> -CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xff0000
>  CONFIG_BOOTDELAY=3
>  CONFIG_USE_PREBOOT=y
>  CONFIG_SYS_CONSOLE_INFO_QUIET=y
> @@ -31,7 +32,6 @@ CONFIG_SPL_BSS_START_ADDR=0x40023000
>  CONFIG_SPL_BSS_MAX_SIZE=0x4000
>  CONFIG_SPL_SYS_MALLOC_SIMPLE=y
>  # CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
> -CONFIG_SPL_STACK=0x4002c000
>  CONFIG_SPL_I2C=y
>  CONFIG_SYS_MAXARGS=32
>  CONFIG_CMD_TLV_EEPROM=y
> @@ -46,7 +46,6 @@ CONFIG_CMD_USB=y
>  CONFIG_CMD_TFTPPUT=y
>  CONFIG_CMD_CACHE=y
>  CONFIG_CMD_TIME=y
> -CONFIG_CMD_MVEBU_BUBT=y
>  CONFIG_ENV_OVERWRITE=y
>  CONFIG_ENV_MIN_ENTRIES=128
>  CONFIG_ARP_TIMEOUT=200
> @@ -59,6 +58,7 @@ CONFIG_DM_I2C=y
>  CONFIG_SYS_I2C_MVTWSI=y
>  CONFIG_I2C_EEPROM=y
>  CONFIG_SPL_I2C_EEPROM=y
> +CONFIG_MMC_BROKEN_CD=y
>  CONFIG_SUPPORT_EMMC_BOOT=y
>  CONFIG_MMC_SDHCI=y
>  CONFIG_MMC_SDHCI_SDMA=y
> -- 
> 2.39.2
>
Pali Rohár Feb. 25, 2023, 10:14 p.m. UTC | #2
On Saturday 25 February 2023 22:49:56 Pali Rohár wrote:
> On Saturday 25 February 2023 11:42:19 Martin Rowe wrote:
> > A388 Clearfog MMC is either SD Card or eMMC with different behaviour for
> > both. Setting MMC_BROKEN_CD allows both to correctly detect MMC.
> > 
> > Signed-off-by: Martin Rowe <martin.p.rowe@gmail.com>
> 
> It looks like a hack but I think we do not have a better option for now.
> 
> If I understand the issue correctly then card-detect pin is unconnected
> for eMMC variant and used for checking if SD card is present for SD
> variant. Unconnected pin seems to have some internal pull-up/down which
> reports not-present state for eMMC variant. eMMC does not have any
> presence signal, so card-detect pin must be ignored for eMMC.
> 
> This looks like a chicken and egg problem and the only option to support
> both variants is to ignore card-detect pin and always try to initialize
> device connected to mmc controller (which may be eMMC or SD).

Hm... maybe better way could be to edit armada-388-clearfog-u-boot.dtsi
file and add there this? /delete-property/ cd-gpios;

> I do not know if there is a better option for ignoring card-detect pin
> in u-boot, so:
> 
> Acked-by: Pali Rohár <pali@kernel.org>
> 
> > ---
> >  configs/clearfog_defconfig      | 3 +--
> >  configs/clearfog_sata_defconfig | 8 ++++----
> >  2 files changed, 5 insertions(+), 6 deletions(-)
> > 
> > diff --git a/configs/clearfog_defconfig b/configs/clearfog_defconfig
> > index 8cd35f9f1a..24e7c16ac7 100644
> > --- a/configs/clearfog_defconfig
> > +++ b/configs/clearfog_defconfig
> > @@ -46,7 +46,6 @@ CONFIG_CMD_USB=y
> >  CONFIG_CMD_TFTPPUT=y
> >  CONFIG_CMD_CACHE=y
> >  CONFIG_CMD_TIME=y
> > -CONFIG_CMD_MVEBU_BUBT=y
> >  CONFIG_ENV_OVERWRITE=y
> >  CONFIG_ENV_MIN_ENTRIES=128
> >  CONFIG_ARP_TIMEOUT=200
> > @@ -59,7 +58,7 @@ CONFIG_DM_I2C=y
> >  CONFIG_SYS_I2C_MVTWSI=y
> >  CONFIG_I2C_EEPROM=y
> >  CONFIG_SPL_I2C_EEPROM=y
> > -CONFIG_SUPPORT_EMMC_BOOT=y
> > +CONFIG_MMC_BROKEN_CD=y
> >  CONFIG_MMC_SDHCI=y
> >  CONFIG_MMC_SDHCI_SDMA=y
> >  CONFIG_MMC_SDHCI_MV=y
> > diff --git a/configs/clearfog_sata_defconfig b/configs/clearfog_sata_defconfig
> > index e9b36150ea..84f900bf50 100644
> > --- a/configs/clearfog_sata_defconfig
> > +++ b/configs/clearfog_sata_defconfig
> > @@ -6,11 +6,14 @@ CONFIG_TEXT_BASE=0x00800000
> >  CONFIG_SPL_LIBCOMMON_SUPPORT=y
> >  CONFIG_SPL_LIBGENERIC_SUPPORT=y
> >  CONFIG_NR_DRAM_BANKS=2
> > +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> > +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xff0000
> >  CONFIG_TARGET_CLEARFOG=y
> >  CONFIG_MVEBU_SPL_BOOT_DEVICE_SATA=y
> >  CONFIG_DEFAULT_DEVICE_TREE="armada-388-clearfog"
> >  CONFIG_SPL_TEXT_BASE=0x40000030
> >  CONFIG_SPL_SERIAL=y
> > +CONFIG_SPL_STACK=0x4002c000
> >  CONFIG_SPL=y
> >  CONFIG_DEBUG_UART_BASE=0xf1012000
> >  CONFIG_DEBUG_UART_CLOCK=250000000
> > @@ -18,8 +21,6 @@ CONFIG_SYS_LOAD_ADDR=0x800000
> >  CONFIG_DEBUG_UART=y
> >  CONFIG_AHCI=y
> >  CONFIG_DISTRO_DEFAULTS=y
> > -CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> > -CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xff0000
> >  CONFIG_BOOTDELAY=3
> >  CONFIG_USE_PREBOOT=y
> >  CONFIG_SYS_CONSOLE_INFO_QUIET=y
> > @@ -31,7 +32,6 @@ CONFIG_SPL_BSS_START_ADDR=0x40023000
> >  CONFIG_SPL_BSS_MAX_SIZE=0x4000
> >  CONFIG_SPL_SYS_MALLOC_SIMPLE=y
> >  # CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
> > -CONFIG_SPL_STACK=0x4002c000
> >  CONFIG_SPL_I2C=y
> >  CONFIG_SYS_MAXARGS=32
> >  CONFIG_CMD_TLV_EEPROM=y
> > @@ -46,7 +46,6 @@ CONFIG_CMD_USB=y
> >  CONFIG_CMD_TFTPPUT=y
> >  CONFIG_CMD_CACHE=y
> >  CONFIG_CMD_TIME=y
> > -CONFIG_CMD_MVEBU_BUBT=y
> >  CONFIG_ENV_OVERWRITE=y
> >  CONFIG_ENV_MIN_ENTRIES=128
> >  CONFIG_ARP_TIMEOUT=200
> > @@ -59,6 +58,7 @@ CONFIG_DM_I2C=y
> >  CONFIG_SYS_I2C_MVTWSI=y
> >  CONFIG_I2C_EEPROM=y
> >  CONFIG_SPL_I2C_EEPROM=y
> > +CONFIG_MMC_BROKEN_CD=y
> >  CONFIG_SUPPORT_EMMC_BOOT=y
> >  CONFIG_MMC_SDHCI=y
> >  CONFIG_MMC_SDHCI_SDMA=y
> > -- 
> > 2.39.2
> >
Martin Rowe Feb. 26, 2023, 1:45 a.m. UTC | #3
On Sat, 25 Feb 2023 at 22:14, Pali Rohár <pali@kernel.org> wrote:
> On Saturday 25 February 2023 22:49:56 Pali Rohár wrote:
> > On Saturday 25 February 2023 11:42:19 Martin Rowe wrote:
> > > A388 Clearfog MMC is either SD Card or eMMC with different behaviour for
> > > both. Setting MMC_BROKEN_CD allows both to correctly detect MMC.
> > >
> > > Signed-off-by: Martin Rowe <martin.p.rowe@gmail.com>
> >
> > It looks like a hack but I think we do not have a better option for now.
> >
> > If I understand the issue correctly then card-detect pin is unconnected
> > for eMMC variant and used for checking if SD card is present for SD
> > variant. Unconnected pin seems to have some internal pull-up/down which
> > reports not-present state for eMMC variant. eMMC does not have any
> > presence signal, so card-detect pin must be ignored for eMMC.
> >
> > This looks like a chicken and egg problem and the only option to support
> > both variants is to ignore card-detect pin and always try to initialize
> > device connected to mmc controller (which may be eMMC or SD).
>
> Hm... maybe better way could be to edit armada-388-clearfog-u-boot.dtsi
> file and add there this? /delete-property/ cd-gpios;

I just tried this and the device is not detected again; adding
"non-removable" seems to be required if changing the dts.

> > I do not know if there is a better option for ignoring card-detect pin
> > in u-boot, so:

I should point out that I did investigate runtime detection. Patching
the fdt alone didn't seem to work using the hooks that were available,
so I started looking into how MMC was being initialised to figure out
if there was something changing the state of the device before it was
returned to BootROM. I ended up in drivers/mmc/mmc.c mmc_start_init
trying to figure out how we always end up with the "MMC: no card
present" message in the eMMC case. I was going to write some extra
logic around the mmc_getcd call, but realised there was already an
ifndef with a config that seemed like this exact use-case. Given that
config solved the problem it seemed like the cleanest solution.

> > Acked-by: Pali Rohár <pali@kernel.org>
> >
> > > ---
> > >  configs/clearfog_defconfig      | 3 +--
> > >  configs/clearfog_sata_defconfig | 8 ++++----
> > >  2 files changed, 5 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/configs/clearfog_defconfig b/configs/clearfog_defconfig
> > > index 8cd35f9f1a..24e7c16ac7 100644
> > > --- a/configs/clearfog_defconfig
> > > +++ b/configs/clearfog_defconfig
> > > @@ -46,7 +46,6 @@ CONFIG_CMD_USB=y
> > >  CONFIG_CMD_TFTPPUT=y
> > >  CONFIG_CMD_CACHE=y
> > >  CONFIG_CMD_TIME=y
> > > -CONFIG_CMD_MVEBU_BUBT=y
> > >  CONFIG_ENV_OVERWRITE=y
> > >  CONFIG_ENV_MIN_ENTRIES=128
> > >  CONFIG_ARP_TIMEOUT=200
> > > @@ -59,7 +58,7 @@ CONFIG_DM_I2C=y
> > >  CONFIG_SYS_I2C_MVTWSI=y
> > >  CONFIG_I2C_EEPROM=y
> > >  CONFIG_SPL_I2C_EEPROM=y
> > > -CONFIG_SUPPORT_EMMC_BOOT=y
> > > +CONFIG_MMC_BROKEN_CD=y
> > >  CONFIG_MMC_SDHCI=y
> > >  CONFIG_MMC_SDHCI_SDMA=y
> > >  CONFIG_MMC_SDHCI_MV=y
> > > diff --git a/configs/clearfog_sata_defconfig b/configs/clearfog_sata_defconfig
> > > index e9b36150ea..84f900bf50 100644
> > > --- a/configs/clearfog_sata_defconfig
> > > +++ b/configs/clearfog_sata_defconfig
> > > @@ -6,11 +6,14 @@ CONFIG_TEXT_BASE=0x00800000
> > >  CONFIG_SPL_LIBCOMMON_SUPPORT=y
> > >  CONFIG_SPL_LIBGENERIC_SUPPORT=y
> > >  CONFIG_NR_DRAM_BANKS=2
> > > +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> > > +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xff0000
> > >  CONFIG_TARGET_CLEARFOG=y
> > >  CONFIG_MVEBU_SPL_BOOT_DEVICE_SATA=y
> > >  CONFIG_DEFAULT_DEVICE_TREE="armada-388-clearfog"
> > >  CONFIG_SPL_TEXT_BASE=0x40000030
> > >  CONFIG_SPL_SERIAL=y
> > > +CONFIG_SPL_STACK=0x4002c000
> > >  CONFIG_SPL=y
> > >  CONFIG_DEBUG_UART_BASE=0xf1012000
> > >  CONFIG_DEBUG_UART_CLOCK=250000000
> > > @@ -18,8 +21,6 @@ CONFIG_SYS_LOAD_ADDR=0x800000
> > >  CONFIG_DEBUG_UART=y
> > >  CONFIG_AHCI=y
> > >  CONFIG_DISTRO_DEFAULTS=y
> > > -CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> > > -CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xff0000
> > >  CONFIG_BOOTDELAY=3
> > >  CONFIG_USE_PREBOOT=y
> > >  CONFIG_SYS_CONSOLE_INFO_QUIET=y
> > > @@ -31,7 +32,6 @@ CONFIG_SPL_BSS_START_ADDR=0x40023000
> > >  CONFIG_SPL_BSS_MAX_SIZE=0x4000
> > >  CONFIG_SPL_SYS_MALLOC_SIMPLE=y
> > >  # CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
> > > -CONFIG_SPL_STACK=0x4002c000
> > >  CONFIG_SPL_I2C=y
> > >  CONFIG_SYS_MAXARGS=32
> > >  CONFIG_CMD_TLV_EEPROM=y
> > > @@ -46,7 +46,6 @@ CONFIG_CMD_USB=y
> > >  CONFIG_CMD_TFTPPUT=y
> > >  CONFIG_CMD_CACHE=y
> > >  CONFIG_CMD_TIME=y
> > > -CONFIG_CMD_MVEBU_BUBT=y
> > >  CONFIG_ENV_OVERWRITE=y
> > >  CONFIG_ENV_MIN_ENTRIES=128
> > >  CONFIG_ARP_TIMEOUT=200
> > > @@ -59,6 +58,7 @@ CONFIG_DM_I2C=y
> > >  CONFIG_SYS_I2C_MVTWSI=y
> > >  CONFIG_I2C_EEPROM=y
> > >  CONFIG_SPL_I2C_EEPROM=y
> > > +CONFIG_MMC_BROKEN_CD=y
> > >  CONFIG_SUPPORT_EMMC_BOOT=y
> > >  CONFIG_MMC_SDHCI=y
> > >  CONFIG_MMC_SDHCI_SDMA=y
> > > --
> > > 2.39.2
> > >
Pali Rohár Feb. 26, 2023, 11:18 a.m. UTC | #4
On Sunday 26 February 2023 01:45:16 Martin Rowe wrote:
> On Sat, 25 Feb 2023 at 22:14, Pali Rohár <pali@kernel.org> wrote:
> > On Saturday 25 February 2023 22:49:56 Pali Rohár wrote:
> > > On Saturday 25 February 2023 11:42:19 Martin Rowe wrote:
> > > > A388 Clearfog MMC is either SD Card or eMMC with different behaviour for
> > > > both. Setting MMC_BROKEN_CD allows both to correctly detect MMC.
> > > >
> > > > Signed-off-by: Martin Rowe <martin.p.rowe@gmail.com>
> > >
> > > It looks like a hack but I think we do not have a better option for now.
> > >
> > > If I understand the issue correctly then card-detect pin is unconnected
> > > for eMMC variant and used for checking if SD card is present for SD
> > > variant. Unconnected pin seems to have some internal pull-up/down which
> > > reports not-present state for eMMC variant. eMMC does not have any
> > > presence signal, so card-detect pin must be ignored for eMMC.
> > >
> > > This looks like a chicken and egg problem and the only option to support
> > > both variants is to ignore card-detect pin and always try to initialize
> > > device connected to mmc controller (which may be eMMC or SD).
> >
> > Hm... maybe better way could be to edit armada-388-clearfog-u-boot.dtsi
> > file and add there this? /delete-property/ cd-gpios;
> 
> I just tried this and the device is not detected again; adding
> "non-removable" seems to be required if changing the dts.
> 
> > > I do not know if there is a better option for ignoring card-detect pin
> > > in u-boot, so:
> 
> I should point out that I did investigate runtime detection.

But how you want to do that runtime detection? As I pointed above I
think it is impossible do runtime detection because it is chicken and
egg problem.

You can patch fdt only after u-boot initialize mmc, so this can be used
just for patching kernel fdt.

> Patching
> the fdt alone didn't seem to work using the hooks that were available,
> so I started looking into how MMC was being initialised to figure out
> if there was something changing the state of the device before it was
> returned to BootROM. I ended up in drivers/mmc/mmc.c mmc_start_init
> trying to figure out how we always end up with the "MMC: no card
> present" message in the eMMC case. I was going to write some extra
> logic around the mmc_getcd call, but realised there was already an
> ifndef with a config that seemed like this exact use-case. Given that
> config solved the problem it seemed like the cleanest solution.
> 
> > > Acked-by: Pali Rohár <pali@kernel.org>
> > >
> > > > ---
> > > >  configs/clearfog_defconfig      | 3 +--
> > > >  configs/clearfog_sata_defconfig | 8 ++++----
> > > >  2 files changed, 5 insertions(+), 6 deletions(-)
> > > >
> > > > diff --git a/configs/clearfog_defconfig b/configs/clearfog_defconfig
> > > > index 8cd35f9f1a..24e7c16ac7 100644
> > > > --- a/configs/clearfog_defconfig
> > > > +++ b/configs/clearfog_defconfig
> > > > @@ -46,7 +46,6 @@ CONFIG_CMD_USB=y
> > > >  CONFIG_CMD_TFTPPUT=y
> > > >  CONFIG_CMD_CACHE=y
> > > >  CONFIG_CMD_TIME=y
> > > > -CONFIG_CMD_MVEBU_BUBT=y
> > > >  CONFIG_ENV_OVERWRITE=y
> > > >  CONFIG_ENV_MIN_ENTRIES=128
> > > >  CONFIG_ARP_TIMEOUT=200
> > > > @@ -59,7 +58,7 @@ CONFIG_DM_I2C=y
> > > >  CONFIG_SYS_I2C_MVTWSI=y
> > > >  CONFIG_I2C_EEPROM=y
> > > >  CONFIG_SPL_I2C_EEPROM=y
> > > > -CONFIG_SUPPORT_EMMC_BOOT=y
> > > > +CONFIG_MMC_BROKEN_CD=y
> > > >  CONFIG_MMC_SDHCI=y
> > > >  CONFIG_MMC_SDHCI_SDMA=y
> > > >  CONFIG_MMC_SDHCI_MV=y
> > > > diff --git a/configs/clearfog_sata_defconfig b/configs/clearfog_sata_defconfig
> > > > index e9b36150ea..84f900bf50 100644
> > > > --- a/configs/clearfog_sata_defconfig
> > > > +++ b/configs/clearfog_sata_defconfig
> > > > @@ -6,11 +6,14 @@ CONFIG_TEXT_BASE=0x00800000
> > > >  CONFIG_SPL_LIBCOMMON_SUPPORT=y
> > > >  CONFIG_SPL_LIBGENERIC_SUPPORT=y
> > > >  CONFIG_NR_DRAM_BANKS=2
> > > > +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> > > > +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xff0000
> > > >  CONFIG_TARGET_CLEARFOG=y
> > > >  CONFIG_MVEBU_SPL_BOOT_DEVICE_SATA=y
> > > >  CONFIG_DEFAULT_DEVICE_TREE="armada-388-clearfog"
> > > >  CONFIG_SPL_TEXT_BASE=0x40000030
> > > >  CONFIG_SPL_SERIAL=y
> > > > +CONFIG_SPL_STACK=0x4002c000
> > > >  CONFIG_SPL=y
> > > >  CONFIG_DEBUG_UART_BASE=0xf1012000
> > > >  CONFIG_DEBUG_UART_CLOCK=250000000
> > > > @@ -18,8 +21,6 @@ CONFIG_SYS_LOAD_ADDR=0x800000
> > > >  CONFIG_DEBUG_UART=y
> > > >  CONFIG_AHCI=y
> > > >  CONFIG_DISTRO_DEFAULTS=y
> > > > -CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> > > > -CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xff0000
> > > >  CONFIG_BOOTDELAY=3
> > > >  CONFIG_USE_PREBOOT=y
> > > >  CONFIG_SYS_CONSOLE_INFO_QUIET=y
> > > > @@ -31,7 +32,6 @@ CONFIG_SPL_BSS_START_ADDR=0x40023000
> > > >  CONFIG_SPL_BSS_MAX_SIZE=0x4000
> > > >  CONFIG_SPL_SYS_MALLOC_SIMPLE=y
> > > >  # CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
> > > > -CONFIG_SPL_STACK=0x4002c000
> > > >  CONFIG_SPL_I2C=y
> > > >  CONFIG_SYS_MAXARGS=32
> > > >  CONFIG_CMD_TLV_EEPROM=y
> > > > @@ -46,7 +46,6 @@ CONFIG_CMD_USB=y
> > > >  CONFIG_CMD_TFTPPUT=y
> > > >  CONFIG_CMD_CACHE=y
> > > >  CONFIG_CMD_TIME=y
> > > > -CONFIG_CMD_MVEBU_BUBT=y
> > > >  CONFIG_ENV_OVERWRITE=y
> > > >  CONFIG_ENV_MIN_ENTRIES=128
> > > >  CONFIG_ARP_TIMEOUT=200
> > > > @@ -59,6 +58,7 @@ CONFIG_DM_I2C=y
> > > >  CONFIG_SYS_I2C_MVTWSI=y
> > > >  CONFIG_I2C_EEPROM=y
> > > >  CONFIG_SPL_I2C_EEPROM=y
> > > > +CONFIG_MMC_BROKEN_CD=y
> > > >  CONFIG_SUPPORT_EMMC_BOOT=y
> > > >  CONFIG_MMC_SDHCI=y
> > > >  CONFIG_MMC_SDHCI_SDMA=y
> > > > --
> > > > 2.39.2
> > > >
Martin Rowe Feb. 26, 2023, 11:28 a.m. UTC | #5
On Sun, 26 Feb 2023 at 11:18, Pali Rohár <pali@kernel.org> wrote:

> On Sunday 26 February 2023 01:45:16 Martin Rowe wrote:
> > On Sat, 25 Feb 2023 at 22:14, Pali Rohár <pali@kernel.org> wrote:
> > > On Saturday 25 February 2023 22:49:56 Pali Rohár wrote:
> > > > On Saturday 25 February 2023 11:42:19 Martin Rowe wrote:
> > > > > A388 Clearfog MMC is either SD Card or eMMC with different
> behaviour for
> > > > > both. Setting MMC_BROKEN_CD allows both to correctly detect MMC.
> > > > >
> > > > > Signed-off-by: Martin Rowe <martin.p.rowe@gmail.com>
> > > >
> > > > It looks like a hack but I think we do not have a better option for
> now.
> > > >
> > > > If I understand the issue correctly then card-detect pin is
> unconnected
> > > > for eMMC variant and used for checking if SD card is present for SD
> > > > variant. Unconnected pin seems to have some internal pull-up/down
> which
> > > > reports not-present state for eMMC variant. eMMC does not have any
> > > > presence signal, so card-detect pin must be ignored for eMMC.
> > > >
> > > > This looks like a chicken and egg problem and the only option to
> support
> > > > both variants is to ignore card-detect pin and always try to
> initialize
> > > > device connected to mmc controller (which may be eMMC or SD).
> > >
> > > Hm... maybe better way could be to edit armada-388-clearfog-u-boot.dtsi
> > > file and add there this? /delete-property/ cd-gpios;
> >
> > I just tried this and the device is not detected again; adding
> > "non-removable" seems to be required if changing the dts.
> >
> > > > I do not know if there is a better option for ignoring card-detect
> pin
> > > > in u-boot, so:
> >
> > I should point out that I did investigate runtime detection.
>
> But how you want to do that runtime detection? As I pointed above I
> think it is impossible do runtime detection because it is chicken and
> egg problem.
>
> You can patch fdt only after u-boot initialize mmc, so this can be used
> just for patching kernel fdt.
>

I was just trying to address your concerns about the solution looking like
a "hack". I did investigate it, and that work confirmed the issues you
expected, so that's confirmation that there isn't a better option. I think
we're saying the same thing :)

I'll look at runtime patching the kernel fdt, but it might not be as quick
a turn around as the defconfig work. If anyone looks at it before me, the
fdt memory allocation needs to be increased by 2 to fit "non-removable" in
the space left by removing the "cd-gpios".

> Patching
> > the fdt alone didn't seem to work using the hooks that were available,
> > so I started looking into how MMC was being initialised to figure out
> > if there was something changing the state of the device before it was
> > returned to BootROM. I ended up in drivers/mmc/mmc.c mmc_start_init
> > trying to figure out how we always end up with the "MMC: no card
> > present" message in the eMMC case. I was going to write some extra
> > logic around the mmc_getcd call, but realised there was already an
> > ifndef with a config that seemed like this exact use-case. Given that
> > config solved the problem it seemed like the cleanest solution.
> >
> > > > Acked-by: Pali Rohár <pali@kernel.org>
> > > >
> > > > > ---
> > > > >  configs/clearfog_defconfig      | 3 +--
> > > > >  configs/clearfog_sata_defconfig | 8 ++++----
> > > > >  2 files changed, 5 insertions(+), 6 deletions(-)
> > > > >
> > > > > diff --git a/configs/clearfog_defconfig
> b/configs/clearfog_defconfig
> > > > > index 8cd35f9f1a..24e7c16ac7 100644
> > > > > --- a/configs/clearfog_defconfig
> > > > > +++ b/configs/clearfog_defconfig
> > > > > @@ -46,7 +46,6 @@ CONFIG_CMD_USB=y
> > > > >  CONFIG_CMD_TFTPPUT=y
> > > > >  CONFIG_CMD_CACHE=y
> > > > >  CONFIG_CMD_TIME=y
> > > > > -CONFIG_CMD_MVEBU_BUBT=y
> > > > >  CONFIG_ENV_OVERWRITE=y
> > > > >  CONFIG_ENV_MIN_ENTRIES=128
> > > > >  CONFIG_ARP_TIMEOUT=200
> > > > > @@ -59,7 +58,7 @@ CONFIG_DM_I2C=y
> > > > >  CONFIG_SYS_I2C_MVTWSI=y
> > > > >  CONFIG_I2C_EEPROM=y
> > > > >  CONFIG_SPL_I2C_EEPROM=y
> > > > > -CONFIG_SUPPORT_EMMC_BOOT=y
> > > > > +CONFIG_MMC_BROKEN_CD=y
> > > > >  CONFIG_MMC_SDHCI=y
> > > > >  CONFIG_MMC_SDHCI_SDMA=y
> > > > >  CONFIG_MMC_SDHCI_MV=y
> > > > > diff --git a/configs/clearfog_sata_defconfig
> b/configs/clearfog_sata_defconfig
> > > > > index e9b36150ea..84f900bf50 100644
> > > > > --- a/configs/clearfog_sata_defconfig
> > > > > +++ b/configs/clearfog_sata_defconfig
> > > > > @@ -6,11 +6,14 @@ CONFIG_TEXT_BASE=0x00800000
> > > > >  CONFIG_SPL_LIBCOMMON_SUPPORT=y
> > > > >  CONFIG_SPL_LIBGENERIC_SUPPORT=y
> > > > >  CONFIG_NR_DRAM_BANKS=2
> > > > > +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> > > > > +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xff0000
> > > > >  CONFIG_TARGET_CLEARFOG=y
> > > > >  CONFIG_MVEBU_SPL_BOOT_DEVICE_SATA=y
> > > > >  CONFIG_DEFAULT_DEVICE_TREE="armada-388-clearfog"
> > > > >  CONFIG_SPL_TEXT_BASE=0x40000030
> > > > >  CONFIG_SPL_SERIAL=y
> > > > > +CONFIG_SPL_STACK=0x4002c000
> > > > >  CONFIG_SPL=y
> > > > >  CONFIG_DEBUG_UART_BASE=0xf1012000
> > > > >  CONFIG_DEBUG_UART_CLOCK=250000000
> > > > > @@ -18,8 +21,6 @@ CONFIG_SYS_LOAD_ADDR=0x800000
> > > > >  CONFIG_DEBUG_UART=y
> > > > >  CONFIG_AHCI=y
> > > > >  CONFIG_DISTRO_DEFAULTS=y
> > > > > -CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> > > > > -CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xff0000
> > > > >  CONFIG_BOOTDELAY=3
> > > > >  CONFIG_USE_PREBOOT=y
> > > > >  CONFIG_SYS_CONSOLE_INFO_QUIET=y
> > > > > @@ -31,7 +32,6 @@ CONFIG_SPL_BSS_START_ADDR=0x40023000
> > > > >  CONFIG_SPL_BSS_MAX_SIZE=0x4000
> > > > >  CONFIG_SPL_SYS_MALLOC_SIMPLE=y
> > > > >  # CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
> > > > > -CONFIG_SPL_STACK=0x4002c000
> > > > >  CONFIG_SPL_I2C=y
> > > > >  CONFIG_SYS_MAXARGS=32
> > > > >  CONFIG_CMD_TLV_EEPROM=y
> > > > > @@ -46,7 +46,6 @@ CONFIG_CMD_USB=y
> > > > >  CONFIG_CMD_TFTPPUT=y
> > > > >  CONFIG_CMD_CACHE=y
> > > > >  CONFIG_CMD_TIME=y
> > > > > -CONFIG_CMD_MVEBU_BUBT=y
> > > > >  CONFIG_ENV_OVERWRITE=y
> > > > >  CONFIG_ENV_MIN_ENTRIES=128
> > > > >  CONFIG_ARP_TIMEOUT=200
> > > > > @@ -59,6 +58,7 @@ CONFIG_DM_I2C=y
> > > > >  CONFIG_SYS_I2C_MVTWSI=y
> > > > >  CONFIG_I2C_EEPROM=y
> > > > >  CONFIG_SPL_I2C_EEPROM=y
> > > > > +CONFIG_MMC_BROKEN_CD=y
> > > > >  CONFIG_SUPPORT_EMMC_BOOT=y
> > > > >  CONFIG_MMC_SDHCI=y
> > > > >  CONFIG_MMC_SDHCI_SDMA=y
> > > > > --
> > > > > 2.39.2
> > > > >
>
diff mbox series

Patch

diff --git a/configs/clearfog_defconfig b/configs/clearfog_defconfig
index 8cd35f9f1a..24e7c16ac7 100644
--- a/configs/clearfog_defconfig
+++ b/configs/clearfog_defconfig
@@ -46,7 +46,6 @@  CONFIG_CMD_USB=y
 CONFIG_CMD_TFTPPUT=y
 CONFIG_CMD_CACHE=y
 CONFIG_CMD_TIME=y
-CONFIG_CMD_MVEBU_BUBT=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_MIN_ENTRIES=128
 CONFIG_ARP_TIMEOUT=200
@@ -59,7 +58,7 @@  CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_MVTWSI=y
 CONFIG_I2C_EEPROM=y
 CONFIG_SPL_I2C_EEPROM=y
-CONFIG_SUPPORT_EMMC_BOOT=y
+CONFIG_MMC_BROKEN_CD=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_SDMA=y
 CONFIG_MMC_SDHCI_MV=y
diff --git a/configs/clearfog_sata_defconfig b/configs/clearfog_sata_defconfig
index e9b36150ea..84f900bf50 100644
--- a/configs/clearfog_sata_defconfig
+++ b/configs/clearfog_sata_defconfig
@@ -6,11 +6,14 @@  CONFIG_TEXT_BASE=0x00800000
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_NR_DRAM_BANKS=2
+CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
+CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xff0000
 CONFIG_TARGET_CLEARFOG=y
 CONFIG_MVEBU_SPL_BOOT_DEVICE_SATA=y
 CONFIG_DEFAULT_DEVICE_TREE="armada-388-clearfog"
 CONFIG_SPL_TEXT_BASE=0x40000030
 CONFIG_SPL_SERIAL=y
+CONFIG_SPL_STACK=0x4002c000
 CONFIG_SPL=y
 CONFIG_DEBUG_UART_BASE=0xf1012000
 CONFIG_DEBUG_UART_CLOCK=250000000
@@ -18,8 +21,6 @@  CONFIG_SYS_LOAD_ADDR=0x800000
 CONFIG_DEBUG_UART=y
 CONFIG_AHCI=y
 CONFIG_DISTRO_DEFAULTS=y
-CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
-CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xff0000
 CONFIG_BOOTDELAY=3
 CONFIG_USE_PREBOOT=y
 CONFIG_SYS_CONSOLE_INFO_QUIET=y
@@ -31,7 +32,6 @@  CONFIG_SPL_BSS_START_ADDR=0x40023000
 CONFIG_SPL_BSS_MAX_SIZE=0x4000
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
 # CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
-CONFIG_SPL_STACK=0x4002c000
 CONFIG_SPL_I2C=y
 CONFIG_SYS_MAXARGS=32
 CONFIG_CMD_TLV_EEPROM=y
@@ -46,7 +46,6 @@  CONFIG_CMD_USB=y
 CONFIG_CMD_TFTPPUT=y
 CONFIG_CMD_CACHE=y
 CONFIG_CMD_TIME=y
-CONFIG_CMD_MVEBU_BUBT=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_MIN_ENTRIES=128
 CONFIG_ARP_TIMEOUT=200
@@ -59,6 +58,7 @@  CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_MVTWSI=y
 CONFIG_I2C_EEPROM=y
 CONFIG_SPL_I2C_EEPROM=y
+CONFIG_MMC_BROKEN_CD=y
 CONFIG_SUPPORT_EMMC_BOOT=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_SDMA=y