cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

watchdog_core.h (2774B)


      1/* SPDX-License-Identifier: GPL-2.0+ */
      2/*
      3 *	watchdog_core.h
      4 *
      5 *	(c) Copyright 2008-2011 Alan Cox <alan@lxorguk.ukuu.org.uk>,
      6 *						All Rights Reserved.
      7 *
      8 *	(c) Copyright 2008-2011 Wim Van Sebroeck <wim@iguana.be>.
      9 *
     10 *	(c) Copyright 2021 Hewlett Packard Enterprise Development LP.
     11 *
     12 *	This source code is part of the generic code that can be used
     13 *	by all the watchdog timer drivers.
     14 *
     15 *	Based on source code of the following authors:
     16 *	  Matt Domsch <Matt_Domsch@dell.com>,
     17 *	  Rob Radez <rob@osinvestor.com>,
     18 *	  Rusty Lynch <rusty@linux.co.intel.com>
     19 *	  Satyam Sharma <satyam@infradead.org>
     20 *	  Randy Dunlap <randy.dunlap@oracle.com>
     21 *
     22 *	Neither Alan Cox, CymruNet Ltd., Wim Van Sebroeck nor Iguana vzw.
     23 *	admit liability nor provide warranty for any of this software.
     24 *	This material is provided "AS-IS" and at no charge.
     25 */
     26
     27#include <linux/hrtimer.h>
     28#include <linux/kthread.h>
     29
     30#define MAX_DOGS	32	/* Maximum number of watchdog devices */
     31
     32/*
     33 * struct watchdog_core_data - watchdog core internal data
     34 * @dev:	The watchdog's internal device
     35 * @cdev:	The watchdog's Character device.
     36 * @wdd:	Pointer to watchdog device.
     37 * @lock:	Lock for watchdog core.
     38 * @status:	Watchdog core internal status bits.
     39 */
     40struct watchdog_core_data {
     41	struct device dev;
     42	struct cdev cdev;
     43	struct watchdog_device *wdd;
     44	struct mutex lock;
     45	ktime_t last_keepalive;
     46	ktime_t last_hw_keepalive;
     47	ktime_t open_deadline;
     48	struct hrtimer timer;
     49	struct kthread_work work;
     50#if IS_ENABLED(CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT)
     51	struct hrtimer pretimeout_timer;
     52#endif
     53	unsigned long status;		/* Internal status bits */
     54#define _WDOG_DEV_OPEN		0	/* Opened ? */
     55#define _WDOG_ALLOW_RELEASE	1	/* Did we receive the magic char ? */
     56#define _WDOG_KEEPALIVE		2	/* Did we receive a keepalive ? */
     57};
     58
     59/*
     60 *	Functions/procedures to be called by the core
     61 */
     62extern int watchdog_dev_register(struct watchdog_device *);
     63extern void watchdog_dev_unregister(struct watchdog_device *);
     64extern int __init watchdog_dev_init(void);
     65extern void __exit watchdog_dev_exit(void);
     66
     67static inline bool watchdog_have_pretimeout(struct watchdog_device *wdd)
     68{
     69	return wdd->info->options & WDIOF_PRETIMEOUT ||
     70	       IS_ENABLED(CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT);
     71}
     72
     73#if IS_ENABLED(CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT)
     74void watchdog_hrtimer_pretimeout_init(struct watchdog_device *wdd);
     75void watchdog_hrtimer_pretimeout_start(struct watchdog_device *wdd);
     76void watchdog_hrtimer_pretimeout_stop(struct watchdog_device *wdd);
     77#else
     78static inline void watchdog_hrtimer_pretimeout_init(struct watchdog_device *wdd) {}
     79static inline void watchdog_hrtimer_pretimeout_start(struct watchdog_device *wdd) {}
     80static inline void watchdog_hrtimer_pretimeout_stop(struct watchdog_device *wdd) {}
     81#endif