X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=post%2Fpost.c;h=c016c3ae4062b8575ee2194697e627168ea244f4;hb=f32f7fe7bd3a5bda3a476520f00e1aca7c2103a9;hp=9d62f4088815d90117936b27c1c784dc3014f1e4;hpb=8bde7f776c77b343aca29b8c7b58464d915ac245;p=u-boot diff --git a/post/post.c b/post/post.c index 9d62f40888..c016c3ae40 100644 --- a/post/post.c +++ b/post/post.c @@ -30,7 +30,7 @@ #include #endif -#ifdef CONFIG_POST +DECLARE_GLOBAL_DATA_PTR; #define POST_MAX_NUMBER 32 @@ -38,8 +38,6 @@ int post_init_f (void) { - DECLARE_GLOBAL_DATA_PTR; - int res = 0; unsigned int i; @@ -62,18 +60,28 @@ int post_init_f (void) void post_bootmode_init (void) { - DECLARE_GLOBAL_DATA_PTR; int bootmode = post_bootmode_get (0); - - if (bootmode == 0) { - bootmode = POST_POWERON; - } else if (bootmode == POST_POWERON) { - bootmode = POST_POWERNORMAL; + int newword; + + if (post_hotkeys_pressed() && !(bootmode & POST_POWERTEST)) { + newword = BOOTMODE_MAGIC | POST_SLOWTEST; + } else if (bootmode == 0) { + newword = BOOTMODE_MAGIC | POST_POWERON; + } else if (bootmode == POST_POWERON || bootmode == POST_SLOWTEST) { + newword = BOOTMODE_MAGIC | POST_NORMAL; } else { - return; + /* Use old value */ + newword = post_word_load () & ~POST_COLDBOOT; + } + + if (bootmode == 0) + { + /* We are booting after power-on */ + newword |= POST_COLDBOOT; } - post_word_store (BOOTMODE_MAGIC | bootmode); + post_word_store (newword); + /* Reset activity record */ gd->post_log_word = 0; } @@ -87,7 +95,7 @@ int post_bootmode_get (unsigned int *last_test) return 0; } - bootmode = word & 0xFF; + bootmode = word & 0x7F; if (last_test && (bootmode & POST_POWERTEST)) { *last_test = (word >> 8) & 0xFF; @@ -96,28 +104,20 @@ int post_bootmode_get (unsigned int *last_test) return bootmode; } -void post_bootmode_clear (void) -{ - post_word_store (0); -} - /* POST tests run before relocation only mark status bits .... */ static void post_log_mark_start ( unsigned long testid ) { - DECLARE_GLOBAL_DATA_PTR; gd->post_log_word |= (testid)<<16; } static void post_log_mark_succ ( unsigned long testid ) { - DECLARE_GLOBAL_DATA_PTR; gd->post_log_word |= testid; } /* ... and the messages are output once we are relocated */ void post_output_backlog ( void ) { - DECLARE_GLOBAL_DATA_PTR; int j; for (j = 0; j < post_list_size; j++) { @@ -125,8 +125,10 @@ void post_output_backlog ( void ) post_log ("POST %s ", post_list[j].cmd); if (gd->post_log_word & post_list[j].testid) post_log ("PASSED\n"); - else + else { post_log ("FAILED\n"); + show_boot_progress (-31); + } } } } @@ -153,8 +155,10 @@ static void post_bootmode_test_off (void) static void post_get_flags (int *test_flags) { - int flag[] = { POST_POWERON, POST_POWERNORMAL, POST_POWERFAIL }; - char *var[] = { "post_poweron", "post_normal", "post_shutdown" }; + int flag[] = { POST_POWERON, POST_NORMAL, POST_SLOWTEST, + POST_CRITICAL }; + char *var[] = { "post_poweron", "post_normal", "post_slowtest", + "post_critical" }; int varnum = sizeof (var) / sizeof (var[0]); char list[128]; /* long enough for POST list */ char *name; @@ -203,6 +207,12 @@ static void post_get_flags (int *test_flags) name = s + 1; } } + + for (j = 0; j < post_list_size; j++) { + if (test_flags[j] & POST_POWERON) { + test_flags[j] |= POST_SLOWTEST; + } + } } static int post_run_single (struct post_test *test, @@ -214,7 +224,9 @@ static int post_run_single (struct post_test *test, if (!(flags & POST_REBOOT)) { if ((test_flags & POST_REBOOT) && !(flags & POST_MANUAL)) { - post_bootmode_test_on (i); + post_bootmode_test_on ( + (gd->flags & GD_FLG_POSTFAIL) ? + POST_FAIL_SAVE | i : i); } if (test_flags & POST_PREREL) @@ -226,9 +238,15 @@ static int post_run_single (struct post_test *test, if (test_flags & POST_PREREL) { if ((*test->test) (flags) == 0) post_log_mark_succ ( test->testid ); + else if (test_flags & POST_CRITICAL) + gd->flags |= GD_FLG_POSTFAIL; } else { - if ((*test->test) (flags) != 0) + if ((*test->test) (flags) != 0) { post_log ("FAILED\n"); + show_boot_progress (-32); + if (test_flags & POST_CRITICAL) + gd->flags |= GD_FLG_POSTFAIL; + } else post_log ("PASSED\n"); } @@ -254,6 +272,10 @@ int post_run (char *name, int flags) unsigned int last; if (post_bootmode_get (&last) & POST_POWERTEST) { + if (last & POST_FAIL_SAVE) { + last &= ~POST_FAIL_SAVE; + gd->flags |= GD_FLG_POSTFAIL; + } if (last < post_list_size && (flags & test_flags[last] & POST_ALWAYS) && (flags & test_flags[last] & POST_MEM)) { @@ -359,8 +381,6 @@ int post_log (char *format, ...) void post_reloc (void) { - DECLARE_GLOBAL_DATA_PTR; - unsigned int i; /* @@ -414,10 +434,9 @@ void post_reloc (void) unsigned long post_time_ms (unsigned long base) { #ifdef CONFIG_PPC - return (unsigned long)get_ticks () / (get_tbclk () / CFG_HZ) - base; + return (unsigned long)(get_ticks () / (get_tbclk () / CFG_HZ)) - base; #else +#warning "Not implemented yet" return 0; /* Not implemented yet */ #endif } - -#endif /* CONFIG_POST */