All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nikita Shubin <nikita.shubin@maquefel.me>
To: opensbi@lists.infradead.org
Subject: [PATCH 2/2] platform: sifive_fu740: fix reset when watchdog is running
Date: Wed, 5 Jan 2022 16:39:59 +0300	[thread overview]
Message-ID: <20220105163959.000046ce@maquefel.me> (raw)
In-Reply-To: <20220105072039.2609845-2-aurelien@aurel32.net>

Hello Aurelien!

Adding David from SiFive...

On Wed,  5 Jan 2022 08:20:39 +0100
Aurelien Jarno <aurelien@aurel32.net> wrote:

> When the watchdog is running the HiFive Unmatched board does not
> reboot properly and shuts down itself a few seconds after reboot, in
> the early stages of the u-boot loading. On a Linux kernel this
> happens when the da9063_wdt module is loaded. This does not happen if
> the module is unloaded before reboot or if the watchdog module is
> loaded with "stop_on_reboot=1".

| A running application is typically in ACTIVE mode. The DA9063
| transitions to ACTIVE mode after the host processor performs at least
| one initial ?alive? watchdog write (or alternatively an initial
| assertion of the KEEP_ACT port) inside the target time window. If the
| WATCHDOG function is disabled by setting TWDSCALE to zero, the DA9063
| transitions to ACTIVE mode when all of the sequencer IDs in the POWER
| domain are complete.

Is this that's case mentioned ? What if we press a reset key when
watchdog is enabled ? Or if it was reseted by thermal sensor ?

Can we disable watchdog on start instead of disabling it before a reset
?

Could you please give us a link to actual report ?

> 
> Fix that by stopping the watchdog before attempting to reset the
> board. This is done by zeroing the TWDSCALE field of CONTROL_D
> register, unless it was already set to 0.
> 
> Reported-by: Tianon Gravi <tianon@debian.org>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
> ---
>  platform/generic/sifive_fu740.c | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
> 
> diff --git a/platform/generic/sifive_fu740.c
> b/platform/generic/sifive_fu740.c index 866e924..f595c04 100644
> --- a/platform/generic/sifive_fu740.c
> +++ b/platform/generic/sifive_fu740.c
> @@ -22,6 +22,7 @@
>  
>  #define DA9063_REG_PAGE_CON		0x00
>  #define DA9063_REG_CONTROL_A		0x0e
> +#define DA9063_REG_CONTROL_D		0x11
>  #define DA9063_REG_CONTROL_F		0x13
>  #define DA9063_REG_DEVICE_ID		0x81
>  
> @@ -29,6 +30,8 @@
>  #define DA9063_CONTROL_A_M_POWER_EN	(1 << 5)
>  #define DA9063_CONTROL_A_STANDBY	(1 << 3)
>  
> +#define DA9063_CONTROL_D_TWDSCALE_MASK	0x07
> +
>  #define DA9063_CONTROL_F_WAKEUP	(1 << 2)
>  #define DA9063_CONTROL_F_SHUTDOWN	(1 << 1)
>  
> @@ -79,6 +82,27 @@ static inline int da9063_sanity_check(struct
> i2c_adapter *adap, uint32_t reg) return 0;
>  }
>  
> +static inline int da9063_stop_watchdog(struct i2c_adapter *adap,
> uint32_t reg) +{
> +	uint8_t val;
> +	int rc = i2c_adapter_reg_write(adap, reg,
> +					DA9063_REG_PAGE_CON, 0x00);
> +
> +	if (rc)
> +		return rc;
> +
> +	rc = i2c_adapter_reg_read(adap, reg, DA9063_REG_CONTROL_D,
> &val);
> +	if (rc)
> +		return rc;
> +
> +	if ((val & DA9063_CONTROL_D_TWDSCALE_MASK) == 0)
> +		return 0;
> +
> +	val &= ~DA9063_CONTROL_D_TWDSCALE_MASK;
> +
> +	return i2c_adapter_reg_write(adap, reg,
> DA9063_REG_CONTROL_D, val); +}
> +
>  static inline int da9063_shutdown(struct i2c_adapter *adap, uint32_t
> reg) {
>  	int rc = i2c_adapter_reg_write(adap, reg,
> @@ -133,6 +157,7 @@ static void da9063_system_reset(u32 type, u32
> reason) break;
>  		case SBI_SRST_RESET_TYPE_COLD_REBOOT:
>  		case SBI_SRST_RESET_TYPE_WARM_REBOOT:
> +			da9063_stop_watchdog(adap, reg);
>  			da9063_reset(adap, reg);
>  			break;
>  		}



  reply	other threads:[~2022-01-05 13:39 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-05  7:20 [PATCH 1/2] platform: sifive_fu740: do not use a global in da9063_reset/shutdown Aurelien Jarno
2022-01-05  7:20 ` [PATCH 2/2] platform: sifive_fu740: fix reset when watchdog is running Aurelien Jarno
2022-01-05 13:39   ` Nikita Shubin [this message]
2022-01-05 16:16     ` David Abdurachmanov
     [not found]       ` <77e2fbd5-aad6-b49b-0559-4f411e42d6d2@ghiti.fr>
2022-01-05 16:45         ` Fwd: " Heinrich Schuchardt
2022-01-05 16:51       ` Aurelien Jarno
2022-01-06 13:10         ` Nikita Shubin
2022-01-19 17:05           ` David Abdurachmanov
2022-01-21 16:22   ` Anup Patel
2022-01-05 13:16 ` [PATCH 1/2] platform: sifive_fu740: do not use a global in da9063_reset/shutdown Nikita Shubin
2022-01-06  1:26 ` Xiang W
2022-01-21 16:21 ` Anup Patel

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=20220105163959.000046ce@maquefel.me \
    --to=nikita.shubin@maquefel.me \
    --cc=opensbi@lists.infradead.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.