1 // SPDX-License-Identifier: GPL-2.0-only
3 * ACPI Hardware Watchdog (WDAT) driver.
5 * Copyright (C) 2016, Intel Corporation
6 * Author: Mika Westerberg <mika.westerberg@linux.intel.com>
9 #include <linux/acpi.h>
10 #include <linux/ioport.h>
11 #include <linux/module.h>
12 #include <linux/platform_device.h>
14 #include <linux/watchdog.h>
16 #define MAX_WDAT_ACTIONS ACPI_WDAT_ACTION_RESERVED
19 * struct wdat_instruction - Single ACPI WDAT instruction
20 * @entry: Copy of the ACPI table instruction
21 * @reg: Register the instruction is accessing
22 * @node: Next instruction in action sequence
24 struct wdat_instruction
{
25 struct acpi_wdat_entry entry
;
27 struct list_head node
;
31 * struct wdat_wdt - ACPI WDAT watchdog device
32 * @pdev: Parent platform device
33 * @wdd: Watchdog core device
34 * @period: How long is one watchdog period in ms
35 * @stopped_in_sleep: Is this watchdog stopped by the firmware in S1-S5
36 * @stopped: Was the watchdog stopped by the driver in suspend
37 * @actions: An array of instruction lists indexed by an action number from
38 * the WDAT table. There can be %NULL entries for not implemented
42 struct platform_device
*pdev
;
43 struct watchdog_device wdd
;
45 bool stopped_in_sleep
;
47 struct list_head
*instructions
[MAX_WDAT_ACTIONS
];
50 #define to_wdat_wdt(wdd) container_of(wdd, struct wdat_wdt, wdd)
52 static bool nowayout
= WATCHDOG_NOWAYOUT
;
53 module_param(nowayout
, bool, 0);
54 MODULE_PARM_DESC(nowayout
, "Watchdog cannot be stopped once started (default="
55 __MODULE_STRING(WATCHDOG_NOWAYOUT
) ")");
57 #define WDAT_DEFAULT_TIMEOUT 30
59 static int timeout
= WDAT_DEFAULT_TIMEOUT
;
60 module_param(timeout
, int, 0);
61 MODULE_PARM_DESC(timeout
, "Watchdog timeout in seconds (default="
62 __MODULE_STRING(WDAT_DEFAULT_TIMEOUT
) ")");
64 static int wdat_wdt_read(struct wdat_wdt
*wdat
,
65 const struct wdat_instruction
*instr
, u32
*value
)
67 const struct acpi_generic_address
*gas
= &instr
->entry
.register_region
;
69 switch (gas
->access_width
) {
71 *value
= ioread8(instr
->reg
);
74 *value
= ioread16(instr
->reg
);
77 *value
= ioread32(instr
->reg
);
83 dev_dbg(&wdat
->pdev
->dev
, "Read %#x from 0x%08llx\n", *value
,
89 static int wdat_wdt_write(struct wdat_wdt
*wdat
,
90 const struct wdat_instruction
*instr
, u32 value
)
92 const struct acpi_generic_address
*gas
= &instr
->entry
.register_region
;
94 switch (gas
->access_width
) {
96 iowrite8((u8
)value
, instr
->reg
);
99 iowrite16((u16
)value
, instr
->reg
);
102 iowrite32(value
, instr
->reg
);
108 dev_dbg(&wdat
->pdev
->dev
, "Wrote %#x to 0x%08llx\n", value
,
114 static int wdat_wdt_run_action(struct wdat_wdt
*wdat
, unsigned int action
,
115 u32 param
, u32
*retval
)
117 struct wdat_instruction
*instr
;
119 if (action
>= ARRAY_SIZE(wdat
->instructions
))
122 if (!wdat
->instructions
[action
])
125 dev_dbg(&wdat
->pdev
->dev
, "Running action %#x\n", action
);
127 /* Run each instruction sequentially */
128 list_for_each_entry(instr
, wdat
->instructions
[action
], node
) {
129 const struct acpi_wdat_entry
*entry
= &instr
->entry
;
130 const struct acpi_generic_address
*gas
;
131 u32 flags
, value
, mask
, x
, y
;
135 gas
= &entry
->register_region
;
137 preserve
= entry
->instruction
& ACPI_WDAT_PRESERVE_REGISTER
;
138 flags
= entry
->instruction
& ~ACPI_WDAT_PRESERVE_REGISTER
;
139 value
= entry
->value
;
143 case ACPI_WDAT_READ_VALUE
:
144 ret
= wdat_wdt_read(wdat
, instr
, &x
);
147 x
>>= gas
->bit_offset
;
150 *retval
= x
== value
;
153 case ACPI_WDAT_READ_COUNTDOWN
:
154 ret
= wdat_wdt_read(wdat
, instr
, &x
);
157 x
>>= gas
->bit_offset
;
163 case ACPI_WDAT_WRITE_VALUE
:
165 x
<<= gas
->bit_offset
;
167 ret
= wdat_wdt_read(wdat
, instr
, &y
);
170 y
= y
& ~(mask
<< gas
->bit_offset
);
173 ret
= wdat_wdt_write(wdat
, instr
, x
);
178 case ACPI_WDAT_WRITE_COUNTDOWN
:
181 x
<<= gas
->bit_offset
;
183 ret
= wdat_wdt_read(wdat
, instr
, &y
);
186 y
= y
& ~(mask
<< gas
->bit_offset
);
189 ret
= wdat_wdt_write(wdat
, instr
, x
);
195 dev_err(&wdat
->pdev
->dev
, "Unknown instruction: %u\n",
204 static int wdat_wdt_enable_reboot(struct wdat_wdt
*wdat
)
209 * WDAT specification says that the watchdog is required to reboot
210 * the system when it fires. However, it also states that it is
211 * recommeded to make it configurable through hardware register. We
212 * enable reboot now if it is configurable, just in case.
214 ret
= wdat_wdt_run_action(wdat
, ACPI_WDAT_SET_REBOOT
, 0, NULL
);
215 if (ret
&& ret
!= -EOPNOTSUPP
) {
216 dev_err(&wdat
->pdev
->dev
,
217 "Failed to enable reboot when watchdog triggers\n");
224 static void wdat_wdt_boot_status(struct wdat_wdt
*wdat
)
229 ret
= wdat_wdt_run_action(wdat
, ACPI_WDAT_GET_STATUS
, 0, &boot_status
);
230 if (ret
&& ret
!= -EOPNOTSUPP
) {
231 dev_err(&wdat
->pdev
->dev
, "Failed to read boot status\n");
236 wdat
->wdd
.bootstatus
= WDIOF_CARDRESET
;
238 /* Clear the boot status in case BIOS did not do it */
239 ret
= wdat_wdt_run_action(wdat
, ACPI_WDAT_SET_STATUS
, 0, NULL
);
240 if (ret
&& ret
!= -EOPNOTSUPP
)
241 dev_err(&wdat
->pdev
->dev
, "Failed to clear boot status\n");
244 static void wdat_wdt_set_running(struct wdat_wdt
*wdat
)
249 ret
= wdat_wdt_run_action(wdat
, ACPI_WDAT_GET_RUNNING_STATE
, 0,
251 if (ret
&& ret
!= -EOPNOTSUPP
)
252 dev_err(&wdat
->pdev
->dev
, "Failed to read running state\n");
255 set_bit(WDOG_HW_RUNNING
, &wdat
->wdd
.status
);
258 static int wdat_wdt_start(struct watchdog_device
*wdd
)
260 return wdat_wdt_run_action(to_wdat_wdt(wdd
),
261 ACPI_WDAT_SET_RUNNING_STATE
, 0, NULL
);
264 static int wdat_wdt_stop(struct watchdog_device
*wdd
)
266 return wdat_wdt_run_action(to_wdat_wdt(wdd
),
267 ACPI_WDAT_SET_STOPPED_STATE
, 0, NULL
);
270 static int wdat_wdt_ping(struct watchdog_device
*wdd
)
272 return wdat_wdt_run_action(to_wdat_wdt(wdd
), ACPI_WDAT_RESET
, 0, NULL
);
275 static int wdat_wdt_set_timeout(struct watchdog_device
*wdd
,
276 unsigned int timeout
)
278 struct wdat_wdt
*wdat
= to_wdat_wdt(wdd
);
279 unsigned int periods
;
282 periods
= timeout
* 1000 / wdat
->period
;
283 ret
= wdat_wdt_run_action(wdat
, ACPI_WDAT_SET_COUNTDOWN
, periods
, NULL
);
285 wdd
->timeout
= timeout
;
289 static unsigned int wdat_wdt_get_timeleft(struct watchdog_device
*wdd
)
291 struct wdat_wdt
*wdat
= to_wdat_wdt(wdd
);
294 wdat_wdt_run_action(wdat
, ACPI_WDAT_GET_CURRENT_COUNTDOWN
, 0, &periods
);
295 return periods
* wdat
->period
/ 1000;
298 static const struct watchdog_info wdat_wdt_info
= {
299 .options
= WDIOF_SETTIMEOUT
| WDIOF_KEEPALIVEPING
| WDIOF_MAGICCLOSE
,
300 .firmware_version
= 0,
301 .identity
= "wdat_wdt",
304 static const struct watchdog_ops wdat_wdt_ops
= {
305 .owner
= THIS_MODULE
,
306 .start
= wdat_wdt_start
,
307 .stop
= wdat_wdt_stop
,
308 .ping
= wdat_wdt_ping
,
309 .set_timeout
= wdat_wdt_set_timeout
,
310 .get_timeleft
= wdat_wdt_get_timeleft
,
313 static int wdat_wdt_probe(struct platform_device
*pdev
)
315 struct device
*dev
= &pdev
->dev
;
316 const struct acpi_wdat_entry
*entries
;
317 const struct acpi_table_wdat
*tbl
;
318 struct wdat_wdt
*wdat
;
319 struct resource
*res
;
324 status
= acpi_get_table(ACPI_SIG_WDAT
, 0,
325 (struct acpi_table_header
**)&tbl
);
326 if (ACPI_FAILURE(status
))
329 wdat
= devm_kzalloc(dev
, sizeof(*wdat
), GFP_KERNEL
);
333 regs
= devm_kcalloc(dev
, pdev
->num_resources
, sizeof(*regs
),
338 /* WDAT specification wants to have >= 1ms period */
339 if (tbl
->timer_period
< 1)
341 if (tbl
->min_count
> tbl
->max_count
)
344 wdat
->period
= tbl
->timer_period
;
345 wdat
->wdd
.min_hw_heartbeat_ms
= wdat
->period
* tbl
->min_count
;
346 wdat
->wdd
.max_hw_heartbeat_ms
= wdat
->period
* tbl
->max_count
;
347 wdat
->stopped_in_sleep
= tbl
->flags
& ACPI_WDAT_STOPPED
;
348 wdat
->wdd
.info
= &wdat_wdt_info
;
349 wdat
->wdd
.ops
= &wdat_wdt_ops
;
352 /* Request and map all resources */
353 for (i
= 0; i
< pdev
->num_resources
; i
++) {
356 res
= &pdev
->resource
[i
];
357 if (resource_type(res
) == IORESOURCE_MEM
) {
358 reg
= devm_ioremap_resource(dev
, res
);
361 } else if (resource_type(res
) == IORESOURCE_IO
) {
362 reg
= devm_ioport_map(dev
, res
->start
, 1);
366 dev_err(dev
, "Unsupported resource\n");
373 entries
= (struct acpi_wdat_entry
*)(tbl
+ 1);
374 for (i
= 0; i
< tbl
->entries
; i
++) {
375 const struct acpi_generic_address
*gas
;
376 struct wdat_instruction
*instr
;
377 struct list_head
*instructions
;
382 action
= entries
[i
].action
;
383 if (action
>= MAX_WDAT_ACTIONS
) {
384 dev_dbg(dev
, "Skipping unknown action: %u\n", action
);
388 instr
= devm_kzalloc(dev
, sizeof(*instr
), GFP_KERNEL
);
392 INIT_LIST_HEAD(&instr
->node
);
393 instr
->entry
= entries
[i
];
395 gas
= &entries
[i
].register_region
;
397 memset(&r
, 0, sizeof(r
));
398 r
.start
= gas
->address
;
399 r
.end
= r
.start
+ ACPI_ACCESS_BYTE_WIDTH(gas
->access_width
) - 1;
400 if (gas
->space_id
== ACPI_ADR_SPACE_SYSTEM_MEMORY
) {
401 r
.flags
= IORESOURCE_MEM
;
402 } else if (gas
->space_id
== ACPI_ADR_SPACE_SYSTEM_IO
) {
403 r
.flags
= IORESOURCE_IO
;
405 dev_dbg(dev
, "Unsupported address space: %d\n",
410 /* Find the matching resource */
411 for (j
= 0; j
< pdev
->num_resources
; j
++) {
412 res
= &pdev
->resource
[j
];
413 if (resource_contains(res
, &r
)) {
414 instr
->reg
= regs
[j
] + r
.start
- res
->start
;
420 dev_err(dev
, "I/O resource not found\n");
424 instructions
= wdat
->instructions
[action
];
426 instructions
= devm_kzalloc(dev
,
427 sizeof(*instructions
),
432 INIT_LIST_HEAD(instructions
);
433 wdat
->instructions
[action
] = instructions
;
436 list_add_tail(&instr
->node
, instructions
);
439 wdat_wdt_boot_status(wdat
);
440 wdat_wdt_set_running(wdat
);
442 ret
= wdat_wdt_enable_reboot(wdat
);
446 platform_set_drvdata(pdev
, wdat
);
449 * Set initial timeout so that userspace has time to configure the
450 * watchdog properly after it has opened the device. In some cases
451 * the BIOS default is too short and causes immediate reboot.
453 if (timeout
* 1000 < wdat
->wdd
.min_hw_heartbeat_ms
||
454 timeout
* 1000 > wdat
->wdd
.max_hw_heartbeat_ms
) {
455 dev_warn(dev
, "Invalid timeout %d given, using %d\n",
456 timeout
, WDAT_DEFAULT_TIMEOUT
);
457 timeout
= WDAT_DEFAULT_TIMEOUT
;
460 ret
= wdat_wdt_set_timeout(&wdat
->wdd
, timeout
);
464 watchdog_set_nowayout(&wdat
->wdd
, nowayout
);
465 return devm_watchdog_register_device(dev
, &wdat
->wdd
);
468 #ifdef CONFIG_PM_SLEEP
469 static int wdat_wdt_suspend_noirq(struct device
*dev
)
471 struct wdat_wdt
*wdat
= dev_get_drvdata(dev
);
474 if (!watchdog_active(&wdat
->wdd
))
478 * We need to stop the watchdog if firmare is not doing it or if we
479 * are going suspend to idle (where firmware is not involved). If
480 * firmware is stopping the watchdog we kick it here one more time
481 * to give it some time.
483 wdat
->stopped
= false;
484 if (acpi_target_system_state() == ACPI_STATE_S0
||
485 !wdat
->stopped_in_sleep
) {
486 ret
= wdat_wdt_stop(&wdat
->wdd
);
488 wdat
->stopped
= true;
490 ret
= wdat_wdt_ping(&wdat
->wdd
);
496 static int wdat_wdt_resume_noirq(struct device
*dev
)
498 struct wdat_wdt
*wdat
= dev_get_drvdata(dev
);
501 if (!watchdog_active(&wdat
->wdd
))
504 if (!wdat
->stopped
) {
506 * Looks like the boot firmware reinitializes the watchdog
507 * before it hands off to the OS on resume from sleep so we
508 * stop and reprogram the watchdog here.
510 ret
= wdat_wdt_stop(&wdat
->wdd
);
514 ret
= wdat_wdt_set_timeout(&wdat
->wdd
, wdat
->wdd
.timeout
);
518 ret
= wdat_wdt_enable_reboot(wdat
);
522 ret
= wdat_wdt_ping(&wdat
->wdd
);
527 return wdat_wdt_start(&wdat
->wdd
);
531 static const struct dev_pm_ops wdat_wdt_pm_ops
= {
532 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(wdat_wdt_suspend_noirq
,
533 wdat_wdt_resume_noirq
)
536 static struct platform_driver wdat_wdt_driver
= {
537 .probe
= wdat_wdt_probe
,
540 .pm
= &wdat_wdt_pm_ops
,
544 module_platform_driver(wdat_wdt_driver
);
546 MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
547 MODULE_DESCRIPTION("ACPI Hardware Watchdog (WDAT) driver");
548 MODULE_LICENSE("GPL v2");
549 MODULE_ALIAS("platform:wdat_wdt");