On Fri, May 22, 2015 at 08:16:47PM +0200, Uwe Kleine-König wrote: > On Fri, Apr 24, 2015 at 11:18:40AM +0200, Uwe Kleine-König wrote: > > [dropped Varadarajan Charulatha and Shubhrajyoti D from the addressees > > because the ti mailserver doesn't know them :-(, added Felipe instead] > > > > On Thu, Apr 23, 2015 at 11:43:54AM +0200, Uwe Kleine-König wrote: > > > I'm working on an AM335x machine and want to make use of the hardware > > > watchdog. I write to you because you contributed to the respective Linux > > > driver and judging from your email address you might be in a position to > > > help me with a problem I see. > > > > > > To get reliable behaviour, I don't want to have situations where the > > > watchdog is disabled. There are currently two situation where this > > > happens with the current state of linux/drivers/watchdog/omap_wdt.c: > > > > > > a) in omap_wdt_probe() there is an unconditional call to > > > omap_wdt_disable() which stops the counter. Ideally I'd want to take > > > over the hardware in the state that it is in when Linux is started. > > > This is a bit complicated, but should be doable. Would such a patch > > > be welcome? > > > > > > b) The reference manual demands: > > > > > > To modify the timer counter value (the WDT_WCRR register), > > > prescaler ratio (the WDT_WCLR[4:2] PTV bit field), delay > > > configuration value (the WDT_WDLY[31:0] DLY_VALUE bit field), or > > > the load value (the WDT_WLDR[31:0] TIMER_LOAD bit field), the > > > watchdog timer must be disabled by using the start/stop sequence > > > (the WDT_WSPR register). > > > > > > This effectively means (and is implemented accordingly in the > > > driver) that on .set_timeout the driver has to stop the counter. > > > So we have an (admittedly small) unprotected window each time the > > > timeout is set (which happens for example when /dev/watchdog is > > > opened). Is there something that can be done here? I imagine that > > > the above statement from the reference manual could be holding out > > > some details like "When writing a new load value (WDT_WLDR) without > > > stopping the timer first, the new load value doesn't have any > > > influence on the running timer. It is only used on the next trigger > > > event." Is this too much to wish for? > > As Felipe predicted (via irc) it's really needed to stop the timer to > > reprogram the reload value. I proved this by hacking my bootloader's mw > > command to correctly write to the watchdog registers (i.e wait until the > > corresponding bit in the Watchdog Write Posting Bits Register disappears > > to signal the write has reached the hardware) and did: > > > > # make the wdog slow > > mw 0x44e35024 0x3c > > > > # set reload value (WLDR) > > mw 0x44e3502c 0xff000000 > > > > # start wdog > > mw 0x44e35048 0xbbbb > > mw 0x44e35048 0x4444 > > > > # set reload value lower (WLDR) > > mw 0x44e35024 0x00000000 > > > > # trigger > > mw 0x44e35030 0x12345678 > > mw 0x44e35030 0x87654321 > > > > # show current counter (WCRR) > > md 0x44e35028+4 > > > > sleep 4 > > > > # trigger again > > mw 0x44e35030 0x12345678 > > mw 0x44e35030 0x87654321 > > > > # show current counter (WCRR) > > md 0x44e35028+4 > > > > # stop wdog > > mw 0x44e35048 0xaaaa > > mw 0x44e35048 0x5555 > > > > The output is twice > > > > 44e35028: ff000001 > > > > :-(. > I guess none of you from inside TI checked any deeper, right? Honestly I > doubt that it would result in a positive surprise, but still I'm pinging > these questions once more. Do you can provide a way how to reprogram the > hardware without stopping it first? heh, as I said before, this IP requires a stop to be reprogrammed. I went all the way to back the OMAP1710 TRM (the earliest TRM I still have around) and lo and behold that in section 17.1.7 it states that "to modify the timer counter value, prescaler ratio, or load valud, the 32-bit watchdog must be disabled by using a specific start/stop sequence". -- balbi
Attachment:
signature.asc
Description: Digital signature