X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=post%2Fpost.c;h=852d6a5dab51ca84623487658c7d0b36abcf13be;hb=1902692aa0b2dcbb9351172be03c57d1e82447e4;hp=28435cc4af8dc15fa15d9754310c653dd885e0c3;hpb=a11e06965ec91270c51853407ff1261d3c740386;p=oweals%2Fu-boot.git diff --git a/post/post.c b/post/post.c index 28435cc4af..852d6a5dab 100644 --- a/post/post.c +++ b/post/post.c @@ -22,16 +22,18 @@ */ #include -#include +#include #include #include +#ifdef CONFIG_SYS_POST_HOTKEYS_GPIO +#include +#endif + #ifdef CONFIG_LOGBUFFER #include #endif -#ifdef CONFIG_POST - DECLARE_GLOBAL_DATA_PTR; #define POST_MAX_NUMBER 32 @@ -60,6 +62,39 @@ int post_init_f (void) return res; } +/* + * Supply a default implementation for post_hotkeys_pressed() for boards + * without hotkey support. We always return 0 here, so that the + * long-running tests won't be started. + * + * Boards with hotkey support can override this weak default function + * by defining one in their board specific code. + */ +int __post_hotkeys_pressed(void) +{ +#ifdef CONFIG_SYS_POST_HOTKEYS_GPIO + int ret; + unsigned gpio = CONFIG_SYS_POST_HOTKEYS_GPIO; + + ret = gpio_request(gpio, "hotkeys"); + if (ret) { + printf("POST: gpio hotkey request failed\n"); + return 0; + } + + gpio_direction_input(gpio); + ret = gpio_get_value(gpio); + gpio_free(gpio); + + return ret; +#endif + + return 0; /* No hotkeys supported */ +} +int post_hotkeys_pressed(void) + __attribute__((weak, alias("__post_hotkeys_pressed"))); + + void post_bootmode_init (void) { int bootmode = post_bootmode_get (0); @@ -129,9 +164,7 @@ void post_output_backlog ( void ) post_log ("PASSED\n"); else { post_log ("FAILED\n"); -#ifdef CONFIG_SHOW_BOOT_PROGRESS - show_boot_progress(-31); -#endif + show_boot_progress (-31); } } } @@ -159,9 +192,11 @@ static void post_bootmode_test_off (void) static void post_get_flags (int *test_flags) { - int flag[] = { POST_POWERON, POST_NORMAL, POST_SLOWTEST }; - char *var[] = { "post_poweron", "post_normal", "post_slowtest" }; - int varnum = sizeof (var) / sizeof (var[0]); + int flag[] = { POST_POWERON, POST_NORMAL, POST_SLOWTEST, + POST_CRITICAL }; + char *var[] = { "post_poweron", "post_normal", "post_slowtest", + "post_critical" }; + int varnum = ARRAY_SIZE(var); char list[128]; /* long enough for POST list */ char *name; char *s; @@ -173,7 +208,7 @@ static void post_get_flags (int *test_flags) } for (i = 0; i < varnum; i++) { - if (getenv_r (var[i], list, sizeof (list)) <= 0) + if (getenv_f(var[i], list, sizeof (list)) <= 0) continue; for (j = 0; j < post_list_size; j++) { @@ -217,6 +252,12 @@ static void post_get_flags (int *test_flags) } } +void __show_post_progress (unsigned int test_num, int before, int result) +{ +} +void show_post_progress (unsigned int, int, int) + __attribute__((weak, alias("__show_post_progress"))); + static int post_run_single (struct post_test *test, int test_flags, int flags, unsigned int i) { @@ -226,27 +267,44 @@ 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) post_log_mark_start ( test->testid ); else - post_log ("POST %s ", test->cmd); + post_log ("POST %s ", test->cmd); } + show_post_progress(i, POST_BEFORE, POST_FAILED); + if (test_flags & POST_PREREL) { - if ((*test->test) (flags) == 0) + if ((*test->test) (flags) == 0) { post_log_mark_succ ( test->testid ); + show_post_progress(i, POST_AFTER, POST_PASSED); + } + else { + show_post_progress(i, POST_AFTER, POST_FAILED); + if (test_flags & POST_CRITICAL) + gd->flags |= GD_FLG_POSTFAIL; + if (test_flags & POST_STOP) + gd->flags |= GD_FLG_POSTSTOP; + } } else { - if ((*test->test) (flags) != 0) { - post_log ("FAILED\n"); -#ifdef CONFIG_SHOW_BOOT_PROGRESS - show_boot_progress(-32); -#endif - } - else - post_log ("PASSED\n"); + if ((*test->test)(flags) != 0) { + post_log("FAILED\n"); + show_boot_progress(-32); + show_post_progress(i, POST_AFTER, POST_FAILED); + if (test_flags & POST_CRITICAL) + gd->flags |= GD_FLG_POSTFAIL; + if (test_flags & POST_STOP) + gd->flags |= GD_FLG_POSTSTOP; + } else { + post_log("PASSED\n"); + show_post_progress(i, POST_AFTER, POST_PASSED); + } } if ((test_flags & POST_REBOOT) && !(flags & POST_MANUAL)) { @@ -269,7 +327,14 @@ int post_run (char *name, int flags) if (name == NULL) { unsigned int last; + if (gd->flags & GD_FLG_POSTSTOP) + return 0; + 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)) { @@ -279,6 +344,8 @@ int post_run (char *name, int flags) flags | POST_REBOOT, last); for (i = last + 1; i < post_list_size; i++) { + if (gd->flags & GD_FLG_POSTSTOP) + break; post_run_single (post_list + i, test_flags[i], flags, i); @@ -286,6 +353,8 @@ int post_run (char *name, int flags) } } else { for (i = 0; i < post_list_size; i++) { + if (gd->flags & GD_FLG_POSTSTOP) + break; post_run_single (post_list + i, test_flags[i], flags, i); @@ -300,6 +369,7 @@ int post_run (char *name, int flags) } if (i < post_list_size) { + WATCHDOG_RESET(); return post_run_single (post_list + i, test_flags[i], flags, i); @@ -352,7 +422,7 @@ int post_log (char *format, ...) { va_list args; uint i; - char printbuffer[CFG_PBSIZE]; + char printbuffer[CONFIG_SYS_PBSIZE]; va_start (args, format); @@ -373,6 +443,7 @@ int post_log (char *format, ...) return 0; } +#ifdef CONFIG_NEEDS_MANUAL_RELOC void post_reloc (void) { unsigned int i; @@ -417,6 +488,7 @@ void post_reloc (void) } } } +#endif /* @@ -428,11 +500,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 () / CONFIG_SYS_HZ)) - base; #else #warning "Not implemented yet" return 0; /* Not implemented yet */ #endif } - -#endif /* CONFIG_POST */