blob: 1d3962500d25a6afd8e061c4ad6dd7e9fc59c688 [file] [log] [blame]
Aneesh Vc0e88522011-07-21 09:10:12 -04001/*
2 * Copyright 2011 Linaro Limited
3 * Aneesh V <aneesh@ti.com>
4 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02005 * SPDX-License-Identifier: GPL-2.0+
Aneesh Vc0e88522011-07-21 09:10:12 -04006 */
7#include <common.h>
Alex Kiernan9c215492018-04-01 09:22:38 +00008#include <environment.h>
Simon Glassd9a766f2017-05-17 08:23:00 -06009#include <asm/setup.h>
Nishanth Menon92adeb62014-03-28 11:00:04 -050010#include <asm/arch/sys_proto.h>
Sam Protsenkobfac4af2018-02-27 23:45:03 +020011#include <asm/omap_common.h>
12
Aneesh Vc0e88522011-07-21 09:10:12 -040013static void do_cancel_out(u32 *num, u32 *den, u32 factor)
14{
15 while (1) {
16 if (((*num)/factor*factor == (*num)) &&
17 ((*den)/factor*factor == (*den))) {
18 (*num) /= factor;
19 (*den) /= factor;
20 } else
21 break;
22 }
23}
24
Semen Protsenkof2817372017-05-22 19:16:40 +030025#ifdef CONFIG_FASTBOOT_FLASH
26static void omap_set_fastboot_cpu(void)
27{
28 char *cpu;
29 u32 cpu_rev = omap_revision();
30
31 switch (cpu_rev) {
Praneeth Bajjuri177c65a2017-10-12 22:47:05 -050032 case DRA762_ES1_0:
33 cpu = "DRA762";
34 break;
Semen Protsenkof2817372017-05-22 19:16:40 +030035 case DRA752_ES1_0:
36 case DRA752_ES1_1:
37 case DRA752_ES2_0:
38 cpu = "DRA752";
39 break;
40 case DRA722_ES1_0:
41 case DRA722_ES2_0:
Vishal Mahaveer538264d2017-10-12 22:47:04 -050042 case DRA722_ES2_1:
Semen Protsenkof2817372017-05-22 19:16:40 +030043 cpu = "DRA722";
44 break;
45 default:
46 cpu = NULL;
47 printf("Warning: fastboot.cpu: unknown CPU rev: %u\n", cpu_rev);
48 }
49
Simon Glass6a38e412017-08-03 12:22:09 -060050 env_set("fastboot.cpu", cpu);
Semen Protsenkof2817372017-05-22 19:16:40 +030051}
52
53static void omap_set_fastboot_secure(void)
54{
55 const char *secure;
56 u32 dev = get_device_type();
57
58 switch (dev) {
59 case EMU_DEVICE:
60 secure = "EMU";
61 break;
62 case HS_DEVICE:
63 secure = "HS";
64 break;
65 case GP_DEVICE:
66 secure = "GP";
67 break;
68 default:
69 secure = NULL;
70 printf("Warning: fastboot.secure: unknown CPU sec: %u\n", dev);
71 }
72
Simon Glass6a38e412017-08-03 12:22:09 -060073 env_set("fastboot.secure", secure);
Semen Protsenkof2817372017-05-22 19:16:40 +030074}
75
76static void omap_set_fastboot_board_rev(void)
77{
78 const char *board_rev;
79
Simon Glass64b723f2017-08-03 12:22:12 -060080 board_rev = env_get("board_rev");
Semen Protsenkof2817372017-05-22 19:16:40 +030081 if (board_rev == NULL)
82 printf("Warning: fastboot.board_rev: unknown board revision\n");
83
Simon Glass6a38e412017-08-03 12:22:09 -060084 env_set("fastboot.board_rev", board_rev);
Semen Protsenkof2817372017-05-22 19:16:40 +030085}
86
87#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
88static u32 omap_mmc_get_part_size(const char *part)
89{
90 int res;
91 struct blk_desc *dev_desc;
92 disk_partition_t info;
93 u64 sz = 0;
94
95 dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV);
96 if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) {
Masahiro Yamada81e10422017-09-16 14:10:41 +090097 pr_err("invalid mmc device\n");
Semen Protsenkof2817372017-05-22 19:16:40 +030098 return 0;
99 }
100
Sam Protsenko8b6fba22017-09-22 01:51:59 +0300101 /* Check only for EFI (GPT) partition table */
102 res = part_get_info_by_name_type(dev_desc, part, &info, PART_TYPE_EFI);
Sam Protsenko77ebe362017-09-21 23:01:00 +0300103 if (res < 0)
Semen Protsenkof2817372017-05-22 19:16:40 +0300104 return 0;
Semen Protsenkof2817372017-05-22 19:16:40 +0300105
106 /* Calculate size in bytes */
107 sz = (info.size * (u64)info.blksz);
108 /* to KiB */
109 sz >>= 10;
110
111 return (u32)sz;
112}
113
114static void omap_set_fastboot_userdata_size(void)
115{
116 char buf[16];
117 u32 sz_kb;
118
119 sz_kb = omap_mmc_get_part_size("userdata");
Sam Protsenko77ebe362017-09-21 23:01:00 +0300120 if (sz_kb == 0)
121 return; /* probably it's not Android partition table */
Semen Protsenkof2817372017-05-22 19:16:40 +0300122
Sam Protsenko77ebe362017-09-21 23:01:00 +0300123 sprintf(buf, "%u", sz_kb);
Simon Glass6a38e412017-08-03 12:22:09 -0600124 env_set("fastboot.userdata_size", buf);
Semen Protsenkof2817372017-05-22 19:16:40 +0300125}
126#else
127static inline void omap_set_fastboot_userdata_size(void)
128{
129}
130#endif /* CONFIG_FASTBOOT_FLASH_MMC_DEV */
131void omap_set_fastboot_vars(void)
132{
133 omap_set_fastboot_cpu();
134 omap_set_fastboot_secure();
135 omap_set_fastboot_board_rev();
136 omap_set_fastboot_userdata_size();
137}
138#endif /* CONFIG_FASTBOOT_FLASH */
139
Aneesh Vc0e88522011-07-21 09:10:12 -0400140/*
141 * Cancel out the denominator and numerator of a fraction
142 * to get smaller numerator and denominator.
143 */
144void cancel_out(u32 *num, u32 *den, u32 den_limit)
145{
146 do_cancel_out(num, den, 2);
147 do_cancel_out(num, den, 3);
148 do_cancel_out(num, den, 5);
149 do_cancel_out(num, den, 7);
150 do_cancel_out(num, den, 11);
151 do_cancel_out(num, den, 13);
152 do_cancel_out(num, den, 17);
153 while ((*den) > den_limit) {
154 *num /= 2;
155 /*
156 * Round up the denominator so that the final fraction
157 * (num/den) is always <= the desired value
158 */
159 *den = (*den + 1) / 2;
160 }
161}
Nishanth Menon92adeb62014-03-28 11:00:04 -0500162
Paul Kocialkowskie0cfa452015-08-27 19:37:08 +0200163__weak void omap_die_id(unsigned int *die_id)
164{
165 die_id[0] = die_id[1] = die_id[2] = die_id[3] = 0;
166}
167
Paul Kocialkowski2edadee2015-08-27 19:37:12 +0200168void omap_die_id_serial(void)
Nishanth Menon92adeb62014-03-28 11:00:04 -0500169{
Paul Kocialkowski2edadee2015-08-27 19:37:12 +0200170 unsigned int die_id[4] = { 0 };
171 char serial_string[17] = { 0 };
Nishanth Menon92adeb62014-03-28 11:00:04 -0500172
Paul Kocialkowski2edadee2015-08-27 19:37:12 +0200173 omap_die_id((unsigned int *)&die_id);
Nishanth Menon92adeb62014-03-28 11:00:04 -0500174
Simon Glass64b723f2017-08-03 12:22:12 -0600175 if (!env_get("serial#")) {
Paul Kocialkowski2edadee2015-08-27 19:37:12 +0200176 snprintf(serial_string, sizeof(serial_string),
177 "%08x%08x", die_id[0], die_id[3]);
178
Simon Glass6a38e412017-08-03 12:22:09 -0600179 env_set("serial#", serial_string);
Nishanth Menon92adeb62014-03-28 11:00:04 -0500180 }
181}
Dileep Katta7354dfc2015-03-25 04:04:51 +0530182
Paul Kocialkowskia7267d22015-08-27 19:37:14 +0200183void omap_die_id_get_board_serial(struct tag_serialnr *serialnr)
184{
185 char *serial_string;
186 unsigned long long serial;
187
Simon Glass64b723f2017-08-03 12:22:12 -0600188 serial_string = env_get("serial#");
Paul Kocialkowskia7267d22015-08-27 19:37:14 +0200189
190 if (serial_string) {
191 serial = simple_strtoull(serial_string, NULL, 16);
192
193 serialnr->high = (unsigned int) (serial >> 32);
194 serialnr->low = (unsigned int) (serial & 0xffffffff);
195 } else {
196 serialnr->high = 0;
197 serialnr->low = 0;
198 }
199}
200
Paul Kocialkowski2edadee2015-08-27 19:37:12 +0200201void omap_die_id_usbethaddr(void)
Dileep Katta7354dfc2015-03-25 04:04:51 +0530202{
Paul Kocialkowski2edadee2015-08-27 19:37:12 +0200203 unsigned int die_id[4] = { 0 };
204 unsigned char mac[6] = { 0 };
Dileep Katta7354dfc2015-03-25 04:04:51 +0530205
Paul Kocialkowski2edadee2015-08-27 19:37:12 +0200206 omap_die_id((unsigned int *)&die_id);
207
Simon Glass64b723f2017-08-03 12:22:12 -0600208 if (!env_get("usbethaddr")) {
Paul Kocialkowski2edadee2015-08-27 19:37:12 +0200209 /*
210 * Create a fake MAC address from the processor ID code.
211 * First byte is 0x02 to signify locally administered.
212 */
213 mac[0] = 0x02;
214 mac[1] = die_id[3] & 0xff;
215 mac[2] = die_id[2] & 0xff;
216 mac[3] = die_id[1] & 0xff;
217 mac[4] = die_id[0] & 0xff;
218 mac[5] = (die_id[0] >> 8) & 0xff;
219
Simon Glass8551d552017-08-03 12:22:11 -0600220 eth_env_set_enetaddr("usbethaddr", mac);
Peter Robinson8033a552017-11-23 13:14:17 +0000221
222 if (!env_get("ethaddr"))
223 eth_env_set_enetaddr("ethaddr", mac);
Dileep Katta7354dfc2015-03-25 04:04:51 +0530224 }
225}
Paul Kocialkowski6bc318e2015-08-27 19:37:13 +0200226
227void omap_die_id_display(void)
228{
229 unsigned int die_id[4] = { 0 };
230
231 omap_die_id(die_id);
232
Ladislav Michlc84b9522016-06-02 11:43:16 +0200233 printf("OMAP die ID: %08x%08x%08x%08x\n", die_id[3], die_id[2],
234 die_id[1], die_id[0]);
Paul Kocialkowski6bc318e2015-08-27 19:37:13 +0200235}