[PATCH v2 1/1] platform: implement K210 system reset

Heinrich Schuchardt xypron.glpk at gmx.de
Fri Feb 26 04:19:04 EST 2021


On 2/26/21 2:59 AM, Damien Le Moal wrote:
> On 2021/02/26 10:28, Jessica Clarke wrote:
>> On 26 Feb 2021, at 01:19, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>>>
>>> Implement rebooting the K210 via the system reset extension.
>>>
>>> All reset types are treated in the same way.
>>> A request for shutdown results in a reboot.
>>>
>>> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>>> Reviewed-by: Damien Le Moal <damien.lemoal at wdc.com>
>>> ---
>>> v2:
>>> 	use a constant for the reset bit mask
>>> ---
>>> platform/kendryte/k210/platform.c | 19 +++++++++++++++++++
>>> platform/kendryte/k210/platform.h |  9 +++++++++
>>> 2 files changed, 28 insertions(+)
>>>
>>> diff --git a/platform/kendryte/k210/platform.c b/platform/kendryte/k210/platform.c
>>> index 944b388..247cb86 100644
>>> --- a/platform/kendryte/k210/platform.c
>>> +++ b/platform/kendryte/k210/platform.c
>>> @@ -129,6 +129,22 @@ static int k210_timer_init(bool cold_boot)
>>> 	return clint_warm_timer_init();
>>> }
>>>
>>> +static int k210_system_reset_check(u32 type, u32 reason)
>>> +{
>>> +	return 1;
>>> +}
>>> +
>>> +static void k210_system_reset(u32 type, u32 reason)
>>> +{
>>> +	u32 val;
>>> +
>>> +	val = k210_read_sysreg(K210_RESET);
>>> +	val |= K210_RESET_MASK;
>>> +	k210_write_sysreg(val, K210_RESET);
>>> +
>>> +	while(1);
>>
>> Formatting requires a space.

Thank you for reviewing.

>>
>>> +}
>>> +
>>
>> It strikes me that this is just a kind of syscons-reset device. Should
>> we not be implementing that slightly more generic driver and have the
>> k210 use a suitable device tree (or hard-code it if you really want)?

Yes, this is a syscon reboot. The relevant part of the device tree is:

syscon at 50440000 {
         compatible = "kendryte,k210-sysctl", "syscon", "simple-mfd";
         reg = <0x50440000 0x00000100>;
         reg-io-width = <0x00000004>;
         phandle = <0x0000000b>;
         reboot {
                 compatible = "syscon-reboot";
                 regmap = <0x0000000b>;
                 offset = <0x00000030>;
                 mask = <0x00000001>;
                 value = <0x00000001>;
         };
};

Implementation of a driver would require to write library code first for
handling regmaps and reg-io-widths.

>
> Device tree for this using generic syscon-reboot is queued on the kernel side
> for 5.12. That can be reused, but there are many dependencies on other drivers
> though (clock and sysctl). A syscon-reboot like generic driver in opensbi would
> be good too, as long as there is more than one user. Not sure if other platform
> in opensbi can benefit from it. This exercise can be left for another patch I think.

Currently I do not see that a device-tree based driver would simplify
the coding.

I will resend the patch with the requested formatting changes.

Best regards

Heinrich

>
>>
>>> const struct sbi_platform_operations platform_ops = {
>>> 	.final_init	= k210_final_init,
>>>
>>> @@ -142,6 +158,9 @@ const struct sbi_platform_operations platform_ops = {
>>> 	.ipi_send  = clint_ipi_send,
>>> 	.ipi_clear = clint_ipi_clear,
>>>
>>> +	.system_reset_check = k210_system_reset_check,
>>> +	.system_reset = k210_system_reset,
>>
>> The ='s are generally kept aligned within blocks.
>>
>> Jess
>>
>>> +
>>> 	.timer_init	   = k210_timer_init,
>>> 	.timer_value	   = clint_timer_value,
>>> 	.timer_event_stop  = clint_timer_event_stop,
>>> diff --git a/platform/kendryte/k210/platform.h b/platform/kendryte/k210/platform.h
>>> index 5269bc4..e425faf 100644
>>> --- a/platform/kendryte/k210/platform.h
>>> +++ b/platform/kendryte/k210/platform.h
>>> @@ -27,10 +27,19 @@
>>> /* Registers */
>>> #define K210_PLL0		0x08
>>> #define K210_CLKSEL0		0x20
>>> +#define K210_RESET		0x30
>>> +
>>> +/* Register bit masks */
>>> +#define K210_RESET_MASK		0x01
>>>
>>> static inline u32 k210_read_sysreg(u32 reg)
>>> {
>>> 	return readl((volatile void *)(K210_SYSCTL_BASE_ADDR + reg));
>>> }
>>>
>>> +static inline void k210_write_sysreg(u32 val, u32 reg)
>>> +{
>>> +	writel(val, (volatile void *)(K210_SYSCTL_BASE_ADDR + reg));
>>> +}
>>> +
>>> #endif /* _K210_PLATFORM_H_ */
>>> --
>>> 2.30.0
>>>
>>>
>>> --
>>> opensbi mailing list
>>> opensbi at lists.infradead.org
>>> http://lists.infradead.org/mailman/listinfo/opensbi
>>
>>
>
>




More information about the opensbi mailing list