Re: [PATCH 1/1] [u-boot][master][PATCH v5] pico-imx7d: add baseboard SD card boot detect

2023-10-26 Thread Fabio Estevam
On Sat, Oct 21, 2023 at 9:40 AM  wrote:
>
> From: Benjamin Szőke 
>
> Technexion PICO-IMX7 SoM is supporting USDHC3 (eMMC or micro SD on SoM)
> and USDHC1 (SD on carrier board) to use on any carrier board like
> PICO-NYMPH. This pacth is intend to take over codes from Technexion

Typo in "pacth is intend".

You can simply say: "Based on the U-Boot version from Technexion."


Re: [PATCH 1/1] [u-boot][master][PATCH v5] pico-imx7d: add baseboard SD card boot detect

2023-10-26 Thread Fabio Estevam
On Sat, Oct 21, 2023 at 9:40 AM  wrote:
>
> From: Benjamin Szőke 
>
> Technexion PICO-IMX7 SoM is supporting USDHC3 (eMMC or micro SD on SoM)
> and USDHC1 (SD on carrier board) to use on any carrier board like
> PICO-NYMPH. This pacth is intend to take over codes from Technexion
> to support mmc autodetect boot for pico-imx7d to able to boot from
> selected USDHC1 or USDHC3 boot devices.
>
> Signed-off-by: Benjamin Szőke 
> ---

Please always provide a changelog.

>  board/technexion/pico-imx7d/pico-imx7d.c | 59 ++-
>  board/technexion/pico-imx7d/spl.c| 91 ++--
>  include/configs/pico-imx7d.h |  4 +-
>  3 files changed, 145 insertions(+), 9 deletions(-)
>
> diff --git a/board/technexion/pico-imx7d/pico-imx7d.c 
> b/board/technexion/pico-imx7d/pico-imx7d.c
> index 6e98b85b28..01a9520d32 100644
> --- a/board/technexion/pico-imx7d/pico-imx7d.c
> +++ b/board/technexion/pico-imx7d/pico-imx7d.c
> @@ -5,6 +5,7 @@
>
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  #include 
> @@ -13,6 +14,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  #include 
> @@ -106,7 +108,7 @@ int board_phy_config(struct phy_device *phydev)
>  {
> unsigned short val;
>
> -   /* To enable AR8035 ouput a 125MHz clk from CLK_25M */
> +   /* To enable AR8035 output a 125MHz clk from CLK_25M */

This is an unrelated change.

> phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
> phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
> phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
> @@ -129,6 +131,49 @@ int board_phy_config(struct phy_device *phydev)
>  }
>  #endif
>
> +#if CONFIG_IS_ENABLED(FSL_ESDHC_IMX)
> +int check_mmc_autodetect(void)
> +{
> +   char *autodetect_str = env_get("mmcautodetect");
> +
> +   if ((autodetect_str) &&
> +   (strcmp(autodetect_str, "yes") == 0)) {
> +   return 1;
> +   }

No need for { to enclose a single line statement. Please remove it.


> +
> +   return 0;
> +}
> +
> +void board_late_mmc_init(void)
> +{
> +   int dev_no = 0;
> +   char cmd[32];
> +
> +   if (!check_mmc_autodetect())
> +   return;
> +
> +   switch (get_boot_device()) {
> +   case SD3_BOOT:
> +   case MMC3_BOOT:
> +   env_set("bootdev", "MMC3");
> +   dev_no = 2;
> +   break;
> +   case SD1_BOOT:
> +   env_set("bootdev", "SD1");
> +   dev_no = 0;
> +   break;

These dev_no assignments are not correct.

imx7d-pico-pi-u-boot.dtsi defines aliases for the eMMC:

aliases {
mmc0 = 

So to avoid errors, I had to apply the following change on top o your patch:

--- a/board/technexion/pico-imx7d/pico-imx7d.c
+++ b/board/technexion/pico-imx7d/pico-imx7d.c
@@ -156,11 +156,11 @@ void board_late_mmc_init(void)
case SD3_BOOT:
case MMC3_BOOT:
env_set("bootdev", "MMC3");
-   dev_no = 2;
+   dev_no = 0;
break;
case SD1_BOOT:
env_set("bootdev", "SD1");
-   dev_no = 0;
+   dev_no = 1;
break;
default:
printf("Wrong boot device!");

> @@ -13,7 +13,7 @@
>  #define CFG_MXC_UART_BASE  UART5_IPS_BASE_ADDR
>
>  /* MMC Config */
> -#define CFG_SYS_FSL_ESDHC_ADDR 0
> +#define CFG_SYS_FSL_ESDHC_ADDR USDHC3_BASE_ADDR

Is this change needed?

>  #define CFG_DFU_ENV_SETTINGS \
> "dfu_alt_info=" \
> @@ -79,9 +79,11 @@
> "name=rootfs,size=0,uuid=${uuid_gpt_rootfs}\0" \
> "fastboot_partition_alias_system=rootfs\0" \
> "setup_emmc=mmc dev 0; gpt write mmc 0 $partitions; reset;\0" \
> +   "mmcautodetect=yes\0" \
> PICO_BOOT_ENV
>
>  #define BOOT_TARGET_DEVICES(func) \
> +   func(MMC, mmc, 2) \

This should be func(MMC, mmc, 1)

Please define aliases if needed.


[PATCH 1/1] [u-boot][master][PATCH v5] pico-imx7d: add baseboard SD card boot detect

2023-10-21 Thread egyszeregy
From: Benjamin Szőke 

Technexion PICO-IMX7 SoM is supporting USDHC3 (eMMC or micro SD on SoM)
and USDHC1 (SD on carrier board) to use on any carrier board like
PICO-NYMPH. This pacth is intend to take over codes from Technexion
to support mmc autodetect boot for pico-imx7d to able to boot from
selected USDHC1 or USDHC3 boot devices.

Signed-off-by: Benjamin Szőke 
---
 board/technexion/pico-imx7d/pico-imx7d.c | 59 ++-
 board/technexion/pico-imx7d/spl.c| 91 ++--
 include/configs/pico-imx7d.h |  4 +-
 3 files changed, 145 insertions(+), 9 deletions(-)

diff --git a/board/technexion/pico-imx7d/pico-imx7d.c 
b/board/technexion/pico-imx7d/pico-imx7d.c
index 6e98b85b28..01a9520d32 100644
--- a/board/technexion/pico-imx7d/pico-imx7d.c
+++ b/board/technexion/pico-imx7d/pico-imx7d.c
@@ -5,6 +5,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -13,6 +14,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -106,7 +108,7 @@ int board_phy_config(struct phy_device *phydev)
 {
unsigned short val;
 
-   /* To enable AR8035 ouput a 125MHz clk from CLK_25M */
+   /* To enable AR8035 output a 125MHz clk from CLK_25M */
phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
@@ -129,6 +131,49 @@ int board_phy_config(struct phy_device *phydev)
 }
 #endif
 
+#if CONFIG_IS_ENABLED(FSL_ESDHC_IMX)
+int check_mmc_autodetect(void)
+{
+   char *autodetect_str = env_get("mmcautodetect");
+
+   if ((autodetect_str) &&
+   (strcmp(autodetect_str, "yes") == 0)) {
+   return 1;
+   }
+
+   return 0;
+}
+
+void board_late_mmc_init(void)
+{
+   int dev_no = 0;
+   char cmd[32];
+
+   if (!check_mmc_autodetect())
+   return;
+
+   switch (get_boot_device()) {
+   case SD3_BOOT:
+   case MMC3_BOOT:
+   env_set("bootdev", "MMC3");
+   dev_no = 2;
+   break;
+   case SD1_BOOT:
+   env_set("bootdev", "SD1");
+   dev_no = 0;
+   break;
+   default:
+   printf("Wrong boot device!");
+   }
+
+   /* Set mmcdev env */
+   env_set_ulong("mmcdev", dev_no);
+
+   sprintf(cmd, "mmc dev %d", dev_no);
+   run_command(cmd, 0);
+}
+#endif
+
 static void setup_iomux_uart(void)
 {
imx_iomux_v3_setup_multiple_pads(uart5_pads, ARRAY_SIZE(uart5_pads));
@@ -176,6 +221,12 @@ int board_late_init(void)
 
set_wdog_reset(wdog);
 
+#if CONFIG_IS_ENABLED(FSL_ESDHC_IMX)
+#if defined(CONFIG_ENV_IS_IN_MMC) || defined(CONFIG_ENV_IS_NOWHERE)
+   board_late_mmc_init();
+#endif /* CONFIG_ENV_IS_IN_MMC or CONFIG_ENV_IS_NOWHERE */
+#endif
+
/*
 * Do not assert internal WDOG_RESET_B_DEB(controlled by bit 4),
 * since we use PMIC_PWRON to reset the board.
@@ -210,3 +261,9 @@ int board_ehci_hcd_init(int port)
}
return 0;
 }
+
+/* This should be defined for each board */
+__weak int mmc_map_to_kernel_blk(int dev_no)
+{
+   return dev_no;
+}
diff --git a/board/technexion/pico-imx7d/spl.c 
b/board/technexion/pico-imx7d/spl.c
index c6b21aaa42..0192eafbaa 100644
--- a/board/technexion/pico-imx7d/spl.c
+++ b/board/technexion/pico-imx7d/spl.c
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -159,7 +160,20 @@ void reset_cpu(void)
 #define USDHC_PAD_CTRL (PAD_CTL_DSE_3P3V_32OHM | PAD_CTL_SRE_SLOW | \
PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PUS_PU47KOHM)
 
-static iomux_v3_cfg_t const usdhc3_pads[] = {
+#define USDHC1_CD_GPIO IMX_GPIO_NR(5, 0)
+/* EMMC/SD */
+static const iomux_v3_cfg_t usdhc1_pads[] = {
+   MX7D_PAD_SD1_CLK__SD1_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+   MX7D_PAD_SD1_CMD__SD1_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+   MX7D_PAD_SD1_DATA0__SD1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+   MX7D_PAD_SD1_DATA1__SD1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+   MX7D_PAD_SD1_DATA2__SD1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+   MX7D_PAD_SD1_DATA3__SD1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+   MX7D_PAD_SD1_CD_B__GPIO5_IO0  | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+};
+
+#define USDHC3_CD_GPIO IMX_GPIO_NR(1, 14)
+static const iomux_v3_cfg_t usdhc3_emmc_pads[] = {
MX7D_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_DATA0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
@@ -173,20 +187,83 @@ static iomux_v3_cfg_t const usdhc3_pads[] = {
MX7D_PAD_GPIO1_IO14__GPIO1_IO14 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
 };
 
-static struct fsl_esdhc_cfg usdhc_cfg[1] = {
+static struct fsl_esdhc_cfg usdhc_cfg[2] = {
{USDHC3_BASE_ADDR},
+   {USDHC1_BASE_ADDR},
 };
 
 int board_mmc_getcd(struct mmc *mmc)
 {
-   /* Assume uSDHC3 emmc is always present */
-   

Re: [PATCH 1/1] [u-boot][master][PATCH v5] pico-imx7d: add baseboard SD card boot detect

2023-10-07 Thread Fabio Estevam
On Fri, Oct 6, 2023 at 6:37 PM  wrote:
>
> From: Benjamin Szőke 
>
> Take over codes from Techenxion to support

Typo in Technexion.

> mmc autodetect boot for pico-imx7d.

Please explain better in the commit log that you are adding support
for the SD card in variants like the nymph baseboard.

>  int board_mmc_getcd(struct mmc *mmc)
>  {
> -   /* Assume uSDHC3 emmc is always present */
> -   return 1;
> +   struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
> +   int ret = 0;
> +
> +   switch (cfg->esdhc_base) {
> +   case USDHC1_BASE_ADDR:
> +   ret = !gpio_get_value(USDHC1_CD_GPIO); /* Assume uSDHC1 sd is 
> always present */

Remove the comment as this is no longer true. You are reading a GPIO
to decide that.

> +   break;
> +   case USDHC3_BASE_ADDR:
> +   ret = !gpio_get_value(USDHC3_CD_GPIO); /* Assume uSDHC3 emmc 
> is always present */

Remove the comment as this is no longer true. You are reading a GPIO
to decide that.

>  int board_mmc_init(struct bd_info *bis)
>  {
> -   imx_iomux_v3_setup_multiple_pads(usdhc3_pads, 
> ARRAY_SIZE(usdhc3_pads));
> -   usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
> -   return fsl_esdhc_initialize(bis, _cfg[0]);
> +   int ret;
> +   u32 index = 0;

No need to initialize 'index' with 0.

I tested it here on an imx7d-pico-pi. Prior to your patch, I got:

U-Boot 2023.10-00559-g931b7c36604b (Oct 07 2023 - 09:17:25 -0300)

CPU:   Freescale i.MX7D rev1.2 1000 MHz (running at 792 MHz)
CPU:   Commercial temperature grade (0C to 95C) at 55C
Reset cause: POR
Model: TechNexion PICO-IMX7D Board and PI baseboard
Board: i.MX7D PICOSOM
DRAM:  512 MiB
Core:  75 devices, 16 uclasses, devicetree: separate
PMIC: PFUZE3000 DEV_ID=0x30 REV_ID=0x11
MMC:   FSL_SDHC: 3, FSL_SDHC: 1, FSL_SDHC: 0
Loading Environment from MMC... OK
In:serial@30a7
Out:   serial
Err:   serial
Net:   eth0: ethernet@30be
Hit any key to stop autoboot:  0

After your patch:

U-Boot 2023.10-00560-g9bf37c401a1d-dirty (Oct 07 2023 - 09:23:54 -0300)

CPU:   Freescale i.MX7D rev1.2 1000 MHz (running at 792 MHz)
CPU:   Commercial temperature grade (0C to 95C) at 54C
Reset cause: POR
Model: TechNexion PICO-IMX7D Board and PI baseboard
Board: i.MX7D PICOSOM
DRAM:  512 MiB
Core:  72 devices, 16 uclasses, devicetree: separate
PMIC: PFUZE3000 DEV_ID=0x30 REV_ID=0x11
MMC:   FSL_SDHC: 1, FSL_SDHC: 0
Loading Environment from MMC... OK
In:serial@30a7
Out:   serial
Err:   serial
MMC Device 2 not found
no mmc device at slot 2
Net:   eth0: ethernet@30be

The messages:

MMC Device 2 not found
no mmc device at slot 2

are a bit annoying as there is no SD card in the imx7d-pico-pi.

I would prefer if these messages were not shown.

Can you try to get rid of it on the  imx7d-pico-pi?

Tested-by: Fabio Estevam 


[PATCH 1/1] [u-boot][master][PATCH v5] pico-imx7d: add baseboard SD card boot detect

2023-10-06 Thread egyszeregy
From: Benjamin Szőke 

Take over codes from Techenxion to support
mmc autodetect boot for pico-imx7d.

Signed-off-by: Benjamin Szőke 
---
 board/technexion/pico-imx7d/pico-imx7d.c | 57 +++
 board/technexion/pico-imx7d/spl.c| 91 ++--
 include/configs/pico-imx7d.h |  4 +-
 3 files changed, 144 insertions(+), 8 deletions(-)

diff --git a/board/technexion/pico-imx7d/pico-imx7d.c 
b/board/technexion/pico-imx7d/pico-imx7d.c
index 6e98b85b28..a3fa915b49 100644
--- a/board/technexion/pico-imx7d/pico-imx7d.c
+++ b/board/technexion/pico-imx7d/pico-imx7d.c
@@ -5,6 +5,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -13,6 +14,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -129,6 +131,49 @@ int board_phy_config(struct phy_device *phydev)
 }
 #endif
 
+#if CONFIG_IS_ENABLED(FSL_ESDHC_IMX)
+int check_mmc_autodetect(void)
+{
+   char *autodetect_str = env_get("mmcautodetect");
+
+   if ((autodetect_str) &&
+   (strcmp(autodetect_str, "yes") == 0)) {
+   return 1;
+   }
+
+   return 0;
+}
+
+void board_late_mmc_init(void)
+{
+   int dev_no = 0;
+   char cmd[32];
+
+   if (!check_mmc_autodetect())
+   return;
+
+   switch (get_boot_device()) {
+   case SD3_BOOT:
+   case MMC3_BOOT:
+   env_set("bootdev", "MMC3");
+   dev_no = 2;
+   break;
+   case SD1_BOOT:
+   env_set("bootdev", "SD1");
+   dev_no = 0;
+   break;
+   default:
+   printf("Wrong boot device!");
+   }
+
+   /* Set mmcdev env */
+   env_set_ulong("mmcdev", dev_no);
+
+   sprintf(cmd, "mmc dev %d", dev_no);
+   run_command(cmd, 0);
+}
+#endif
+
 static void setup_iomux_uart(void)
 {
imx_iomux_v3_setup_multiple_pads(uart5_pads, ARRAY_SIZE(uart5_pads));
@@ -176,6 +221,12 @@ int board_late_init(void)
 
set_wdog_reset(wdog);
 
+#if CONFIG_IS_ENABLED(FSL_ESDHC_IMX)
+#if defined(CONFIG_ENV_IS_IN_MMC) || defined(CONFIG_ENV_IS_NOWHERE)
+   board_late_mmc_init();
+#endif /* CONFIG_ENV_IS_IN_MMC or CONFIG_ENV_IS_NOWHERE */
+#endif
+
/*
 * Do not assert internal WDOG_RESET_B_DEB(controlled by bit 4),
 * since we use PMIC_PWRON to reset the board.
@@ -210,3 +261,9 @@ int board_ehci_hcd_init(int port)
}
return 0;
 }
+
+/* This should be defined for each board */
+__weak int mmc_map_to_kernel_blk(int dev_no)
+{
+   return dev_no;
+}
diff --git a/board/technexion/pico-imx7d/spl.c 
b/board/technexion/pico-imx7d/spl.c
index c6b21aaa42..2fe76145be 100644
--- a/board/technexion/pico-imx7d/spl.c
+++ b/board/technexion/pico-imx7d/spl.c
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -159,7 +160,20 @@ void reset_cpu(void)
 #define USDHC_PAD_CTRL (PAD_CTL_DSE_3P3V_32OHM | PAD_CTL_SRE_SLOW | \
PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PUS_PU47KOHM)
 
-static iomux_v3_cfg_t const usdhc3_pads[] = {
+#define USDHC1_CD_GPIO IMX_GPIO_NR(5, 0)
+/* EMMC/SD */
+static const iomux_v3_cfg_t usdhc1_pads[] = {
+   MX7D_PAD_SD1_CLK__SD1_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+   MX7D_PAD_SD1_CMD__SD1_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+   MX7D_PAD_SD1_DATA0__SD1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+   MX7D_PAD_SD1_DATA1__SD1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+   MX7D_PAD_SD1_DATA2__SD1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+   MX7D_PAD_SD1_DATA3__SD1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+   MX7D_PAD_SD1_CD_B__GPIO5_IO0  | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+};
+
+#define USDHC3_CD_GPIO IMX_GPIO_NR(1, 14)
+static const iomux_v3_cfg_t usdhc3_emmc_pads[] = {
MX7D_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_DATA0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
@@ -173,20 +187,83 @@ static iomux_v3_cfg_t const usdhc3_pads[] = {
MX7D_PAD_GPIO1_IO14__GPIO1_IO14 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
 };
 
-static struct fsl_esdhc_cfg usdhc_cfg[1] = {
+static struct fsl_esdhc_cfg usdhc_cfg[2] = {
{USDHC3_BASE_ADDR},
+   {USDHC1_BASE_ADDR},
 };
 
 int board_mmc_getcd(struct mmc *mmc)
 {
-   /* Assume uSDHC3 emmc is always present */
-   return 1;
+   struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
+   int ret = 0;
+
+   switch (cfg->esdhc_base) {
+   case USDHC1_BASE_ADDR:
+   ret = !gpio_get_value(USDHC1_CD_GPIO); /* Assume uSDHC1 sd is 
always present */
+   break;
+   case USDHC3_BASE_ADDR:
+   ret = !gpio_get_value(USDHC3_CD_GPIO); /* Assume uSDHC3 emmc is 
always present */
+   break;
+   }
+
+   return ret;
 }
 
 int board_mmc_init(struct bd_info *bis)
 {
-   imx_iomux_v3_setup_multiple_pads(usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
-