[v2] arm: exynos: Read default MMC device from XOM[7:5] pins
diff mbox series

Message ID 20200117130244.14975-1-m.szyprowski@samsung.com
State Accepted
Commit 86c88711082b9fb4da5f7eb0b80d5604c283f0c5
Delegated to: Minkyu Kang
Headers show
Series
  • [v2] arm: exynos: Read default MMC device from XOM[7:5] pins
Related show

Commit Message

Marek Szyprowski Jan. 17, 2020, 1:02 p.m. UTC
XOM pins provide information for iROM bootloader about the boot device.
Those pins are mapped to lower bits of OP_MODE register (0x10000008),
which is common for all Exynos SoC variants. Set the default MMC device id
to reflect the boot device selected by XOM[7:5] pins (2 for the SD or 0 for
the eMMC).

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
v2:
- store mmc boot device to ${mmcbootdev} env
- print information about boot mmc device
---
 arch/arm/mach-exynos/include/mach/cpu.h |  1 +
 board/samsung/common/board.c            | 28 +++++++++++++++++++++++++
 configs/odroid-xu3_defconfig            |  1 +
 configs/odroid_defconfig                |  1 +
 4 files changed, 31 insertions(+)

Comments

Minkyu Kang Jan. 23, 2020, 7:09 a.m. UTC | #1
Hi,

On 17/01/2020 22:02, Marek Szyprowski wrote:
> XOM pins provide information for iROM bootloader about the boot device.
> Those pins are mapped to lower bits of OP_MODE register (0x10000008),
> which is common for all Exynos SoC variants. Set the default MMC device id
> to reflect the boot device selected by XOM[7:5] pins (2 for the SD or 0 for
> the eMMC).
> 
> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
> ---
> v2:
> - store mmc boot device to ${mmcbootdev} env
> - print information about boot mmc device
> ---
>  arch/arm/mach-exynos/include/mach/cpu.h |  1 +
>  board/samsung/common/board.c            | 28 +++++++++++++++++++++++++
>  configs/odroid-xu3_defconfig            |  1 +
>  configs/odroid_defconfig                |  1 +
>  4 files changed, 31 insertions(+)
> 
> diff --git a/arch/arm/mach-exynos/include/mach/cpu.h b/arch/arm/mach-exynos/include/mach/cpu.h
> index 766edeeb29..fb5fdaf3ba 100644
> --- a/arch/arm/mach-exynos/include/mach/cpu.h
> +++ b/arch/arm/mach-exynos/include/mach/cpu.h
> @@ -17,6 +17,7 @@
>  
>  #define EXYNOS4_GPIO_PART3_BASE		0x03860000
>  #define EXYNOS4_PRO_ID			0x10000000
> +#define EXYNOS4_OP_MODE			0x10000008
>  #define EXYNOS4_SYSREG_BASE		0x10010000
>  #define EXYNOS4_POWER_BASE		0x10020000
>  #define EXYNOS4_SWRESET			0x10020400
> diff --git a/board/samsung/common/board.c b/board/samsung/common/board.c
> index ee2fc7971e..cb94ced54e 100644
> --- a/board/samsung/common/board.c
> +++ b/board/samsung/common/board.c
> @@ -24,6 +24,8 @@
>  #include <asm/arch/sromc.h>
>  #include <lcd.h>
>  #include <i2c.h>
> +#include <mmc.h>
> +#include <stdio_dev.h>
>  #include <usb.h>
>  #include <dwc3-uboot.h>
>  #include <samsung/misc.h>
> @@ -42,6 +44,20 @@ __weak int exynos_power_init(void)
>  	return 0;
>  }
>  
> +/**
> + * get_boot_mmc_dev() - read boot MMC device id from XOM[7:5] pins.
> + */
> +static int get_boot_mmc_dev(void)
> +{
> +	u32 mode = readl(EXYNOS4_OP_MODE) & 0x1C;
> +
> +	if (mode == 0x04)
> +		return 2; /* MMC2: SD */
> +
> +	/* MMC0: eMMC or unknown */
> +	return 0;
> +}
> +
>  #if defined CONFIG_EXYNOS_TMU
>  /* Boot Time Thermal Analysis for SoC temperature threshold breach */
>  static void boot_temp_check(void)
> @@ -280,6 +296,8 @@ int board_late_init(void)
>  {
>  	struct udevice *dev;
>  	int ret;
> +	int mmcbootdev = get_boot_mmc_dev();
> +	char mmcbootdev_str[16];
>  
>  	stdio_print_current_devices();
>  	ret = uclass_first_device_err(UCLASS_CROS_EC, &dev);
> @@ -292,6 +310,11 @@ int board_late_init(void)
>  		panic("Cannot init cros-ec device");
>  		return -1;
>  	}
> +
> +	printf("Boot device: MMC(%u)\n", mmcbootdev);
> +	sprintf(mmcbootdev_str, "%u", mmcbootdev);
> +	env_set("mmcbootdev", mmcbootdev_str);
> +
>  	return 0;
>  }
>  #endif
> @@ -359,3 +382,8 @@ int board_usb_cleanup(int index, enum usb_init_type init)
>  #endif
>  	return 0;
>  }
> +
> +int mmc_get_env_dev(void)
> +{
> +	return get_boot_mmc_dev();
> +}
> diff --git a/configs/odroid-xu3_defconfig b/configs/odroid-xu3_defconfig
> index 20038d4197..2e982e1b53 100644
> --- a/configs/odroid-xu3_defconfig
> +++ b/configs/odroid-xu3_defconfig
> @@ -14,6 +14,7 @@ CONFIG_FIT_BEST_MATCH=y
>  CONFIG_SILENT_CONSOLE=y
>  CONFIG_CONSOLE_MUX=y
>  CONFIG_MISC_INIT_R=y
> +CONFIG_BOARD_LATE_INIT=y

Is it a related change?

>  # CONFIG_DISPLAY_BOARDINFO is not set
>  CONFIG_DISPLAY_BOARDINFO_LATE=y
>  CONFIG_BOARD_TYPES=y
> diff --git a/configs/odroid_defconfig b/configs/odroid_defconfig
> index be914e4caf..e4392e477e 100644
> --- a/configs/odroid_defconfig
> +++ b/configs/odroid_defconfig
> @@ -17,6 +17,7 @@ CONFIG_BOOTARGS="Please use defined boot"
>  CONFIG_SYS_CONSOLE_IS_IN_ENV=y
>  CONFIG_SYS_CONSOLE_INFO_QUIET=y
>  CONFIG_MISC_INIT_R=y
> +CONFIG_BOARD_LATE_INIT=y
>  CONFIG_BOARD_TYPES=y
>  CONFIG_SYS_PROMPT="Odroid # "
>  # CONFIG_CMD_XIMG is not set
> 

Thanks,
Minkyu Kang.
Marek Szyprowski Jan. 23, 2020, 7:20 a.m. UTC | #2
Hi Minkyu,

On 23.01.2020 08:09, Minkyu Kang wrote:
> On 17/01/2020 22:02, Marek Szyprowski wrote:
>> XOM pins provide information for iROM bootloader about the boot device.
>> Those pins are mapped to lower bits of OP_MODE register (0x10000008),
>> which is common for all Exynos SoC variants. Set the default MMC device id
>> to reflect the boot device selected by XOM[7:5] pins (2 for the SD or 0 for
>> the eMMC).
>>
>> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
>> ---
>> v2:
>> - store mmc boot device to ${mmcbootdev} env
>> - print information about boot mmc device
>> ---
>>   arch/arm/mach-exynos/include/mach/cpu.h |  1 +
>>   board/samsung/common/board.c            | 28 +++++++++++++++++++++++++
>>   configs/odroid-xu3_defconfig            |  1 +
>>   configs/odroid_defconfig                |  1 +
>>   4 files changed, 31 insertions(+)
>>
>> diff --git a/arch/arm/mach-exynos/include/mach/cpu.h b/arch/arm/mach-exynos/include/mach/cpu.h
>> index 766edeeb29..fb5fdaf3ba 100644
>> --- a/arch/arm/mach-exynos/include/mach/cpu.h
>> +++ b/arch/arm/mach-exynos/include/mach/cpu.h
>> @@ -17,6 +17,7 @@
>>   
>>   #define EXYNOS4_GPIO_PART3_BASE		0x03860000
>>   #define EXYNOS4_PRO_ID			0x10000000
>> +#define EXYNOS4_OP_MODE			0x10000008
>>   #define EXYNOS4_SYSREG_BASE		0x10010000
>>   #define EXYNOS4_POWER_BASE		0x10020000
>>   #define EXYNOS4_SWRESET			0x10020400
>> diff --git a/board/samsung/common/board.c b/board/samsung/common/board.c
>> index ee2fc7971e..cb94ced54e 100644
>> --- a/board/samsung/common/board.c
>> +++ b/board/samsung/common/board.c
>> @@ -24,6 +24,8 @@
>>   #include <asm/arch/sromc.h>
>>   #include <lcd.h>
>>   #include <i2c.h>
>> +#include <mmc.h>
>> +#include <stdio_dev.h>
>>   #include <usb.h>
>>   #include <dwc3-uboot.h>
>>   #include <samsung/misc.h>
>> @@ -42,6 +44,20 @@ __weak int exynos_power_init(void)
>>   	return 0;
>>   }
>>   
>> +/**
>> + * get_boot_mmc_dev() - read boot MMC device id from XOM[7:5] pins.
>> + */
>> +static int get_boot_mmc_dev(void)
>> +{
>> +	u32 mode = readl(EXYNOS4_OP_MODE) & 0x1C;
>> +
>> +	if (mode == 0x04)
>> +		return 2; /* MMC2: SD */
>> +
>> +	/* MMC0: eMMC or unknown */
>> +	return 0;
>> +}
>> +
>>   #if defined CONFIG_EXYNOS_TMU
>>   /* Boot Time Thermal Analysis for SoC temperature threshold breach */
>>   static void boot_temp_check(void)
>> @@ -280,6 +296,8 @@ int board_late_init(void)
>>   {
>>   	struct udevice *dev;
>>   	int ret;
>> +	int mmcbootdev = get_boot_mmc_dev();
>> +	char mmcbootdev_str[16];
>>   
>>   	stdio_print_current_devices();
>>   	ret = uclass_first_device_err(UCLASS_CROS_EC, &dev);
>> @@ -292,6 +310,11 @@ int board_late_init(void)
>>   		panic("Cannot init cros-ec device");
>>   		return -1;
>>   	}
>> +
>> +	printf("Boot device: MMC(%u)\n", mmcbootdev);
>> +	sprintf(mmcbootdev_str, "%u", mmcbootdev);
>> +	env_set("mmcbootdev", mmcbootdev_str);
>> +
>>   	return 0;
>>   }
>>   #endif
>> @@ -359,3 +382,8 @@ int board_usb_cleanup(int index, enum usb_init_type init)
>>   #endif
>>   	return 0;
>>   }
>> +
>> +int mmc_get_env_dev(void)
>> +{
>> +	return get_boot_mmc_dev();
>> +}
>> diff --git a/configs/odroid-xu3_defconfig b/configs/odroid-xu3_defconfig
>> index 20038d4197..2e982e1b53 100644
>> --- a/configs/odroid-xu3_defconfig
>> +++ b/configs/odroid-xu3_defconfig
>> @@ -14,6 +14,7 @@ CONFIG_FIT_BEST_MATCH=y
>>   CONFIG_SILENT_CONSOLE=y
>>   CONFIG_CONSOLE_MUX=y
>>   CONFIG_MISC_INIT_R=y
>> +CONFIG_BOARD_LATE_INIT=y
> Is it a related change?

Yes, it is needed to enable the code added to board_late_init() function.

>>   # CONFIG_DISPLAY_BOARDINFO is not set
>>   CONFIG_DISPLAY_BOARDINFO_LATE=y
>>   CONFIG_BOARD_TYPES=y
>> diff --git a/configs/odroid_defconfig b/configs/odroid_defconfig
>> index be914e4caf..e4392e477e 100644
>> --- a/configs/odroid_defconfig
>> +++ b/configs/odroid_defconfig
>> @@ -17,6 +17,7 @@ CONFIG_BOOTARGS="Please use defined boot"
>>   CONFIG_SYS_CONSOLE_IS_IN_ENV=y
>>   CONFIG_SYS_CONSOLE_INFO_QUIET=y
>>   CONFIG_MISC_INIT_R=y
>> +CONFIG_BOARD_LATE_INIT=y
>>   CONFIG_BOARD_TYPES=y
>>   CONFIG_SYS_PROMPT="Odroid # "
>>   # CONFIG_CMD_XIMG is not set

Best regards
Minkyu Kang Jan. 23, 2020, 7:33 a.m. UTC | #3
Hi!

On 23/01/2020 16:20, Marek Szyprowski wrote:
> Hi Minkyu,
> 
> On 23.01.2020 08:09, Minkyu Kang wrote:
>> On 17/01/2020 22:02, Marek Szyprowski wrote:
>>> XOM pins provide information for iROM bootloader about the boot device.
>>> Those pins are mapped to lower bits of OP_MODE register (0x10000008),
>>> which is common for all Exynos SoC variants. Set the default MMC device id
>>> to reflect the boot device selected by XOM[7:5] pins (2 for the SD or 0 for
>>> the eMMC).
>>>
>>> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
>>> ---
>>> v2:
>>> - store mmc boot device to ${mmcbootdev} env
>>> - print information about boot mmc device
>>> ---
>>>   arch/arm/mach-exynos/include/mach/cpu.h |  1 +
>>>   board/samsung/common/board.c            | 28 +++++++++++++++++++++++++
>>>   configs/odroid-xu3_defconfig            |  1 +
>>>   configs/odroid_defconfig                |  1 +
>>>   4 files changed, 31 insertions(+)
>>>
>>> diff --git a/arch/arm/mach-exynos/include/mach/cpu.h b/arch/arm/mach-exynos/include/mach/cpu.h
>>> index 766edeeb29..fb5fdaf3ba 100644
>>> --- a/arch/arm/mach-exynos/include/mach/cpu.h
>>> +++ b/arch/arm/mach-exynos/include/mach/cpu.h
>>> @@ -17,6 +17,7 @@
>>>   
>>>   #define EXYNOS4_GPIO_PART3_BASE		0x03860000
>>>   #define EXYNOS4_PRO_ID			0x10000000
>>> +#define EXYNOS4_OP_MODE			0x10000008
>>>   #define EXYNOS4_SYSREG_BASE		0x10010000
>>>   #define EXYNOS4_POWER_BASE		0x10020000
>>>   #define EXYNOS4_SWRESET			0x10020400
>>> diff --git a/board/samsung/common/board.c b/board/samsung/common/board.c
>>> index ee2fc7971e..cb94ced54e 100644
>>> --- a/board/samsung/common/board.c
>>> +++ b/board/samsung/common/board.c
>>> @@ -24,6 +24,8 @@
>>>   #include <asm/arch/sromc.h>
>>>   #include <lcd.h>
>>>   #include <i2c.h>
>>> +#include <mmc.h>
>>> +#include <stdio_dev.h>
>>>   #include <usb.h>
>>>   #include <dwc3-uboot.h>
>>>   #include <samsung/misc.h>
>>> @@ -42,6 +44,20 @@ __weak int exynos_power_init(void)
>>>   	return 0;
>>>   }
>>>   
>>> +/**
>>> + * get_boot_mmc_dev() - read boot MMC device id from XOM[7:5] pins.
>>> + */
>>> +static int get_boot_mmc_dev(void)
>>> +{
>>> +	u32 mode = readl(EXYNOS4_OP_MODE) & 0x1C;
>>> +
>>> +	if (mode == 0x04)
>>> +		return 2; /* MMC2: SD */
>>> +
>>> +	/* MMC0: eMMC or unknown */
>>> +	return 0;
>>> +}
>>> +
>>>   #if defined CONFIG_EXYNOS_TMU
>>>   /* Boot Time Thermal Analysis for SoC temperature threshold breach */
>>>   static void boot_temp_check(void)
>>> @@ -280,6 +296,8 @@ int board_late_init(void)
>>>   {
>>>   	struct udevice *dev;
>>>   	int ret;
>>> +	int mmcbootdev = get_boot_mmc_dev();
>>> +	char mmcbootdev_str[16];
>>>   
>>>   	stdio_print_current_devices();
>>>   	ret = uclass_first_device_err(UCLASS_CROS_EC, &dev);
>>> @@ -292,6 +310,11 @@ int board_late_init(void)
>>>   		panic("Cannot init cros-ec device");
>>>   		return -1;
>>>   	}
>>> +
>>> +	printf("Boot device: MMC(%u)\n", mmcbootdev);
>>> +	sprintf(mmcbootdev_str, "%u", mmcbootdev);
>>> +	env_set("mmcbootdev", mmcbootdev_str);
>>> +
>>>   	return 0;
>>>   }
>>>   #endif
>>> @@ -359,3 +382,8 @@ int board_usb_cleanup(int index, enum usb_init_type init)
>>>   #endif
>>>   	return 0;
>>>   }
>>> +
>>> +int mmc_get_env_dev(void)
>>> +{
>>> +	return get_boot_mmc_dev();
>>> +}
>>> diff --git a/configs/odroid-xu3_defconfig b/configs/odroid-xu3_defconfig
>>> index 20038d4197..2e982e1b53 100644
>>> --- a/configs/odroid-xu3_defconfig
>>> +++ b/configs/odroid-xu3_defconfig
>>> @@ -14,6 +14,7 @@ CONFIG_FIT_BEST_MATCH=y
>>>   CONFIG_SILENT_CONSOLE=y
>>>   CONFIG_CONSOLE_MUX=y
>>>   CONFIG_MISC_INIT_R=y
>>> +CONFIG_BOARD_LATE_INIT=y
>> Is it a related change?
> 
> Yes, it is needed to enable the code added to board_late_init() function.

I mean, is your changes should located to board_late_init?

> 
>>>   # CONFIG_DISPLAY_BOARDINFO is not set
>>>   CONFIG_DISPLAY_BOARDINFO_LATE=y
>>>   CONFIG_BOARD_TYPES=y
>>> diff --git a/configs/odroid_defconfig b/configs/odroid_defconfig
>>> index be914e4caf..e4392e477e 100644
>>> --- a/configs/odroid_defconfig
>>> +++ b/configs/odroid_defconfig
>>> @@ -17,6 +17,7 @@ CONFIG_BOOTARGS="Please use defined boot"
>>>   CONFIG_SYS_CONSOLE_IS_IN_ENV=y
>>>   CONFIG_SYS_CONSOLE_INFO_QUIET=y
>>>   CONFIG_MISC_INIT_R=y
>>> +CONFIG_BOARD_LATE_INIT=y
>>>   CONFIG_BOARD_TYPES=y
>>>   CONFIG_SYS_PROMPT="Odroid # "
>>>   # CONFIG_CMD_XIMG is not set
> 
> Best regards
> 

Thanks,
Minkyu Kang.
Marek Szyprowski Jan. 23, 2020, 7:39 a.m. UTC | #4
Hi

On 23.01.2020 08:33, Minkyu Kang wrote:
> On 23/01/2020 16:20, Marek Szyprowski wrote:
>> On 23.01.2020 08:09, Minkyu Kang wrote:
>>> On 17/01/2020 22:02, Marek Szyprowski wrote:
>>>> XOM pins provide information for iROM bootloader about the boot device.
>>>> Those pins are mapped to lower bits of OP_MODE register (0x10000008),
>>>> which is common for all Exynos SoC variants. Set the default MMC device id
>>>> to reflect the boot device selected by XOM[7:5] pins (2 for the SD or 0 for
>>>> the eMMC).
>>>>
>>>> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
>>>> ---
>>>> v2:
>>>> - store mmc boot device to ${mmcbootdev} env
>>>> - print information about boot mmc device
>>>> ---
>>>>    arch/arm/mach-exynos/include/mach/cpu.h |  1 +
>>>>    board/samsung/common/board.c            | 28 +++++++++++++++++++++++++
>>>>    configs/odroid-xu3_defconfig            |  1 +
>>>>    configs/odroid_defconfig                |  1 +
>>>>    4 files changed, 31 insertions(+)
>>>>
>>>> diff --git a/arch/arm/mach-exynos/include/mach/cpu.h b/arch/arm/mach-exynos/include/mach/cpu.h
>>>> index 766edeeb29..fb5fdaf3ba 100644
>>>> --- a/arch/arm/mach-exynos/include/mach/cpu.h
>>>> +++ b/arch/arm/mach-exynos/include/mach/cpu.h
>>>> @@ -17,6 +17,7 @@
>>>>    
>>>>    #define EXYNOS4_GPIO_PART3_BASE		0x03860000
>>>>    #define EXYNOS4_PRO_ID			0x10000000
>>>> +#define EXYNOS4_OP_MODE			0x10000008
>>>>    #define EXYNOS4_SYSREG_BASE		0x10010000
>>>>    #define EXYNOS4_POWER_BASE		0x10020000
>>>>    #define EXYNOS4_SWRESET			0x10020400
>>>> diff --git a/board/samsung/common/board.c b/board/samsung/common/board.c
>>>> index ee2fc7971e..cb94ced54e 100644
>>>> --- a/board/samsung/common/board.c
>>>> +++ b/board/samsung/common/board.c
>>>> @@ -24,6 +24,8 @@
>>>>    #include <asm/arch/sromc.h>
>>>>    #include <lcd.h>
>>>>    #include <i2c.h>
>>>> +#include <mmc.h>
>>>> +#include <stdio_dev.h>
>>>>    #include <usb.h>
>>>>    #include <dwc3-uboot.h>
>>>>    #include <samsung/misc.h>
>>>> @@ -42,6 +44,20 @@ __weak int exynos_power_init(void)
>>>>    	return 0;
>>>>    }
>>>>    
>>>> +/**
>>>> + * get_boot_mmc_dev() - read boot MMC device id from XOM[7:5] pins.
>>>> + */
>>>> +static int get_boot_mmc_dev(void)
>>>> +{
>>>> +	u32 mode = readl(EXYNOS4_OP_MODE) & 0x1C;
>>>> +
>>>> +	if (mode == 0x04)
>>>> +		return 2; /* MMC2: SD */
>>>> +
>>>> +	/* MMC0: eMMC or unknown */
>>>> +	return 0;
>>>> +}
>>>> +
>>>>    #if defined CONFIG_EXYNOS_TMU
>>>>    /* Boot Time Thermal Analysis for SoC temperature threshold breach */
>>>>    static void boot_temp_check(void)
>>>> @@ -280,6 +296,8 @@ int board_late_init(void)
>>>>    {
>>>>    	struct udevice *dev;
>>>>    	int ret;
>>>> +	int mmcbootdev = get_boot_mmc_dev();
>>>> +	char mmcbootdev_str[16];
>>>>    
>>>>    	stdio_print_current_devices();
>>>>    	ret = uclass_first_device_err(UCLASS_CROS_EC, &dev);
>>>> @@ -292,6 +310,11 @@ int board_late_init(void)
>>>>    		panic("Cannot init cros-ec device");
>>>>    		return -1;
>>>>    	}
>>>> +
>>>> +	printf("Boot device: MMC(%u)\n", mmcbootdev);
>>>> +	sprintf(mmcbootdev_str, "%u", mmcbootdev);
>>>> +	env_set("mmcbootdev", mmcbootdev_str);
>>>> +
>>>>    	return 0;
>>>>    }
>>>>    #endif
>>>> @@ -359,3 +382,8 @@ int board_usb_cleanup(int index, enum usb_init_type init)
>>>>    #endif
>>>>    	return 0;
>>>>    }
>>>> +
>>>> +int mmc_get_env_dev(void)
>>>> +{
>>>> +	return get_boot_mmc_dev();
>>>> +}
>>>> diff --git a/configs/odroid-xu3_defconfig b/configs/odroid-xu3_defconfig
>>>> index 20038d4197..2e982e1b53 100644
>>>> --- a/configs/odroid-xu3_defconfig
>>>> +++ b/configs/odroid-xu3_defconfig
>>>> @@ -14,6 +14,7 @@ CONFIG_FIT_BEST_MATCH=y
>>>>    CONFIG_SILENT_CONSOLE=y
>>>>    CONFIG_CONSOLE_MUX=y
>>>>    CONFIG_MISC_INIT_R=y
>>>> +CONFIG_BOARD_LATE_INIT=y
>>> Is it a related change?
>> Yes, it is needed to enable the code added to board_late_init() function.
> I mean, is your changes should located to board_late_init?

Setting mmcbootdev env is being done in board_late_init() (see the diff 
a few lines above), so to make it working, one has to enable 
CONFIG_BOARD_LATE_INIT.

>>>>    # CONFIG_DISPLAY_BOARDINFO is not set
>>>>    CONFIG_DISPLAY_BOARDINFO_LATE=y
>>>>    CONFIG_BOARD_TYPES=y
>>>> diff --git a/configs/odroid_defconfig b/configs/odroid_defconfig
>>>> index be914e4caf..e4392e477e 100644
>>>> --- a/configs/odroid_defconfig
>>>> +++ b/configs/odroid_defconfig
>>>> @@ -17,6 +17,7 @@ CONFIG_BOOTARGS="Please use defined boot"
>>>>    CONFIG_SYS_CONSOLE_IS_IN_ENV=y
>>>>    CONFIG_SYS_CONSOLE_INFO_QUIET=y
>>>>    CONFIG_MISC_INIT_R=y
>>>> +CONFIG_BOARD_LATE_INIT=y
>>>>    CONFIG_BOARD_TYPES=y
>>>>    CONFIG_SYS_PROMPT="Odroid # "
>>>>    # CONFIG_CMD_XIMG is not set
>>>>
Best regards
Minkyu Kang Jan. 28, 2020, 9:14 a.m. UTC | #5
On 23/01/2020 16:39, Marek Szyprowski wrote:
> Hi
> 
> On 23.01.2020 08:33, Minkyu Kang wrote:
>> On 23/01/2020 16:20, Marek Szyprowski wrote:
>>> On 23.01.2020 08:09, Minkyu Kang wrote:
>>>> On 17/01/2020 22:02, Marek Szyprowski wrote:
>>>>> XOM pins provide information for iROM bootloader about the boot device.
>>>>> Those pins are mapped to lower bits of OP_MODE register (0x10000008),
>>>>> which is common for all Exynos SoC variants. Set the default MMC device id
>>>>> to reflect the boot device selected by XOM[7:5] pins (2 for the SD or 0 for
>>>>> the eMMC).
>>>>>
>>>>> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
>>>>> ---
>>>>> v2:
>>>>> - store mmc boot device to ${mmcbootdev} env
>>>>> - print information about boot mmc device
>>>>> ---
>>>>>    arch/arm/mach-exynos/include/mach/cpu.h |  1 +
>>>>>    board/samsung/common/board.c            | 28 +++++++++++++++++++++++++
>>>>>    configs/odroid-xu3_defconfig            |  1 +
>>>>>    configs/odroid_defconfig                |  1 +
>>>>>    4 files changed, 31 insertions(+)
>>>>>
>>>>> diff --git a/arch/arm/mach-exynos/include/mach/cpu.h b/arch/arm/mach-exynos/include/mach/cpu.h
>>>>> index 766edeeb29..fb5fdaf3ba 100644
>>>>> --- a/arch/arm/mach-exynos/include/mach/cpu.h
>>>>> +++ b/arch/arm/mach-exynos/include/mach/cpu.h
>>>>> @@ -17,6 +17,7 @@
>>>>>    
>>>>>    #define EXYNOS4_GPIO_PART3_BASE		0x03860000
>>>>>    #define EXYNOS4_PRO_ID			0x10000000
>>>>> +#define EXYNOS4_OP_MODE			0x10000008
>>>>>    #define EXYNOS4_SYSREG_BASE		0x10010000
>>>>>    #define EXYNOS4_POWER_BASE		0x10020000
>>>>>    #define EXYNOS4_SWRESET			0x10020400
>>>>> diff --git a/board/samsung/common/board.c b/board/samsung/common/board.c
>>>>> index ee2fc7971e..cb94ced54e 100644
>>>>> --- a/board/samsung/common/board.c
>>>>> +++ b/board/samsung/common/board.c
>>>>> @@ -24,6 +24,8 @@
>>>>>    #include <asm/arch/sromc.h>
>>>>>    #include <lcd.h>
>>>>>    #include <i2c.h>
>>>>> +#include <mmc.h>
>>>>> +#include <stdio_dev.h>
>>>>>    #include <usb.h>
>>>>>    #include <dwc3-uboot.h>
>>>>>    #include <samsung/misc.h>
>>>>> @@ -42,6 +44,20 @@ __weak int exynos_power_init(void)
>>>>>    	return 0;
>>>>>    }
>>>>>    
>>>>> +/**
>>>>> + * get_boot_mmc_dev() - read boot MMC device id from XOM[7:5] pins.
>>>>> + */
>>>>> +static int get_boot_mmc_dev(void)
>>>>> +{
>>>>> +	u32 mode = readl(EXYNOS4_OP_MODE) & 0x1C;
>>>>> +
>>>>> +	if (mode == 0x04)
>>>>> +		return 2; /* MMC2: SD */
>>>>> +
>>>>> +	/* MMC0: eMMC or unknown */
>>>>> +	return 0;
>>>>> +}
>>>>> +
>>>>>    #if defined CONFIG_EXYNOS_TMU
>>>>>    /* Boot Time Thermal Analysis for SoC temperature threshold breach */
>>>>>    static void boot_temp_check(void)
>>>>> @@ -280,6 +296,8 @@ int board_late_init(void)
>>>>>    {
>>>>>    	struct udevice *dev;
>>>>>    	int ret;
>>>>> +	int mmcbootdev = get_boot_mmc_dev();
>>>>> +	char mmcbootdev_str[16];
>>>>>    
>>>>>    	stdio_print_current_devices();
>>>>>    	ret = uclass_first_device_err(UCLASS_CROS_EC, &dev);
>>>>> @@ -292,6 +310,11 @@ int board_late_init(void)
>>>>>    		panic("Cannot init cros-ec device");
>>>>>    		return -1;
>>>>>    	}
>>>>> +
>>>>> +	printf("Boot device: MMC(%u)\n", mmcbootdev);
>>>>> +	sprintf(mmcbootdev_str, "%u", mmcbootdev);
>>>>> +	env_set("mmcbootdev", mmcbootdev_str);
>>>>> +
>>>>>    	return 0;
>>>>>    }
>>>>>    #endif
>>>>> @@ -359,3 +382,8 @@ int board_usb_cleanup(int index, enum usb_init_type init)
>>>>>    #endif
>>>>>    	return 0;
>>>>>    }
>>>>> +
>>>>> +int mmc_get_env_dev(void)
>>>>> +{
>>>>> +	return get_boot_mmc_dev();
>>>>> +}
>>>>> diff --git a/configs/odroid-xu3_defconfig b/configs/odroid-xu3_defconfig
>>>>> index 20038d4197..2e982e1b53 100644
>>>>> --- a/configs/odroid-xu3_defconfig
>>>>> +++ b/configs/odroid-xu3_defconfig
>>>>> @@ -14,6 +14,7 @@ CONFIG_FIT_BEST_MATCH=y
>>>>>    CONFIG_SILENT_CONSOLE=y
>>>>>    CONFIG_CONSOLE_MUX=y
>>>>>    CONFIG_MISC_INIT_R=y
>>>>> +CONFIG_BOARD_LATE_INIT=y
>>>> Is it a related change?
>>> Yes, it is needed to enable the code added to board_late_init() function.
>> I mean, is your changes should located to board_late_init?
> 
> Setting mmcbootdev env is being done in board_late_init() (see the diff 
> a few lines above), so to make it working, one has to enable 
> CONFIG_BOARD_LATE_INIT.
> 
>>>>>    # CONFIG_DISPLAY_BOARDINFO is not set
>>>>>    CONFIG_DISPLAY_BOARDINFO_LATE=y
>>>>>    CONFIG_BOARD_TYPES=y
>>>>> diff --git a/configs/odroid_defconfig b/configs/odroid_defconfig
>>>>> index be914e4caf..e4392e477e 100644
>>>>> --- a/configs/odroid_defconfig
>>>>> +++ b/configs/odroid_defconfig
>>>>> @@ -17,6 +17,7 @@ CONFIG_BOOTARGS="Please use defined boot"
>>>>>    CONFIG_SYS_CONSOLE_IS_IN_ENV=y
>>>>>    CONFIG_SYS_CONSOLE_INFO_QUIET=y
>>>>>    CONFIG_MISC_INIT_R=y
>>>>> +CONFIG_BOARD_LATE_INIT=y
>>>>>    CONFIG_BOARD_TYPES=y
>>>>>    CONFIG_SYS_PROMPT="Odroid # "
>>>>>    # CONFIG_CMD_XIMG is not set
>>>>>
> Best regards
> 

applied to u-boot-samsung.

Thanks,
Minkyu Kang.

Patch
diff mbox series

diff --git a/arch/arm/mach-exynos/include/mach/cpu.h b/arch/arm/mach-exynos/include/mach/cpu.h
index 766edeeb29..fb5fdaf3ba 100644
--- a/arch/arm/mach-exynos/include/mach/cpu.h
+++ b/arch/arm/mach-exynos/include/mach/cpu.h
@@ -17,6 +17,7 @@ 
 
 #define EXYNOS4_GPIO_PART3_BASE		0x03860000
 #define EXYNOS4_PRO_ID			0x10000000
+#define EXYNOS4_OP_MODE			0x10000008
 #define EXYNOS4_SYSREG_BASE		0x10010000
 #define EXYNOS4_POWER_BASE		0x10020000
 #define EXYNOS4_SWRESET			0x10020400
diff --git a/board/samsung/common/board.c b/board/samsung/common/board.c
index ee2fc7971e..cb94ced54e 100644
--- a/board/samsung/common/board.c
+++ b/board/samsung/common/board.c
@@ -24,6 +24,8 @@ 
 #include <asm/arch/sromc.h>
 #include <lcd.h>
 #include <i2c.h>
+#include <mmc.h>
+#include <stdio_dev.h>
 #include <usb.h>
 #include <dwc3-uboot.h>
 #include <samsung/misc.h>
@@ -42,6 +44,20 @@  __weak int exynos_power_init(void)
 	return 0;
 }
 
+/**
+ * get_boot_mmc_dev() - read boot MMC device id from XOM[7:5] pins.
+ */
+static int get_boot_mmc_dev(void)
+{
+	u32 mode = readl(EXYNOS4_OP_MODE) & 0x1C;
+
+	if (mode == 0x04)
+		return 2; /* MMC2: SD */
+
+	/* MMC0: eMMC or unknown */
+	return 0;
+}
+
 #if defined CONFIG_EXYNOS_TMU
 /* Boot Time Thermal Analysis for SoC temperature threshold breach */
 static void boot_temp_check(void)
@@ -280,6 +296,8 @@  int board_late_init(void)
 {
 	struct udevice *dev;
 	int ret;
+	int mmcbootdev = get_boot_mmc_dev();
+	char mmcbootdev_str[16];
 
 	stdio_print_current_devices();
 	ret = uclass_first_device_err(UCLASS_CROS_EC, &dev);
@@ -292,6 +310,11 @@  int board_late_init(void)
 		panic("Cannot init cros-ec device");
 		return -1;
 	}
+
+	printf("Boot device: MMC(%u)\n", mmcbootdev);
+	sprintf(mmcbootdev_str, "%u", mmcbootdev);
+	env_set("mmcbootdev", mmcbootdev_str);
+
 	return 0;
 }
 #endif
@@ -359,3 +382,8 @@  int board_usb_cleanup(int index, enum usb_init_type init)
 #endif
 	return 0;
 }
+
+int mmc_get_env_dev(void)
+{
+	return get_boot_mmc_dev();
+}
diff --git a/configs/odroid-xu3_defconfig b/configs/odroid-xu3_defconfig
index 20038d4197..2e982e1b53 100644
--- a/configs/odroid-xu3_defconfig
+++ b/configs/odroid-xu3_defconfig
@@ -14,6 +14,7 @@  CONFIG_FIT_BEST_MATCH=y
 CONFIG_SILENT_CONSOLE=y
 CONFIG_CONSOLE_MUX=y
 CONFIG_MISC_INIT_R=y
+CONFIG_BOARD_LATE_INIT=y
 # CONFIG_DISPLAY_BOARDINFO is not set
 CONFIG_DISPLAY_BOARDINFO_LATE=y
 CONFIG_BOARD_TYPES=y
diff --git a/configs/odroid_defconfig b/configs/odroid_defconfig
index be914e4caf..e4392e477e 100644
--- a/configs/odroid_defconfig
+++ b/configs/odroid_defconfig
@@ -17,6 +17,7 @@  CONFIG_BOOTARGS="Please use defined boot"
 CONFIG_SYS_CONSOLE_IS_IN_ENV=y
 CONFIG_SYS_CONSOLE_INFO_QUIET=y
 CONFIG_MISC_INIT_R=y
+CONFIG_BOARD_LATE_INIT=y
 CONFIG_BOARD_TYPES=y
 CONFIG_SYS_PROMPT="Odroid # "
 # CONFIG_CMD_XIMG is not set