diff mbox

[U-Boot,v3,04/11] mx6: add boot device support for SPL

Message ID 1399526182-11966-5-git-send-email-tharvey@gateworks.com
State Changes Requested
Delegated to: Stefano Babic
Headers show

Commit Message

Tim Harvey May 8, 2014, 5:16 a.m. UTC
Add a common spl.c file to support boot device functions needed for SPL
such as detecting the boot device.

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
---
v3:
 - added Freescale copyright

v2:
 - re-base on top of Masahiro Yamada's consolidation patch:
   http://patchwork.ozlabs.org/patch/341817/
 - moved spl_boot_device() and get_boot_mode() into own common imx spl.c file
 - use mem-mapped structure for smbr reg access
---
 arch/arm/imx-common/Makefile |  1 +
 arch/arm/imx-common/spl.c    | 81 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 82 insertions(+)
 create mode 100644 arch/arm/imx-common/spl.c

Comments

Nikita Kiryanov May 28, 2014, 4:38 p.m. UTC | #1
Hi Tim,
Sorry for the late reply.

On 08/05/14 08:16, Tim Harvey wrote:
> Add a common spl.c file to support boot device functions needed for SPL
> such as detecting the boot device.
>
> Signed-off-by: Tim Harvey <tharvey@gateworks.com>
> ---
> v3:
>   - added Freescale copyright
>
> v2:
>   - re-base on top of Masahiro Yamada's consolidation patch:
>     http://patchwork.ozlabs.org/patch/341817/
>   - moved spl_boot_device() and get_boot_mode() into own common imx spl.c file
>   - use mem-mapped structure for smbr reg access
> ---

[..snip..]

> +		}
> +		break;
> +	/* SD/eSD: 8.5.3, Table 8-15  */
> +	case 0x4:
> +	case 0x5:
> +		return BOOT_DEVICE_MMC1;
> +	/* MMC/eMMC: 8.5.3 */
> +	case 0x6:
> +	case 0x7:
> +		return BOOT_DEVICE_MMC1;
> +	/* NAND Flash: 8.5.2 */
> +	case 0x8 ... 0xf:
> +		return BOOT_DEVICE_NAND;
> +	}
> +	return BOOT_DEVICE_NONE;
> +}
> +#endif
> +
> +#if defined(CONFIG_SPL_MMC_SUPPORT)
> +/* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */
> +u32 spl_boot_mode(void)
> +{
> +	switch (spl_boot_device()) {
> +	/* for MMC return either RAW or FAT mode */
> +	case BOOT_DEVICE_MMC1:
> +	case BOOT_DEVICE_MMC2:

spl_boot_device() returns only BOOT_DEVICE_MMC1. Was the MMC/eMMC case
supposed to return a BOOT_DEVICE_MMC2?

Aside from this nitpick,
Acked-by: Nikita Kiryanov <nikita@compulab.co.il>
Tim Harvey May 29, 2014, 4:11 a.m. UTC | #2
On Wed, May 28, 2014 at 9:38 AM, Nikita Kiryanov <nikita@compulab.co.il> wrote:
> Hi Tim,
> Sorry for the late reply.

no worries - your the only review of this revision thus far ;)

>
>
> On 08/05/14 08:16, Tim Harvey wrote:
>>
>> Add a common spl.c file to support boot device functions needed for SPL
>> such as detecting the boot device.
>>
>> Signed-off-by: Tim Harvey <tharvey@gateworks.com>
>> ---
>> v3:
>>   - added Freescale copyright
>>
>> v2:
>>   - re-base on top of Masahiro Yamada's consolidation patch:
>>     http://patchwork.ozlabs.org/patch/341817/
>>   - moved spl_boot_device() and get_boot_mode() into own common imx spl.c
>> file
>>   - use mem-mapped structure for smbr reg access
>> ---
>
>
> [..snip..]
>
>
>> +               }
>> +               break;
>> +       /* SD/eSD: 8.5.3, Table 8-15  */
>> +       case 0x4:
>> +       case 0x5:
>> +               return BOOT_DEVICE_MMC1;
>> +       /* MMC/eMMC: 8.5.3 */
>> +       case 0x6:
>> +       case 0x7:
>> +               return BOOT_DEVICE_MMC1;
>> +       /* NAND Flash: 8.5.2 */
>> +       case 0x8 ... 0xf:
>> +               return BOOT_DEVICE_NAND;
>> +       }
>> +       return BOOT_DEVICE_NONE;
>> +}
>> +#endif
>> +
>> +#if defined(CONFIG_SPL_MMC_SUPPORT)
>> +/* called from spl_mmc to see type of boot mode for storage (RAW or FAT)
>> */
>> +u32 spl_boot_mode(void)
>> +{
>> +       switch (spl_boot_device()) {
>> +       /* for MMC return either RAW or FAT mode */
>> +       case BOOT_DEVICE_MMC1:
>> +       case BOOT_DEVICE_MMC2:
>
>
> spl_boot_device() returns only BOOT_DEVICE_MMC1. Was the MMC/eMMC case
> supposed to return a BOOT_DEVICE_MMC2?

Its hard to say - I think the use of BOOT_DEVICE_* is very
implementation specific. I don't quite understand why there is a
BOOT_DEVICE_MMC{1,2,2_2} defined in arch/arm/include/asm/spl.h - the
BOOT_DEVICE_MMC2_2 is certainly quite odd. In uboot/common/spl/spl.c
they are all treated the same and spl_mmc_load_image() always assumes
the 'first' mmc device anyway.

In the IMX6 case I'm not sure an SD/uSD card would be treated any
different than an MMC card so it would come down to which specific
device is flagged as the boot device, of which there are 4 sdhc's. So
eventually, one might need to add more BOOT_DEVICE_MMC enums if that
is to be supported. For now, I'm keeping it simple and there is an
issue with IMX6 spl_mmc_load_image() anyway which I plan on addressing
later.

Tim

>
> Aside from this nitpick,
> Acked-by: Nikita Kiryanov <nikita@compulab.co.il>
Igor Grinberg May 29, 2014, 6:45 a.m. UTC | #3
Hi Tim,

On 05/29/14 07:11, Tim Harvey wrote:
> On Wed, May 28, 2014 at 9:38 AM, Nikita Kiryanov <nikita@compulab.co.il> wrote:
>> Hi Tim,
>> Sorry for the late reply.
> 
> no worries - your the only review of this revision thus far ;)
> 
>>
>>
>> On 08/05/14 08:16, Tim Harvey wrote:
>>>
>>> Add a common spl.c file to support boot device functions needed for SPL
>>> such as detecting the boot device.
>>>
>>> Signed-off-by: Tim Harvey <tharvey@gateworks.com>
>>> ---
>>> v3:
>>>   - added Freescale copyright
>>>
>>> v2:
>>>   - re-base on top of Masahiro Yamada's consolidation patch:
>>>     http://patchwork.ozlabs.org/patch/341817/
>>>   - moved spl_boot_device() and get_boot_mode() into own common imx spl.c
>>> file
>>>   - use mem-mapped structure for smbr reg access
>>> ---
>>
>>
>> [..snip..]
>>
>>
>>> +               }
>>> +               break;
>>> +       /* SD/eSD: 8.5.3, Table 8-15  */
>>> +       case 0x4:
>>> +       case 0x5:
>>> +               return BOOT_DEVICE_MMC1;
>>> +       /* MMC/eMMC: 8.5.3 */
>>> +       case 0x6:
>>> +       case 0x7:
>>> +               return BOOT_DEVICE_MMC1;
>>> +       /* NAND Flash: 8.5.2 */
>>> +       case 0x8 ... 0xf:
>>> +               return BOOT_DEVICE_NAND;
>>> +       }
>>> +       return BOOT_DEVICE_NONE;
>>> +}
>>> +#endif
>>> +
>>> +#if defined(CONFIG_SPL_MMC_SUPPORT)
>>> +/* called from spl_mmc to see type of boot mode for storage (RAW or FAT)
>>> */
>>> +u32 spl_boot_mode(void)
>>> +{
>>> +       switch (spl_boot_device()) {
>>> +       /* for MMC return either RAW or FAT mode */
>>> +       case BOOT_DEVICE_MMC1:
>>> +       case BOOT_DEVICE_MMC2:
>>
>>
>> spl_boot_device() returns only BOOT_DEVICE_MMC1. Was the MMC/eMMC case
>> supposed to return a BOOT_DEVICE_MMC2?
> 
> Its hard to say - I think the use of BOOT_DEVICE_* is very
> implementation specific. I don't quite understand why there is a
> BOOT_DEVICE_MMC{1,2,2_2} defined in arch/arm/include/asm/spl.h - the
> BOOT_DEVICE_MMC2_2 is certainly quite odd.

AFAIK, this is needed to support eMMC boot partitions which are physical
and not logical, but they are still within the same device.

> In uboot/common/spl/spl.c
> they are all treated the same and spl_mmc_load_image() always assumes
> the 'first' mmc device anyway.
> 
> In the IMX6 case I'm not sure an SD/uSD card would be treated any
> different than an MMC card so it would come down to which specific
> device is flagged as the boot device, of which there are 4 sdhc's. So
> eventually, one might need to add more BOOT_DEVICE_MMC enums if that
> is to be supported. For now, I'm keeping it simple and there is an
> issue with IMX6 spl_mmc_load_image() anyway which I plan on addressing
> later.
> 
> Tim
> 
>>
>> Aside from this nitpick,
>> Acked-by: Nikita Kiryanov <nikita@compulab.co.il>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>
diff mbox

Patch

diff --git a/arch/arm/imx-common/Makefile b/arch/arm/imx-common/Makefile
index b04dfbb..c97ea48 100644
--- a/arch/arm/imx-common/Makefile
+++ b/arch/arm/imx-common/Makefile
@@ -16,6 +16,7 @@  obj-$(CONFIG_SYS_I2C_MXC) += i2c-mxv7.o
 endif
 ifeq ($(SOC),$(filter $(SOC),mx6 mxs))
 obj-y	+= misc.o
+obj-$(CONFIG_SPL_BUILD)	+= spl.o
 endif
 ifeq ($(SOC),$(filter $(SOC),mx6))
 obj-$(CONFIG_CMD_SATA) += sata.o
diff --git a/arch/arm/imx-common/spl.c b/arch/arm/imx-common/spl.c
new file mode 100644
index 0000000..9a02a64
--- /dev/null
+++ b/arch/arm/imx-common/spl.c
@@ -0,0 +1,81 @@ 
+/*
+ * Copyright (C) 2014 Gateworks Corporation
+ * Copyright (C) 2011-2012 Freescale Semiconductor, Inc.
+ *
+ * Author: Tim Harvey <tharvey@gateworks.com>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/spl.h>
+#include <spl.h>
+
+#if defined(CONFIG_MX6)
+/* determine boot device from SRC_SBMR1 register (BOOT_CFG[4:1]) */
+u32 spl_boot_device(void)
+{
+	struct src *psrc = (struct src *)SRC_BASE_ADDR;
+	unsigned reg = readl(&psrc->sbmr1);
+
+	/* BOOT_CFG1[7:4] - see IMX6DQRM Table 8-8 */
+	switch ((reg & 0x000000FF) >> 4) {
+	 /* EIM: See 8.5.1, Table 8-9 */
+	case 0x0:
+		/* BOOT_CFG1[3]: NOR/OneNAND Selection */
+		if ((reg & 0x00000008) >> 3)
+			return BOOT_DEVICE_ONENAND;
+		else
+			return BOOT_DEVICE_NOR;
+		break;
+	/* SATA: See 8.5.4, Table 8-20 */
+	case 0x2:
+		return BOOT_DEVICE_SATA;
+	/* Serial ROM: See 8.5.5.1, Table 8-22 */
+	case 0x3:
+		/* BOOT_CFG4[2:0] */
+		switch ((reg & 0x07000000) >> 24) {
+		case 0x0 ... 0x4:
+			return BOOT_DEVICE_SPI;
+		case 0x5 ... 0x7:
+			return BOOT_DEVICE_I2C;
+		}
+		break;
+	/* SD/eSD: 8.5.3, Table 8-15  */
+	case 0x4:
+	case 0x5:
+		return BOOT_DEVICE_MMC1;
+	/* MMC/eMMC: 8.5.3 */
+	case 0x6:
+	case 0x7:
+		return BOOT_DEVICE_MMC1;
+	/* NAND Flash: 8.5.2 */
+	case 0x8 ... 0xf:
+		return BOOT_DEVICE_NAND;
+	}
+	return BOOT_DEVICE_NONE;
+}
+#endif
+
+#if defined(CONFIG_SPL_MMC_SUPPORT)
+/* called from spl_mmc to see type of boot mode for storage (RAW or FAT) */
+u32 spl_boot_mode(void)
+{
+	switch (spl_boot_device()) {
+	/* for MMC return either RAW or FAT mode */
+	case BOOT_DEVICE_MMC1:
+	case BOOT_DEVICE_MMC2:
+#ifdef CONFIG_SPL_FAT_SUPPORT
+		return MMCSD_MODE_FAT;
+#else
+		return MMCSD_MODE_RAW;
+#endif
+		break;
+	default:
+		puts("spl: ERROR:  unsupported device\n");
+		hang();
+	}
+}
+#endif