Re: wdat_wdt: Problem with WDAT using shared registers

From: Guenter Roeck
Date: Wed Oct 11 2023 - 11:30:02 EST


On Fri, Aug 28, 2043 at 01:17:41AM +0800, xingtong.wu wrote:
> Hi
>
> I want to use the wdat_wdt to support a watchdog of SIONCT (a multi-function device
> (mfd)), and I register instructions for wdat_wdt in BIOS, it need registers 0x2e-0x2f
> to access the watchdog, then register 0x2e-0x2f will be forever occupied by platform
> device wdat_wdt, see the code: https://elixir.bootlin.com/linux/v6.6-rc5/source/drivers/acpi/acpi_watchdog.c#L180
>
> but the 0x2e-0x2f are special, they are used for a multi-function device --SIONCT, the
> device have many pins can not only support features for watchdog, but also other
> features like leds, fans, temperature monitor... there are drivers for these pins, e.g.
> gpio-f7188x, nct6775, w83627hf... these driver use the shared register 0x2e-0x2f.
>
> So the issue happened, the wdat_wdt occupied the shared register 0x2e-0x2f, then
> the other driver can not load.
>
> Here is the msg I collected from my device:
>
> root@ipc-SIMATIC-IPC-BX-21A:/home/ipc# cat /proc/ioports
> 0000-0cf7 : PCI Bus 0000:00
> 0000-001f : dma1
> 0020-0021 : pic1
> 002e-002e : wdat_wdt
> 002f-002f : wdat_wdt
>
> It will cause other SIONCT drivers can not load, e.g.
> root@ipc-SIMATIC-IPC-BX-21A:/home/ipc# modprobe gpio-f7188x
> modprobe: ERROR: could not insert 'gpio_f7188x': No such device
>
> And dmesg info is:
> [ 213.559168] gpio-f7188xI/O address 0x002e already in use
>
> Same reason for other drivers:
> root@ipc-SIMATIC-IPC-BX-21A:/home/ipc# modprobe nct6775
> modprobe: ERROR: could not insert 'nct6775': No such device
>
> Do you have any idea for the wdat_wdt to add support for multi-function device?
>

In general, it would need to request the 0x2e-0x2f space temporarily
and release it when it isn't used. Many other drivers do the same.
Look for request_muxed_region() and release_region() in, for example,
drivers/watchdog/w83627hf_wdt.c.

However, this is more difficult with ACPI. Device access should either
be all through ACPI, or all direct. It doesn't really make much if any
sense to access one of the sub-devices through ACPI and others directly
because there is no automatic synchronization mechanism between ACPI
and the rest of the kernel. If ACPI reserves the 0x2e-0x2f space, it
owns it, period.

Note: There can only be one device at 0x2e/0x2f. I don't really understand
the reference to both nct6775 and f7188 because it is simply not possible
that both reside at that address at the same time. And if there is a nct6775
or f7188 compatible chip in the system, it would make much more sense to
use the chip specific watchdog drivers instead of wdat_wdt - again, ACPI
takes it all, and doesn't like competition.

Guenter