mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

The s390 specific diag288_wdt watchdog driver makes use of the virtual watchdog timer, which is available in most machine configurations. If executing the diagnose instruction with subcode 0x288 results in an exception the watchdog timer is not available, otherwise it is available. In order to allow module autoload of the diag288_wdt module, move the detection of the virtual watchdog timer to early boot code, and provide its availability as a cpu feature. This allows to make use of module_cpu_feature_match() to automatically load the module iff the virtual watchdog timer is available. Suggested-by: Marc Hartmayer <mhartmay@linux.ibm.com> Tested-by: Mete Durlu <meted@linux.ibm.com> Acked-by: Guenter Roeck <linux@roeck-us.net> Link: https://lore.kernel.org/r/20250410095036.1525057-1-hca@linux.ibm.com Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
41 lines
1 KiB
C
41 lines
1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#ifndef _ASM_S390_DIAG288_H
|
|
#define _ASM_S390_DIAG288_H
|
|
|
|
#include <asm/asm-extable.h>
|
|
#include <asm/types.h>
|
|
|
|
#define MIN_INTERVAL 15 /* Minimal time supported by diag288 */
|
|
#define MAX_INTERVAL 3600 /* One hour should be enough - pure estimation */
|
|
|
|
#define WDT_DEFAULT_TIMEOUT 30
|
|
|
|
/* Function codes - init, change, cancel */
|
|
#define WDT_FUNC_INIT 0
|
|
#define WDT_FUNC_CHANGE 1
|
|
#define WDT_FUNC_CANCEL 2
|
|
#define WDT_FUNC_CONCEAL 0x80000000
|
|
|
|
/* Action codes for LPAR watchdog */
|
|
#define LPARWDT_RESTART 0
|
|
|
|
static inline int __diag288(unsigned int func, unsigned int timeout,
|
|
unsigned long action, unsigned int len)
|
|
{
|
|
union register_pair r1 = { .even = func, .odd = timeout, };
|
|
union register_pair r3 = { .even = action, .odd = len, };
|
|
int rc = -EINVAL;
|
|
|
|
asm volatile(
|
|
" diag %[r1],%[r3],0x288\n"
|
|
"0: lhi %[rc],0\n"
|
|
"1:"
|
|
EX_TABLE(0b, 1b)
|
|
: [rc] "+d" (rc)
|
|
: [r1] "d" (r1.pair), [r3] "d" (r3.pair)
|
|
: "cc", "memory");
|
|
return rc;
|
|
}
|
|
|
|
#endif /* _ASM_S390_DIAG288_H */
|