Subject: Re: generic todr implementation for hp700
To: Nick Hudson <nick.hudson@dsl.pipex.com>
From: Garrett D'Amore <garrett_damore@tadpole.com>
List: port-hp700
Date: 09/14/2006 21:09:45
That looks good to me. If it works for you, please commit it!
-- Garrett
Nick Hudson wrote:
> On Thursday 14 September 2006 18:29, Izumi Tsutsui wrote:
>
>> garrett_damore@tadpole.com wrote:
>>
>>> Attached is the code to convert hp700 to generic TODR. Testing and
>>> commit approval desired. :-)
>>>
>> I can't test it right now, but it seems better to move
>> settod() and gettod() from dev/clock.c to dev/pdc.c
>> and to call todr_attach() in pdc_init().
>>
>
> Like this?
>
>
>> ---
>> Izumi Tsutsui
>>
>
> Nick
>
> ------------------------------------------------------------------------
>
> Index: sys/arch/hp700/dev/clock.c
> ===================================================================
> RCS file: /cvsroot/src/sys/arch/hp700/dev/clock.c,v
> retrieving revision 1.4
> diff -u -p -u -r1.4 clock.c
> --- sys/arch/hp700/dev/clock.c 11 Dec 2005 12:17:24 -0000 1.4
> +++ sys/arch/hp700/dev/clock.c 14 Sep 2006 21:10:28 -0000
> @@ -40,8 +40,6 @@ __KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.
> #include <sys/kernel.h>
> #include <sys/time.h>
>
> -#include <dev/clock_subr.h>
> -
> #include <machine/pdc.h>
> #include <machine/iomod.h>
> #include <machine/psl.h>
> @@ -58,12 +56,6 @@ __KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.
> #include <ddb/db_extern.h>
> #endif
>
> -volatile struct timeval time;
> -
> -void startrtclock(void);
> -
> -static struct pdc_tod tod PDC_ALIGNMENT;
> -
> void
> cpu_initclocks(void)
> {
> @@ -97,60 +89,6 @@ clock_intr(void *v)
> return 1;
> }
>
> -
> -/*
> - * initialize the system time from the time of day clock
> - */
> -void
> -inittodr(time_t t)
> -{
> - int tbad = 0;
> - int pagezero_cookie;
> -
> - if (t < 5*SECYR) {
> - printf ("WARNING: preposterous time in file system");
> - t = 6*SECYR + 186*SECDAY + SECDAY/2;
> - tbad = 1;
> - }
> -
> - pagezero_cookie = hp700_pagezero_map();
> - pdc_call((iodcio_t)PAGE0->mem_pdc, 1, PDC_TOD, PDC_TOD_READ,
> - &tod, 0, 0, 0, 0, 0);
> - hp700_pagezero_unmap(pagezero_cookie);
> -
> - time.tv_sec = tod.sec;
> - time.tv_usec = tod.usec;
> -
> - if (!tbad) {
> - u_long dt;
> -
> - dt = (time.tv_sec < t)? t - time.tv_sec : time.tv_sec - t;
> -
> - if (dt < 2 * SECDAY)
> - return;
> - printf("WARNING: clock %s %ld days",
> - time.tv_sec < t? "lost" : "gained", dt / SECDAY);
> - }
> -
> - printf (" -- CHECK AND RESET THE DATE!\n");
> -}
> -
> -/*
> - * reset the time of day clock to the value in time
> - */
> -void
> -resettodr(void)
> -{
> - int pagezero_cookie;
> -
> - tod.sec = time.tv_sec;
> - tod.usec = time.tv_usec;
> -
> - pagezero_cookie = hp700_pagezero_map();
> - pdc_call((iodcio_t)PAGE0->mem_pdc, 1, PDC_TOD, PDC_TOD_WRITE, &tod);
> - hp700_pagezero_unmap(pagezero_cookie);
> -}
> -
> void
> setstatclockrate(int newhz)
> {
> Index: sys/arch/hp700/dev/pdc.c
> ===================================================================
> RCS file: /cvsroot/src/sys/arch/hp700/dev/pdc.c,v
> retrieving revision 1.17
> diff -u -p -u -r1.17 pdc.c
> --- sys/arch/hp700/dev/pdc.c 23 Jul 2006 22:06:05 -0000 1.17
> +++ sys/arch/hp700/dev/pdc.c 14 Sep 2006 21:10:28 -0000
> @@ -46,6 +46,7 @@ __KERNEL_RCSID(0, "$NetBSD: pdc.c,v 1.17
> #include <sys/kauth.h>
>
> #include <dev/cons.h>
> +#include <dev/clock_subr.h>
>
> #include <machine/pdc.h>
> #include <machine/iomod.h>
> @@ -98,9 +99,18 @@ int pdccnlookc(dev_t, int *);
>
> static struct cnm_state pdc_cnm_state;
>
> +static int pdcgettod(todr_chip_handle_t, volatile struct timeval *);
> +static int pdcsettod(todr_chip_handle_t, volatile struct timeval *);
> +
> +static struct pdc_tod tod PDC_ALIGNMENT;
> +
> void
> pdc_init(void)
> {
> + static struct todr_chip_handle todr = {
> + .todr_settime = pdcsettod,
> + .todr_gettime = pdcgettod,
> + };
> static int kbd_iodc[IODC_MAXSIZE/sizeof(int)];
> static int cn_iodc[IODC_MAXSIZE/sizeof(int)];
> int err;
> @@ -134,6 +144,9 @@ pdc_init(void)
> cn_set_magic("+++++");
>
> hp700_pagezero_unmap(pagezero_cookie);
> +
> + /* attach the TOD clock */
> + todr_attach(&todr);
> }
>
> int
> @@ -442,3 +455,32 @@ void
> pdccnpollc(dev_t dev, int on)
> {
> }
> +
> +static int
> +pdcgettod(todr_chip_handle_t tch, volatile struct timeval *tvp)
> +{
> + int pagezero_cookie;
> +
> + pagezero_cookie = hp700_pagezero_map();
> + pdc_call((iodcio_t)PAGE0->mem_pdc, 1, PDC_TOD, PDC_TOD_READ,
> + &tod, 0, 0, 0, 0, 0);
> + hp700_pagezero_unmap(pagezero_cookie);
> +
> + tvp->tv_sec = tod.sec;
> + tvp->tv_usec = tod.usec;
> + return 0;
> +}
> +
> +static int
> +pdcsettod(todr_chip_handle_t tch, volatile struct timeval *tvp)
> +{
> + int pagezero_cookie;
> +
> + tod.sec = tvp->tv_sec;
> + tod.usec = tvp->tv_usec;
> +
> + pagezero_cookie = hp700_pagezero_map();
> + pdc_call((iodcio_t)PAGE0->mem_pdc, 1, PDC_TOD, PDC_TOD_WRITE, &tod);
> + hp700_pagezero_unmap(pagezero_cookie);
> + return 0;
> +}
> Index: sys/arch/hp700/include/types.h
> ===================================================================
> RCS file: /cvsroot/src/sys/arch/hp700/include/types.h,v
> retrieving revision 1.5
> diff -u -p -u -r1.5 types.h
> --- sys/arch/hp700/include/types.h 3 Sep 2006 13:51:23 -0000 1.5
> +++ sys/arch/hp700/include/types.h 14 Sep 2006 21:10:28 -0000
> @@ -7,5 +7,6 @@
>
> #define __HAVE_GENERIC_SOFT_INTERRUPTS
> #define __HAVE_DEVICE_REGISTER
> +#define __HAVE_GENERIC_TODR
>
> #endif /* _HP700_TYPES_H_ */
> Index: sys/arch/hp700/hp700/machdep.c
> ===================================================================
> RCS file: /cvsroot/src/sys/arch/hp700/hp700/machdep.c,v
> retrieving revision 1.30
> diff -u -p -u -r1.30 machdep.c
> --- sys/arch/hp700/hp700/machdep.c 26 Aug 2006 06:17:48 -0000 1.30
> +++ sys/arch/hp700/hp700/machdep.c 14 Sep 2006 21:10:30 -0000
> @@ -1361,10 +1361,12 @@ cpu_reboot(int howto, char *user_boot_st
> if (!(howto & RB_NOSYNC) && waittime < 0) {
> waittime = 0;
> vfs_shutdown();
> -#if 0
> +
> + /*
> + * If we've been adjusting the clock, the todr
> + * will be out of synch; adjust it now.
> + */
> resettodr();
> -#endif
> - printf("WARNING: not updating battery clock\n");
> }
>
> /* XXX probably save howto into stable storage */
>
--
Garrett D'Amore, Principal Software Engineer
Tadpole Computer / Computing Technologies Division,
General Dynamics C4 Systems
http://www.tadpolecomputer.com/
Phone: 951 325-2134 Fax: 951 325-2191