From bb1d881cb8e1366834a1ac3ade54e3c78d961261 Mon Sep 17 00:00:00 2001 From: David P Date: Thu, 31 May 2018 19:38:56 -0400 Subject: upgpkg: kernels/linux-libre-pae 4.16.13_gnu-1 Signed-off-by: David P --- ...watchdog-Prefer-iTCO_wdt-on-Lenovo-Z50-70.patch | 125 +++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 kernels/linux-libre-pae/0002-ACPI-watchdog-Prefer-iTCO_wdt-on-Lenovo-Z50-70.patch (limited to 'kernels/linux-libre-pae/0002-ACPI-watchdog-Prefer-iTCO_wdt-on-Lenovo-Z50-70.patch') diff --git a/kernels/linux-libre-pae/0002-ACPI-watchdog-Prefer-iTCO_wdt-on-Lenovo-Z50-70.patch b/kernels/linux-libre-pae/0002-ACPI-watchdog-Prefer-iTCO_wdt-on-Lenovo-Z50-70.patch new file mode 100644 index 000000000..ecd2d721d --- /dev/null +++ b/kernels/linux-libre-pae/0002-ACPI-watchdog-Prefer-iTCO_wdt-on-Lenovo-Z50-70.patch @@ -0,0 +1,125 @@ +From f593e0bde601ff2b4f84b7363e4dfcbbda652e6d Mon Sep 17 00:00:00 2001 +Message-Id: +In-Reply-To: +References: +From: Mika Westerberg +Date: Mon, 23 Apr 2018 14:16:03 +0300 +Subject: [PATCH 2/3] ACPI / watchdog: Prefer iTCO_wdt on Lenovo Z50-70 + +WDAT table on Lenovo Z50-70 is using RTC SRAM (ports 0x70 and 0x71) to +store state of the timer. This conflicts with Linux RTC driver +(rtc-cmos.c) who fails to reserve those ports for itself preventing RTC +from functioning. In addition the WDAT table seems not to be fully +functional because it does not reset the system when the watchdog times +out. + +On this system iTCO_wdt works just fine so we simply prefer to use it +instead of WDAT. This makes RTC working again and also results working +watchdog via iTCO_wdt. + +Reported-by: Peter Milley +Link: https://bugzilla.kernel.org/show_bug.cgi?id=199033 +Signed-off-by: Mika Westerberg +Signed-off-by: Rafael J. Wysocki +--- + drivers/acpi/acpi_watchdog.c | 59 ++++++++++++++++++++++++++++++------ + 1 file changed, 49 insertions(+), 10 deletions(-) + +diff --git a/drivers/acpi/acpi_watchdog.c b/drivers/acpi/acpi_watchdog.c +index ebb626ffb5fa..4bde16fb97d8 100644 +--- a/drivers/acpi/acpi_watchdog.c ++++ b/drivers/acpi/acpi_watchdog.c +@@ -12,41 +12,80 @@ + #define pr_fmt(fmt) "ACPI: watchdog: " fmt + + #include ++#include + #include + #include + + #include "internal.h" + ++static const struct dmi_system_id acpi_watchdog_skip[] = { ++ { ++ /* ++ * On Lenovo Z50-70 there are two issues with the WDAT ++ * table. First some of the instructions use RTC SRAM ++ * to store persistent information. This does not work well ++ * with Linux RTC driver. Second, more important thing is ++ * that the instructions do not actually reset the system. ++ * ++ * On this particular system iTCO_wdt seems to work just ++ * fine so we prefer that over WDAT for now. ++ * ++ * See also https://bugzilla.kernel.org/show_bug.cgi?id=199033. ++ */ ++ .ident = "Lenovo Z50-70", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "20354"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Z50-70"), ++ }, ++ }, ++ {} ++}; ++ ++static const struct acpi_table_wdat *acpi_watchdog_get_wdat(void) ++{ ++ const struct acpi_table_wdat *wdat = NULL; ++ acpi_status status; ++ ++ if (acpi_disabled) ++ return NULL; ++ ++ if (dmi_check_system(acpi_watchdog_skip)) ++ return NULL; ++ ++ status = acpi_get_table(ACPI_SIG_WDAT, 0, ++ (struct acpi_table_header **)&wdat); ++ if (ACPI_FAILURE(status)) { ++ /* It is fine if there is no WDAT */ ++ return NULL; ++ } ++ ++ return wdat; ++} ++ + /** + * Returns true if this system should prefer ACPI based watchdog instead of + * the native one (which are typically the same hardware). + */ + bool acpi_has_watchdog(void) + { +- struct acpi_table_header hdr; +- +- if (acpi_disabled) +- return false; +- +- return ACPI_SUCCESS(acpi_get_table_header(ACPI_SIG_WDAT, 0, &hdr)); ++ return !!acpi_watchdog_get_wdat(); + } + EXPORT_SYMBOL_GPL(acpi_has_watchdog); + + void __init acpi_watchdog_init(void) + { + const struct acpi_wdat_entry *entries; + const struct acpi_table_wdat *wdat; + struct list_head resource_list; + struct resource_entry *rentry; + struct platform_device *pdev; + struct resource *resources; + size_t nresources = 0; +- acpi_status status; + int i; + +- status = acpi_get_table(ACPI_SIG_WDAT, 0, +- (struct acpi_table_header **)&wdat); +- if (ACPI_FAILURE(status)) { ++ wdat = acpi_watchdog_get_wdat(); ++ if (!wdat) { + /* It is fine if there is no WDAT */ + return; + } +-- +2.17.0 + -- cgit v1.2.3