diff mbox

[U-Boot] Exynos5: Add support for USB download boot mode

Message ID 1359369599-30404-1-git-send-email-gautam.vivek@samsung.com
State Accepted
Delegated to: Minkyu Kang
Headers show

Commit Message

Vivek Gautam Jan. 28, 2013, 10:39 a.m. UTC
Exynos5250 supports secondary USB device boot mode. If the iROM fails
to download u-boot from the primary boot device (such as SD or eMMC),
it will try to retrieve from the secondary boot device (such as USB).

Signed-off-by: Naveen Krishna Ch <ch.naveen@samsung.com>
Signed-off-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
---

NOTE:
 - Based on 'master' branch of u-boot-samsung.
 - Tested with smdk5250 for usb download mode.

 board/samsung/smdk5250/spl_boot.c |   40 +++++++++++++++++++++++++++++++++++-
 include/configs/exynos5250-dt.h   |    5 ++++
 2 files changed, 43 insertions(+), 2 deletions(-)

Comments

Simon Glass Feb. 4, 2013, 9:26 p.m. UTC | #1
Hi,

On Mon, Jan 28, 2013 at 2:39 AM, Vivek Gautam <gautam.vivek@samsung.com> wrote:
> Exynos5250 supports secondary USB device boot mode. If the iROM fails
> to download u-boot from the primary boot device (such as SD or eMMC),
> it will try to retrieve from the secondary boot device (such as USB).
>
> Signed-off-by: Naveen Krishna Ch <ch.naveen@samsung.com>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>

Acked-by: Simon Glass <sjg@chromium.org>

But please see comment below.

> ---
>
> NOTE:
>  - Based on 'master' branch of u-boot-samsung.
>  - Tested with smdk5250 for usb download mode.
>
>  board/samsung/smdk5250/spl_boot.c |   40 +++++++++++++++++++++++++++++++++++-
>  include/configs/exynos5250-dt.h   |    5 ++++
>  2 files changed, 43 insertions(+), 2 deletions(-)
>
> diff --git a/board/samsung/smdk5250/spl_boot.c b/board/samsung/smdk5250/spl_boot.c
> index d8f3c1e..c0bcf46 100644
> --- a/board/samsung/smdk5250/spl_boot.c
> +++ b/board/samsung/smdk5250/spl_boot.c
> @@ -32,6 +32,21 @@ enum boot_mode {
>  };
>
>         typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
> +       typedef u32 (*usb_copy_func_t)(void);
> +
> +/*
> + * Set/clear program flow prediction and return the previous state.
> + */
> +static int config_branch_prediction(int set_cr_z)
> +{
> +       unsigned int cr;
> +
> +       /* System Control Register: 11th bit Z Branch prediction enable */
> +       cr = get_cr();
> +       set_cr(set_cr_z ? cr | CR_Z : cr & ~CR_Z);
> +
> +       return cr & CR_Z;
> +}
>
>  /*
>  * Copy U-boot from mmc to RAM:
> @@ -41,10 +56,20 @@ enum boot_mode {
>  void copy_uboot_to_ram(void)
>  {
>         spi_copy_func_t spi_copy;
> -       enum boot_mode bootmode;
> +       usb_copy_func_t usb_copy;
> +
> +       int is_cr_z_set;
> +       unsigned int sec_boot_check;
> +       enum boot_mode bootmode = BOOT_MODE_OM;
>         u32 (*copy_bl2)(u32, u32, u32);
>
> -       bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
> +       /* Read iRAM location to check for secondary USB boot mode */
> +       sec_boot_check = readl(EXYNOS_IRAM_SECONDARY_BASE);
> +       if (sec_boot_check == EXYNOS_USB_SECONDARY_BOOT)
> +               bootmode = BOOT_MODE_USB;
> +
> +       if (bootmode == BOOT_MODE_OM)
> +               bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
>
>         switch (bootmode) {
>         case BOOT_MODE_SERIAL:
> @@ -57,6 +82,17 @@ void copy_uboot_to_ram(void)
>                 copy_bl2(BL2_START_OFFSET, BL2_SIZE_BLOC_COUNT,
>                                                 CONFIG_SYS_TEXT_BASE);
>                 break;
> +       case BOOT_MODE_USB:
> +               /*
> +                * iROM needs program flow prediction to be disabled
> +                * before copy from USB device to RAM
> +                */
> +               is_cr_z_set = config_branch_prediction(0);
> +               usb_copy = *(usb_copy_func_t *)
> +                               EXYNOS_COPY_USB_FNPTR_ADDR;
> +               usb_copy();
> +               config_branch_prediction(is_cr_z_set);
> +               break;
>         default:
>                 break;
>         }
> diff --git a/include/configs/exynos5250-dt.h b/include/configs/exynos5250-dt.h
> index cabd2f2..6728b0e 100644
> --- a/include/configs/exynos5250-dt.h
> +++ b/include/configs/exynos5250-dt.h
> @@ -123,6 +123,11 @@
>  #define CONFIG_USB_EHCI_EXYNOS
>  #define CONFIG_USB_STORAGE
>
> +/* USB boot mode */
> +#define EXYNOS_COPY_USB_FNPTR_ADDR     0x02020070
> +#define EXYNOS_USB_SECONDARY_BOOT      0xfeed0002
> +#define EXYNOS_IRAM_SECONDARY_BASE     0x02020018


What happened to the function pointer table patch?

> +
>  /* MMC SPL */
>  #define CONFIG_SPL
>  #define COPY_BL2_FNPTR_ADDR    0x02020030
> --
> 1.7.6.5
>

Regards,
Simon
Vivek Gautam Feb. 6, 2013, 5:04 a.m. UTC | #2
Hi Simon,


On Tue, Feb 5, 2013 at 2:56 AM, Simon Glass <sjg@chromium.org> wrote:
> Hi,
>
> On Mon, Jan 28, 2013 at 2:39 AM, Vivek Gautam <gautam.vivek@samsung.com> wrote:
>> Exynos5250 supports secondary USB device boot mode. If the iROM fails
>> to download u-boot from the primary boot device (such as SD or eMMC),
>> it will try to retrieve from the secondary boot device (such as USB).
>>
>> Signed-off-by: Naveen Krishna Ch <ch.naveen@samsung.com>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
>
> Acked-by: Simon Glass <sjg@chromium.org>
>

Thanks for reviewing.

> But please see comment below.
>
>> ---
>>
>> NOTE:
>>  - Based on 'master' branch of u-boot-samsung.
>>  - Tested with smdk5250 for usb download mode.
>>
>>  board/samsung/smdk5250/spl_boot.c |   40 +++++++++++++++++++++++++++++++++++-
>>  include/configs/exynos5250-dt.h   |    5 ++++
>>  2 files changed, 43 insertions(+), 2 deletions(-)
>>
>> diff --git a/board/samsung/smdk5250/spl_boot.c b/board/samsung/smdk5250/spl_boot.c
>> index d8f3c1e..c0bcf46 100644
>> --- a/board/samsung/smdk5250/spl_boot.c
>> +++ b/board/samsung/smdk5250/spl_boot.c
>> @@ -32,6 +32,21 @@ enum boot_mode {
>>  };
>>
>>         typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>> +       typedef u32 (*usb_copy_func_t)(void);
>> +
>> +/*
>> + * Set/clear program flow prediction and return the previous state.
>> + */
>> +static int config_branch_prediction(int set_cr_z)
>> +{
>> +       unsigned int cr;
>> +
>> +       /* System Control Register: 11th bit Z Branch prediction enable */
>> +       cr = get_cr();
>> +       set_cr(set_cr_z ? cr | CR_Z : cr & ~CR_Z);
>> +
>> +       return cr & CR_Z;
>> +}
>>
>>  /*
>>  * Copy U-boot from mmc to RAM:
>> @@ -41,10 +56,20 @@ enum boot_mode {
>>  void copy_uboot_to_ram(void)
>>  {
>>         spi_copy_func_t spi_copy;
>> -       enum boot_mode bootmode;
>> +       usb_copy_func_t usb_copy;
>> +
>> +       int is_cr_z_set;
>> +       unsigned int sec_boot_check;
>> +       enum boot_mode bootmode = BOOT_MODE_OM;
>>         u32 (*copy_bl2)(u32, u32, u32);
>>
>> -       bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
>> +       /* Read iRAM location to check for secondary USB boot mode */
>> +       sec_boot_check = readl(EXYNOS_IRAM_SECONDARY_BASE);
>> +       if (sec_boot_check == EXYNOS_USB_SECONDARY_BOOT)
>> +               bootmode = BOOT_MODE_USB;
>> +
>> +       if (bootmode == BOOT_MODE_OM)
>> +               bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
>>
>>         switch (bootmode) {
>>         case BOOT_MODE_SERIAL:
>> @@ -57,6 +82,17 @@ void copy_uboot_to_ram(void)
>>                 copy_bl2(BL2_START_OFFSET, BL2_SIZE_BLOC_COUNT,
>>                                                 CONFIG_SYS_TEXT_BASE);
>>                 break;
>> +       case BOOT_MODE_USB:
>> +               /*
>> +                * iROM needs program flow prediction to be disabled
>> +                * before copy from USB device to RAM
>> +                */
>> +               is_cr_z_set = config_branch_prediction(0);
>> +               usb_copy = *(usb_copy_func_t *)
>> +                               EXYNOS_COPY_USB_FNPTR_ADDR;
>> +               usb_copy();
>> +               config_branch_prediction(is_cr_z_set);
>> +               break;
>>         default:
>>                 break;
>>         }
>> diff --git a/include/configs/exynos5250-dt.h b/include/configs/exynos5250-dt.h
>> index cabd2f2..6728b0e 100644
>> --- a/include/configs/exynos5250-dt.h
>> +++ b/include/configs/exynos5250-dt.h
>> @@ -123,6 +123,11 @@
>>  #define CONFIG_USB_EHCI_EXYNOS
>>  #define CONFIG_USB_STORAGE
>>
>> +/* USB boot mode */
>> +#define EXYNOS_COPY_USB_FNPTR_ADDR     0x02020070
>> +#define EXYNOS_USB_SECONDARY_BOOT      0xfeed0002
>> +#define EXYNOS_IRAM_SECONDARY_BASE     0x02020018
>
>
> What happened to the function pointer table patch?
>
I think i missed that patch from Amar, :-(
will remove these #defines and use the function pointer table instead.

>> +
>>  /* MMC SPL */
>>  #define CONFIG_SPL
>>  #define COPY_BL2_FNPTR_ADDR    0x02020030
>> --
>> 1.7.6.5
>>
>
Simon Glass April 13, 2013, 2:20 p.m. UTC | #3
Hi,

On Tue, Feb 5, 2013 at 9:04 PM, Vivek Gautam <gautamvivek1987@gmail.com> wrote:
> Hi Simon,
>
>
> On Tue, Feb 5, 2013 at 2:56 AM, Simon Glass <sjg@chromium.org> wrote:
>> Hi,
>>
>> On Mon, Jan 28, 2013 at 2:39 AM, Vivek Gautam <gautam.vivek@samsung.com> wrote:
>>> Exynos5250 supports secondary USB device boot mode. If the iROM fails
>>> to download u-boot from the primary boot device (such as SD or eMMC),
>>> it will try to retrieve from the secondary boot device (such as USB).
>>>
>>> Signed-off-by: Naveen Krishna Ch <ch.naveen@samsung.com>
>>> Signed-off-by: Simon Glass <sjg@chromium.org>
>>> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
>>
>> Acked-by: Simon Glass <sjg@chromium.org>
>>
>
> Thanks for reviewing.
>
>> But please see comment below.
>>
>>> ---
>>>
>>> NOTE:
>>>  - Based on 'master' branch of u-boot-samsung.
>>>  - Tested with smdk5250 for usb download mode.
>>>
>>>  board/samsung/smdk5250/spl_boot.c |   40 +++++++++++++++++++++++++++++++++++-
>>>  include/configs/exynos5250-dt.h   |    5 ++++
>>>  2 files changed, 43 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/board/samsung/smdk5250/spl_boot.c b/board/samsung/smdk5250/spl_boot.c
>>> index d8f3c1e..c0bcf46 100644
>>> --- a/board/samsung/smdk5250/spl_boot.c
>>> +++ b/board/samsung/smdk5250/spl_boot.c
>>> @@ -32,6 +32,21 @@ enum boot_mode {
>>>  };
>>>
>>>         typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>>> +       typedef u32 (*usb_copy_func_t)(void);
>>> +
>>> +/*
>>> + * Set/clear program flow prediction and return the previous state.
>>> + */
>>> +static int config_branch_prediction(int set_cr_z)
>>> +{
>>> +       unsigned int cr;
>>> +
>>> +       /* System Control Register: 11th bit Z Branch prediction enable */
>>> +       cr = get_cr();
>>> +       set_cr(set_cr_z ? cr | CR_Z : cr & ~CR_Z);
>>> +
>>> +       return cr & CR_Z;
>>> +}
>>>
>>>  /*
>>>  * Copy U-boot from mmc to RAM:
>>> @@ -41,10 +56,20 @@ enum boot_mode {
>>>  void copy_uboot_to_ram(void)
>>>  {
>>>         spi_copy_func_t spi_copy;
>>> -       enum boot_mode bootmode;
>>> +       usb_copy_func_t usb_copy;
>>> +
>>> +       int is_cr_z_set;
>>> +       unsigned int sec_boot_check;
>>> +       enum boot_mode bootmode = BOOT_MODE_OM;
>>>         u32 (*copy_bl2)(u32, u32, u32);
>>>
>>> -       bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
>>> +       /* Read iRAM location to check for secondary USB boot mode */
>>> +       sec_boot_check = readl(EXYNOS_IRAM_SECONDARY_BASE);
>>> +       if (sec_boot_check == EXYNOS_USB_SECONDARY_BOOT)
>>> +               bootmode = BOOT_MODE_USB;
>>> +
>>> +       if (bootmode == BOOT_MODE_OM)
>>> +               bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
>>>
>>>         switch (bootmode) {
>>>         case BOOT_MODE_SERIAL:
>>> @@ -57,6 +82,17 @@ void copy_uboot_to_ram(void)
>>>                 copy_bl2(BL2_START_OFFSET, BL2_SIZE_BLOC_COUNT,
>>>                                                 CONFIG_SYS_TEXT_BASE);
>>>                 break;
>>> +       case BOOT_MODE_USB:
>>> +               /*
>>> +                * iROM needs program flow prediction to be disabled
>>> +                * before copy from USB device to RAM
>>> +                */
>>> +               is_cr_z_set = config_branch_prediction(0);
>>> +               usb_copy = *(usb_copy_func_t *)
>>> +                               EXYNOS_COPY_USB_FNPTR_ADDR;
>>> +               usb_copy();
>>> +               config_branch_prediction(is_cr_z_set);
>>> +               break;
>>>         default:
>>>                 break;
>>>         }
>>> diff --git a/include/configs/exynos5250-dt.h b/include/configs/exynos5250-dt.h
>>> index cabd2f2..6728b0e 100644
>>> --- a/include/configs/exynos5250-dt.h
>>> +++ b/include/configs/exynos5250-dt.h
>>> @@ -123,6 +123,11 @@
>>>  #define CONFIG_USB_EHCI_EXYNOS
>>>  #define CONFIG_USB_STORAGE
>>>
>>> +/* USB boot mode */
>>> +#define EXYNOS_COPY_USB_FNPTR_ADDR     0x02020070
>>> +#define EXYNOS_USB_SECONDARY_BOOT      0xfeed0002
>>> +#define EXYNOS_IRAM_SECONDARY_BASE     0x02020018
>>
>>
>> What happened to the function pointer table patch?
>>
> I think i missed that patch from Amar, :-(
> will remove these #defines and use the function pointer table instead.

I notice that this patch has not made it to mainline. It really should
be there since without it it is not possible to USB boot on snow,
which makes development awkward.

Can we get this applied in time for the release? The comment made
above can be dealt with later perhaps.

Regards,
Simon
Vivek Gautam April 15, 2013, 5:36 a.m. UTC | #4
Hi,


On Sat, Apr 13, 2013 at 7:50 PM, Simon Glass <sjg@chromium.org> wrote:
> Hi,
>
> On Tue, Feb 5, 2013 at 9:04 PM, Vivek Gautam <gautamvivek1987@gmail.com> wrote:
>> Hi Simon,
>>
>>
>> On Tue, Feb 5, 2013 at 2:56 AM, Simon Glass <sjg@chromium.org> wrote:
>>> Hi,
>>>
>>> On Mon, Jan 28, 2013 at 2:39 AM, Vivek Gautam <gautam.vivek@samsung.com> wrote:
>>>> Exynos5250 supports secondary USB device boot mode. If the iROM fails
>>>> to download u-boot from the primary boot device (such as SD or eMMC),
>>>> it will try to retrieve from the secondary boot device (such as USB).
>>>>
>>>> Signed-off-by: Naveen Krishna Ch <ch.naveen@samsung.com>
>>>> Signed-off-by: Simon Glass <sjg@chromium.org>
>>>> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
>>>
>>> Acked-by: Simon Glass <sjg@chromium.org>
>>>
>>
>> Thanks for reviewing.
>>
>>> But please see comment below.
>>>
>>>> ---
>>>>
>>>> NOTE:
>>>>  - Based on 'master' branch of u-boot-samsung.
>>>>  - Tested with smdk5250 for usb download mode.
>>>>
>>>>  board/samsung/smdk5250/spl_boot.c |   40 +++++++++++++++++++++++++++++++++++-
>>>>  include/configs/exynos5250-dt.h   |    5 ++++
>>>>  2 files changed, 43 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/board/samsung/smdk5250/spl_boot.c b/board/samsung/smdk5250/spl_boot.c
>>>> index d8f3c1e..c0bcf46 100644
>>>> --- a/board/samsung/smdk5250/spl_boot.c
>>>> +++ b/board/samsung/smdk5250/spl_boot.c
>>>> @@ -32,6 +32,21 @@ enum boot_mode {
>>>>  };
>>>>
>>>>         typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>>>> +       typedef u32 (*usb_copy_func_t)(void);
>>>> +
>>>> +/*
>>>> + * Set/clear program flow prediction and return the previous state.
>>>> + */
>>>> +static int config_branch_prediction(int set_cr_z)
>>>> +{
>>>> +       unsigned int cr;
>>>> +
>>>> +       /* System Control Register: 11th bit Z Branch prediction enable */
>>>> +       cr = get_cr();
>>>> +       set_cr(set_cr_z ? cr | CR_Z : cr & ~CR_Z);
>>>> +
>>>> +       return cr & CR_Z;
>>>> +}
>>>>
>>>>  /*
>>>>  * Copy U-boot from mmc to RAM:
>>>> @@ -41,10 +56,20 @@ enum boot_mode {
>>>>  void copy_uboot_to_ram(void)
>>>>  {
>>>>         spi_copy_func_t spi_copy;
>>>> -       enum boot_mode bootmode;
>>>> +       usb_copy_func_t usb_copy;
>>>> +
>>>> +       int is_cr_z_set;
>>>> +       unsigned int sec_boot_check;
>>>> +       enum boot_mode bootmode = BOOT_MODE_OM;
>>>>         u32 (*copy_bl2)(u32, u32, u32);
>>>>
>>>> -       bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
>>>> +       /* Read iRAM location to check for secondary USB boot mode */
>>>> +       sec_boot_check = readl(EXYNOS_IRAM_SECONDARY_BASE);
>>>> +       if (sec_boot_check == EXYNOS_USB_SECONDARY_BOOT)
>>>> +               bootmode = BOOT_MODE_USB;
>>>> +
>>>> +       if (bootmode == BOOT_MODE_OM)
>>>> +               bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
>>>>
>>>>         switch (bootmode) {
>>>>         case BOOT_MODE_SERIAL:
>>>> @@ -57,6 +82,17 @@ void copy_uboot_to_ram(void)
>>>>                 copy_bl2(BL2_START_OFFSET, BL2_SIZE_BLOC_COUNT,
>>>>                                                 CONFIG_SYS_TEXT_BASE);
>>>>                 break;
>>>> +       case BOOT_MODE_USB:
>>>> +               /*
>>>> +                * iROM needs program flow prediction to be disabled
>>>> +                * before copy from USB device to RAM
>>>> +                */
>>>> +               is_cr_z_set = config_branch_prediction(0);
>>>> +               usb_copy = *(usb_copy_func_t *)
>>>> +                               EXYNOS_COPY_USB_FNPTR_ADDR;
>>>> +               usb_copy();
>>>> +               config_branch_prediction(is_cr_z_set);
>>>> +               break;
>>>>         default:
>>>>                 break;
>>>>         }
>>>> diff --git a/include/configs/exynos5250-dt.h b/include/configs/exynos5250-dt.h
>>>> index cabd2f2..6728b0e 100644
>>>> --- a/include/configs/exynos5250-dt.h
>>>> +++ b/include/configs/exynos5250-dt.h
>>>> @@ -123,6 +123,11 @@
>>>>  #define CONFIG_USB_EHCI_EXYNOS
>>>>  #define CONFIG_USB_STORAGE
>>>>
>>>> +/* USB boot mode */
>>>> +#define EXYNOS_COPY_USB_FNPTR_ADDR     0x02020070
>>>> +#define EXYNOS_USB_SECONDARY_BOOT      0xfeed0002
>>>> +#define EXYNOS_IRAM_SECONDARY_BASE     0x02020018
>>>
>>>
>>> What happened to the function pointer table patch?
>>>
>> I think i missed that patch from Amar, :-(
>> will remove these #defines and use the function pointer table instead.
>
> I notice that this patch has not made it to mainline. It really should
> be there since without it it is not possible to USB boot on snow,
> which makes development awkward.
>
> Can we get this applied in time for the release? The comment made
> above can be dealt with later perhaps.

Sorry for not responding to this patch for long, but was still waiting
for Amar's emmc booting patch
to get merged (which carries the funtion pointer table).

Hi Minkyu,
Is it fine with you if we pull this in for now, and post a patch later
to make things aligned
with funtion-pointer table ?

This patch cleanly applies on u-boot-samsung/master.
Minkyu Kang April 17, 2013, 2:09 a.m. UTC | #5
On 15/04/13 14:36, Vivek Gautam wrote:
> Hi,
> 
> 
> On Sat, Apr 13, 2013 at 7:50 PM, Simon Glass <sjg@chromium.org> wrote:
>> Hi,
>>
>> On Tue, Feb 5, 2013 at 9:04 PM, Vivek Gautam <gautamvivek1987@gmail.com> wrote:
>>> Hi Simon,
>>>
>>>
>>> On Tue, Feb 5, 2013 at 2:56 AM, Simon Glass <sjg@chromium.org> wrote:
>>>> Hi,
>>>>
>>>> On Mon, Jan 28, 2013 at 2:39 AM, Vivek Gautam <gautam.vivek@samsung.com> wrote:
>>>>> Exynos5250 supports secondary USB device boot mode. If the iROM fails
>>>>> to download u-boot from the primary boot device (such as SD or eMMC),
>>>>> it will try to retrieve from the secondary boot device (such as USB).
>>>>>
>>>>> Signed-off-by: Naveen Krishna Ch <ch.naveen@samsung.com>
>>>>> Signed-off-by: Simon Glass <sjg@chromium.org>
>>>>> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
>>>>
>>>> Acked-by: Simon Glass <sjg@chromium.org>
>>>>
>>>
>>> Thanks for reviewing.
>>>
>>>> But please see comment below.
>>>>
>>>>> ---
>>>>>
>>>>> NOTE:
>>>>>  - Based on 'master' branch of u-boot-samsung.
>>>>>  - Tested with smdk5250 for usb download mode.
>>>>>
>>>>>  board/samsung/smdk5250/spl_boot.c |   40 +++++++++++++++++++++++++++++++++++-
>>>>>  include/configs/exynos5250-dt.h   |    5 ++++
>>>>>  2 files changed, 43 insertions(+), 2 deletions(-)
>>>>>
>>>>> diff --git a/board/samsung/smdk5250/spl_boot.c b/board/samsung/smdk5250/spl_boot.c
>>>>> index d8f3c1e..c0bcf46 100644
>>>>> --- a/board/samsung/smdk5250/spl_boot.c
>>>>> +++ b/board/samsung/smdk5250/spl_boot.c
>>>>> @@ -32,6 +32,21 @@ enum boot_mode {
>>>>>  };
>>>>>
>>>>>         typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
>>>>> +       typedef u32 (*usb_copy_func_t)(void);
>>>>> +
>>>>> +/*
>>>>> + * Set/clear program flow prediction and return the previous state.
>>>>> + */
>>>>> +static int config_branch_prediction(int set_cr_z)
>>>>> +{
>>>>> +       unsigned int cr;
>>>>> +
>>>>> +       /* System Control Register: 11th bit Z Branch prediction enable */
>>>>> +       cr = get_cr();
>>>>> +       set_cr(set_cr_z ? cr | CR_Z : cr & ~CR_Z);
>>>>> +
>>>>> +       return cr & CR_Z;
>>>>> +}
>>>>>
>>>>>  /*
>>>>>  * Copy U-boot from mmc to RAM:
>>>>> @@ -41,10 +56,20 @@ enum boot_mode {
>>>>>  void copy_uboot_to_ram(void)
>>>>>  {
>>>>>         spi_copy_func_t spi_copy;
>>>>> -       enum boot_mode bootmode;
>>>>> +       usb_copy_func_t usb_copy;
>>>>> +
>>>>> +       int is_cr_z_set;
>>>>> +       unsigned int sec_boot_check;
>>>>> +       enum boot_mode bootmode = BOOT_MODE_OM;
>>>>>         u32 (*copy_bl2)(u32, u32, u32);
>>>>>
>>>>> -       bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
>>>>> +       /* Read iRAM location to check for secondary USB boot mode */
>>>>> +       sec_boot_check = readl(EXYNOS_IRAM_SECONDARY_BASE);
>>>>> +       if (sec_boot_check == EXYNOS_USB_SECONDARY_BOOT)
>>>>> +               bootmode = BOOT_MODE_USB;
>>>>> +
>>>>> +       if (bootmode == BOOT_MODE_OM)
>>>>> +               bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
>>>>>
>>>>>         switch (bootmode) {
>>>>>         case BOOT_MODE_SERIAL:
>>>>> @@ -57,6 +82,17 @@ void copy_uboot_to_ram(void)
>>>>>                 copy_bl2(BL2_START_OFFSET, BL2_SIZE_BLOC_COUNT,
>>>>>                                                 CONFIG_SYS_TEXT_BASE);
>>>>>                 break;
>>>>> +       case BOOT_MODE_USB:
>>>>> +               /*
>>>>> +                * iROM needs program flow prediction to be disabled
>>>>> +                * before copy from USB device to RAM
>>>>> +                */
>>>>> +               is_cr_z_set = config_branch_prediction(0);
>>>>> +               usb_copy = *(usb_copy_func_t *)
>>>>> +                               EXYNOS_COPY_USB_FNPTR_ADDR;
>>>>> +               usb_copy();
>>>>> +               config_branch_prediction(is_cr_z_set);
>>>>> +               break;
>>>>>         default:
>>>>>                 break;
>>>>>         }
>>>>> diff --git a/include/configs/exynos5250-dt.h b/include/configs/exynos5250-dt.h
>>>>> index cabd2f2..6728b0e 100644
>>>>> --- a/include/configs/exynos5250-dt.h
>>>>> +++ b/include/configs/exynos5250-dt.h
>>>>> @@ -123,6 +123,11 @@
>>>>>  #define CONFIG_USB_EHCI_EXYNOS
>>>>>  #define CONFIG_USB_STORAGE
>>>>>
>>>>> +/* USB boot mode */
>>>>> +#define EXYNOS_COPY_USB_FNPTR_ADDR     0x02020070
>>>>> +#define EXYNOS_USB_SECONDARY_BOOT      0xfeed0002
>>>>> +#define EXYNOS_IRAM_SECONDARY_BASE     0x02020018
>>>>
>>>>
>>>> What happened to the function pointer table patch?
>>>>
>>> I think i missed that patch from Amar, :-(
>>> will remove these #defines and use the function pointer table instead.
>>
>> I notice that this patch has not made it to mainline. It really should
>> be there since without it it is not possible to USB boot on snow,
>> which makes development awkward.
>>
>> Can we get this applied in time for the release? The comment made
>> above can be dealt with later perhaps.
> 
> Sorry for not responding to this patch for long, but was still waiting
> for Amar's emmc booting patch
> to get merged (which carries the funtion pointer table).
> 
> Hi Minkyu,
> Is it fine with you if we pull this in for now, and post a patch later
> to make things aligned
> with funtion-pointer table ?
> 
> This patch cleanly applies on u-boot-samsung/master.
> 
> 

applied to u-boot-samsung

Thanks,
Minkyu Kang.
diff mbox

Patch

diff --git a/board/samsung/smdk5250/spl_boot.c b/board/samsung/smdk5250/spl_boot.c
index d8f3c1e..c0bcf46 100644
--- a/board/samsung/smdk5250/spl_boot.c
+++ b/board/samsung/smdk5250/spl_boot.c
@@ -32,6 +32,21 @@  enum boot_mode {
 };
 
 	typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
+	typedef u32 (*usb_copy_func_t)(void);
+
+/*
+ * Set/clear program flow prediction and return the previous state.
+ */
+static int config_branch_prediction(int set_cr_z)
+{
+	unsigned int cr;
+
+	/* System Control Register: 11th bit Z Branch prediction enable */
+	cr = get_cr();
+	set_cr(set_cr_z ? cr | CR_Z : cr & ~CR_Z);
+
+	return cr & CR_Z;
+}
 
 /*
 * Copy U-boot from mmc to RAM:
@@ -41,10 +56,20 @@  enum boot_mode {
 void copy_uboot_to_ram(void)
 {
 	spi_copy_func_t spi_copy;
-	enum boot_mode bootmode;
+	usb_copy_func_t usb_copy;
+
+	int is_cr_z_set;
+	unsigned int sec_boot_check;
+	enum boot_mode bootmode = BOOT_MODE_OM;
 	u32 (*copy_bl2)(u32, u32, u32);
 
-	bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
+	/* Read iRAM location to check for secondary USB boot mode */
+	sec_boot_check = readl(EXYNOS_IRAM_SECONDARY_BASE);
+	if (sec_boot_check == EXYNOS_USB_SECONDARY_BOOT)
+		bootmode = BOOT_MODE_USB;
+
+	if (bootmode == BOOT_MODE_OM)
+		bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
 
 	switch (bootmode) {
 	case BOOT_MODE_SERIAL:
@@ -57,6 +82,17 @@  void copy_uboot_to_ram(void)
 		copy_bl2(BL2_START_OFFSET, BL2_SIZE_BLOC_COUNT,
 						CONFIG_SYS_TEXT_BASE);
 		break;
+	case BOOT_MODE_USB:
+		/*
+		 * iROM needs program flow prediction to be disabled
+		 * before copy from USB device to RAM
+		 */
+		is_cr_z_set = config_branch_prediction(0);
+		usb_copy = *(usb_copy_func_t *)
+				EXYNOS_COPY_USB_FNPTR_ADDR;
+		usb_copy();
+		config_branch_prediction(is_cr_z_set);
+		break;
 	default:
 		break;
 	}
diff --git a/include/configs/exynos5250-dt.h b/include/configs/exynos5250-dt.h
index cabd2f2..6728b0e 100644
--- a/include/configs/exynos5250-dt.h
+++ b/include/configs/exynos5250-dt.h
@@ -123,6 +123,11 @@ 
 #define CONFIG_USB_EHCI_EXYNOS
 #define CONFIG_USB_STORAGE
 
+/* USB boot mode */
+#define EXYNOS_COPY_USB_FNPTR_ADDR	0x02020070
+#define EXYNOS_USB_SECONDARY_BOOT	0xfeed0002
+#define EXYNOS_IRAM_SECONDARY_BASE	0x02020018
+
 /* MMC SPL */
 #define CONFIG_SPL
 #define COPY_BL2_FNPTR_ADDR	0x02020030