Watchdog on MPC82xx

Bastos Fernandez Alexandre alebas at televes.com
Wed Apr 19 21:13:55 EST 2006


Well,

I have tested two different approaches which has been confirmed
to be already working on MPC82xx boards.

One, from Paul Bilke, is based on modifiying printk to service
the WDT and reload the counter during boot time.
So I have modified kernel/printk.c and tested with this:

asmlinkage int printk(const char *fmt, ...)
{
    va_list args;
    int r;

    force_wdt_reload();
    [...]
}

#define SWSR_ADDR (CPM_MAP_ADDR + 0x1000E)

void force_wdt_reload(void)
{
    unsigned short *swsr_ptr = (unsigned short *)ioremap(SWSR_ADDR,0x2);

    (*swsr_ptr) = (unsigned short) 0x556c;
    (*swsr_ptr) = (unsigned short) 0xaa39;
}

Paul has reported changing printk works for him on several MPC82xx boards.

Second one is from Mike Rapoport from Compulab. Is the heartbeat
method. I have added and additional call in m82xx_board_setup()
which should reset the WDT for the first time in setup_arch():

static __inline__ void reset_8260_watchdog(void)
{
    cpm2_immr->im_siu_conf.siu_82xx.sc_swsr = 0x556c;
    cpm2_immr->im_siu_conf.siu_82xx.sc_swsr = 0xaa39;
}

void __init
m82xx_board_setup(void)
{
    volatile cpm2_map_t *immap = cpm2_immr;

    reset_8260_watchdog();

    ppc_md.heartbeat = m82xx_heartbeat;
    ppc_md.heartbeat_reset = HZ/2;
    ppc_md.heartbeat_count = 1;

}

Mike has reported the heartbeat method is working for him
on MPC8247 and MPC8271 boards with kernel 2.6.12.3.


I have tested both in a MCP8248 based board, with kernel
2.6.15 and u-boot 1.1.4 and I have no success. I can see
the __log_buf after the reset caused by de WDT and there
are several printk's done. I have put printk's to the
reset_8260_watchdog(), and I can see them also, so I
should suppose it is executed, but the board keeps reseting.
Furthermore, u-boot is doing OK the WDT job (with changes done
from Compulab).

I have dissasambled that, and for example:

c01c93b8 <m82xx_board_setup>:
c01c93b8: 3d 40 c0 1e     lis     r10,-16354
c01c93bc: 38 00 55 6c     li      r0,21868
c01c93c0: 81 2a 81 8c     lwz     r9,-32372(r10)
c01c93c4: 3d 09 00 01     addis   r8,r9,1
c01c93c8: b0 08 00 0e     sth     r0,14(r8)
c01c93cc: 81 68 0d 50     lwz     r11,3408(r8)
c01c93d0: 81 2a 81 8c     lwz     r9,-32372(r10)
c01c93d4: 75 60 08 00     andis.  r0,r11,2048
c01c93d8: 38 00 aa 39     li      r0,-21959
c01c93dc: 3d 29 00 01     addis   r9,r9,1
c01c93e0: b0 09 00 0e     sth     r0,14(r9)
c01c93e4: 41 82 00 44     beq-    c01c9428 <m82xx_board_setup+0x70>

[...]

which looks OK for me (but I am not an expert).

So, could someone give me some guideline about what could
be happening?. Should I downgrade to 2.6.12.3 and test?
Is the WDT being reloaded at least one time and then
failing to reset? Some idea on how to debug that?

Thanks


Alex BASTOS

P.S. The __log_buf
 3c353e4c 696e7578 20766572 73696f6e    <5>Linux version
 20322e36 2e313520 28616c65 62617340     2.6.15 (alebas@
 54523339 32292028 67636320 76657273    xxxx) (gcc vers
 696f6e20 332e332e 32292023 33392050    ion 3.3.2) #39 P
 5245454d 50542054 75652041 70722031    REEMPT Tue Apr 1
 38203135 3a32353a 33392043 45535420    8 15:25:39 CEST
 32303036 0a3c363e 54656c65 76657320    2006.<6>Televes
 446f4338 32343820 436f6d70 75746572    XXX8248 Computer
 2d6f6e2d 4d6f6475 6c652070 6f72740a    -on-Module port.
 3c373e4f 6e206e6f 64652030 20746f74    <7>On node 0 tot
 616c7061 6765733a 20313633 38340a3c    alpages: 16384.<
 373e2020 444d4120 7a6f6e65 3a203136    7>  DMA zone: 16
 33383420 70616765 732c204c 49464f20    384 pages, LIFO
 62617463 683a330a 3c373e20 20444d41    batch:3.<7>  DMA
 3332207a 6f6e653a 20302070 61676573    32 zone: 0 pages
 2c204c49 464f2062 61746368 3a300a3c    , LIFO batch:0.<
 373e2020 4e6f726d 616c207a 6f6e653a    7>  Normal zone:
 20302070 61676573 2c204c49 464f2062     0 pages, LIFO b
 61746368 3a300a3c 373e2020 48696768    atch:0.<7>  High
 4d656d20 7a6f6e65 3a203020 70616765    Mem zone: 0 page
 732c204c 49464f20 62617463 683a300a    s, LIFO batch:0.
 3c343e42 75696c74 2031207a 6f6e656c    <4>Built 1 zonel
 69737473 0a3c353e 4b65726e 656c2063    ists.<5>Kernel c
 6f6d6d61 6e64206c 696e653a 20726f6f    ommand line: roo
 743d2f64 65762f72 616d3020 72772063    t=/dev/ram0 rw c
 6f6e736f 6c653d74 74794350 4d0a3c35    onsole=ttyCPM.<5
 3e596f75 20617265 20617420 4f6e650a    >You are at One.
 3c343e50 49442068 61736820 7461626c    <4>PID hash tabl
 6520656e 74726965 733a2035 31322028    e entries: 512 (
 6f726465 723a2039 2c203831 00000000    order: 9, 81....
 00000000 00000000 00000000 00000000    ................






More information about the Linuxppc-embedded mailing list