On Wed, Jan 20, 2010 at 05:56,  <[email protected]> wrote:
> Modified: trunk/arch/blackfin/Kconfig (8203 => 8204)
>
> @@ -661,7 +661,7 @@
>
>  choice
>       prompt "Blackfin Exception Scratch Register"
> -     default BFIN_SCRATCH_REG_RETN
> +     default BFIN_SCRATCH_REG_RETE

uhh, no.  you just broke compatibility with JTAG ICEs in default configs.

> Modified: trunk/arch/blackfin/Kconfig.debug (8203 => 8204)
>
> @@ -238,6 +238,17 @@
>         all of this lives in the init section and is thrown away after the
>         kernel boots completely.
>
> +config NMI_WATCHDOG
> +     bool "Enable NMI watchdog to help debuging lockup on SMP"
> +     default n
> +     depends on SMP
> +     help
> +       if any CPU in the system does not execute the period local timer
> +       interrupt for more than 5 seconds, then the NMI handler dumps debug
> +       information. This information can be used to debug the lockup.
> +
> +       Note: this feature means can not select BFIN_SCRATCH_REG_RETN

so use Kconfig dependency: depends !BFIN_SCRATCH_REG_RETN

> Added: trunk/arch/blackfin/kernel/nmi.c (0 => 8204)
>
> +/* Bit in WDOG_CTL that indicates watchdog has expired (WDR0) */
> +#define WDOG_EXPIRED 0x8000
> +
> +/* Masks for WDEV field in WDOG_CTL register */
> +#define ICTL_RESET   0x0
> +#define ICTL_NMI     0x2
> +#define ICTL_GPI     0x4
> +#define ICTL_NONE    0x6
> +#define ICTL_MASK    0x6
> +
> +/* Masks for WDEN field in WDOG_CTL register */
> +#define WDEN_MASK    0x0FF0
> +#define WDEN_ENABLE  0x0000
> +#define WDEN_DISABLE 0x0AD0

these really need to be merged with the bfin-wdt into say asm/bfin_watchdog.h

> +static int nmi_wdt_set_timeout(unsigned long t)
> +{
> +     u32 cnt;
> +     int run;
> +
> +     cnt = t * get_sclk();
> +     if (cnt < get_sclk()) {

cache the sclk value locally so we dont call get_sclk() twice

> +             printk(KERN_WARNING "NMI: timeout value is too large\n");

pr_warning()

> +static int __init init_nmi_wdt(void)
> +{
> +     nmi_wdt_set_timeout(timeout);
> +     nmi_wdt_start();
> +     nmi_active = true;
> +     printk(KERN_INFO "nmi_wdt: initialized: timeout=%d sec\n", timeout);

pr_info

> +asmlinkage notrace void do_nmi(struct pt_regs *fp)

if this guy is labeled notrace, are all the functions it calls notrace
too ?  seems like printk() and such wont be ...

> +     printk(KERN_EMERG "NMI Watchdog detected LOCKUP, dump for CPU %d\n",
> +                                                     smp_processor_id());

pr_emerg() and you've already got smp_processor_id() in the local cpu var

> +     show_stack(current, (unsigned long *)fp);
> +     printk(KERN_EMERG "\n\n");

pr_emerg()

> Modified: trunk/arch/blackfin/mach-common/interrupt.S (8203 => 8204)
>
> +     /* Turn caches off, to ensure we don't get double exceptions */
> +     P4.L = LO(IMEM_CONTROL);
> +     P4.H = HI(IMEM_CONTROL);
> +     R5 = [P4];
> +     [--SP] = R5;
> +     BITCLR(R5,ENICPLB_P);
> +     CSYNC;
> +     [P4] = R5;
> +     SSYNC;
> +
> +     P4.L = LO(DMEM_CONTROL);
> +     P4.H = HI(DMEM_CONTROL);
> +     R5 = [P4];

load COREMMR_BASE into P4.H, then you can do:
R5 = [P4 + (DMEM_CONTROL - COREMMR_BASE)];

> +     [--SP] = R5;
> +     BITCLR(R5,ENDCPLB_P);
> +     CSYNC;
> +     [P4] = R5;
> +     SSYNC;
> +
> +     SP += -12;
> +     call _do_nmi;
> +     SP += 12;
> +
> +     R5 = [SP++];
> +     P4.L = LO(DMEM_CONTROL);
> +     P4.H = HI(DMEM_CONTROL);

if you use preserved registers, you dont need to reload the pointers
(P4/R5/etc...) across the function call as the C ABI will take care of
it
-mike
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to