Re: [PATCH v3 4/4] watchdog/pseries-wdt: initial support for H_WATCHDOG-based watchdog timers

2022-07-26 Thread Michael Ellerman
Guenter Roeck  writes:
> On Mon, Jul 25, 2022 at 11:11:41AM -0500, Scott Cheloha wrote:
>> On Wed, Jul 13, 2022 at 01:50:14PM -0700, Guenter Roeck wrote:
>> > On 7/13/22 13:23, Scott Cheloha wrote:
>> > > PAPR v2.12 defines a new hypercall, H_WATCHDOG.  The hypercall permits
>> > > guest control of one or more virtual watchdog timers.  The timers have
>> > > millisecond granularity.  The guest is terminated when a timer
>> > > expires.
>> > > 
>> > > This patch adds a watchdog driver for these timers, "pseries-wdt".
>> > > 
>> > > pseries_wdt_probe() currently assumes the existence of only one
>> > > platform device and always assigns it watchdogNumber 1.  If we ever
>> > > expose more than one timer to userspace we will need to devise a way
>> > > to assign a distinct watchdogNumber to each platform device at device
>> > > registration time.
>> > > 
>> > > Signed-off-by: Scott Cheloha 
>> > 
>> > Acked-by: Guenter Roeck 
>> 
>> Guenter, Michael,
>> 
>> Which tree is taking this series?

powerpc.

It's been in next-test/next for about a week.

It's in linux-next today.

> The series includes non-watchdog changes, so my expectation was that some
> other tree would take it.

Yep, thanks for the ack.

cheers


Re: [PATCH v3 4/4] watchdog/pseries-wdt: initial support for H_WATCHDOG-based watchdog timers

2022-07-25 Thread Guenter Roeck
On Mon, Jul 25, 2022 at 11:11:41AM -0500, Scott Cheloha wrote:
> On Wed, Jul 13, 2022 at 01:50:14PM -0700, Guenter Roeck wrote:
> > On 7/13/22 13:23, Scott Cheloha wrote:
> > > PAPR v2.12 defines a new hypercall, H_WATCHDOG.  The hypercall permits
> > > guest control of one or more virtual watchdog timers.  The timers have
> > > millisecond granularity.  The guest is terminated when a timer
> > > expires.
> > > 
> > > This patch adds a watchdog driver for these timers, "pseries-wdt".
> > > 
> > > pseries_wdt_probe() currently assumes the existence of only one
> > > platform device and always assigns it watchdogNumber 1.  If we ever
> > > expose more than one timer to userspace we will need to devise a way
> > > to assign a distinct watchdogNumber to each platform device at device
> > > registration time.
> > > 
> > > Signed-off-by: Scott Cheloha 
> > 
> > Acked-by: Guenter Roeck 
> 
> Guenter, Michael,
> 
> Which tree is taking this series?
> 
The series includes non-watchdog changes, so my expectation was that some
other tree would take it.

Guenter

> watchdog-next or PPC development?
> 
> -Scott


Re: [PATCH v3 4/4] watchdog/pseries-wdt: initial support for H_WATCHDOG-based watchdog timers

2022-07-25 Thread Scott Cheloha
On Wed, Jul 13, 2022 at 01:50:14PM -0700, Guenter Roeck wrote:
> On 7/13/22 13:23, Scott Cheloha wrote:
> > PAPR v2.12 defines a new hypercall, H_WATCHDOG.  The hypercall permits
> > guest control of one or more virtual watchdog timers.  The timers have
> > millisecond granularity.  The guest is terminated when a timer
> > expires.
> > 
> > This patch adds a watchdog driver for these timers, "pseries-wdt".
> > 
> > pseries_wdt_probe() currently assumes the existence of only one
> > platform device and always assigns it watchdogNumber 1.  If we ever
> > expose more than one timer to userspace we will need to devise a way
> > to assign a distinct watchdogNumber to each platform device at device
> > registration time.
> > 
> > Signed-off-by: Scott Cheloha 
> 
> Acked-by: Guenter Roeck 

Guenter, Michael,

Which tree is taking this series?

watchdog-next or PPC development?

-Scott


Re: [PATCH v3 4/4] watchdog/pseries-wdt: initial support for H_WATCHDOG-based watchdog timers

2022-07-13 Thread Guenter Roeck

On 7/13/22 13:23, Scott Cheloha wrote:

PAPR v2.12 defines a new hypercall, H_WATCHDOG.  The hypercall permits
guest control of one or more virtual watchdog timers.  The timers have
millisecond granularity.  The guest is terminated when a timer
expires.

This patch adds a watchdog driver for these timers, "pseries-wdt".

pseries_wdt_probe() currently assumes the existence of only one
platform device and always assigns it watchdogNumber 1.  If we ever
expose more than one timer to userspace we will need to devise a way
to assign a distinct watchdogNumber to each platform device at device
registration time.

Signed-off-by: Scott Cheloha 


Acked-by: Guenter Roeck 


---
  .../watchdog/watchdog-parameters.rst  |  12 +
  drivers/watchdog/Kconfig  |   8 +
  drivers/watchdog/Makefile |   1 +
  drivers/watchdog/pseries-wdt.c| 239 ++
  4 files changed, 260 insertions(+)
  create mode 100644 drivers/watchdog/pseries-wdt.c

diff --git a/Documentation/watchdog/watchdog-parameters.rst 
b/Documentation/watchdog/watchdog-parameters.rst
index 223c99361a30..29153eed6689 100644
--- a/Documentation/watchdog/watchdog-parameters.rst
+++ b/Documentation/watchdog/watchdog-parameters.rst
@@ -425,6 +425,18 @@ pnx833x_wdt:
  
  -
  
+pseries-wdt:

+action:
+   Action taken when watchdog expires: 0 (power off), 1 (restart),
+   2 (dump and restart). (default=1)
+timeout:
+   Initial watchdog timeout in seconds. (default=60)
+nowayout:
+   Watchdog cannot be stopped once started.
+   (default=kernel config parameter)
+
+-
+
  rc32434_wdt:
  timeout:
Watchdog timeout value, in seconds (default=20)
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index 32fd37698932..a2429604a4ab 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -1962,6 +1962,14 @@ config MEN_A21_WDT
  
  # PPC64 Architecture
  
+config PSERIES_WDT

+   tristate "POWER Architecture Platform Watchdog Timer"
+   depends on PPC_PSERIES
+   select WATCHDOG_CORE
+   help
+ Driver for virtual watchdog timers provided by PAPR
+ hypervisors (e.g. PowerVM, KVM).
+
  config WATCHDOG_RTAS
tristate "RTAS watchdog"
depends on PPC_RTAS
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index c324e9d820e9..cdeb119e6e61 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -187,6 +187,7 @@ obj-$(CONFIG_BOOKE_WDT) += booke_wdt.o
  obj-$(CONFIG_MEN_A21_WDT) += mena21_wdt.o
  
  # PPC64 Architecture

+obj-$(CONFIG_PSERIES_WDT) += pseries-wdt.o
  obj-$(CONFIG_WATCHDOG_RTAS) += wdrtas.o
  
  # S390 Architecture

diff --git a/drivers/watchdog/pseries-wdt.c b/drivers/watchdog/pseries-wdt.c
new file mode 100644
index ..7f53b5293409
--- /dev/null
+++ b/drivers/watchdog/pseries-wdt.c
@@ -0,0 +1,239 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2022 International Business Machines, Inc.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define DRV_NAME "pseries-wdt"
+
+/*
+ * H_WATCHDOG Input
+ *
+ * R4: "flags":
+ *
+ * Bits 48-55: "operation"
+ */
+#define PSERIES_WDTF_OP_START  0x100UL /* start timer */
+#define PSERIES_WDTF_OP_STOP   0x200UL /* stop timer */
+#define PSERIES_WDTF_OP_QUERY  0x300UL /* query timer capabilities */
+
+/*
+ * Bits 56-63: "timeoutAction" (for "Start Watchdog" only)
+ */
+#define PSERIES_WDTF_ACTION_HARD_POWEROFF  0x1UL   /* poweroff */
+#define PSERIES_WDTF_ACTION_HARD_RESTART   0x2UL   /* restart */
+#define PSERIES_WDTF_ACTION_DUMP_RESTART   0x3UL   /* dump + restart */
+
+/*
+ * H_WATCHDOG Output
+ *
+ * R3: Return code
+ *
+ * H_SUCCESSThe operation completed.
+ *
+ * H_BUSY  The hypervisor is too busy; retry the operation.
+ *
+ * H_PARAMETER  The given "flags" are somehow invalid.  Either the
+ *  "operation" or "timeoutAction" is invalid, or a
+ *  reserved bit is set.
+ *
+ * H_P2 The given "watchdogNumber" is zero or exceeds the
+ *  supported maximum value.
+ *
+ * H_P3 The given "timeoutInMs" is below the supported
+ *  minimum value.
+ *
+ * H_NOOP   The given "watchdogNumber" is already stopped.
+ *
+ * H_HARDWARE   The operation failed for ineffable reasons.
+ *
+ * H_FUNCTION   The H_WATCHDOG hypercall is not supported by this
+ *  hypervisor.
+ *
+ * R4:
+ *
+ * - For the "Query Watchdog Capabilities" operation, a 64-bit
+ *   structure:
+ */
+#define PSERIES_WDTQ_MIN_TIMEOUT(cap)  (((cap) >> 48) & 0x)
+#define PSERIES_WDTQ_MAX_NUMBER(cap)   (((cap) >> 32) & 0x)
+
+static const unsigned long 

[PATCH v3 4/4] watchdog/pseries-wdt: initial support for H_WATCHDOG-based watchdog timers

2022-07-13 Thread Scott Cheloha
PAPR v2.12 defines a new hypercall, H_WATCHDOG.  The hypercall permits
guest control of one or more virtual watchdog timers.  The timers have
millisecond granularity.  The guest is terminated when a timer
expires.

This patch adds a watchdog driver for these timers, "pseries-wdt".

pseries_wdt_probe() currently assumes the existence of only one
platform device and always assigns it watchdogNumber 1.  If we ever
expose more than one timer to userspace we will need to devise a way
to assign a distinct watchdogNumber to each platform device at device
registration time.

Signed-off-by: Scott Cheloha 
---
 .../watchdog/watchdog-parameters.rst  |  12 +
 drivers/watchdog/Kconfig  |   8 +
 drivers/watchdog/Makefile |   1 +
 drivers/watchdog/pseries-wdt.c| 239 ++
 4 files changed, 260 insertions(+)
 create mode 100644 drivers/watchdog/pseries-wdt.c

diff --git a/Documentation/watchdog/watchdog-parameters.rst 
b/Documentation/watchdog/watchdog-parameters.rst
index 223c99361a30..29153eed6689 100644
--- a/Documentation/watchdog/watchdog-parameters.rst
+++ b/Documentation/watchdog/watchdog-parameters.rst
@@ -425,6 +425,18 @@ pnx833x_wdt:
 
 -
 
+pseries-wdt:
+action:
+   Action taken when watchdog expires: 0 (power off), 1 (restart),
+   2 (dump and restart). (default=1)
+timeout:
+   Initial watchdog timeout in seconds. (default=60)
+nowayout:
+   Watchdog cannot be stopped once started.
+   (default=kernel config parameter)
+
+-
+
 rc32434_wdt:
 timeout:
Watchdog timeout value, in seconds (default=20)
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index 32fd37698932..a2429604a4ab 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -1962,6 +1962,14 @@ config MEN_A21_WDT
 
 # PPC64 Architecture
 
+config PSERIES_WDT
+   tristate "POWER Architecture Platform Watchdog Timer"
+   depends on PPC_PSERIES
+   select WATCHDOG_CORE
+   help
+ Driver for virtual watchdog timers provided by PAPR
+ hypervisors (e.g. PowerVM, KVM).
+
 config WATCHDOG_RTAS
tristate "RTAS watchdog"
depends on PPC_RTAS
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index c324e9d820e9..cdeb119e6e61 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -187,6 +187,7 @@ obj-$(CONFIG_BOOKE_WDT) += booke_wdt.o
 obj-$(CONFIG_MEN_A21_WDT) += mena21_wdt.o
 
 # PPC64 Architecture
+obj-$(CONFIG_PSERIES_WDT) += pseries-wdt.o
 obj-$(CONFIG_WATCHDOG_RTAS) += wdrtas.o
 
 # S390 Architecture
diff --git a/drivers/watchdog/pseries-wdt.c b/drivers/watchdog/pseries-wdt.c
new file mode 100644
index ..7f53b5293409
--- /dev/null
+++ b/drivers/watchdog/pseries-wdt.c
@@ -0,0 +1,239 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2022 International Business Machines, Inc.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define DRV_NAME "pseries-wdt"
+
+/*
+ * H_WATCHDOG Input
+ *
+ * R4: "flags":
+ *
+ * Bits 48-55: "operation"
+ */
+#define PSERIES_WDTF_OP_START  0x100UL /* start timer */
+#define PSERIES_WDTF_OP_STOP   0x200UL /* stop timer */
+#define PSERIES_WDTF_OP_QUERY  0x300UL /* query timer capabilities */
+
+/*
+ * Bits 56-63: "timeoutAction" (for "Start Watchdog" only)
+ */
+#define PSERIES_WDTF_ACTION_HARD_POWEROFF  0x1UL   /* poweroff */
+#define PSERIES_WDTF_ACTION_HARD_RESTART   0x2UL   /* restart */
+#define PSERIES_WDTF_ACTION_DUMP_RESTART   0x3UL   /* dump + restart */
+
+/*
+ * H_WATCHDOG Output
+ *
+ * R3: Return code
+ *
+ * H_SUCCESSThe operation completed.
+ *
+ * H_BUSY  The hypervisor is too busy; retry the operation.
+ *
+ * H_PARAMETER  The given "flags" are somehow invalid.  Either the
+ *  "operation" or "timeoutAction" is invalid, or a
+ *  reserved bit is set.
+ *
+ * H_P2 The given "watchdogNumber" is zero or exceeds the
+ *  supported maximum value.
+ *
+ * H_P3 The given "timeoutInMs" is below the supported
+ *  minimum value.
+ *
+ * H_NOOP   The given "watchdogNumber" is already stopped.
+ *
+ * H_HARDWARE   The operation failed for ineffable reasons.
+ *
+ * H_FUNCTION   The H_WATCHDOG hypercall is not supported by this
+ *  hypervisor.
+ *
+ * R4:
+ *
+ * - For the "Query Watchdog Capabilities" operation, a 64-bit
+ *   structure:
+ */
+#define PSERIES_WDTQ_MIN_TIMEOUT(cap)  (((cap) >> 48) & 0x)
+#define PSERIES_WDTQ_MAX_NUMBER(cap)   (((cap) >> 32) & 0x)
+
+static const unsigned long pseries_wdt_action[] = {
+   [0] = PSERIES_WDTF_ACTION_HARD_POWEROFF,
+   [1] =