From patchwork Fri Feb 3 13:50:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Morse X-Patchwork-Id: 52518 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp856222wrn; Fri, 3 Feb 2023 06:05:56 -0800 (PST) X-Google-Smtp-Source: AK7set/paIHtfZNzzq+TkvQe4CJsQOekS9JUKFHyTWh+M78Anp6UMDBulSg08BxB262YmFTZUkc3 X-Received: by 2002:aa7:971b:0:b0:594:1f1c:3d35 with SMTP id a27-20020aa7971b000000b005941f1c3d35mr4438536pfg.10.1675433156161; Fri, 03 Feb 2023 06:05:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675433156; cv=none; d=google.com; s=arc-20160816; b=r7wRix+KU5oFbrKRdAkYhvSU1KfW+V3gQBFBxIwRGrbJvvDxhqlVzg2fRE+hUEYc1X H4FU7k9ZWbSRM8dZGA5brqbocpnEWkPVpsK7i3KHmCLMDllqAEHtCZzytFOrNw8+y6Ku E4PCOIjz05za8F3WkEC3l0I5Ybpbd3cGBtKiqtwgsvq/ahKZraDgE7fhGdLpIZu8fpUj bIGuk6kmnt1TNQNKcaoeA4Y1oDoIP2YggzVaC3j+bpnco3jT8g4O/dXMCqL6Jd42BIMT gdYcnLO2XWzF0yugkL1sewVzxltS7A3ruq9m09MB+xh+Vs8c6uJsVPPEOsK2Py/Vo2ie BUKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=cEpk8OB7tTgIs3Za9e7KQ6CtkXPMFFZrjuQxJyh6ItA=; b=gpKKIbrTWooSaynqipcxgd7fD5I7AEir01pdIuk4KTdq4eUdDniy30GpUtLanPXi8z 4oAAVjMO0z9d+1jAPv2WUi81SFFdF9wjDCJcCzSw3UuEt/yT2xYNMh5PIkRMAsDY+oWq /1jbKLRd+ZatYLVUpaGZusQcAJAIOhdpWIPYZ5g0OkqnhqrpSYVgQA1/+c/jyz31kZEY XPLoCRMXh8dpEYwfqIkpqKsQdzGhNL6FLTFwVKlgHcPvk1EnSzaBwh5aTxLP2TPD2qsi aw8Qj3Jozd8CPdhaBh1vHYEb2jcOSEBjDB8E3wPPpoGCg/08lpMQc3RWhQE3zfcAI/j+ bfwQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id c188-20020a621cc5000000b005925031cd77si2650095pfc.158.2023.02.03.06.05.42; Fri, 03 Feb 2023 06:05:56 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233754AbjBCOEj (ORCPT + 99 others); Fri, 3 Feb 2023 09:04:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48166 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233327AbjBCOEJ (ORCPT ); Fri, 3 Feb 2023 09:04:09 -0500 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 1A733A58C2; Fri, 3 Feb 2023 06:01:58 -0800 (PST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A7B731763; Fri, 3 Feb 2023 05:54:37 -0800 (PST) Received: from eglon.cambridge.arm.com (eglon.cambridge.arm.com [10.1.196.177]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DA7AA3F71E; Fri, 3 Feb 2023 05:53:51 -0800 (PST) From: James Morse To: linux-pm@vger.kernel.org, loongarch@lists.linux.dev, kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arch@vger.kernel.org, linux-ia64@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, x86@kernel.org Cc: Marc Zyngier , Thomas Gleixner , Lorenzo Pieralisi , Mark Rutland , Sudeep Holla , Borislav Petkov , H Peter Anvin , Dave Hansen , Ingo Molnar , Will Deacon , Catalin Marinas , Huacai Chen , James Morse , Suzuki K Poulose , Oliver Upton , Len Brown , Rafael Wysocki , WANG Xuerui , Salil Mehta , Russell King , Jean-Philippe Brucker Subject: [RFC PATCH 28/32] ACPI: add support to register CPUs based on the _STA enabled bit Date: Fri, 3 Feb 2023 13:50:39 +0000 Message-Id: <20230203135043.409192-29-james.morse@arm.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230203135043.409192-1-james.morse@arm.com> References: <20230203135043.409192-1-james.morse@arm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1756818997285650537?= X-GMAIL-MSGID: =?utf-8?q?1756818997285650537?= acpi_processor_get_info() registers all present CPUs. Registering a CPU is what creates the sysfs entries and triggers the udev notifications. arm64 virtual machines that support 'virtual cpu hotplug' use the enabled bit to indicate whether the CPU can be brought online, as the existing ACPI tables require all hardware to be described and present. If firmware describes a CPU as present, but disabled, skip the registration. Such CPUs are present, but can't be brought online for whatever reason. (e.g. firmware/hypervisor policy). Once firmware sets the enabled bit, the CPU can be registered and brought online by user-space. Online CPUs, or CPUs that are missing an _STA method must always be registered. Signed-off-by: James Morse --- drivers/acpi/acpi_processor.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c index 572a12672c0e..20e810a066da 100644 --- a/drivers/acpi/acpi_processor.c +++ b/drivers/acpi/acpi_processor.c @@ -194,6 +194,35 @@ static int acpi_processor_make_present(struct acpi_processor *pr) return ret; } +static int acpi_processor_make_enabled(struct acpi_processor *pr) +{ + unsigned long long sta; + acpi_status status; + bool present, enabled; + + if (!acpi_has_method(pr->handle, "_STA")) + return arch_register_cpu(pr->id); + + status = acpi_evaluate_integer(pr->handle, "_STA", NULL, &sta); + if (ACPI_FAILURE(status)) + return -ENODEV; + + present = sta & ACPI_STA_DEVICE_PRESENT; + enabled = sta & ACPI_STA_DEVICE_ENABLED; + + if (cpu_online(pr->id) && (!present || !enabled)) { + pr_err_once(FW_BUG "CPU %u is online, but described as not present or disabled!\n", pr->id); + add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); + } else if (!present || !enabled) { + return -ENODEV; + } + + if (get_cpu_device(pr->id)) + return -EEXIST; + + return arch_register_cpu(pr->id); +} + static int acpi_processor_get_info(struct acpi_device *device) { union acpi_object object = { 0 }; @@ -271,7 +300,7 @@ static int acpi_processor_get_info(struct acpi_device *device) } if (!invalid_logical_cpuid(pr->id) && cpu_present(pr->id)) { - int ret = arch_register_cpu(pr->id); + int ret = acpi_processor_make_enabled(pr); if (ret) return ret; } @@ -478,6 +507,9 @@ static void acpi_processor_post_eject(struct acpi_device *device) acpi_processor_make_not_present(device); return; } + + if (cpu_present(pr->id) && !(sta & ACPI_STA_DEVICE_ENABLED)) + arch_unregister_cpu(pr->id); } #ifdef CONFIG_X86