From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org,
Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>,
"Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
Subject: [PATCH 4.5 88/88] ACPI / processor: Request native thermal interrupt handling via _OSC
Date: Mon, 9 May 2016 09:22:17 +0200 [thread overview]
Message-ID: <20160509071956.521100571@linuxfoundation.org> (raw)
In-Reply-To: <20160509071952.129092535@linuxfoundation.org>
4.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
commit a21211672c9a1d730a39aa65d4a5b3414700adfb upstream.
There are several reports of freeze on enabling HWP (Hardware PStates)
feature on Skylake-based systems by the Intel P-states driver. The root
cause is identified as the HWP interrupts causing BIOS code to freeze.
HWP interrupts use the thermal LVT which can be handled by Linux
natively, but on the affected Skylake-based systems SMM will respond
to it by default. This is a problem for several reasons:
- On the affected systems the SMM thermal LVT handler is broken (it
will crash when invoked) and a BIOS update is necessary to fix it.
- With thermal interrupt handled in SMM we lose all of the reporting
features of the arch/x86/kernel/cpu/mcheck/therm_throt driver.
- Some thermal drivers like x86-package-temp depend on the thermal
threshold interrupts signaled via the thermal LVT.
- The HWP interrupts are useful for debugging and tuning
performance (if the kernel can handle them).
The native handling of thermal interrupts needs to be enabled
because of that.
This requires some way to tell SMM that the OS can handle thermal
interrupts. That can be done by using _OSC/_PDC in processor
scope very early during ACPI initialization.
The meaning of _OSC/_PDC bit 12 in processor scope is whether or
not the OS supports native handling of interrupts for Collaborative
Processor Performance Control (CPPC) notifications. Since on
HWP-capable systems CPPC is a firmware interface to HWP, setting
this bit effectively tells the firmware that the OS will handle
thermal interrupts natively going forward.
For details on _OSC/_PDC refer to:
http://www.intel.com/content/www/us/en/standards/processor-vendor-specific-acpi-specification.html
To implement the _OSC/_PDC handshake as described, introduce a new
function, acpi_early_processor_osc(), that walks the ACPI
namespace looking for ACPI processor objects and invokes _OSC for
them with bit 12 in the capabilities buffer set and terminates the
namespace walk on the first success.
Also modify intel_thermal_interrupt() to clear HWP status bits in
the HWP_STATUS MSR to acknowledge HWP interrupts (which prevents
them from firing continuously).
Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
[ rjw: Subject & changelog, function rename ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
arch/x86/kernel/cpu/mcheck/therm_throt.c | 3 +
drivers/acpi/acpi_processor.c | 52 +++++++++++++++++++++++++++++++
drivers/acpi/bus.c | 3 +
drivers/acpi/internal.h | 6 +++
4 files changed, 64 insertions(+)
--- a/arch/x86/kernel/cpu/mcheck/therm_throt.c
+++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c
@@ -385,6 +385,9 @@ static void intel_thermal_interrupt(void
{
__u64 msr_val;
+ if (static_cpu_has(X86_FEATURE_HWP))
+ wrmsrl_safe(MSR_HWP_STATUS, 0);
+
rdmsrl(MSR_IA32_THERM_STATUS, msr_val);
/* Check for violation of core thermal thresholds*/
--- a/drivers/acpi/acpi_processor.c
+++ b/drivers/acpi/acpi_processor.c
@@ -491,6 +491,58 @@ static void acpi_processor_remove(struct
}
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
+#ifdef CONFIG_X86
+static bool acpi_hwp_native_thermal_lvt_set;
+static acpi_status __init acpi_hwp_native_thermal_lvt_osc(acpi_handle handle,
+ u32 lvl,
+ void *context,
+ void **rv)
+{
+ u8 sb_uuid_str[] = "4077A616-290C-47BE-9EBD-D87058713953";
+ u32 capbuf[2];
+ struct acpi_osc_context osc_context = {
+ .uuid_str = sb_uuid_str,
+ .rev = 1,
+ .cap.length = 8,
+ .cap.pointer = capbuf,
+ };
+
+ if (acpi_hwp_native_thermal_lvt_set)
+ return AE_CTRL_TERMINATE;
+
+ capbuf[0] = 0x0000;
+ capbuf[1] = 0x1000; /* set bit 12 */
+
+ if (ACPI_SUCCESS(acpi_run_osc(handle, &osc_context))) {
+ if (osc_context.ret.pointer && osc_context.ret.length > 1) {
+ u32 *capbuf_ret = osc_context.ret.pointer;
+
+ if (capbuf_ret[1] & 0x1000) {
+ acpi_handle_info(handle,
+ "_OSC native thermal LVT Acked\n");
+ acpi_hwp_native_thermal_lvt_set = true;
+ }
+ }
+ kfree(osc_context.ret.pointer);
+ }
+
+ return AE_OK;
+}
+
+void __init acpi_early_processor_osc(void)
+{
+ if (boot_cpu_has(X86_FEATURE_HWP)) {
+ acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
+ ACPI_UINT32_MAX,
+ acpi_hwp_native_thermal_lvt_osc,
+ NULL, NULL, NULL);
+ acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID,
+ acpi_hwp_native_thermal_lvt_osc,
+ NULL, NULL);
+ }
+}
+#endif
+
/*
* The following ACPI IDs are known to be suitable for representing as
* processor devices.
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -1005,6 +1005,9 @@ static int __init acpi_bus_init(void)
goto error1;
}
+ /* Set capability bits for _OSC under processor scope */
+ acpi_early_processor_osc();
+
/*
* _OSC method may exist in module level code,
* so it must be run after ACPI_FULL_INITIALIZATION
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -138,6 +138,12 @@ void acpi_early_processor_set_pdc(void);
static inline void acpi_early_processor_set_pdc(void) {}
#endif
+#ifdef CONFIG_X86
+void acpi_early_processor_osc(void);
+#else
+static inline void acpi_early_processor_osc(void) {}
+#endif
+
/* --------------------------------------------------------------------------
Embedded Controller
-------------------------------------------------------------------------- */
next prev parent reply other threads:[~2016-05-09 7:39 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-09 7:20 [PATCH 4.5 00/88] 4.5.4-stable review Greg Kroah-Hartman
2016-05-09 7:20 ` [PATCH 4.5 01/88] clocksource/drivers/tango-xtal: Fix boot hang due to incorrect test Greg Kroah-Hartman
2016-05-09 7:20 ` [PATCH 4.5 02/88] RDMA/iw_cxgb4: Fix bar2 virt addr calculation for T4 chips Greg Kroah-Hartman
2016-05-09 7:20 ` [PATCH 4.5 03/88] net/mlx5_core: Fix caching ATOMIC endian mode capability Greg Kroah-Hartman
2016-05-09 7:20 ` [PATCH 4.5 04/88] ipvs: handle ip_vs_fill_iph_skb_off failure Greg Kroah-Hartman
2016-05-09 7:20 ` [PATCH 4.5 05/88] ipvs: correct initial offset of Call-ID header search in SIP persistence engine Greg Kroah-Hartman
2016-05-09 7:20 ` [PATCH 4.5 06/88] ipvs: drop first packet to redirect conntrack Greg Kroah-Hartman
2016-05-09 7:20 ` [PATCH 4.5 07/88] rtlwifi: Fix size of wireless mode variable Greg Kroah-Hartman
2016-05-09 7:20 ` [PATCH 4.5 08/88] mfd: intel-lpss: Remove clock tree on error path Greg Kroah-Hartman
2016-05-09 7:20 ` [PATCH 4.5 09/88] nbd: ratelimit error msgs after socket close Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 11/88] null_blk: add lightnvm null_blk device to the nullb_list Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 12/88] ata: ahci_xgene: dereferencing uninitialized pointer in probe Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 13/88] wlcore: fix error handling in wlcore_event_fw_logger Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 14/88] ath10k: fix pktlog in QCA99X0 Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 15/88] mwifiex: fix corner case association failure Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 17/88] clk-divider: make sure read-only dividers do not write to their register Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 18/88] soc: rockchip: power-domain: fix err handle while probing Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 19/88] clk: rockchip: fix wrong mmc phase shift for rk3228 Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 20/88] clk: rockchip: free memory in error cases when registering clock branches Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 22/88] clk: qcom: msm8960: fix ce3_core clk enable register Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 23/88] clk: versatile: sp810: support reentrance Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 24/88] clk: qcom: msm8960: Fix ce3_src register offset Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 25/88] clk: sunxi: Fix sun8i-a23-apb0-clk divider flags Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 26/88] clk: xgene: Add missing parenthesis when clearing divider value Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 27/88] clk: bcm2835: fix check of error code returned by devm_ioremap_resource() Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 28/88] pwm: omap-dmtimer: Fix inaccurate period and duty cycle calculations Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 29/88] pwm: omap-dmtimer: Add sanity checking for load and match values Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 30/88] pwm: omap-dmtimer: Round load and match values rather than truncate Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 31/88] lpfc: fix misleading indentation Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 33/88] ath9k: ar5008_hw_cmn_spur_mitigate: add missing mask_m & mask_p initialisation Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 34/88] mac80211: fix statistics leak if dev_alloc_name() fails Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 35/88] tracing: Dont display trigger file for events that cant be enabled Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 36/88] MD: make bio mergeable Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 37/88] Minimal fix-up of bad hashing behavior of hash_64() Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 38/88] mm: memcontrol: let v2 cgroups follow changes in system swappiness Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 39/88] mm, cma: prevent nr_isolated_* counters from going negative Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 40/88] mm/zswap: provide unique zpool name Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 41/88] propogate_mnt: Handle the first propogated copy being a slave Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 42/88] modpost: fix module autoloading for OF devices with generic compatible property Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 43/88] ARM: EXYNOS: Properly skip unitialized parent clock in power domain on Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 44/88] ARM: SoCFPGA: Fix secondary CPU startup in thumb2 kernel Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 45/88] xen: Fix page <-> pfn conversion on 32 bit systems Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 46/88] xen/balloon: Fix crash when ballooning on x86 32 bit PAE Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 47/88] xen/evtchn: fix ring resize when binding new events Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 48/88] HID: wacom: Add support for DTK-1651 Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 49/88] HID: Fix boot delay for Creative SB Omni Surround 5.1 with quirk Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 50/88] Input: zforce_ts - fix dual touch recognition Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 51/88] proc: prevent accessing /proc/<PID>/environ until its ready Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 52/88] mm: update min_free_kbytes from khugepaged after core initialization Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 53/88] batman-adv: fix DAT candidate selection (must use vid) Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 54/88] batman-adv: Check skb size before using encapsulated ETH+VLAN header Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 56/88] batman-adv: Reduce refcnt of removed router when updating route Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 57/88] libnvdimm, pfn: fix memmap reservation sizing Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 58/88] writeback: Fix performance regression in wb_over_bg_thresh() Greg Kroah-Hartman
[not found] ` <20160509071952.129092535-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>
2016-05-09 7:21 ` [PATCH 4.5 59/88] MAINTAINERS: Remove asterisk from EFI directory names Greg Kroah-Hartman
2016-05-09 7:21 ` Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 60/88] x86/tsc: Read all ratio bits from MSR_PLATFORM_INFO Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 61/88] ARM: cpuidle: Pass on arm_cpuidle_suspend()s return value Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 62/88] parisc: fix a bug when syscall number of tracee is __NR_Linux_syscalls Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 63/88] cpufreq: st: enable selective initialization based on the platform Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 64/88] ARC: Add missing io barriers to io{read,write}{16,32}be() Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 65/88] x86/sysfb_efi: Fix valid BAR address range check Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 66/88] ARM: dts: apq8064: add ahci ports-implemented mask Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 67/88] ACPICA: Dispatcher: Update thread ID for recursive method calls Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 68/88] powerpc: Fix bad inline asm constraint in create_zero_mask() Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 69/88] libahci: save port map for forced port map Greg Kroah-Hartman
2016-05-09 7:21 ` [PATCH 4.5 70/88] ata: ahci-platform: Add ports-implemented DT bindings Greg Kroah-Hartman
2016-05-09 7:22 ` [PATCH 4.5 71/88] USB: serial: cp210x: add ID for Link ECU Greg Kroah-Hartman
2016-05-09 7:22 ` [PATCH 4.5 72/88] USB: serial: cp210x: add Straizona Focusers device ids Greg Kroah-Hartman
2016-05-09 7:22 ` [PATCH 4.5 73/88] Revert "USB / PM: Allow USB devices to remain runtime-suspended when sleeping" Greg Kroah-Hartman
2016-05-09 7:22 ` [PATCH 4.5 74/88] nvmem: mxs-ocotp: fix buffer overflow in read Greg Kroah-Hartman
2016-05-09 7:22 ` [PATCH 4.5 75/88] Drivers: hv: vmbus: Fix signaling logic in hv_need_to_signal_on_read() Greg Kroah-Hartman
2016-05-09 7:22 ` [PATCH 4.5 76/88] gpu: ipu-v3: Fix imx-ipuv3-crtc module autoloading Greg Kroah-Hartman
2016-05-09 7:22 ` [PATCH 4.5 77/88] drm/amdgpu: make sure vertical front porch is at least 1 Greg Kroah-Hartman
2016-05-09 7:22 ` [PATCH 4.5 79/88] iio: ak8975: Fix NULL pointer exception on early interrupt Greg Kroah-Hartman
2016-05-09 7:22 ` [PATCH 4.5 81/88] drm/radeon: make sure vertical front porch is at least 1 Greg Kroah-Hartman
2016-05-09 7:22 ` Greg Kroah-Hartman [this message]
[not found] ` <5730411d.47afc20a.a55a6.ffffa291@mx.google.com>
2016-05-09 8:06 ` [PATCH 4.5 00/88] 4.5.4-stable review Greg Kroah-Hartman
2016-05-11 8:45 ` Kevin Hilman
2016-05-09 13:08 ` Guenter Roeck
2016-05-10 7:03 ` Greg Kroah-Hartman
2016-05-09 19:41 ` Shuah Khan
2016-05-10 7:03 ` Greg Kroah-Hartman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160509071956.521100571@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rafael.j.wysocki@intel.com \
--cc=srinivas.pandruvada@linux.intel.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.