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