diff --git a/arch/arm/boards/efika-mx-smartbook/board.c b/arch/arm/boards/efika-mx-smartbook/board.c index 5c02689..e9b6062 100644 --- a/arch/arm/boards/efika-mx-smartbook/board.c +++ b/arch/arm/boards/efika-mx-smartbook/board.c @@ -14,6 +14,7 @@ */ #include +#include #include #include #include @@ -479,7 +480,7 @@ static int efikamx_part_init(void) { - if (imx_bootsource() == bootsource_mmc) { + if (bootsource_get() == BOOTSOURCE_MMC) { devfs_add_partition("mmc_left", 0x00000, 0x80000, DEVFS_PARTITION_FIXED, "self0"); devfs_add_partition("mmc_left", 0x80000, 0x80000, diff --git a/arch/arm/boards/efika-mx-smartbook/env/init/bootsource b/arch/arm/boards/efika-mx-smartbook/env/init/bootsource index fb08469..380e855 100644 --- a/arch/arm/boards/efika-mx-smartbook/env/init/bootsource +++ b/arch/arm/boards/efika-mx-smartbook/env/init/bootsource @@ -3,7 +3,7 @@ # by default pick kernel from MMC card if booting from # it, otherwise default to boot from internal harddisk -if [ $barebox_loc = mmc ]; then +if [ $bootsource = mmc ]; then global.boot.default=mmc-left else global.boot.default=hd-internal diff --git a/arch/arm/boards/karo-tx53/board.c b/arch/arm/boards/karo-tx53/board.c index 8a69e99..7e1ef37 100644 --- a/arch/arm/boards/karo-tx53/board.c +++ b/arch/arm/boards/karo-tx53/board.c @@ -13,6 +13,7 @@ * */ #include +#include #include #include #include @@ -234,13 +235,13 @@ { const char *envdev; - switch (imx_bootsource()) { - case bootsource_mmc: + switch (bootsource_get()) { + case BOOTSOURCE_MMC: devfs_add_partition("disk0", 0x00000, SZ_512K, DEVFS_PARTITION_FIXED, "self0"); devfs_add_partition("disk0", SZ_512K, SZ_1M, DEVFS_PARTITION_FIXED, "env0"); envdev = "MMC"; break; - case bootsource_nand: + case BOOTSOURCE_NAND: default: devfs_add_partition("nand0", 0x00000, 0x80000, DEVFS_PARTITION_FIXED, "self_raw"); dev_add_bb_dev("self_raw", "self0"); diff --git a/arch/arm/boards/pcm038/pcm038.c b/arch/arm/boards/pcm038/pcm038.c index 587ace8..3fb1100 100644 --- a/arch/arm/boards/pcm038/pcm038.c +++ b/arch/arm/boards/pcm038/pcm038.c @@ -16,6 +16,7 @@ #define pr_fmt(fmt) "pcm038: " fmt #include +#include #include #include #include @@ -299,8 +300,8 @@ */ imx27_add_fec(&fec_info); - switch (imx_bootsource()) { - case bootsource_nand: + switch (bootsource_get()) { + case BOOTSOURCE_NAND: devfs_add_partition("nand0", 0x00000, 0x80000, DEVFS_PARTITION_FIXED, "self_raw"); dev_add_bb_dev("self_raw", "self0"); diff --git a/arch/arm/boards/pcm043/pcm043.c b/arch/arm/boards/pcm043/pcm043.c index 04418fb..b5ba275 100644 --- a/arch/arm/boards/pcm043/pcm043.c +++ b/arch/arm/boards/pcm043/pcm043.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -139,15 +140,15 @@ */ add_cfi_flash_device(DEVICE_ID_DYNAMIC, MX35_CS0_BASE_ADDR, 32 * 1024 * 1024, 0); - switch (imx_bootsource()) { - case bootsource_nand: + switch (bootsource_get()) { + case BOOTSOURCE_NAND: devfs_add_partition("nand0", 0x00000, SZ_512K, DEVFS_PARTITION_FIXED, "self_raw"); dev_add_bb_dev("self_raw", "self0"); devfs_add_partition("nand0", SZ_512K, SZ_256K, DEVFS_PARTITION_FIXED, "env_raw"); dev_add_bb_dev("env_raw", "env0"); envstr = "NAND"; break; - case bootsource_nor: + case BOOTSOURCE_NOR: default: devfs_add_partition("nor0", 0x00000, SZ_512K, DEVFS_PARTITION_FIXED, "self0"); /* ourself */ devfs_add_partition("nor0", SZ_512K, SZ_128K, DEVFS_PARTITION_FIXED, "env0"); /* environment */ diff --git a/arch/arm/mach-imx/boot.c b/arch/arm/mach-imx/boot.c index 8c7f8ee..bd0cb84 100644 --- a/arch/arm/mach-imx/boot.c +++ b/arch/arm/mach-imx/boot.c @@ -12,72 +12,43 @@ */ #include +#include #include #include #include #include #include - -static const char *bootsource_str[] = { - [bootsource_unknown] = "unknown", - [bootsource_nand] = "nand", - [bootsource_nor] = "nor", - [bootsource_mmc] = "mmc", - [bootsource_i2c] = "i2c", - [bootsource_spi] = "spi", - [bootsource_serial] = "serial", - [bootsource_onenand] = "onenand", - [bootsource_hd] = "harddisk", -}; - -static enum imx_bootsource bootsource; - -void imx_set_bootsource(enum imx_bootsource src) -{ - if (src >= ARRAY_SIZE(bootsource_str)) - src = bootsource_unknown; - - bootsource = src; - - setenv("barebox_loc", bootsource_str[src]); - export("barebox_loc"); -} - -enum imx_bootsource imx_bootsource(void) -{ - return bootsource; -} - -BAREBOX_MAGICVAR(barebox_loc, "The source barebox has been booted from"); +#include +#include /* [CTRL][TYPE] */ -static const enum imx_bootsource locations[4][4] = { +static const enum bootsource locations[4][4] = { { /* CTRL = WEIM */ - bootsource_nor, - bootsource_unknown, - bootsource_onenand, - bootsource_unknown, + BOOTSOURCE_NOR, + BOOTSOURCE_UNKNOWN, + BOOTSOURCE_ONENAND, + BOOTSOURCE_UNKNOWN, }, { /* CTRL == NAND */ - bootsource_nand, - bootsource_nand, - bootsource_nand, - bootsource_nand, + BOOTSOURCE_NAND, + BOOTSOURCE_NAND, + BOOTSOURCE_NAND, + BOOTSOURCE_NAND, }, { /* CTRL == ATA, (imx35 only) */ - bootsource_unknown, - bootsource_unknown, /* might be p-ata */ - bootsource_unknown, - bootsource_unknown, + BOOTSOURCE_UNKNOWN, + BOOTSOURCE_UNKNOWN, /* might be p-ata */ + BOOTSOURCE_UNKNOWN, + BOOTSOURCE_UNKNOWN, }, { /* CTRL == expansion */ - bootsource_mmc, /* note imx25 could also be: movinand, ce-ata */ - bootsource_unknown, - bootsource_i2c, - bootsource_spi, + BOOTSOURCE_MMC, /* note imx25 could also be: movinand, ce-ata */ + BOOTSOURCE_UNKNOWN, + BOOTSOURCE_I2C, + BOOTSOURCE_SPI, } }; /* - * Saves the boot source media into the $barebox_loc environment variable + * Saves the boot source media into the $bootsource environment variable * * This information is useful for barebox init scripts as we can then easily * use a kernel image stored on the same media that we launch barebox with @@ -94,20 +65,31 @@ * Note also that I suspect that the boot source pins are only sampled at * power up. */ -int imx_25_35_boot_save_loc(unsigned int ctrl, unsigned int type) +static void imx25_35_boot_save_loc(unsigned int ctrl, unsigned int type) { - const char *bareboxloc = NULL; - enum imx_bootsource src; + enum bootsource src; src = locations[ctrl][type]; - imx_set_bootsource(src); - if (bareboxloc) { - setenv("barebox_loc", bareboxloc); - export("barebox_loc"); - } + bootsource_set(src); +} - return 0; +void imx25_boot_save_loc(void __iomem *ccm_base) +{ + uint32_t val; + + val = readl(ccm_base + MX25_CCM_RCSR); + imx25_35_boot_save_loc((val >> MX25_CCM_RCSR_MEM_CTRL_SHIFT) & 0x3, + (val >> MX25_CCM_RCSR_MEM_TYPE_SHIFT) & 0x3); +} + +void imx35_boot_save_loc(void __iomem *ccm_base) +{ + uint32_t val; + + val = readl(ccm_base + MX35_CCM_RCSR); + imx25_35_boot_save_loc((val >> MX35_CCM_RCSR_MEM_CTRL_SHIFT) & 0x3, + (val >> MX35_CCM_RCSR_MEM_TYPE_SHIFT) & 0x3); } #define IMX27_SYSCTRL_GPCR 0x18 @@ -121,9 +103,9 @@ #define IMX27_GPCR_BOOT_32BIT_CS0 6 #define IMX27_GPCR_BOOT_8BIT_NAND_512 7 -void imx_27_boot_save_loc(void __iomem *sysctrl_base) +void imx27_boot_save_loc(void __iomem *sysctrl_base) { - enum imx_bootsource src; + enum bootsource src; uint32_t val; val = readl(sysctrl_base + IMX27_SYSCTRL_GPCR); @@ -132,20 +114,20 @@ switch (val) { case IMX27_GPCR_BOOT_UART_USB: - src = bootsource_serial; + src = BOOTSOURCE_SERIAL; break; case IMX27_GPCR_BOOT_8BIT_NAND_2k: case IMX27_GPCR_BOOT_16BIT_NAND_2k: case IMX27_GPCR_BOOT_16BIT_NAND_512: case IMX27_GPCR_BOOT_8BIT_NAND_512: - src = bootsource_nand; + src = BOOTSOURCE_NAND; break; default: - src = bootsource_nor; + src = BOOTSOURCE_NOR; break; } - imx_set_bootsource(src); + bootsource_set(src); } #define IMX51_SRC_SBMR 0x4 @@ -153,9 +135,9 @@ #define IMX51_SBMR_BT_MEM_CTL_SHIFT 0 #define IMX51_SBMR_BMOD_SHIFT 14 -int imx51_boot_save_loc(void __iomem *src_base) +void imx51_boot_save_loc(void __iomem *src_base) { - enum imx_bootsource src = bootsource_unknown; + enum bootsource src = BOOTSOURCE_UNKNOWN; uint32_t reg; unsigned int ctrl, type; @@ -172,59 +154,69 @@ break; case 1: /* reserved */ - src = bootsource_unknown; + src = BOOTSOURCE_UNKNOWN; break; case 3: - src = bootsource_serial; + src = BOOTSOURCE_SERIAL; break; } - imx_set_bootsource(src); - - return 0; + bootsource_set(src); } #define IMX53_SRC_SBMR 0x4 -int imx53_boot_save_loc(void __iomem *src_base) +void imx53_boot_save_loc(void __iomem *src_base) { - enum imx_bootsource src = bootsource_unknown; - uint32_t cfg1 = readl(src_base + IMX53_SRC_SBMR) & 0xff; + enum bootsource src = BOOTSOURCE_UNKNOWN; + int instance; + uint32_t cfg1 = readl(src_base + IMX53_SRC_SBMR); - switch (cfg1 >> 4) { + switch ((cfg1 & 0xff) >> 4) { case 2: - src = bootsource_hd; + src = BOOTSOURCE_HD; break; case 3: if (cfg1 & (1 << 3)) - src = bootsource_spi; + src = BOOTSOURCE_SPI; else - src = bootsource_i2c; + src = BOOTSOURCE_I2C; break; case 4: case 5: case 6: case 7: - src = bootsource_mmc; + src = BOOTSOURCE_MMC; break; default: break; } if (cfg1 & (1 << 7)) - src = bootsource_nand; + src = BOOTSOURCE_NAND; - imx_set_bootsource(src); - return 0; + switch (src) { + case BOOTSOURCE_MMC: + case BOOTSOURCE_SPI: + case BOOTSOURCE_I2C: + instance = (cfg1 >> 21) & 0x3; + break; + default: + instance = 0; + break; + } + + bootsource_set(src); + bootsource_set_instance(instance); } #define IMX6_SRC_SBMR1 0x04 #define IMX6_SRC_SBMR2 0x1c -int imx6_boot_save_loc(void __iomem *src_base) +void imx6_boot_save_loc(void __iomem *src_base) { - enum imx_bootsource src = bootsource_unknown; + enum bootsource src = BOOTSOURCE_UNKNOWN; uint32_t sbmr2 = readl(src_base + IMX6_SRC_SBMR2) >> 24; uint32_t cfg1 = readl(src_base + IMX6_SRC_SBMR1) & 0xff; uint32_t boot_cfg_4_2_0; @@ -237,44 +229,44 @@ case 2: /* internal boot */ goto internal_boot; case 1: /* Serial Downloader */ - src = bootsource_serial; + src = BOOTSOURCE_SERIAL; break; case 3: /* reserved */ break; }; - imx_set_bootsource(src); + bootsource_set(src); - return 0; + return; internal_boot: switch (cfg1 >> 4) { case 2: - src = bootsource_hd; + src = BOOTSOURCE_HD; break; case 3: boot_cfg_4_2_0 = (cfg1 >> 16) & 0x7; if (boot_cfg_4_2_0 > 4) - src = bootsource_i2c; + src = BOOTSOURCE_I2C; else - src = bootsource_spi; + src = BOOTSOURCE_SPI; break; case 4: case 5: case 6: case 7: - src = bootsource_mmc; + src = BOOTSOURCE_MMC; break; default: break; } if (cfg1 & (1 << 7)) - src = bootsource_nand; + src = BOOTSOURCE_NAND; - imx_set_bootsource(src); + bootsource_set(src); - return 0; + return; } diff --git a/arch/arm/mach-imx/imx25.c b/arch/arm/mach-imx/imx25.c index adcd9d2..5011918 100644 --- a/arch/arm/mach-imx/imx25.c +++ b/arch/arm/mach-imx/imx25.c @@ -59,11 +59,7 @@ static int imx25_init(void) { - uint32_t val; - - val = readl(MX25_CCM_BASE_ADDR + MX25_CCM_RCSR); - imx_25_35_boot_save_loc((val >> MX25_CCM_RCSR_MEM_CTRL_SHIFT) & 0x3, - (val >> MX25_CCM_RCSR_MEM_TYPE_SHIFT) & 0x3); + imx25_boot_save_loc((void *)MX25_CCM_BASE_ADDR); add_generic_device("imx_iim", 0, NULL, MX25_IIM_BASE_ADDR, SZ_4K, IORESOURCE_MEM, &imx25_iim_pdata); diff --git a/arch/arm/mach-imx/imx27.c b/arch/arm/mach-imx/imx27.c index e9d6197..45436be 100644 --- a/arch/arm/mach-imx/imx27.c +++ b/arch/arm/mach-imx/imx27.c @@ -99,7 +99,7 @@ static int imx27_init(void) { imx27_silicon_revision(); - imx_27_boot_save_loc((void *)MX27_SYSCTRL_BASE_ADDR); + imx27_boot_save_loc((void *)MX27_SYSCTRL_BASE_ADDR); imx_iomuxv1_init((void *)MX27_GPIO1_BASE_ADDR); diff --git a/arch/arm/mach-imx/imx35.c b/arch/arm/mach-imx/imx35.c index 7b68783..92f6964 100644 --- a/arch/arm/mach-imx/imx35.c +++ b/arch/arm/mach-imx/imx35.c @@ -59,13 +59,9 @@ static int imx35_init(void) { - uint32_t val; - imx35_silicon_revision(); - val = readl(MX35_CCM_BASE_ADDR + MX35_CCM_RCSR); - imx_25_35_boot_save_loc((val >> MX35_CCM_RCSR_MEM_CTRL_SHIFT) & 0x3, - (val >> MX35_CCM_RCSR_MEM_TYPE_SHIFT) & 0x3); + imx35_boot_save_loc((void *)MX35_CCM_BASE_ADDR); add_generic_device("imx_iim", 0, NULL, MX35_IIM_BASE_ADDR, SZ_4K, IORESOURCE_MEM, NULL); diff --git a/arch/arm/mach-imx/imx51.c b/arch/arm/mach-imx/imx51.c index cffcca3..96ac3b6 100644 --- a/arch/arm/mach-imx/imx51.c +++ b/arch/arm/mach-imx/imx51.c @@ -77,7 +77,7 @@ postcore_initcall(imx51_init); /* - * Saves the boot source media into the $barebox_loc environment variable + * Saves the boot source media into the $bootsource environment variable * * This information is useful for barebox init scripts as we can then easily * use a kernel image stored on the same media that we launch barebox with diff --git a/arch/arm/mach-imx/include/mach/generic.h b/arch/arm/mach-imx/include/mach/generic.h index 5e600a3..6bce787 100644 --- a/arch/arm/mach-imx/include/mach/generic.h +++ b/arch/arm/mach-imx/include/mach/generic.h @@ -1,26 +1,12 @@ u64 imx_uid(void); -enum imx_bootsource { - bootsource_unknown, - bootsource_nand, - bootsource_nor, - bootsource_mmc, - bootsource_i2c, - bootsource_spi, - bootsource_serial, - bootsource_onenand, - bootsource_hd, -}; - -enum imx_bootsource imx_bootsource(void); -void imx_set_bootsource(enum imx_bootsource src); - -int imx_25_35_boot_save_loc(unsigned int ctrl, unsigned int type); -void imx_27_boot_save_loc(void __iomem *sysctrl_base); -int imx51_boot_save_loc(void __iomem *src_base); -int imx53_boot_save_loc(void __iomem *src_base); -int imx6_boot_save_loc(void __iomem *src_base); +void imx25_boot_save_loc(void __iomem *ccm_base); +void imx35_boot_save_loc(void __iomem *ccm_base); +void imx27_boot_save_loc(void __iomem *sysctrl_base); +void imx51_boot_save_loc(void __iomem *src_base); +void imx53_boot_save_loc(void __iomem *src_base); +void imx6_boot_save_loc(void __iomem *src_base); /* There's a off-by-one betweem the gpio bank number and the gpiochip */ /* range e.g. GPIO_1_5 is gpio 5 under linux */ diff --git a/arch/arm/mach-mxs/imx.c b/arch/arm/mach-mxs/imx.c index ab32f10..cdf9275 100644 --- a/arch/arm/mach-mxs/imx.c +++ b/arch/arm/mach-mxs/imx.c @@ -14,11 +14,15 @@ */ #include +#include #include #include #include #include + +#include #include +#include #define HW_RTC_PERSISTENT1 0x070 @@ -55,3 +59,98 @@ .usage = "show clock frequencies", BAREBOX_CMD_COMPLETE(empty_complete) BAREBOX_CMD_END + + +static int __silicon_revision = SILICON_REVISION_UNKNOWN; + +int silicon_revision_get(void) +{ + return __silicon_revision; +} + +void silicon_revision_set(const char *soc, int revision) +{ + __silicon_revision = revision; + + printf("detected %s revision %d.%d\n", soc, + (revision >> 4) & 0xf, revision & 0xf); +} + +#define HW_DIGCTL_CHIPID (0x8001c310) +#define HW_DIGCTL_CHIPID_MASK (0xffff << 16) +#define HW_DIGCTL_CHIPID_MX23 (0x3780 << 16) +#define HW_DIGCTL_CHIPID_MX28 (0x2800 << 16) + +static void mxs_silicon_revision(void) +{ + enum silicon_revision revision = SILICON_REVISION_UNKNOWN; + const char *product = "unknown"; + uint32_t reg; + uint8_t rev; + + reg = readl((void __iomem *)HW_DIGCTL_CHIPID); + rev = reg & 0xff; + + switch (reg & HW_DIGCTL_CHIPID_MASK) { + case HW_DIGCTL_CHIPID_MX23: + product = "i.MX23"; + switch (rev) { + case 0x0: revision = SILICON_REVISION_1_0; break; + case 0x1: revision = SILICON_REVISION_1_1; break; + case 0x2: revision = SILICON_REVISION_1_2; break; + case 0x3: revision = SILICON_REVISION_1_3; break; + case 0x4: revision = SILICON_REVISION_1_4; break; + } + case HW_DIGCTL_CHIPID_MX28: + product = "i.MX28"; + switch (rev) { + case 0x1: revision = SILICON_REVISION_1_2; break; + } + } + + silicon_revision_set(product, revision); +} + +#define MX28_REV_1_0_MODE (0x0001a7f0) +#define MX28_REV_1_2_MODE (0x00019bf0) + +static void mxs_boot_save_loc(void) +{ + enum bootsource src = BOOTSOURCE_UNKNOWN; + int instance = 0; + uint32_t mode = 0xff; + + if (cpu_is_mx23()) { + /* not implemented yet */ + } else if (cpu_is_mx28()) { + enum silicon_revision rev = silicon_revision_get(); + + if (rev == SILICON_REVISION_1_2) + mode = *(uint32_t *)MX28_REV_1_2_MODE; + else + mode = *(uint32_t *)MX28_REV_1_0_MODE; + } + + switch (mode & 0xf) { + case 0x0: src = BOOTSOURCE_USB; break; /* "USB" */ + case 0x1: src = BOOTSOURCE_I2C_EEPROM; break; /* "I2C, master" */ + case 0x3: instance = 1; /* fallthrough */ /* "SSP SPI #2, master, NOR" */ + case 0x2: src = BOOTSOURCE_SPI_NOR; break; /* "SSP SPI #1, master, NOR" */ + case 0x4: src = BOOTSOURCE_NAND; break; /* "NAND" */ + case 0x8: src = BOOTSOURCE_SPI_EEPROM; break; /* "SSP SPI #3, master, EEPROM" */ + case 0xa: instance = 1; /* fallthrough */ /* "SSP SD/MMC #1" */ + case 0x9: src = BOOTSOURCE_MMC; break; /* "SSP SD/MMC #0" */ + } + + bootsource_set(src); + bootsource_set_instance(instance); +} + +static int mxs_init(void) +{ + mxs_silicon_revision(); + mxs_boot_save_loc(); + + return 0; +} +postcore_initcall(mxs_init); diff --git a/arch/arm/mach-mxs/include/mach/revision.h b/arch/arm/mach-mxs/include/mach/revision.h new file mode 100644 index 0000000..91f174d --- /dev/null +++ b/arch/arm/mach-mxs/include/mach/revision.h @@ -0,0 +1,24 @@ +#ifndef __MACH_REVISION_H__ +#define __MACH_REVISION_H__ + +/* silicon revisions */ +enum silicon_revision { + SILICON_REVISION_1_0 = 0x10, + SILICON_REVISION_1_1 = 0x11, + SILICON_REVISION_1_2 = 0x12, + SILICON_REVISION_1_3 = 0x13, + SILICON_REVISION_1_4 = 0x14, + SILICON_REVISION_2_0 = 0x20, + SILICON_REVISION_2_1 = 0x21, + SILICON_REVISION_2_2 = 0x22, + SILICON_REVISION_2_3 = 0x23, + SILICON_REVISION_3_0 = 0x30, + SILICON_REVISION_3_1 = 0x31, + SILICON_REVISION_3_2 = 0x32, + SILICON_REVISION_UNKNOWN =0xff +}; + +int silicon_revision_get(void); +void silicon_revision_set(const char *soc, int revision); + +#endif /* __MACH_REVISION_H__ */ diff --git a/common/Makefile b/common/Makefile index 1b3b009..dcb07c2 100644 --- a/common/Makefile +++ b/common/Makefile @@ -40,6 +40,7 @@ obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_FLEXIBLE_BOOTARGS) += bootargs.o obj-$(CONFIG_BAREBOX_UPDATE) += bbu.o +obj-y += bootsource.o extra-$(CONFIG_MODULES) += module.lds extra-y += barebox_default_env barebox_default_env.h diff --git a/common/bootsource.c b/common/bootsource.c new file mode 100644 index 0000000..7f3d51f --- /dev/null +++ b/common/bootsource.c @@ -0,0 +1,90 @@ +/* + * + * Copyright (C) 2011 Marc Reilly + * Copyright (C) 2013 Marc Kleine-Budde + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include + +static const char *bootsource_str[] = { + [BOOTSOURCE_UNKNOWN] = "unknown", + [BOOTSOURCE_NAND] = "nand", + [BOOTSOURCE_NOR] = "nor", + [BOOTSOURCE_MMC] = "mmc", + [BOOTSOURCE_I2C] = "i2c", + [BOOTSOURCE_I2C_EEPROM] = "i2c-eeprom", + [BOOTSOURCE_SPI] = "spi", + [BOOTSOURCE_SPI_EEPROM] = "spi-eeprom", + [BOOTSOURCE_SPI_NOR] = "spi-nor", + [BOOTSOURCE_SERIAL] = "serial", + [BOOTSOURCE_ONENAND] = "onenand", + [BOOTSOURCE_HD] = "harddisk", + [BOOTSOURCE_USB] = "usb", +}; + +static enum bootsource bootsource = BOOTSOURCE_UNKNOWN; +static int bootsource_instance = BOOTSOURCE_INSTANCE_UNKNOWN; + +void bootsource_set(enum bootsource src) +{ + if (src >= ARRAY_SIZE(bootsource_str)) + src = BOOTSOURCE_UNKNOWN; + + bootsource = src; + + setenv("bootsource", bootsource_str[src]); +} + +void bootsource_set_instance(int instance) +{ + char buf[32]; + + bootsource_instance = instance; + + if (instance < 0) + sprintf(buf, "unknown"); + else + snprintf(buf, sizeof(buf), "%d", instance); + + setenv("bootsource_instance", buf); +} + +enum bootsource bootsource_get(void) +{ + return bootsource; +} + +BAREBOX_MAGICVAR(bootsource, "The source barebox has been booted from"); + +int bootsource_get_instance(void) +{ + return bootsource_instance; +} + +BAREBOX_MAGICVAR(bootsource_instance, "The instance of the source barebox has been booted from"); + +static int bootsource_init(void) +{ + bootsource_set(bootsource); + bootsource_set_instance(bootsource_instance); + export("bootsource"); + export("bootsource_instance"); + + return 0; +} +coredevice_initcall(bootsource_init); diff --git a/include/bootsource.h b/include/bootsource.h new file mode 100644 index 0000000..4bca9b9 --- /dev/null +++ b/include/bootsource.h @@ -0,0 +1,27 @@ +#ifndef __BOOTSOURCE_H__ +#define __BOOTSOURCE_H__ + +enum bootsource { + BOOTSOURCE_UNKNOWN, + BOOTSOURCE_NAND, + BOOTSOURCE_NOR, + BOOTSOURCE_MMC, + BOOTSOURCE_I2C, + BOOTSOURCE_I2C_EEPROM, + BOOTSOURCE_SPI, + BOOTSOURCE_SPI_EEPROM, + BOOTSOURCE_SPI_NOR, + BOOTSOURCE_SERIAL, + BOOTSOURCE_ONENAND, + BOOTSOURCE_HD, + BOOTSOURCE_USB, +}; + +#define BOOTSOURCE_INSTANCE_UNKNOWN -1 + +enum bootsource bootsource_get(void); +int bootsource_get_instance(void); +void bootsource_set(enum bootsource src); +void bootsource_set_instance(int instance); + +#endif /* __BOOTSOURCE_H__ */