]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
watchdog: iTCO: Drop vendor support
authorGuenter Roeck <linux@roeck-us.net>
Tue, 18 Nov 2025 19:29:58 +0000 (11:29 -0800)
committerWim Van Sebroeck <wim@linux-watchdog.org>
Sun, 18 Jan 2026 09:55:08 +0000 (10:55 +0100)
iTCO vendor support was introduced in 2006 to support SuperMicro boards
with Pentium 3 CPUs. It was extended in 2009 to support motherbords
with broken BIOS (specifically Intel DG33TL). The code is long since
obsolete, so let's drop support for it.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Wim Van Sebroeck <wim@linux-watchdog.org>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
Documentation/watchdog/watchdog-parameters.rst
drivers/watchdog/Kconfig
drivers/watchdog/Makefile
drivers/watchdog/iTCO_vendor.h [deleted file]
drivers/watchdog/iTCO_vendor_support.c [deleted file]
drivers/watchdog/iTCO_wdt.c

index 0a0119edfa82d6b5d4ff1d687ef3787c5473b97b..773241ed99867cb479e2ce6bd1cba52f0e909d39 100644 (file)
@@ -209,13 +209,6 @@ iTCO_wdt:
 
 -------------------------------------------------
 
-iTCO_vendor_support:
-    vendorsupport:
-       iTCO vendor specific support mode, default=0 (none),
-       1=SuperMicro Pent3, 2=SuperMicro Pent4+, 911=Broken SMI BIOS
-
--------------------------------------------------
-
 ib700wdt:
     timeout:
        Watchdog timeout in seconds. 0<= timeout <=30, default=30.
index d3b9df7d466b0b7215ee87b3040811d44ee53d2a..dc78729ba2a5d6e035ed3cbe5c2b631d11b76b20 100644 (file)
@@ -1429,14 +1429,6 @@ config ITCO_WDT
          To compile this driver as a module, choose M here: the
          module will be called iTCO_wdt.
 
-config ITCO_VENDOR_SUPPORT
-       bool "Intel TCO Timer/Watchdog Specific Vendor Support"
-       depends on ITCO_WDT
-       help
-         Add vendor specific support to the intel TCO timer based watchdog
-         devices. At this moment we only have additional support for some
-         SuperMicro Inc. motherboards.
-
 config IT8712F_WDT
        tristate "IT8712F (Smart Guardian) Watchdog Timer"
        depends on (X86 || COMPILE_TEST) && HAS_IOPORT
index ba52099b125398a32f80dad23317e223cc4af028..d2fb16b9f9ce763bba5a6ad899d47b8ebaf3743e 100644 (file)
@@ -127,9 +127,6 @@ obj-$(CONFIG_IE6XX_WDT) += ie6xx_wdt.o
 obj-$(CONFIG_ITCO_WDT) += iTCO_wdt.o
 obj-$(CONFIG_LENOVO_SE10_WDT) += lenovo_se10_wdt.o
 obj-$(CONFIG_LENOVO_SE30_WDT) += lenovo_se30_wdt.o
-ifeq ($(CONFIG_ITCO_VENDOR_SUPPORT),y)
-obj-$(CONFIG_ITCO_WDT) += iTCO_vendor_support.o
-endif
 obj-$(CONFIG_IT8712F_WDT) += it8712f_wdt.o
 obj-$(CONFIG_IT87_WDT) += it87_wdt.o
 obj-$(CONFIG_HP_WATCHDOG) += hpwdt.o
diff --git a/drivers/watchdog/iTCO_vendor.h b/drivers/watchdog/iTCO_vendor.h
deleted file mode 100644 (file)
index 69e92e6..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/* iTCO Vendor Specific Support hooks */
-#ifdef CONFIG_ITCO_VENDOR_SUPPORT
-extern int iTCO_vendorsupport;
-extern void iTCO_vendor_pre_start(struct resource *, unsigned int);
-extern void iTCO_vendor_pre_stop(struct resource *);
-extern int iTCO_vendor_check_noreboot_on(void);
-#else
-#define iTCO_vendorsupport                             0
-#define iTCO_vendor_pre_start(acpibase, heartbeat)     {}
-#define iTCO_vendor_pre_stop(acpibase)                 {}
-#define iTCO_vendor_check_noreboot_on()                        1
-                               /* 1=check noreboot; 0=don't check */
-#endif
diff --git a/drivers/watchdog/iTCO_vendor_support.c b/drivers/watchdog/iTCO_vendor_support.c
deleted file mode 100644 (file)
index cf0eaa0..0000000
+++ /dev/null
@@ -1,216 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- *     intel TCO vendor specific watchdog driver support
- *
- *     (c) Copyright 2006-2009 Wim Van Sebroeck <wim@iguana.be>.
- *
- *     Neither Wim Van Sebroeck nor Iguana vzw. admit liability nor
- *     provide warranty for any of this software. This material is
- *     provided "AS-IS" and at no charge.
- */
-
-/*
- *     Includes, defines, variables, module parameters, ...
- */
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-/* Module and version information */
-#define DRV_NAME       "iTCO_vendor_support"
-#define DRV_VERSION    "1.04"
-
-/* Includes */
-#include <linux/module.h>              /* For module specific items */
-#include <linux/moduleparam.h>         /* For new moduleparam's */
-#include <linux/types.h>               /* For standard types (like size_t) */
-#include <linux/errno.h>               /* For the -ENODEV/... values */
-#include <linux/kernel.h>              /* For printk/panic/... */
-#include <linux/init.h>                        /* For __init/__exit/... */
-#include <linux/ioport.h>              /* For io-port access */
-#include <linux/io.h>                  /* For inb/outb/... */
-
-#include "iTCO_vendor.h"
-
-/* List of vendor support modes */
-/* SuperMicro Pentium 3 Era 370SSE+-OEM1/P3TSSE */
-#define SUPERMICRO_OLD_BOARD   1
-/* SuperMicro Pentium 4 / Xeon 4 / EMT64T Era Systems - no longer supported */
-#define SUPERMICRO_NEW_BOARD   2
-/* Broken BIOS */
-#define BROKEN_BIOS            911
-
-int iTCO_vendorsupport;
-EXPORT_SYMBOL(iTCO_vendorsupport);
-
-module_param_named(vendorsupport, iTCO_vendorsupport, int, 0);
-MODULE_PARM_DESC(vendorsupport, "iTCO vendor specific support mode, default="
-                       "0 (none), 1=SuperMicro Pent3, 911=Broken SMI BIOS");
-
-/*
- *     Vendor Specific Support
- */
-
-/*
- *     Vendor Support: 1
- *     Board: Super Micro Computer Inc. 370SSE+-OEM1/P3TSSE
- *     iTCO chipset: ICH2
- *
- *     Code contributed by: R. Seretny <lkpatches@paypc.com>
- *     Documentation obtained by R. Seretny from SuperMicro Technical Support
- *
- *     To enable Watchdog function:
- *         BIOS setup -> Power -> TCO Logic SMI Enable -> Within5Minutes
- *         This setting enables SMI to clear the watchdog expired flag.
- *         If BIOS or CPU fail which may cause SMI hang, then system will
- *         reboot. When application starts to use watchdog function,
- *         application has to take over the control from SMI.
- *
- *         For P3TSSE, J36 jumper needs to be removed to enable the Watchdog
- *         function.
- *
- *         Note: The system will reboot when Expire Flag is set TWICE.
- *         So, if the watchdog timer is 20 seconds, then the maximum hang
- *         time is about 40 seconds, and the minimum hang time is about
- *         20.6 seconds.
- */
-
-static void supermicro_old_pre_start(struct resource *smires)
-{
-       unsigned long val32;
-
-       /* Bit 13: TCO_EN -> 0 = Disables TCO logic generating an SMI# */
-       val32 = inl(smires->start);
-       val32 &= 0xffffdfff;    /* Turn off SMI clearing watchdog */
-       outl(val32, smires->start);     /* Needed to activate watchdog */
-}
-
-static void supermicro_old_pre_stop(struct resource *smires)
-{
-       unsigned long val32;
-
-       /* Bit 13: TCO_EN -> 1 = Enables the TCO logic to generate SMI# */
-       val32 = inl(smires->start);
-       val32 |= 0x00002000;    /* Turn on SMI clearing watchdog */
-       outl(val32, smires->start);     /* Needed to deactivate watchdog */
-}
-
-/*
- *     Vendor Support: 911
- *     Board: Some Intel ICHx based motherboards
- *     iTCO chipset: ICH7+
- *
- *     Some Intel motherboards have a broken BIOS implementation: i.e.
- *     the SMI handler clear's the TIMEOUT bit in the TC01_STS register
- *     and does not reload the time. Thus the TCO watchdog does not reboot
- *     the system.
- *
- *     These are the conclusions of Andriy Gapon <avg@icyb.net.ua> after
- *     debugging: the SMI handler is quite simple - it tests value in
- *     TCO1_CNT against 0x800, i.e. checks TCO_TMR_HLT. If the bit is set
- *     the handler goes into an infinite loop, apparently to allow the
- *     second timeout and reboot. Otherwise it simply clears TIMEOUT bit
- *     in TCO1_STS and that's it.
- *     So the logic seems to be reversed, because it is hard to see how
- *     TIMEOUT can get set to 1 and SMI generated when TCO_TMR_HLT is set
- *     (other than a transitional effect).
- *
- *     The only fix found to get the motherboard(s) to reboot is to put
- *     the glb_smi_en bit to 0. This is a dirty hack that bypasses the
- *     broken code by disabling Global SMI.
- *
- *     WARNING: globally disabling SMI could possibly lead to dramatic
- *     problems, especially on laptops! I.e. various ACPI things where
- *     SMI is used for communication between OS and firmware.
- *
- *     Don't use this fix if you don't need to!!!
- */
-
-static void broken_bios_start(struct resource *smires)
-{
-       unsigned long val32;
-
-       val32 = inl(smires->start);
-       /* Bit 13: TCO_EN     -> 0 = Disables TCO logic generating an SMI#
-          Bit  0: GBL_SMI_EN -> 0 = No SMI# will be generated by ICH. */
-       val32 &= 0xffffdffe;
-       outl(val32, smires->start);
-}
-
-static void broken_bios_stop(struct resource *smires)
-{
-       unsigned long val32;
-
-       val32 = inl(smires->start);
-       /* Bit 13: TCO_EN     -> 1 = Enables TCO logic generating an SMI#
-          Bit  0: GBL_SMI_EN -> 1 = Turn global SMI on again. */
-       val32 |= 0x00002001;
-       outl(val32, smires->start);
-}
-
-/*
- *     Generic Support Functions
- */
-
-void iTCO_vendor_pre_start(struct resource *smires,
-                          unsigned int heartbeat)
-{
-       switch (iTCO_vendorsupport) {
-       case SUPERMICRO_OLD_BOARD:
-               supermicro_old_pre_start(smires);
-               break;
-       case BROKEN_BIOS:
-               broken_bios_start(smires);
-               break;
-       }
-}
-EXPORT_SYMBOL(iTCO_vendor_pre_start);
-
-void iTCO_vendor_pre_stop(struct resource *smires)
-{
-       switch (iTCO_vendorsupport) {
-       case SUPERMICRO_OLD_BOARD:
-               supermicro_old_pre_stop(smires);
-               break;
-       case BROKEN_BIOS:
-               broken_bios_stop(smires);
-               break;
-       }
-}
-EXPORT_SYMBOL(iTCO_vendor_pre_stop);
-
-int iTCO_vendor_check_noreboot_on(void)
-{
-       switch (iTCO_vendorsupport) {
-       case SUPERMICRO_OLD_BOARD:
-               return 0;
-       default:
-               return 1;
-       }
-}
-EXPORT_SYMBOL(iTCO_vendor_check_noreboot_on);
-
-static int __init iTCO_vendor_init_module(void)
-{
-       if (iTCO_vendorsupport == SUPERMICRO_NEW_BOARD) {
-               pr_warn("Option vendorsupport=%d is no longer supported, "
-                       "please use the w83627hf_wdt driver instead\n",
-                       SUPERMICRO_NEW_BOARD);
-               return -EINVAL;
-       }
-       pr_info("vendor-support=%d\n", iTCO_vendorsupport);
-       return 0;
-}
-
-static void __exit iTCO_vendor_exit_module(void)
-{
-       pr_info("Module Unloaded\n");
-}
-
-module_init(iTCO_vendor_init_module);
-module_exit(iTCO_vendor_exit_module);
-
-MODULE_AUTHOR("Wim Van Sebroeck <wim@iguana.be>, "
-               "R. Seretny <lkpatches@paypc.com>");
-MODULE_DESCRIPTION("Intel TCO Vendor Specific WatchDog Timer Driver Support");
-MODULE_VERSION(DRV_VERSION);
-MODULE_LICENSE("GPL");
index 4ab3405ef8e6e10637020ec2de09abfb29eb4fc5..1dec9cd155b11e2547465dad8bba078022684371 100644 (file)
@@ -63,8 +63,6 @@
 #include <linux/platform_data/itco_wdt.h>
 #include <linux/mfd/intel_pmc_bxt.h>
 
-#include "iTCO_vendor.h"
-
 /* Address definitions for the TCO */
 /* TCO base address */
 #define TCOBASE(p)     ((p)->tco_res->start)
@@ -283,8 +281,6 @@ static int iTCO_wdt_start(struct watchdog_device *wd_dev)
        struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev);
        unsigned int val;
 
-       iTCO_vendor_pre_start(p->smi_res, wd_dev->timeout);
-
        /* disable chipset's NO_REBOOT bit */
        if (p->update_no_reboot_bit(p->no_reboot_priv, false)) {
                dev_err(wd_dev->parent, "failed to reset NO_REBOOT flag, reboot disabled by hardware/BIOS\n");
@@ -314,8 +310,6 @@ static int iTCO_wdt_stop(struct watchdog_device *wd_dev)
        struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev);
        unsigned int val;
 
-       iTCO_vendor_pre_stop(p->smi_res);
-
        /* Bit 11: TCO Timer Halt -> 1 = The TCO timer is disabled */
        val = inw(TCO1_CNT(p));
        val |= 0x0800;
@@ -488,8 +482,7 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
                               (u64)SMI_EN(p));
                        return -EBUSY;
                }
-       } else if (iTCO_vendorsupport ||
-                  turn_SMI_watchdog_clear_off >= p->iTCO_version) {
+       } else if (turn_SMI_watchdog_clear_off >= p->iTCO_version) {
                dev_err(dev, "SMI I/O resource is missing\n");
                return -ENODEV;
        }
@@ -508,8 +501,7 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
        }
 
        /* Check chipset's NO_REBOOT bit */
-       if (p->update_no_reboot_bit(p->no_reboot_priv, false) &&
-           iTCO_vendor_check_noreboot_on()) {
+       if (p->update_no_reboot_bit(p->no_reboot_priv, false)) {
                dev_info(dev, "unable to reset NO_REBOOT flag, device disabled by hardware/BIOS\n");
                return -ENODEV; /* Cannot reset NO_REBOOT bit */
        }