| From foo@baz Sun May 27 17:33:38 CEST 2018 |
| From: Jayachandran C <jnair@caviumnetworks.com> |
| Date: Wed, 28 Feb 2018 02:52:20 -0800 |
| Subject: watchdog: sbsa: use 32-bit read for WCV |
| |
| From: Jayachandran C <jnair@caviumnetworks.com> |
| |
| [ Upstream commit 93ac3deb7c220cbcec032a967220a1f109d58431 ] |
| |
| According to SBSA spec v3.1 section 5.3: |
| All registers are 32 bits in size and should be accessed using |
| 32-bit reads and writes. If an access size other than 32 bits |
| is used then the results are IMPLEMENTATION DEFINED. |
| [...] |
| The Generic Watchdog is little-endian |
| |
| The current code uses readq to read the watchdog compare register |
| which does a 64-bit access. This fails on ThunderX2 which does not |
| implement 64-bit access to this register. |
| |
| Fix this by using lo_hi_readq() that does two 32-bit reads. |
| |
| Signed-off-by: Jayachandran C <jnair@caviumnetworks.com> |
| Reviewed-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Wim Van Sebroeck <wim@iguana.be> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/watchdog/sbsa_gwdt.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/watchdog/sbsa_gwdt.c |
| +++ b/drivers/watchdog/sbsa_gwdt.c |
| @@ -50,6 +50,7 @@ |
| */ |
| |
| #include <linux/io.h> |
| +#include <linux/io-64-nonatomic-lo-hi.h> |
| #include <linux/interrupt.h> |
| #include <linux/module.h> |
| #include <linux/moduleparam.h> |
| @@ -159,7 +160,7 @@ static unsigned int sbsa_gwdt_get_timele |
| !(readl(gwdt->control_base + SBSA_GWDT_WCS) & SBSA_GWDT_WCS_WS0)) |
| timeleft += readl(gwdt->control_base + SBSA_GWDT_WOR); |
| |
| - timeleft += readq(gwdt->control_base + SBSA_GWDT_WCV) - |
| + timeleft += lo_hi_readq(gwdt->control_base + SBSA_GWDT_WCV) - |
| arch_counter_get_cntvct(); |
| |
| do_div(timeleft, gwdt->clk); |