patch-2.4.19 linux-2.4.19/arch/mips64/sgi-ip27/ip27-timer.c
Next file: linux-2.4.19/arch/mips64/sgi-ip32/Makefile
Previous file: linux-2.4.19/arch/mips64/sgi-ip27/ip27-setup.c
Back to the patch index
Back to the overall index
- Lines: 128
- Date:
Fri Aug 2 17:39:43 2002
- Orig file:
linux-2.4.18/arch/mips64/sgi-ip27/ip27-timer.c
- Orig date:
Sun Sep 9 10:43:02 2001
diff -urN linux-2.4.18/arch/mips64/sgi-ip27/ip27-timer.c linux-2.4.19/arch/mips64/sgi-ip27/ip27-timer.c
@@ -12,6 +12,7 @@
#include <linux/timex.h>
#include <linux/mm.h>
+#include <asm/time.h>
#include <asm/pgtable.h>
#include <asm/sgialib.h>
#include <asm/sn/ioc3.h>
@@ -91,8 +92,9 @@
{
int cpu = smp_processor_id();
int cpuA = ((cputoslice(cpu)) == 0);
- int irq = 7; /* XXX Assign number */
+ int irq = 9; /* XXX Assign number */
+ irq_enter(cpu, irq);
write_lock(&xtime_lock);
again:
@@ -109,19 +111,7 @@
do_timer(regs);
#ifdef CONFIG_SMP
- {
- int user = user_mode(regs);
-
- /*
- * update_process_times() expects us to have done irq_enter().
- * Besides, if we don't timer interrupts ignore the global
- * interrupt lock, which is the WrongThing (tm) to do.
- * Picked from i386 code.
- */
- irq_enter(cpu, 0);
- update_process_times(user);
- irq_exit(cpu, 0);
- }
+ update_process_times(user_mode(regs));
#endif /* CONFIG_SMP */
/*
@@ -145,62 +135,19 @@
}
write_unlock(&xtime_lock);
+ irq_exit(cpu, irq);
if (softirq_pending(cpu))
do_softirq();
}
-unsigned long inline do_gettimeoffset(void)
+unsigned long ip27_do_gettimeoffset(void)
{
unsigned long ct_cur1;
ct_cur1 = REMOTE_HUB_L(cputonasid(0), PI_RT_COUNT) + CYCLES_PER_JIFFY;
return (ct_cur1 - ct_cur[0]) * NSEC_PER_CYCLE / 1000;
}
-void do_gettimeofday(struct timeval *tv)
-{
- unsigned long flags;
- unsigned long usec, sec;
-
- read_lock_irqsave(&xtime_lock, flags);
- usec = do_gettimeoffset();
- {
- unsigned long lost = jiffies - wall_jiffies;
- if (lost)
- usec += lost * (1000000 / HZ);
- }
- sec = xtime.tv_sec;
- usec += xtime.tv_usec;
- read_unlock_irqrestore(&xtime_lock, flags);
-
- while (usec >= 1000000) {
- usec -= 1000000;
- sec++;
- }
-
- tv->tv_sec = sec;
- tv->tv_usec = usec;
-}
-
-void do_settimeofday(struct timeval *tv)
-{
- write_lock_irq(&xtime_lock);
- tv->tv_usec -= do_gettimeoffset();
- tv->tv_usec -= (jiffies - wall_jiffies) * (1000000 / HZ);
-
- while (tv->tv_usec < 0) {
- tv->tv_usec += 1000000;
- tv->tv_sec--;
- }
-
- xtime = *tv;
- time_adjust = 0; /* stop active adjtime() */
- time_status |= STA_UNSYNC;
- time_maxerror = NTP_PHASE_LIMIT;
- time_esterror = NTP_PHASE_LIMIT;
- write_unlock_irq(&xtime_lock);
-}
-
/* Includes for ioc3_init(). */
#include <asm/sn/types.h>
#include <asm/sn/sn0/addrs.h>
@@ -239,10 +186,12 @@
return mktime(year, month, date, hour, min, sec);
}
-void __init time_init(void)
+void __init ip27_time_init(void)
{
xtime.tv_sec = get_m48t35_time();
xtime.tv_usec = 0;
+
+ do_gettimeoffset = ip27_do_gettimeoffset;
}
void __init cpu_time_init(void)
@@ -263,7 +212,7 @@
printk("CPU %d clock is %dMHz.\n", smp_processor_id(), cpu->cpu_speed);
- set_cp0_status(SRB_TIMOCLK, SRB_TIMOCLK);
+ set_cp0_status(SRB_TIMOCLK);
}
void __init hub_rtc_init(cnodeid_t cnode)
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)