aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/time.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel/time.c')
-rw-r--r--arch/powerpc/kernel/time.c41
1 files changed, 20 insertions, 21 deletions
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index a6282b625b44..070b4b458aaf 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -62,8 +62,8 @@
62#include <asm/irq.h> 62#include <asm/irq.h>
63#include <asm/div64.h> 63#include <asm/div64.h>
64#include <asm/smp.h> 64#include <asm/smp.h>
65#include <asm/vdso_datapage.h>
65#ifdef CONFIG_PPC64 66#ifdef CONFIG_PPC64
66#include <asm/systemcfg.h>
67#include <asm/firmware.h> 67#include <asm/firmware.h>
68#endif 68#endif
69#ifdef CONFIG_PPC_ISERIES 69#ifdef CONFIG_PPC_ISERIES
@@ -261,7 +261,6 @@ static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
261 do_gtod.varp = temp_varp; 261 do_gtod.varp = temp_varp;
262 do_gtod.var_idx = temp_idx; 262 do_gtod.var_idx = temp_idx;
263 263
264#ifdef CONFIG_PPC64
265 /* 264 /*
266 * tb_update_count is used to allow the userspace gettimeofday code 265 * tb_update_count is used to allow the userspace gettimeofday code
267 * to assure itself that it sees a consistent view of the tb_to_xs and 266 * to assure itself that it sees a consistent view of the tb_to_xs and
@@ -271,14 +270,15 @@ static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
271 * tb_to_xs and stamp_xsec values are consistent. If not, then it 270 * tb_to_xs and stamp_xsec values are consistent. If not, then it
272 * loops back and reads them again until this criteria is met. 271 * loops back and reads them again until this criteria is met.
273 */ 272 */
274 ++(systemcfg->tb_update_count); 273 ++(vdso_data->tb_update_count);
275 smp_wmb(); 274 smp_wmb();
276 systemcfg->tb_orig_stamp = new_tb_stamp; 275 vdso_data->tb_orig_stamp = new_tb_stamp;
277 systemcfg->stamp_xsec = new_stamp_xsec; 276 vdso_data->stamp_xsec = new_stamp_xsec;
278 systemcfg->tb_to_xs = new_tb_to_xs; 277 vdso_data->tb_to_xs = new_tb_to_xs;
278 vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
279 vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
279 smp_wmb(); 280 smp_wmb();
280 ++(systemcfg->tb_update_count); 281 ++(vdso_data->tb_update_count);
281#endif
282} 282}
283 283
284/* 284/*
@@ -357,8 +357,8 @@ static void iSeries_tb_recal(void)
357 do_gtod.tb_ticks_per_sec = tb_ticks_per_sec; 357 do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
358 tb_to_xs = divres.result_low; 358 tb_to_xs = divres.result_low;
359 do_gtod.varp->tb_to_xs = tb_to_xs; 359 do_gtod.varp->tb_to_xs = tb_to_xs;
360 systemcfg->tb_ticks_per_sec = tb_ticks_per_sec; 360 vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
361 systemcfg->tb_to_xs = tb_to_xs; 361 vdso_data->tb_to_xs = tb_to_xs;
362 } 362 }
363 else { 363 else {
364 printk( "Titan recalibrate: FAILED (difference > 4 percent)\n" 364 printk( "Titan recalibrate: FAILED (difference > 4 percent)\n"
@@ -483,6 +483,8 @@ void __init smp_space_timers(unsigned int max_cpus)
483 unsigned long offset = tb_ticks_per_jiffy / max_cpus; 483 unsigned long offset = tb_ticks_per_jiffy / max_cpus;
484 unsigned long previous_tb = per_cpu(last_jiffy, boot_cpuid); 484 unsigned long previous_tb = per_cpu(last_jiffy, boot_cpuid);
485 485
486 /* make sure tb > per_cpu(last_jiffy, cpu) for all cpus always */
487 previous_tb -= tb_ticks_per_jiffy;
486 for_each_cpu(i) { 488 for_each_cpu(i) {
487 if (i != boot_cpuid) { 489 if (i != boot_cpuid) {
488 previous_tb += offset; 490 previous_tb += offset;
@@ -558,10 +560,8 @@ int do_settimeofday(struct timespec *tv)
558 new_xsec += (u64)new_sec * XSEC_PER_SEC - tb_delta_xs; 560 new_xsec += (u64)new_sec * XSEC_PER_SEC - tb_delta_xs;
559 update_gtod(tb_last_jiffy, new_xsec, do_gtod.varp->tb_to_xs); 561 update_gtod(tb_last_jiffy, new_xsec, do_gtod.varp->tb_to_xs);
560 562
561#ifdef CONFIG_PPC64 563 vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
562 systemcfg->tz_minuteswest = sys_tz.tz_minuteswest; 564 vdso_data->tz_dsttime = sys_tz.tz_dsttime;
563 systemcfg->tz_dsttime = sys_tz.tz_dsttime;
564#endif
565 565
566 write_sequnlock_irqrestore(&xtime_lock, flags); 566 write_sequnlock_irqrestore(&xtime_lock, flags);
567 clock_was_set(); 567 clock_was_set();
@@ -710,13 +710,12 @@ void __init time_init(void)
710 do_gtod.tb_ticks_per_sec = tb_ticks_per_sec; 710 do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
711 do_gtod.varp->tb_to_xs = tb_to_xs; 711 do_gtod.varp->tb_to_xs = tb_to_xs;
712 do_gtod.tb_to_us = tb_to_us; 712 do_gtod.tb_to_us = tb_to_us;
713#ifdef CONFIG_PPC64 713
714 systemcfg->tb_orig_stamp = tb_last_jiffy; 714 vdso_data->tb_orig_stamp = tb_last_jiffy;
715 systemcfg->tb_update_count = 0; 715 vdso_data->tb_update_count = 0;
716 systemcfg->tb_ticks_per_sec = tb_ticks_per_sec; 716 vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
717 systemcfg->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC; 717 vdso_data->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC;
718 systemcfg->tb_to_xs = tb_to_xs; 718 vdso_data->tb_to_xs = tb_to_xs;
719#endif
720 719
721 time_freq = 0; 720 time_freq = 0;
722 721