lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <28072b8e-2c32-e67d-19d3-026913c0bc7f@codethink.co.uk>
Date:   Tue, 21 Sep 2021 11:25:06 +0100
From:   Ben Dooks <ben.dooks@...ethink.co.uk>
To:     Alexandre Ghiti <alexandre.ghiti@...onical.com>,
        Support Opensource <support.opensource@...semi.com>,
        Lee Jones <lee.jones@...aro.org>,
        linux-riscv@...ts.infradead.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] drivers: mfd: da9063: Add restart notifier implementation

On 21/09/2021 06:33, Alexandre Ghiti wrote:
> The SiFive Unmatched board uses the da9063 PMIC for reset: add a restart
> notifier that will execute a small i2c sequence allowing to reset the
> board.
> 
> The original implementation comes from Marcus Comstedt and Anders Montonen
> (https://forums.sifive.com/t/reboot-command/4721/28).
> 
> Signed-off-by: Alexandre Ghiti <alexandre.ghiti@...onical.com>

I've got a couple of comments here, mainly is this the right place
and has anyone other than you tested. I tried something similar on
my Unmatched and it just turned the board off.

> ---
>   drivers/mfd/da9063-core.c       | 25 +++++++++++++++++++++++++
>   include/linux/mfd/da9063/core.h |  3 +++
>   2 files changed, 28 insertions(+)
> 
> diff --git a/drivers/mfd/da9063-core.c b/drivers/mfd/da9063-core.c
> index df407c3afce3..c87b8d611f20 100644
> --- a/drivers/mfd/da9063-core.c
> +++ b/drivers/mfd/da9063-core.c
> @@ -20,6 +20,7 @@
>   #include <linux/mutex.h>
>   #include <linux/mfd/core.h>
>   #include <linux/regmap.h>
> +#include <linux/reboot.h>
>   
>   #include <linux/mfd/da9063/core.h>
>   #include <linux/mfd/da9063/registers.h>
> @@ -158,6 +159,18 @@ static int da9063_clear_fault_log(struct da9063 *da9063)
>   	return ret;
>   }
>   
> +static int da9063_restart_notify(struct notifier_block *this,
> +				 unsigned long mode, void *cmd)
> +{
> +	struct da9063 *da9063 = container_of(this, struct da9063, restart_handler);
> +
> +	regmap_write(da9063->regmap, DA9063_REG_PAGE_CON, 0x00);
> +	regmap_write(da9063->regmap, DA9063_REG_CONTROL_F, 0x04);
> +	regmap_write(da9063->regmap, DA9063_REG_CONTROL_A, 0x68);
> +
> +	return NOTIFY_DONE;
> +}
> +

Firstly, do you also need to force the AUTOBOOT (bit 3, CONTROL_C)
to ensure the PMIC does restart.

>   int da9063_device_init(struct da9063 *da9063, unsigned int irq)
>   {
>   	int ret;
> @@ -197,6 +210,18 @@ int da9063_device_init(struct da9063 *da9063, unsigned int irq)
>   		}
>   	}
>   
> +	da9063->restart_handler.notifier_call = da9063_restart_notify;
> +	da9063->restart_handler.priority = 128;
> +	ret = register_restart_handler(&da9063->restart_handler);
> +	if (ret) {
> +		dev_err(da9063->dev, "Failed to register restart handler\n");
> +		return ret;
> +	}
> +
> +	devm_add_action(da9063->dev,
> +			(void (*)(void *))unregister_restart_handler,
> +			&da9063->restart_handler);

there's devm_register_reboot_notifier()


> +
>   	return ret;
>   }
>   
> diff --git a/include/linux/mfd/da9063/core.h b/include/linux/mfd/da9063/core.h
> index fa7a43f02f27..1b20c498e340 100644
> --- a/include/linux/mfd/da9063/core.h
> +++ b/include/linux/mfd/da9063/core.h
> @@ -85,6 +85,9 @@ struct da9063 {
>   	int		chip_irq;
>   	unsigned int	irq_base;
>   	struct regmap_irq_chip_data *regmap_irq;
> +
> +	/* Restart */
> +	struct notifier_block restart_handler;
>   };
>   
>   int da9063_device_init(struct da9063 *da9063, unsigned int irq);

Note, the watchdog driver for the DA9063 also has a restart method
although it also does not set the AUTOBOOT bit either.

The best thing is to enable the watchdog driver, the SiFive release
does not have either the core DA9063 or the watchdog driver for it
enabled.

-- 
Ben Dooks				http://www.codethink.co.uk/
Senior Engineer				Codethink - Providing Genius

https://www.codethink.co.uk/privacy.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ