diff options
author | Tony Luck <tony.luck@intel.com> | 2006-02-07 18:25:57 -0500 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2006-02-07 18:25:57 -0500 |
commit | d6e56a2a088935f3c1feee5ff5a06c67f2ec6002 (patch) | |
tree | ab9fd17a56f81a7662aab8f135be7ed0f3c707c5 /arch/ia64/sn | |
parent | 9d78f43d1fd3e028bfd37510ce847d0896f71f78 (diff) |
[IA64] Fix CONFIG_PRINTK_TIME
There were two problems with enabling the PRINTK_TIME config
option:
1) The first calls to printk() occur before per-cpu data virtual
address is pinned into the TLB, so sched_clock() can fault.
2) sched_clock() is based on ar.itc, which may not be synchronized
across cpus.
Ken Chen started this patch, Tony Luck tinkered with it, and Jes
Sorensen perfected it.
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/sn')
-rw-r--r-- | arch/ia64/sn/kernel/setup.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c index ee36bff93c30..6ea5b8a37c01 100644 --- a/arch/ia64/sn/kernel/setup.c +++ b/arch/ia64/sn/kernel/setup.c | |||
@@ -67,6 +67,7 @@ extern unsigned long last_time_offset; | |||
67 | extern void (*ia64_mark_idle) (int); | 67 | extern void (*ia64_mark_idle) (int); |
68 | extern void snidle(int); | 68 | extern void snidle(int); |
69 | extern unsigned char acpi_kbd_controller_present; | 69 | extern unsigned char acpi_kbd_controller_present; |
70 | extern unsigned long long (*ia64_printk_clock)(void); | ||
70 | 71 | ||
71 | unsigned long sn_rtc_cycles_per_second; | 72 | unsigned long sn_rtc_cycles_per_second; |
72 | EXPORT_SYMBOL(sn_rtc_cycles_per_second); | 73 | EXPORT_SYMBOL(sn_rtc_cycles_per_second); |
@@ -372,6 +373,16 @@ sn_scan_pcdp(void) | |||
372 | } | 373 | } |
373 | } | 374 | } |
374 | 375 | ||
376 | static unsigned long sn2_rtc_initial; | ||
377 | |||
378 | static unsigned long long ia64_sn2_printk_clock(void) | ||
379 | { | ||
380 | unsigned long rtc_now = rtc_time(); | ||
381 | |||
382 | return (rtc_now - sn2_rtc_initial) * | ||
383 | (1000000000 / sn_rtc_cycles_per_second); | ||
384 | } | ||
385 | |||
375 | /** | 386 | /** |
376 | * sn_setup - SN platform setup routine | 387 | * sn_setup - SN platform setup routine |
377 | * @cmdline_p: kernel command line | 388 | * @cmdline_p: kernel command line |
@@ -386,6 +397,7 @@ void __init sn_setup(char **cmdline_p) | |||
386 | u32 version = sn_sal_rev(); | 397 | u32 version = sn_sal_rev(); |
387 | extern void sn_cpu_init(void); | 398 | extern void sn_cpu_init(void); |
388 | 399 | ||
400 | sn2_rtc_initial = rtc_time(); | ||
389 | ia64_sn_plat_set_error_handling_features(); // obsolete | 401 | ia64_sn_plat_set_error_handling_features(); // obsolete |
390 | ia64_sn_set_os_feature(OSF_MCA_SLV_TO_OS_INIT_SLV); | 402 | ia64_sn_set_os_feature(OSF_MCA_SLV_TO_OS_INIT_SLV); |
391 | ia64_sn_set_os_feature(OSF_FEAT_LOG_SBES); | 403 | ia64_sn_set_os_feature(OSF_FEAT_LOG_SBES); |
@@ -437,19 +449,6 @@ void __init sn_setup(char **cmdline_p) | |||
437 | */ | 449 | */ |
438 | build_cnode_tables(); | 450 | build_cnode_tables(); |
439 | 451 | ||
440 | /* | ||
441 | * Old PROMs do not provide an ACPI FADT. Disable legacy keyboard | ||
442 | * support here so we don't have to listen to failed keyboard probe | ||
443 | * messages. | ||
444 | */ | ||
445 | if (version <= 0x0209 && acpi_kbd_controller_present) { | ||
446 | printk(KERN_INFO "Disabling legacy keyboard support as prom " | ||
447 | "is too old and doesn't provide FADT\n"); | ||
448 | acpi_kbd_controller_present = 0; | ||
449 | } | ||
450 | |||
451 | printk("SGI SAL version %x.%02x\n", version >> 8, version & 0x00FF); | ||
452 | |||
453 | status = | 452 | status = |
454 | ia64_sal_freq_base(SAL_FREQ_BASE_REALTIME_CLOCK, &ticks_per_sec, | 453 | ia64_sal_freq_base(SAL_FREQ_BASE_REALTIME_CLOCK, &ticks_per_sec, |
455 | &drift); | 454 | &drift); |
@@ -463,6 +462,21 @@ void __init sn_setup(char **cmdline_p) | |||
463 | 462 | ||
464 | platform_intr_list[ACPI_INTERRUPT_CPEI] = IA64_CPE_VECTOR; | 463 | platform_intr_list[ACPI_INTERRUPT_CPEI] = IA64_CPE_VECTOR; |
465 | 464 | ||
465 | ia64_printk_clock = ia64_sn2_printk_clock; | ||
466 | |||
467 | /* | ||
468 | * Old PROMs do not provide an ACPI FADT. Disable legacy keyboard | ||
469 | * support here so we don't have to listen to failed keyboard probe | ||
470 | * messages. | ||
471 | */ | ||
472 | if (version <= 0x0209 && acpi_kbd_controller_present) { | ||
473 | printk(KERN_INFO "Disabling legacy keyboard support as prom " | ||
474 | "is too old and doesn't provide FADT\n"); | ||
475 | acpi_kbd_controller_present = 0; | ||
476 | } | ||
477 | |||
478 | printk("SGI SAL version %x.%02x\n", version >> 8, version & 0x00FF); | ||
479 | |||
466 | /* | 480 | /* |
467 | * we set the default root device to /dev/hda | 481 | * we set the default root device to /dev/hda |
468 | * to make simulation easy | 482 | * to make simulation easy |