blob: cbe2bc8395675a9d00df2ced63c936b7ce5c0572 [file] [log] [blame]
#!/bin/sh
#
# Program the hardware watchdog counter.
#
if grep -q "BCM7425" /proc/cpuinfo; then
# GFHD100
init=bcm7425_init
setup=bcm_setup
pushback=bcm_pushback
elif grep -q "BCM7429" /proc/cpuinfo; then
# GFHD200
init=bcm7429_init
setup=bcm_setup
pushback=bcm_pushback
elif grep -q "Optimus" /proc/cpuinfo; then
# GFRG200/210
init=mindspeed_init
setup=mindspeed_setup
pushback=mindspeed_pushback
else
echo "Unknown CPU type, cannot initialize watchdog timer"
cat /proc/cpuinfo
exit 1
fi
echo -1000 >/proc/$$/oom_score_adj
write()
{
devmem "$@" >/dev/null
}
#
# BCM support
#
# The watch counter. It counts at a clock rate of 27Mhz,
# so the largest timeout we can program is 159s. The watchdog timer triggers
# an NMI midway which as at approx. 79.5s. Our custom NMI handler in the
# kernel dumps the CPU registers and calls panic() i.e. reboots the box. If,
# for some reason, this fails, the watchdog timer will eventually assert a chip
# reset event after another 79.5s. (The software watchdog is currently at 70s)
bcm7425_init()
{
timer_wdtimeout_reg=0x104067e8
timer_wdcmd_reg=0x104067ec
timer_wdchiprst_cnt_reg=0x104067f0
timer_wdctrl_reg=0x104067fc
}
bcm7429_init()
{
timer_wdtimeout_reg=0x104066e8
timer_wdcmd_reg=0x104066ec
timer_wdchiprst_cnt_reg=0x104066f0
timer_wdctrl_reg=0x104066fc
}
bcm_setup()
{
# WD timeout value: 159.072862778 seconds (an NMI is triggered halfway through)
wdtimeout_val=0xffffffff
# WD event mode: NMI asserted when WD timer is midway, and chip reset asserted
# when WD timer expires
wd_event_mode=0x2
# WD chip reset length: 2.49 seconds (maximum)
wdchiprst_cnt_val=0x3ffffff
# Stop and reprogram the watchdog timer
write $timer_wdcmd_reg 32 0xee00
write $timer_wdcmd_reg 32 0x00ee
write $timer_wdtimeout_reg 32 $wdtimeout_val
write $timer_wdctrl_reg 32 $wd_event_mode
write $timer_wdchiprst_cnt_reg 32 $wdchiprst_cnt_val
}
bcm_pushback()
{
write $timer_wdcmd_reg 32 0xff00
write $timer_wdcmd_reg 32 0x00ff
}
#
# mindspeed support
#
# default wd is 70 seconds
mindspeed_init()
{
:
}
mindspeed_setup()
{
exec 9>/dev/comcerto_wdt
}
mindspeed_pushback()
{
echo -n V >&9
}
#
# init, setup, pushback timer
#
$init
$setup
# Start the watchdog timer and reload every 5 seconds
while :; do
$pushback
sleep 5
done