From: Felipe Balbi <balbi@ti.com>
To: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
Cc: Lokesh Vutla <lokeshvutla@ti.com>, Felipe Balbi <balbi@ti.com>,
<linux-watchdog@vger.kernel.org>, <kernel@pengutronix.de>,
Linux OMAP Mailing List <linux-omap@vger.kernel.org>
Subject: Re: races in omap_wdt
Date: Fri, 22 May 2015 13:24:01 -0500 [thread overview]
Message-ID: <20150522182401.GF5582@saruman.tx.rr.com> (raw)
In-Reply-To: <20150522181647.GM24769@pengutronix.de>
[-- Attachment #1: Type: text/plain, Size: 4158 bytes --]
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 #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
prev parent reply other threads:[~2015-05-22 18:26 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-23 9:43 races in omap_wdt Uwe Kleine-König
2015-04-24 9:18 ` Uwe Kleine-König
2015-04-29 8:21 ` Uwe Kleine-König
2015-05-22 18:16 ` Uwe Kleine-König
2015-05-22 18:24 ` Felipe Balbi [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150522182401.GF5582@saruman.tx.rr.com \
--to=balbi@ti.com \
--cc=kernel@pengutronix.de \
--cc=linux-omap@vger.kernel.org \
--cc=linux-watchdog@vger.kernel.org \
--cc=lokeshvutla@ti.com \
--cc=u.kleine-koenig@pengutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox