Out of interest how did you test this? If I find some time I will test it on an e500 system, just havent given much thought on how to test the watchdog though.
- kumar On Mar 4, 2005, at 3:38 AM, Takeharu KATO wrote: > Matt and Kurmar: > > I performed name-cleanup in the driver. > > Moreover, I tested this driver with PowerPC405GPr(Sycamore) > in addition to PowerPC440GP(ebony)/MPC8555(MPC8555-CDS). > > This driver consist of two patches as follows: > > 1) Architecture specific part(booke_wdt-arch.patch) > This is the architecture specific part of the driver. > It contains WDT exception handlers > and kernel command line processing > routines. > > 2) Device driver part(booke_wdt-drv.patch) > This is the core of this WDT > driver. > > At first, I post the architecture specific part with this mail. > > Please apply. > > Regards, > > Signed-off-by: Takeharu KATO <kato.takeharu at jp.fujitsu.com> > > --- linux-2.6.11/arch/ppc/kernel/head_44x.S???? 2005-03-04 > 17:12:42.944450424 +0900 > +++ linux-2.6.11-booke-wdt/arch/ppc/kernel/head_44x.S?? 2005-03-04 > 13:21:31.000000000 +0900 > @@ -444,8 +444,12 @@ interrupt_base: > ? ????? EXCEPTION(0x1010, FixedIntervalTimer, UnknownException, > EXC_XFER_EE) > > ? ????? /* Watchdog Timer Interrupt */ > -?????? /* TODO: Add watchdog support */ > +#if defined(CONFIG_BOOKE_WDT) > +?????? CRITICAL_EXCEPTION(0x1020, WatchdogTimer, booke_wdt_exception) > +#else > ? ????? CRITICAL_EXCEPTION(0x1020, WatchdogTimer, UnknownException) > +#endif? /*? CONFIG_BOOKE_WDT? */ > +?????? > > ? ????? /* Data TLB Error Interrupt */ > ? ????? START_EXCEPTION(DataTLBError) > --- linux-2.6.11/arch/ppc/kernel/head_4xx.S???? 2005-03-04 > 17:16:48.089182760 +0900 > +++ linux-2.6.11-booke-wdt/arch/ppc/kernel/head_4xx.S?? 2005-03-04 > 13:21:31.000000000 +0900 > @@ -469,27 +469,23 @@ label: > > ? /* 0x1000 - Programmable Interval Timer (PIT) Exception */ > ? ????? START_EXCEPTION(0x1000, Decrementer) > -?????? NORMAL_EXCEPTION_PROLOG > -?????? lis???? r0,TSR_PIS at h > -?????? mtspr?? SPRN_TSR,r0???? ??????? /* Clear the PIT exception */ > -?????? addi??? r3,r1,STACK_FRAME_OVERHEAD > -?????? EXC_XFER_LITE(0x1000, timer_interrupt) > - > +?????? b?????? DecrementerHandler > ? #if 0 > ? /* NOTE: > - * FIT and WDT handlers are not implemented yet. > + * FIT handler are not implemented yet. > ?? */ > > ? /* 0x1010 - Fixed Interval Timer (FIT) Exception > ? */ > ? ????? STND_EXCEPTION(0x1010,? FITException,?? ??????? > UnknownException) > > -/* 0x1020 - Watchdog Timer (WDT) Exception > -*/ > - > -?????? CRITICAL_EXCEPTION(0x1020, WDTException, UnknownException) > ? #endif > > +? /* 0x1020 - Watchdog Timer (WDT) Exception > +? */ > +?????? START_EXCEPTION(0x1020, WDTException) > +?????? b?????? WatchDogHandler > + > ? /* 0x1100 - Data TLB Miss Exception > ?? * As the name implies, translation is not in the MMU, so search the > ?? * page tables and fix it.? The only purpose of this function is to > @@ -771,6 +767,14 @@ label: > ? ????? ??????? (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \ > ? ????? ??????? NOCOPY, crit_transfer_to_handler, ret_from_crit_exc) > > + > +DecrementerHandler: > +?????? NORMAL_EXCEPTION_PROLOG > +?????? lis???? r0,TSR_PIS at h > +?????? mtspr?? SPRN_TSR,r0???? ??????? /* Clear the PIT exception */ > +?????? addi??? r3,r1,STACK_FRAME_OVERHEAD > +?????? EXC_XFER_LITE(0x1000, timer_interrupt) > + > ? /* > ?? * The other Data TLB exceptions bail out to this point > ?? * if they can't resolve the lightweight TLB fault. > @@ -844,6 +848,19 @@ finish_tlb_load: > ? ????? rfi???? ??????? ??????? /* Should sync shadow TLBs */ > ? ????? b?????? .?????? ??????? /* prevent prefetch past rfi */ > > +/* > + * WatchDog Exception > + */ > +WatchDogHandler: > +?????? CRITICAL_EXCEPTION_PROLOG; > +?????? addi??? r3,r1,STACK_FRAME_OVERHEAD; > +#if defined(CONFIG_BOOKE_WDT) > +?????? EXC_XFER_TEMPLATE(booke_wdt_exception, 0x1022, (MSR_KERNEL & > ~(MSR_ME|MSR_DE|MSR_CE)),NOCOPY, > crit_transfer_to_handler, ret_from_crit_exc) > + > +#else > +?????? EXC_XFER_TEMPLATE(UnknownException, 0x1022, (MSR_KERNEL & > ~(MSR_ME|MSR_DE|MSR_CE)),NOCOPY, > crit_transfer_to_handler, ret_from_crit_exc) > +#endif? /*? CONFIG_BOOKE_WDT? */ > + > ? /* extern void giveup_fpu(struct task_struct *prev) > ?? * > ?? * The PowerPC 4xx family of processors do not have an FPU, so this > just > --- linux-2.6.11/arch/ppc/kernel/head_e500.S??? 2005-03-04 > 17:15:36.641044528 +0900 > +++ linux-2.6.11-booke-wdt/arch/ppc/kernel/head_e500.S? 2005-03-04 > 13:21:31.000000000 +0900 > @@ -494,8 +494,11 @@ interrupt_base: > ? ????? EXCEPTION(0x3100, FixedIntervalTimer, UnknownException, > EXC_XFER_EE) > > ? ????? /* Watchdog Timer Interrupt */ > -?????? /* TODO: Add watchdog support */ > +#if defined(CONFIG_BOOKE_WDT) > +?????? CRITICAL_EXCEPTION(0x3200, WatchdogTimer, booke_wdt_exception) > +#else > ? ????? CRITICAL_EXCEPTION(0x3200, WatchdogTimer, UnknownException) > +#endif? /*? CONFIG_BOOKE_WDT? */ > > ? ????? /* Data TLB Error Interrupt */ > ? ????? START_EXCEPTION(DataTLBError) > --- linux-2.6.11/arch/ppc/platforms/85xx/mpc8540_ads.c? 2005-03-04 > 17:13:11.927044400 +0900 > +++ > linux-2.6.11-booke-wdt/arch/ppc/platforms/85xx/mpc8540_ads.c??????? > 2005-03-04 13:21:31.000000000 +0900 > @@ -54,6 +54,7 @@ > > ? #include <syslib/ppc85xx_setup.h> > > + > ? /* > *********************************************************************** > * > ?? * > ?? * Setup the architecture > @@ -187,6 +188,14 @@ platform_init(unsigned long r3, unsigned > ? ????? ??????? strcpy(cmd_line, (char *) (r6 + KERNELBASE)); > ? ????? } > > +#ifdef CONFIG_BOOKE_WDT > +???? { > +?????? extern void booke_wdt_setup_options(char *cmd_line); > + > +?????? booke_wdt_setup_options(cmd_line); > +???? } > +#endif? /*? CONFIG_BOOKE_WDT? */ > + > ? ????? identify_ppc_sys_by_id(mfspr(SVR)); > > ? ????? /* setup the PowerPC module struct */ > --- linux-2.6.11/arch/ppc/platforms/85xx/mpc8560_ads.c? 2005-03-04 > 17:17:54.566076736 +0900 > +++ > linux-2.6.11-booke-wdt/arch/ppc/platforms/85xx/mpc8560_ads.c??????? > 2005-03-04 13:21:31.000000000 +0900 > @@ -197,6 +197,14 @@ platform_init(unsigned long r3, unsigned > ? ????? ??????? strcpy(cmd_line, (char *) (r6 + KERNELBASE)); > ? ????? } > > +#ifdef CONFIG_BOOKE_WDT > +???? { > +?????? extern void booke_wdt_setup_options(char *cmd_line); > + > +?????? booke_wdt_setup_options(cmd_line); > +???? } > +#endif? /*? CONFIG_BOOKE_WDT? */ > + > ? ????? identify_ppc_sys_by_id(mfspr(SVR)); > > ? ????? /* setup the PowerPC module struct */ > --- linux-2.6.11/arch/ppc/platforms/85xx/mpc85xx_cds_common.c?? > 2005-03-04 17:16:27.056380232 +0900 > +++ > linux-2.6.11-booke-wdt/arch/ppc/platforms/85xx/mpc85xx_cds_common.c > 2005-03-04 > 13:21:31.000000000 +0900 > @@ -437,6 +437,14 @@ platform_init(unsigned long r3, unsigned > ????????????????? strcpy(cmd_line, (char *) (r6 + KERNELBASE)); > ????????? } > > +#ifdef CONFIG_BOOKE_WDT > +???? { > +?????? extern void booke_wdt_setup_options(char *cmd_line); > + > +?????? booke_wdt_setup_options(cmd_line); > +???? } > +#endif? /*? CONFIG_BOOKE_WDT? */ > + > ? ????? identify_ppc_sys_by_id(mfspr(SVR)); > > ????????? /* setup the PowerPC module struct */ > --- linux-2.6.11/arch/ppc/platforms/85xx/sbc8560.c????? 2005-03-04 > 17:17:22.985877656 +0900 > +++ linux-2.6.11-booke-wdt/arch/ppc/platforms/85xx/sbc8560.c??? > 2005-03-04 13:21:31.000000000 +0900 > @@ -198,6 +198,14 @@ platform_init(unsigned long r3, unsigned > ? ????? ??????? strcpy(cmd_line, (char *) (r6 + KERNELBASE)); > ? ????? } > > +#ifdef CONFIG_BOOKE_WDT > +???? { > +?????? extern void booke_wdt_setup_options(char *cmd_line); > + > +?????? booke_wdt_setup_options(cmd_line); > +???? } > +#endif? /*? CONFIG_BOOKE_WDT? */ > + > ? ????? identify_ppc_sys_by_id(mfspr(SVR)); > > ? ????? /* setup the PowerPC module struct */ > --- linux-2.6.11/arch/ppc/platforms/85xx/stx_gp3.c????? 2005-03-04 > 17:14:12.883777568 +0900 > +++ linux-2.6.11-booke-wdt/arch/ppc/platforms/85xx/stx_gp3.c??? > 2005-03-04 13:21:31.000000000 +0900 > @@ -68,6 +68,7 @@ unsigned long isa_mem_base = 0; > ? unsigned long pci_dram_offset = 0; > ? #endif > > + > ? /* Internal interrupts are all Level Sensitive, and Positive > Polarity */ > ? static u8 gp3_openpic_initsenses[] __initdata = { > ? ????? (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),????? /* Internal? > 0: L2 Cache */ > @@ -357,6 +358,14 @@ platform_init(unsigned long r3, unsigned > ? ????? ??????? strcpy(cmd_line, (char *) (r6 + KERNELBASE)); > ? ????? } > > +#ifdef CONFIG_BOOKE_WDT > +???? { > +?????? extern void booke_wdt_setup_options(char *cmd_line); > + > +?????? booke_wdt_setup_options(cmd_line); > +???? } > +#endif? /*? CONFIG_BOOKE_WDT? */ > + > ? ????? identify_ppc_sys_by_id(mfspr(SVR)); > > ? ????? /* setup the PowerPC module struct */ > --- linux-2.6.11/arch/ppc/syslib/ppc4xx_setup.c 2005-03-04 > 17:10:56.867576560 +0900 > +++ linux-2.6.11-booke-wdt/arch/ppc/syslib/ppc4xx_setup.c?????? > 2005-03-04 13:21:31.000000000 +0900 > @@ -48,10 +48,6 @@ > ? extern void abort(void); > ? extern void ppc4xx_find_bridges(void); > > -extern void ppc4xx_wdt_heartbeat(void); > -extern int wdt_enable; > -extern unsigned long wdt_period; > - > ? /* Global Variables */ > ? bd_t __res; > > @@ -257,22 +253,14 @@ ppc4xx_init(unsigned long r3, unsigned l > ? ????? ??????? *(char *) (r7 + KERNELBASE) = 0; > ? ????? ??????? strcpy(cmd_line, (char *) (r6 + KERNELBASE)); > ? ????? } > -#if defined(CONFIG_PPC405_WDT) > -/* Look for wdt= option on command line */ > -?????? if (strstr(cmd_line, "wdt=")) { > -?????? ??????? int valid_wdt = 0; > -?????? ??????? char *p, *q; > -?????? ??????? for (q = cmd_line; (p = strstr(q, "wdt=")) != 0;) { > -?????? ??????? ??????? q = p + 4; > -?????? ??????? ??????? if (p > cmd_line && p[-1] != ' ') > -?????? ??????? ??????? ??????? continue; > -?????? ??????? ??????? wdt_period = simple_strtoul(q, &q, 0); > -?????? ??????? ??????? valid_wdt = 1; > -?????? ??????? ??????? ++q; > -?????? ??????? } > -?????? ??????? wdt_enable = valid_wdt; > -?????? } > -#endif > + > +#ifdef CONFIG_BOOKE_WDT > +???? { > +?????? extern void booke_wdt_setup_options(char *cmd_line); > + > +?????? booke_wdt_setup_options(cmd_line); > +???? } > +#endif? /*? CONFIG_BOOKE_WDT? */ > > ? ????? /* Initialize machine-dependent vectors */ > > @@ -319,3 +307,5 @@ void platform_machine_check(struct pt_re > ? #endif > > ? } > + > + > > >