From owner-p4-projects@FreeBSD.ORG Mon Jan 7 23:32:42 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 0730116A46D; Mon, 7 Jan 2008 23:32:42 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C061B16A419 for ; Mon, 7 Jan 2008 23:32:41 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 9E36313C4E8 for ; Mon, 7 Jan 2008 23:32:41 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m07NWf4k089206 for ; Mon, 7 Jan 2008 23:32:41 GMT (envelope-from gonzo@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m07NWfxf089203 for perforce@freebsd.org; Mon, 7 Jan 2008 23:32:41 GMT (envelope-from gonzo@FreeBSD.org) Date: Mon, 7 Jan 2008 23:32:41 GMT Message-Id: <200801072332.m07NWfxf089203@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gonzo@FreeBSD.org using -f From: Oleksandr Tymoshenko To: Perforce Change Reviews Cc: Subject: PERFORCE change 132757 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Jan 2008 23:32:42 -0000 http://perforce.freebsd.org/chv.cgi?CH=132757 Change 132757 by gonzo@gonzo_jeeves on 2008/01/07 23:31:51 o Retire old tick.c in favor of J! clock.c o Move all clock-related stuff from machdep.c to clock.c o Clean out onsoleted functions from clock.c o All platforms should use mips_timer_init_params to initialize CPU frequency (obtained in a platform-dependent fashion) and frequency divisor. Fixed it for MALTA stuff only on the moment. o Some style(9) fixes. Affected files ... .. //depot/projects/mips2-jnpr/src/sys/conf/files.mips#7 edit .. //depot/projects/mips2-jnpr/src/sys/mips/include/clock.h#7 edit .. //depot/projects/mips2-jnpr/src/sys/mips/mips/clock.c#4 edit .. //depot/projects/mips2-jnpr/src/sys/mips/mips/machdep.c#11 edit .. //depot/projects/mips2-jnpr/src/sys/mips/mips32/malta/malta_machdep.c#4 edit Differences ... ==== //depot/projects/mips2-jnpr/src/sys/conf/files.mips#7 (text+ko) ==== @@ -56,7 +56,7 @@ # Phase 4 # ---------------------------------------------------------------------- # -#mips/mips/clock.c standard +mips/mips/clock.c standard #mips/mips/queue.c standard # ---------------------------------------------------------------------- # Phase 5 @@ -82,7 +82,7 @@ mips/mips/stack_machdep.c optional ddb | stack mips/mips/support.S standard mips/mips/swtch.S standard -mips/mips/tick.c standard +# mips/mips/tick.c standard mips/mips/uio_machdep.c standard geom/geom_bsd.c standard geom/geom_bsd_enc.c standard ==== //depot/projects/mips2-jnpr/src/sys/mips/include/clock.h#7 (text+ko) ==== @@ -17,19 +17,6 @@ extern int cpu_clock; -/* - * count register is incremented as function of cpu - * pipeline frequency. - */ -/* - * FREEBSD_DEVELOPERS_FIXME: - * MIPS_COUNT_DIVIDER is CPU specific. There are some CPUs for which - * the count register runs at the same frequency as the CPU pipeline frequency - */ - -/* Standard MIPS Processors - count runs at 1/2 of the CPU pipeline frequency */ -#define MIPS_COUNT_DIVIDER 2 - extern uint32_t clockintr(uint32_t, struct clockframe *); #define wall_cmos_clock 0 @@ -41,8 +28,7 @@ */ #define MIPS_DEFAULT_HZ (100 * 1000 * 1000) -void tick_init_params(uint64_t, int); -void tick_init(void); +void mips_timer_init_params(uint64_t, int); int sysbeep(int pitch, int period); extern uint64_t counter_freq; ==== //depot/projects/mips2-jnpr/src/sys/mips/mips/clock.c#4 (text+ko) ==== @@ -68,27 +68,13 @@ int clock_started = 0; static u_long mips_timer_hz; -u_int32_t cpu_counter_interval; - -struct timespec time; - -#define SECMIN (60) /* seconds per minute */ -#define SECHOUR (60*SECMIN) /* seconds per hour */ -#define SECDAY (24*SECHOUR) /* seconds per day */ -#define SECYR (365*SECDAY) /* seconds per common year */ +uint32_t cpu_counter_interval; +uint32_t mips_count_divider = 2; -#define YEARDAYS(year) ((((year) % 4) == 0 && \ - ((year % 100) != 0 || (year % 400) == 0)) ? 366 : 365) - -#define RTC_NOPROFRATE 128 -#define RTC_PROFRATE 1024 -#define R7K_TIMER_FREQ 33000000 - #if 0 #define DEBUG_CLOCK 1 #endif -static int get_todtime(struct tod_time *); static unsigned mips_get_timecount(struct timecounter *tc); static void mips_timer_init(void); @@ -109,7 +95,7 @@ unsigned int c, current_dly = 0, dly, p; p = Mips_GetCOUNT(); - dly = (cpu_clock / 1000000 / MIPS_COUNT_DIVIDER) * n; + dly = (cpu_clock / 1000000 / mips_count_divider) * n; while(current_dly < dly ) { c = Mips_GetCOUNT(); current_dly += c - p; @@ -135,7 +121,7 @@ printf("cpu_initclocks(): stathz = 0x%x, profhz = 0x%x\n", stathz, profhz); - mips_timecounter.tc_frequency = cpu_clock / MIPS_COUNT_DIVIDER; + mips_timecounter.tc_frequency = cpu_clock / mips_count_divider; tc_init(&mips_timecounter); mips_timer_init(); @@ -144,14 +130,37 @@ } } -void mips_start_timer(void); +static void +mips_start_timer(void) +{ + + Mips_SetCOMPARE(Mips_GetCOUNT() + cpu_counter_interval); +} + +static uint64_t +mips_ticker(void) +{ + + return ((uint64_t)Mips_GetCOUNT()); +} -void mips_start_timer(void) +void +mips_timer_init_params(uint64_t platform_counter_freq, int double_count) { - Mips_SetCOMPARE(Mips_GetCOUNT() + cpu_counter_interval); + cpu_clock = platform_counter_freq; + + if (double_count != 0) + mips_count_divider = 2; + else + mips_count_divider = 1; + + /* XXX: should divider be taken into account */ + set_cputicker(mips_ticker, cpu_clock, 1); } + + /* * Clock interrupt code for machines using the on cpu chip * counter register. This register counts at half the pipeline @@ -180,15 +189,15 @@ * The counter register acts like timer which is incremented as * function of the CPU pipeline frequency. */ - cpu_counter_interval = (cpu_clock / MIPS_COUNT_DIVIDER) / mips_timer_hz ; + cpu_counter_interval = (cpu_clock / mips_count_divider) / mips_timer_hz ; mips_start_timer(); printf("mips_timer_init: cpu_counter_interval = 0x%x\n", cpu_counter_interval); } -intrmask_t -clockintr(intrmask_t mask, struct clockframe *frame) +uint32_t +clockintr(uint32_t mask, struct clockframe *frame) { struct clk_ticks *cpu_ticks; @@ -203,16 +212,16 @@ if (cpu_ticks->hard_ticks >= mips_timer_hz) { cpu_ticks->hard_ticks -= mips_timer_hz; if (PCPU_GET(cpuid) == 0) - hardclock(frame); + hardclock(USERMODE(frame->sr), frame->pc); else - hardclock_process(frame); + hardclock_cpu(USERMODE(frame->sr)); } /* Fire statclock at stathz. */ cpu_ticks->stat_ticks += stathz; if (cpu_ticks->stat_ticks >= mips_timer_hz) { cpu_ticks->stat_ticks -= mips_timer_hz; - statclock(frame); + statclock(USERMODE(frame->sr)); } /* Fire profclock at profhz, but only when needed. */ @@ -220,11 +229,10 @@ if (cpu_ticks->prof_ticks >= mips_timer_hz) { cpu_ticks->prof_ticks -= mips_timer_hz; if (profprocs != 0) - profclock(frame); + profclock(USERMODE(frame->sr), frame->pc); } critical_exit(); done: - atomic_add_int((int *)&intrcnt[INTRCNT_HARDCLOCK], 1); /* restart timer */ mips_start_timer(); /* @@ -237,34 +245,6 @@ return CR_INT_CLOCK; } -/* - * We assume newhz is either stathz or profhz, and that neither will - * change after being set up above. Could recalculate intervals here - * but that would be a drag. - */ -void -setstatclockrate(int newhz) -{ - - /* nothing we can do */ -} - -static int -get_todtime(struct tod_time *tod) -{ - - /* - * Read RTC chip registers NOTE: Read routines are responsible - * for sanity checking clock. Dates after 19991231 should be - * returned as year >= 100. - */ - - /* - * NO hardware tod clock. - */ - return (0); -} - void cpu_startprofclock(void) { @@ -277,128 +257,9 @@ /* nothing to do */ } -/* - * This code is defunct after 2099. Will Unix still be here then?? - */ -static short dayyr[12] = { - 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 -}; - -/* - * Initialize the time of day register, based on the time base which - * is, e.g. from a filesystem. - */ -void -inittodr(time_t base) -{ - struct tod_time c; - long deltat; - int days, yr, s; - - if (base < 15*SECYR) { - printf("WARNING: preposterous time in file system\n"); - /* read the system clock anyway */ - base = 17*SECYR + 186*SECDAY + SECDAY/2; - } - - if (base) { - s = splclock(); - time.tv_sec = base; - time.tv_nsec = 0; - splx(s); - } - - if (!get_todtime(&c)) { - printf("WARNING: No TOD clock, believing file system.\n"); - s = splclock(); - tc_setclock(&time); - splx(s); - clockinitted = 1; - return; - } - - days = 0; - for (yr = 1970; yr < c.year; yr++) { - days += YEARDAYS(yr); - } - days += dayyr[c.mon - 1] + c.day - 1; - if (YEARDAYS(c.year) == 366 && c.mon > 2) - days++; - /* now have days since Jan 1, 1970; the rest is easy... */ - s = splclock(); - time.tv_sec = days * SECDAY + c.hour * 3600 + c.min * 60 + c.sec; - time.tv_nsec = 0; - tc_setclock(&time); - splx(s); - clockinitted = 1; - - /* - * See if we gained/lost time. - */ - deltat = time.tv_sec - base; - if (deltat > 5*SECYR) { - printf("WARNING: clock %d days greater than file system time\n", - deltat / SECDAY); - return; - } else if (deltat < -SECDAY) { - printf("WARNING: clock %d days less than file system time\n", - deltat / -SECDAY); - } else { - return; - } -} - -/* - * Reset the TOD clock. This is done when the system is halted or - * when the time is reset by the stime system call. - */ -void -resettodr(void) -{ - struct tod_time c; - register int t = 0, t2 = 0; - - /* - * Don't reset clock if time has not been set! - */ - if(!clockinitted) { - return; - } - - /* compute the day of week. 1 is Sunday*/ - t2 = time.tv_sec / SECDAY; - c.dow = (t2 + 5) % 7; /* 1/1/1970 was thursday */ - - /* compute the year */ - t2 = time.tv_sec / SECDAY; - c.year = 69; - while (t2 >= 0) { /* whittle off years */ - t = t2; - c.year++; - t2 -= YEARDAYS(c.year); - } - - /* t = month + day; separate */ - t2 = YEARDAYS(c.year); - for (c.mon = 1; c.mon < 12; c.mon++) { - if (t < dayyr[c.mon] + (t2 == 366 && c.mon > 1)) - break; - } - - c.day = t - dayyr[c.mon - 1] + 1; - if (t2 == 366 && c.mon > 2) { - c.day--; - } - - t = time.tv_sec % SECDAY; - c.hour = t / 3600; - t %= 3600; - c.min = t / 60; - c.sec = t % 60; -} - static unsigned mips_get_timecount(struct timecounter *tc) { + return(Mips_GetCOUNT()); } ==== //depot/projects/mips2-jnpr/src/sys/mips/mips/machdep.c#11 (text+ko) ==== @@ -119,7 +119,7 @@ int cold = 1; int Maxmem; long realmem = 0; -int cpu_clock; +int cpu_clock = MIPS_DEFAULT_HZ; SYSCTL_INT(_hw, OID_AUTO, clockrate, CTLFLAG_RD, &cpu_clock, 0, "CPU instruction clock rate"); int clocks_running = 0; @@ -675,22 +675,3 @@ printf("Kernel dumps not implemented on this architecture\n"); } - -void -cpu_initclocks() -{ - tick_init(); - clocks_running = 1; -} - -void -cpu_startprofclock(void) -{ - -} - -void -cpu_stopprofclock(void) -{ - -} ==== //depot/projects/mips2-jnpr/src/sys/mips/mips32/malta/malta_machdep.c#4 (text+ko) ==== @@ -314,5 +314,5 @@ #endif } while(0); - tick_init_params(platform_counter_freq, 0); + mips_timer_init_params(platform_counter_freq, 0); }