Message ID | 1359369599-30404-1-git-send-email-gautam.vivek@samsung.com |
---|---|
State | Accepted |
Commit | 70656c79f3c85df77b65cda0237f5454851186ca |
Headers | show |
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
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 >> >
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
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.
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 --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