]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/samsung/smdk5250/spl_boot.c
arm: pxa: config option for PXA270 turbo mode
[karo-tx-uboot.git] / board / samsung / smdk5250 / spl_boot.c
1 /*
2  * Copyright (C) 2012 Samsung Electronics
3  *
4  * See file CREDITS for list of people who contributed to this
5  * project.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 of
10  * the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20  * MA 02111-1307 USA
21  */
22
23 #include<common.h>
24 #include<config.h>
25
26 enum boot_mode {
27         BOOT_MODE_MMC = 4,
28         BOOT_MODE_SERIAL = 20,
29         /* Boot based on Operating Mode pin settings */
30         BOOT_MODE_OM = 32,
31         BOOT_MODE_USB,  /* Boot using USB download */
32 };
33
34         typedef u32 (*spi_copy_func_t)(u32 offset, u32 nblock, u32 dst);
35         typedef u32 (*usb_copy_func_t)(void);
36
37 /*
38  * Set/clear program flow prediction and return the previous state.
39  */
40 static int config_branch_prediction(int set_cr_z)
41 {
42         unsigned int cr;
43
44         /* System Control Register: 11th bit Z Branch prediction enable */
45         cr = get_cr();
46         set_cr(set_cr_z ? cr | CR_Z : cr & ~CR_Z);
47
48         return cr & CR_Z;
49 }
50
51 /*
52 * Copy U-boot from mmc to RAM:
53 * COPY_BL2_FNPTR_ADDR: Address in iRAM, which Contains
54 * Pointer to API (Data transfer from mmc to ram)
55 */
56 void copy_uboot_to_ram(void)
57 {
58         spi_copy_func_t spi_copy;
59         usb_copy_func_t usb_copy;
60
61         int is_cr_z_set;
62         unsigned int sec_boot_check;
63         enum boot_mode bootmode = BOOT_MODE_OM;
64         u32 (*copy_bl2)(u32, u32, u32);
65
66         /* Read iRAM location to check for secondary USB boot mode */
67         sec_boot_check = readl(EXYNOS_IRAM_SECONDARY_BASE);
68         if (sec_boot_check == EXYNOS_USB_SECONDARY_BOOT)
69                 bootmode = BOOT_MODE_USB;
70
71         if (bootmode == BOOT_MODE_OM)
72                 bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
73
74         switch (bootmode) {
75         case BOOT_MODE_SERIAL:
76                 spi_copy = *(spi_copy_func_t *)EXYNOS_COPY_SPI_FNPTR_ADDR;
77                 spi_copy(SPI_FLASH_UBOOT_POS, CONFIG_BL2_SIZE,
78                                                 CONFIG_SYS_TEXT_BASE);
79                 break;
80         case BOOT_MODE_MMC:
81                 copy_bl2 = (void *) *(u32 *)COPY_BL2_FNPTR_ADDR;
82                 copy_bl2(BL2_START_OFFSET, BL2_SIZE_BLOC_COUNT,
83                                                 CONFIG_SYS_TEXT_BASE);
84                 break;
85         case BOOT_MODE_USB:
86                 /*
87                  * iROM needs program flow prediction to be disabled
88                  * before copy from USB device to RAM
89                  */
90                 is_cr_z_set = config_branch_prediction(0);
91                 usb_copy = *(usb_copy_func_t *)
92                                 EXYNOS_COPY_USB_FNPTR_ADDR;
93                 usb_copy();
94                 config_branch_prediction(is_cr_z_set);
95                 break;
96         default:
97                 break;
98         }
99 }
100
101 void board_init_f(unsigned long bootflag)
102 {
103         __attribute__((noreturn)) void (*uboot)(void);
104         copy_uboot_to_ram();
105
106         /* Jump to U-Boot image */
107         uboot = (void *)CONFIG_SYS_TEXT_BASE;
108         (*uboot)();
109         /* Never returns Here */
110 }
111
112 /* Place Holders */
113 void board_init_r(gd_t *id, ulong dest_addr)
114 {
115         /* Function attribute is no-return */
116         /* This Function never executes */
117         while (1)
118                 ;
119 }
120
121 void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3) {}