Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / u-boot / board / zeus / zeus.c
1 /*
2  * (C) Copyright 2007
3  * Stefan Roese, DENX Software Engineering, sr@denx.de.
4  *
5  * SPDX-License-Identifier:     GPL-2.0+
6  */
7
8 #include <common.h>
9 #include <command.h>
10 #include <malloc.h>
11 #include <environment.h>
12 #include <logbuff.h>
13 #include <post.h>
14
15 #include <asm/processor.h>
16 #include <asm/io.h>
17 #include <asm/ppc4xx-gpio.h>
18
19 DECLARE_GLOBAL_DATA_PTR;
20
21 #define REBOOT_MAGIC    0x07081967
22 #define REBOOT_NOP      0x00000000
23 #define REBOOT_DO_POST  0x00000001
24
25 extern flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; /* info for FLASH chips     */
26
27 ulong flash_get_size(ulong base, int banknum);
28 void env_crc_update(void);
29
30 static u32 start_time;
31
32 int board_early_init_f(void)
33 {
34         mtdcr(UIC0SR, 0xFFFFFFFF);      /* clear all ints */
35         mtdcr(UIC0ER, 0x00000000);      /* disable all ints */
36         mtdcr(UIC0CR, 0x00000000);
37         mtdcr(UIC0PR, 0xFFFF7F00);      /* set int polarities */
38         mtdcr(UIC0TR, 0x00000000);      /* set int trigger levels */
39         mtdcr(UIC0SR, 0xFFFFFFFF);      /* clear all ints */
40         mtdcr(UIC0VCR, 0x00000001);     /* set vect base=0,INT0 highest priority */
41
42         /*
43          * Configure CPC0_PCI to enable PerWE as output
44          */
45         mtdcr(CPC0_PCI, CPC0_PCI_SPE);
46
47         return 0;
48 }
49
50 int misc_init_r(void)
51 {
52         u32 pbcr;
53         int size_val = 0;
54         u32 post_magic;
55         u32 post_val;
56
57         post_magic = in_be32((void *)CONFIG_SYS_POST_MAGIC);
58         post_val = in_be32((void *)CONFIG_SYS_POST_VAL);
59         if ((post_magic == REBOOT_MAGIC) && (post_val == REBOOT_DO_POST)) {
60                 /*
61                  * Set special bootline bootparameter to pass this POST boot
62                  * mode to Linux to reset the username/password
63                  */
64                 setenv("addmisc", "setenv bootargs \\${bootargs} factory_reset=yes");
65
66                 /*
67                  * Normally don't run POST tests, only when enabled
68                  * via the sw-reset button. So disable further tests
69                  * upon next bootup here.
70                  */
71                 out_be32((void *)CONFIG_SYS_POST_VAL, REBOOT_NOP);
72         } else {
73                 /*
74                  * Only run POST when initiated via the sw-reset button mechanism
75                  */
76                 post_word_store(0);
77         }
78
79         /*
80          * Get current time
81          */
82         start_time = get_timer(0);
83
84         /*
85          * FLASH stuff...
86          */
87
88         /* Re-do sizing to get full correct info */
89
90         /* adjust flash start and offset */
91         mfebc(PB0CR, pbcr);
92         switch (gd->bd->bi_flashsize) {
93         case 1 << 20:
94                 size_val = 0;
95                 break;
96         case 2 << 20:
97                 size_val = 1;
98                 break;
99         case 4 << 20:
100                 size_val = 2;
101                 break;
102         case 8 << 20:
103                 size_val = 3;
104                 break;
105         case 16 << 20:
106                 size_val = 4;
107                 break;
108         case 32 << 20:
109                 size_val = 5;
110                 break;
111         case 64 << 20:
112                 size_val = 6;
113                 break;
114         case 128 << 20:
115                 size_val = 7;
116                 break;
117         }
118         pbcr = (pbcr & 0x0001ffff) | gd->bd->bi_flashstart | (size_val << 17);
119         mtebc(PB0CR, pbcr);
120
121         /*
122          * Re-check to get correct base address
123          */
124         flash_get_size(gd->bd->bi_flashstart, 0);
125
126         /* Monitor protection ON by default */
127         (void)flash_protect(FLAG_PROTECT_SET,
128                             -CONFIG_SYS_MONITOR_LEN,
129                             0xffffffff,
130                             &flash_info[0]);
131
132         /* Env protection ON by default */
133         (void)flash_protect(FLAG_PROTECT_SET,
134                             CONFIG_ENV_ADDR_REDUND,
135                             CONFIG_ENV_ADDR_REDUND + 2*CONFIG_ENV_SECT_SIZE - 1,
136                             &flash_info[0]);
137
138         return 0;
139 }
140
141 /*
142  * Check Board Identity:
143  */
144 int checkboard(void)
145 {
146         char buf[64];
147         int i = getenv_f("serial#", buf, sizeof(buf));
148
149         puts("Board: Zeus-");
150
151         if (in_be32((void *)GPIO0_IR) & GPIO_VAL(CONFIG_SYS_GPIO_ZEUS_PE))
152                 puts("PE");
153         else
154                 puts("CE");
155
156         puts(" of BulletEndPoint");
157
158         if (i > 0) {
159                 puts(", serial# ");
160                 puts(buf);
161         }
162         putc('\n');
163
164         /* both LED's off */
165         gpio_write_bit(CONFIG_SYS_GPIO_LED_RED, 0);
166         gpio_write_bit(CONFIG_SYS_GPIO_LED_GREEN, 0);
167         udelay(10000);
168         /* and on again */
169         gpio_write_bit(CONFIG_SYS_GPIO_LED_RED, 1);
170         gpio_write_bit(CONFIG_SYS_GPIO_LED_GREEN, 1);
171
172         return (0);
173 }
174
175 static int default_env_var(char *buf, char *var)
176 {
177         char *ptr;
178         char *val;
179
180         /*
181          * Find env variable
182          */
183         ptr = strstr(buf + 4, var);
184         if (ptr == NULL) {
185                 printf("ERROR: %s not found!\n", var);
186                 return -1;
187         }
188         ptr += strlen(var) + 1;
189
190         /*
191          * Now the ethaddr needs to be updated in the "normal"
192          * environment storage -> redundant flash.
193          */
194         val = ptr;
195         setenv(var, val);
196         printf("Updated %s from eeprom to %s!\n", var, val);
197
198         return 0;
199 }
200
201 static int restore_default(void)
202 {
203         char *buf;
204         char *buf_save;
205         u32 crc;
206
207         set_default_env("");
208
209         gd->env_valid = 1;
210
211         /*
212          * Read board specific values from I2C EEPROM
213          * and set env variables accordingly
214          * -> ethaddr, eth1addr, serial#
215          */
216         buf = buf_save = malloc(FACTORY_RESET_ENV_SIZE);
217         if (buf == NULL) {
218                 printf("ERROR: malloc() failed\n");
219                 return -1;
220         }
221         if (eeprom_read(FACTORY_RESET_I2C_EEPROM, FACTORY_RESET_ENV_OFFS,
222                         (u8 *)buf, FACTORY_RESET_ENV_SIZE)) {
223                 puts("\nError reading EEPROM!\n");
224         } else {
225                 crc = crc32(0, (u8 *)(buf + 4), FACTORY_RESET_ENV_SIZE - 4);
226                 if (crc != *(u32 *)buf) {
227                         printf("ERROR: crc mismatch %08x %08x\n", crc, *(u32 *)buf);
228                         return -1;
229                 }
230
231                 default_env_var(buf, "ethaddr");
232                 buf += 8 + 18;
233                 default_env_var(buf, "eth1addr");
234                 buf += 9 + 18;
235                 default_env_var(buf, "serial#");
236         }
237
238         /*
239          * Finally save updated env variables back to flash
240          */
241         saveenv();
242
243         free(buf_save);
244
245         return 0;
246 }
247
248 int do_set_default(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
249 {
250         char *buf;
251         char *buf_save;
252         char str[32];
253         u32 crc;
254         char var[32];
255
256         if (argc < 4) {
257                 puts("ERROR!\n");
258                 return -1;
259         }
260
261         buf = buf_save = malloc(FACTORY_RESET_ENV_SIZE);
262         memset(buf, 0, FACTORY_RESET_ENV_SIZE);
263
264         strcpy(var, "ethaddr");
265         printf("Setting %s to %s\n", var, argv[1]);
266         sprintf(str, "%s=%s", var, argv[1]);
267         strcpy(buf + 4, str);
268         buf += strlen(str) + 1;
269
270         strcpy(var, "eth1addr");
271         printf("Setting %s to %s\n", var, argv[2]);
272         sprintf(str, "%s=%s", var, argv[2]);
273         strcpy(buf + 4, str);
274         buf += strlen(str) + 1;
275
276         strcpy(var, "serial#");
277         printf("Setting %s to %s\n", var, argv[3]);
278         sprintf(str, "%s=%s", var, argv[3]);
279         strcpy(buf + 4, str);
280
281         crc = crc32(0, (u8 *)(buf_save + 4), FACTORY_RESET_ENV_SIZE - 4);
282         *(u32 *)buf_save = crc;
283
284         if (eeprom_write(FACTORY_RESET_I2C_EEPROM, FACTORY_RESET_ENV_OFFS,
285                          (u8 *)buf_save, FACTORY_RESET_ENV_SIZE)) {
286                 puts("\nError writing EEPROM!\n");
287                 return -1;
288         }
289
290         free(buf_save);
291
292         return 0;
293 }
294
295 U_BOOT_CMD(
296         setdef, 4,      1,      do_set_default,
297         "write board-specific values to EEPROM (ethaddr...)",
298         "ethaddr eth1addr serial#\n    - write board-specific values to EEPROM"
299         );
300
301 static inline int sw_reset_pressed(void)
302 {
303         return !(in_be32((void *)GPIO0_IR) & GPIO_VAL(CONFIG_SYS_GPIO_SW_RESET));
304 }
305
306 int do_chkreset(cmd_tbl_t* cmdtp, int flag, int argc, char * const argv[])
307 {
308         int delta;
309         int count = 0;
310         int post = 0;
311         int factory_reset = 0;
312
313         if (!sw_reset_pressed()) {
314                 printf("SW-Reset already high (Button released)\n");
315                 printf("-> No action taken!\n");
316                 return 0;
317         }
318
319         printf("Waiting for SW-Reset button to be released.");
320
321         while (1) {
322                 delta = get_timer(start_time);
323                 if (!sw_reset_pressed())
324                         break;
325
326                 if ((delta > CONFIG_SYS_TIME_POST) && !post) {
327                         printf("\nWhen released now, POST tests will be started.");
328                         gpio_write_bit(CONFIG_SYS_GPIO_LED_GREEN, 0);
329                         post = 1;
330                 }
331
332                 if ((delta > CONFIG_SYS_TIME_FACTORY_RESET) && !factory_reset) {
333                         printf("\nWhen released now, factory default values"
334                                " will be restored.");
335                         gpio_write_bit(CONFIG_SYS_GPIO_LED_RED, 0);
336                         factory_reset = 1;
337                 }
338
339                 udelay(1000);
340                 if (!(count++ % 1000))
341                         printf(".");
342         }
343
344
345         printf("\nSW-Reset Button released after %d milli-seconds!\n", delta);
346
347         if (delta > CONFIG_SYS_TIME_FACTORY_RESET) {
348                 printf("Starting factory reset value restoration...\n");
349
350                 /*
351                  * Restore default setting
352                  */
353                 restore_default();
354
355                 /*
356                  * Reset the board for default to become valid
357                  */
358                 do_reset(NULL, 0, 0, NULL);
359
360                 return 0;
361         }
362
363         if (delta > CONFIG_SYS_TIME_POST) {
364                 printf("Starting POST configuration...\n");
365
366                 /*
367                  * Enable POST upon next bootup
368                  */
369                 out_be32((void *)CONFIG_SYS_POST_MAGIC, REBOOT_MAGIC);
370                 out_be32((void *)CONFIG_SYS_POST_VAL, REBOOT_DO_POST);
371                 post_bootmode_init();
372
373                 /*
374                  * Reset the logbuffer for a clean start
375                  */
376                 logbuff_reset();
377
378                 do_reset(NULL, 0, 0, NULL);
379
380                 return 0;
381         }
382
383         return 0;
384 }
385
386 U_BOOT_CMD (
387         chkreset, 1, 1, do_chkreset,
388         "Check for status of SW-reset button and act accordingly",
389         ""
390 );
391
392 #if defined(CONFIG_POST)
393 /*
394  * Returns 1 if keys pressed to start the power-on long-running tests
395  * Called from board_init_f().
396  */
397 int post_hotkeys_pressed(void)
398 {
399         u32 post_magic;
400         u32 post_val;
401
402         post_magic = in_be32((void *)CONFIG_SYS_POST_MAGIC);
403         post_val = in_be32((void *)CONFIG_SYS_POST_VAL);
404
405         if ((post_magic == REBOOT_MAGIC) && (post_val == REBOOT_DO_POST))
406                 return 1;
407         else
408                 return 0;
409 }
410 #endif /* CONFIG_POST */