Re: git: 67f2a563bfca - main - acpi: Tell SMM we will handle CPPC notifications
Date: Mon, 10 Oct 2022 15:29:56 UTC
On 10 Oct 2022, at 14:53, Tom Jones <thj@FreeBSD.org> wrote:
>
> The branch main has been updated by thj:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=67f2a563bfcad75c16536ca500b06ddc9306dfa0
>
> commit 67f2a563bfcad75c16536ca500b06ddc9306dfa0
> Author: Tom Jones <thj@FreeBSD.org>
> AuthorDate: 2022-10-10 13:46:25 +0000
> Commit: Tom Jones <thj@FreeBSD.org>
> CommitDate: 2022-10-10 13:53:15 +0000
>
> acpi: Tell SMM we will handle CPPC notifications
>
> Buggy SMM implementations can hang while processing CPPC notifications.
> This leads to some laptops (notably Thinkpads) hanging when the
> hwpstate_intel driver is loaded.
>
> Tell the SMM that we will handle CPPC notifications as described in:
>
> - Intel® Processor Vendor-Specific ACPI
> - Intel® 64 and IA-32 Architectures Software Developer’s Manual
>
> CPPC events default to masked (disabled) so while we do not do any
> handling right now this does not seem to lead to any issues.
>
> This approach was found via this Linux Kernel patch:
> https://lkml.org/lkml/2016/3/17/563
>
> PR: 253288
> Reviewed by: imp, jhb
> Sponsored by: Modirum
> Sponsored by: Klara, Inc.
> Differential Revision: https://reviews.freebsd.org/D36699
> ---
> sys/dev/acpica/acpi_cpu.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/sys/dev/acpica/acpi_cpu.c b/sys/dev/acpica/acpi_cpu.c
> index 762ea37cfa34..49d2bd11fdaa 100644
> --- a/sys/dev/acpica/acpi_cpu.c
> +++ b/sys/dev/acpica/acpi_cpu.c
> @@ -153,6 +153,7 @@ static struct sysctl_ctx_list cpu_sysctl_ctx;
> static struct sysctl_oid *cpu_sysctl_tree;
> static int cpu_cx_generic;
> static int cpu_cx_lowest_lim;
> +static bool cppc_notify;
>
> static struct acpi_cpu_softc **cpu_softc;
> ACPI_SERIAL_DECL(cpu, "ACPI CPU");
> @@ -396,6 +397,13 @@ acpi_cpu_attach(device_t dev)
> */
> if (!acpi_disabled("mwait") && cpu_mwait_usable())
> sc->cpu_features |= ACPI_CAP_SMP_C1_NATIVE | ACPI_CAP_SMP_C3_NATIVE;
> +
> + /*
> + * Work around a lingering SMM bug which leads to freezes when handling
> + * CPPC notifications. Tell the SMM we will handle any CPPC notifications.
> + */
> + if ((cpu_power_eax & CPUTPM1_HWP_NOTIFICATION) && cppc_notify)
> + sc->cpu_features |= ACPI_CAP_INTR_CPPC;
> #endif
>
> if (devclass_get_drivers(device_get_devclass(dev), &drivers,
> @@ -977,6 +985,12 @@ acpi_cpu_startup(void *arg)
> NULL, 0, acpi_cpu_global_cx_lowest_sysctl, "A",
> "Global lowest Cx sleep state to use");
>
> + /* Add sysctl handler to control registering for CPPC notifications */
> + cppc_notify = 1;
> + SYSCTL_ADD_BOOL(&cpu_sysctl_ctx, SYSCTL_CHILDREN(cpu_sysctl_tree),
> + OID_AUTO, "cppc_notify", CTLFLAG_RDTUN | CTLFLAG_MPSAFE,
> + &cppc_notify, 0, "Register for CPPC Notifications");
> +
This isn’t under an ifdef?
Jess
> /* Take over idling from cpu_idle_default(). */
> cpu_cx_lowest_lim = 0;
> CPU_FOREACH(i) {