@@ -643,6 +643,8 @@ void omap_die_id_get_board_serial(struct tag_serialnr *serialnr);
void omap_die_id_usbethaddr(void);
void omap_die_id_display(void);
+void omap_set_fastboot_vars(void);
+
void recalibrate_iodelay(void);
void omap_smc1(u32 service, u32 val);
@@ -6,6 +6,16 @@
*/
#include <common.h>
#include <asm/arch/sys_proto.h>
+
+/* Device type bits in CONTROL_STATUS register */
+#define DEVICETYPE_OFFSET 6
+#define DEVICETYPE_MASK (0x7 << DEVICETYPE_OFFSET)
+#define OMAP_TYPE_TEST 0x0
+#define OMAP_TYPE_EMU 0x1
+#define OMAP_TYPE_SEC 0x2
+#define OMAP_TYPE_GP 0x3
+#define OMAP_TYPE_BAD 0x4
+
static void do_cancel_out(u32 *num, u32 *den, u32 factor)
{
while (1) {
@@ -18,6 +28,122 @@ static void do_cancel_out(u32 *num, u32 *den, u32 factor)
}
}
+static const char *omap_get_cpu_type(void)
+{
+ u32 type;
+
+ type = readl((*ctrl)->control_status);
+ type &= DEVICETYPE_MASK;
+ type >>= DEVICETYPE_OFFSET;
+
+ switch (type) {
+ case OMAP_TYPE_EMU:
+ return "EMU";
+ case OMAP_TYPE_SEC:
+ return "HS";
+ case OMAP_TYPE_GP:
+ return "GP";
+ default:
+ return NULL;
+ }
+}
+
+static void omap_set_fastboot_cpu(void)
+{
+ u32 cpu_rev;
+ char *cpu;
+
+ cpu_rev = omap_revision();
+
+ switch (cpu_rev) {
+ case DRA752_ES1_0:
+ case DRA752_ES1_1:
+ case DRA752_ES2_0:
+ cpu = "J6";
+ break;
+ case DRA722_ES1_0:
+ case DRA722_ES2_0:
+ cpu = "J6ECO";
+ break;
+ default:
+ cpu = NULL;
+ printf("Warning: fastboot.cpu: unknown cpu type %u\n", cpu_rev);
+ }
+
+ setenv("fastboot.cpu", cpu);
+}
+
+static void omap_set_fastboot_secure(void)
+{
+ const char *secure;
+
+ secure = omap_get_cpu_type();
+ if (secure == NULL)
+ printf("Warning: fastboot.secure: unknown CPU type\n");
+
+ setenv("fastboot.secure", secure);
+}
+
+static void omap_set_fastboot_board_rev(void)
+{
+ const char *board_rev;
+
+ board_rev = getenv("board_rev");
+ if (board_rev == NULL)
+ printf("Warning: fastboot.board_rev: unknown board revision\n");
+
+ setenv("fastboot.board_rev", board_rev);
+}
+
+#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
+static u32 omap_mmc_get_part_size(const char *part)
+{
+ int res;
+ struct blk_desc *dev_desc;
+ disk_partition_t info;
+ u64 sz = 0;
+
+ dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV);
+ if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) {
+ error("invalid mmc device\n");
+ return 0;
+ }
+
+ res = part_get_info_by_name(dev_desc, part, &info);
+ if (res < 0) {
+ error("cannot find partition: '%s'\n", part);
+ return 0;
+ }
+
+ /* Calculate size in bytes */
+ sz = (info.size * (u64)info.blksz);
+ /* to KiB */
+ sz >>= 10;
+
+ return (u32)sz;
+}
+
+static void omap_set_fastboot_userdata_size(void)
+{
+ char buf[16];
+ u32 sz_kb;
+
+ sz_kb = omap_mmc_get_part_size("userdata");
+ if (sz_kb == 0) {
+ buf[0] = '\0';
+ printf("Warning: fastboot.userdata_size: unable to calc\n");
+ } else {
+ sprintf(buf, "%u", sz_kb);
+ }
+
+ setenv("fastboot.userdata_size", buf);
+}
+#else
+static inline void omap_set_fastboot_userdata_size(void)
+{
+}
+#endif
+
/*
* Cancel out the denominator and numerator of a fraction
* to get smaller numerator and denominator.
@@ -111,3 +237,11 @@ void omap_die_id_display(void)
printf("OMAP die ID: %08x%08x%08x%08x\n", die_id[3], die_id[2],
die_id[1], die_id[0]);
}
+
+void omap_set_fastboot_vars(void)
+{
+ omap_set_fastboot_cpu();
+ omap_set_fastboot_secure();
+ omap_set_fastboot_board_rev();
+ omap_set_fastboot_userdata_size();
+}
This patch reuses new option, which allows us to expose variables from environment to "fastboot getvar" command. Those variables must be of "fastboot.%s" format. Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org> --- arch/arm/include/asm/omap_common.h | 2 + arch/arm/mach-omap2/utils.c | 134 +++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+)