^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * acpi_processor.c - ACPI processor enumeration support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2004 Dominik Brodowski <linux@brodo.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (C) 2004 Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Copyright (C) 2013, Intel Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Rafael J. Wysocki <rafael.j.wysocki@intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <acpi/processor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <asm/cpu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "internal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define _COMPONENT ACPI_PROCESSOR_COMPONENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) ACPI_MODULE_NAME("processor");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) DEFINE_PER_CPU(struct acpi_processor *, processors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) EXPORT_PER_CPU_SYMBOL(processors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /* --------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) Errata Handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) -------------------------------------------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct acpi_processor_errata errata __read_mostly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) EXPORT_SYMBOL_GPL(errata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) static int acpi_processor_errata_piix4(struct pci_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) u8 value1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) u8 value2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * Note that 'dev' references the PIIX4 ACPI Controller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) switch (dev->revision) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 A-step\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 B-step\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4E\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4M\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found unknown PIIX4\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) switch (dev->revision) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) case 0: /* PIIX4 A-step */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) case 1: /* PIIX4 B-step */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * See specification changes #13 ("Manual Throttle Duty Cycle")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * and #14 ("Enabling and Disabling Manual Throttle"), plus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * erratum #5 ("STPCLK# Deassertion Time") from the January
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) * 2002 PIIX4 specification update. Applies to only older
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) * PIIX4 models.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) errata.piix4.throttle = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) case 2: /* PIIX4E */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) case 3: /* PIIX4M */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) * See erratum #18 ("C3 Power State/BMIDE and Type-F DMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * Livelock") from the January 2002 PIIX4 specification update.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * Applies to all PIIX4 models.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * BM-IDE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * ------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * Find the PIIX4 IDE Controller and get the Bus Master IDE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * Status register address. We'll use this later to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) * each IDE controller's DMA status to make sure we catch all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * DMA activity.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) PCI_DEVICE_ID_INTEL_82371AB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) PCI_ANY_ID, PCI_ANY_ID, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) if (dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) errata.piix4.bmisx = pci_resource_start(dev, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) pci_dev_put(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) * Type-F DMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) * ----------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) * Find the PIIX4 ISA Controller and read the Motherboard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * DMA controller's status to see if Type-F (Fast) DMA mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) * is enabled (bit 7) on either channel. Note that we'll
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) * disable C3 support if this is enabled, as some legacy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * devices won't operate well if fast DMA is disabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) PCI_DEVICE_ID_INTEL_82371AB_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) PCI_ANY_ID, PCI_ANY_ID, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) if (dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) pci_read_config_byte(dev, 0x76, &value1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) pci_read_config_byte(dev, 0x77, &value2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) if ((value1 & 0x80) || (value2 & 0x80))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) errata.piix4.fdma = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) pci_dev_put(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) if (errata.piix4.bmisx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) ACPI_DEBUG_PRINT((ACPI_DB_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) "Bus master activity detection (BM-IDE) erratum enabled\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) if (errata.piix4.fdma)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) ACPI_DEBUG_PRINT((ACPI_DB_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) "Type-F DMA livelock erratum (C3 disabled)\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) static int acpi_processor_errata(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) int result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) struct pci_dev *dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) * PIIX4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) PCI_DEVICE_ID_INTEL_82371AB_3, PCI_ANY_ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) PCI_ANY_ID, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) if (dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) result = acpi_processor_errata_piix4(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) pci_dev_put(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /* --------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) Initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) -------------------------------------------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #ifdef CONFIG_ACPI_HOTPLUG_CPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) int __weak acpi_map_cpu(acpi_handle handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) phys_cpuid_t physid, u32 acpi_id, int *pcpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) int __weak acpi_unmap_cpu(int cpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) int __weak arch_register_cpu(int cpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) void __weak arch_unregister_cpu(int cpu) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) static int acpi_processor_hotadd_init(struct acpi_processor *pr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) unsigned long long sta;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) if (invalid_phys_cpuid(pr->phys_id))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) status = acpi_evaluate_integer(pr->handle, "_STA", NULL, &sta);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) if (ACPI_FAILURE(status) || !(sta & ACPI_STA_DEVICE_PRESENT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) cpu_maps_update_begin();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) cpu_hotplug_begin();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) ret = acpi_map_cpu(pr->handle, pr->phys_id, pr->acpi_id, &pr->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) ret = arch_register_cpu(pr->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) acpi_unmap_cpu(pr->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) * CPU got hot-added, but cpu_data is not initialized yet. Set a flag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) * to delay cpu_idle/throttling initialization and do it when the CPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) * gets online for the first time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) pr_info("CPU%d has been hot-added\n", pr->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) pr->flags.need_hotplug_init = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) cpu_hotplug_done();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) cpu_maps_update_done();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) static inline int acpi_processor_hotadd_init(struct acpi_processor *pr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) #endif /* CONFIG_ACPI_HOTPLUG_CPU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) static int acpi_processor_get_info(struct acpi_device *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) union acpi_object object = { 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) struct acpi_processor *pr = acpi_driver_data(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) int device_declaration = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) acpi_status status = AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) static int cpu0_initialized;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) unsigned long long value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) acpi_processor_errata();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) * Check to see if we have bus mastering arbitration control. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) * is required for proper C3 usage (to maintain cache coherency).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) if (acpi_gbl_FADT.pm2_control_block && acpi_gbl_FADT.pm2_control_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) pr->flags.bm_control = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) ACPI_DEBUG_PRINT((ACPI_DB_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) "Bus mastering arbitration control present\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) ACPI_DEBUG_PRINT((ACPI_DB_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) "No bus mastering arbitration control\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) if (!strcmp(acpi_device_hid(device), ACPI_PROCESSOR_OBJECT_HID)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /* Declared with "Processor" statement; match ProcessorID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) dev_err(&device->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) "Failed to evaluate processor object (0x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) pr->acpi_id = object.processor.proc_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) * Declared with "Device" statement; match _UID.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) NULL, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) dev_err(&device->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) "Failed to evaluate processor _UID (0x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) device_declaration = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) pr->acpi_id = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (acpi_duplicate_processor_id(pr->acpi_id)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) if (pr->acpi_id == 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) dev_info_once(&device->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) "Entry not well-defined, consider updating BIOS\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) dev_err(&device->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) "Failed to get unique processor _UID (0x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) pr->acpi_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) pr->phys_id = acpi_get_phys_id(pr->handle, device_declaration,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) pr->acpi_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) if (invalid_phys_cpuid(pr->phys_id))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) acpi_handle_debug(pr->handle, "failed to get CPU physical ID.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) pr->id = acpi_map_cpuid(pr->phys_id, pr->acpi_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) if (!cpu0_initialized && !acpi_has_cpu_in_madt()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) cpu0_initialized = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) * Handle UP system running SMP kernel, with no CPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) * entry in MADT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) if (invalid_logical_cpuid(pr->id) && (num_online_cpus() == 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) pr->id = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) * Extra Processor objects may be enumerated on MP systems with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) * less than the max # of CPUs. They should be ignored _iff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) * they are physically not present.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) * NOTE: Even if the processor has a cpuid, it may not be present
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) * because cpuid <-> apicid mapping is persistent now.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) if (invalid_logical_cpuid(pr->id) || !cpu_present(pr->id)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) int ret = acpi_processor_hotadd_init(pr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) * On some boxes several processors use the same processor bus id.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) * But they are located in different scope. For example:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) * \_SB.SCK0.CPU0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) * \_SB.SCK1.CPU0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) * Rename the processor device bus id. And the new bus id will be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) * generated as the following format:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) * CPU+CPU ID.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) sprintf(acpi_device_bid(device), "CPU%X", pr->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) pr->acpi_id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) if (!object.processor.pblk_address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No PBLK (NULL address)\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) else if (object.processor.pblk_length != 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) dev_err(&device->dev, "Invalid PBLK length [%d]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) object.processor.pblk_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) pr->throttling.address = object.processor.pblk_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) pr->throttling.duty_offset = acpi_gbl_FADT.duty_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) pr->throttling.duty_width = acpi_gbl_FADT.duty_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) pr->pblk = object.processor.pblk_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) * If ACPI describes a slot number for this CPU, we can use it to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) * ensure we get the right value in the "physical id" field
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) * of /proc/cpuinfo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) status = acpi_evaluate_integer(pr->handle, "_SUN", NULL, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) if (ACPI_SUCCESS(status))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) arch_fix_phys_package_id(pr->id, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) * Do not put anything in here which needs the core to be online.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) * For example MSR access or setting up things which check for cpuinfo_x86
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) * (cpu_data(cpu)) values, like CPU feature flags, family, model, etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) * Such things have to be put in and set up by the processor driver's .probe().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) static DEFINE_PER_CPU(void *, processor_device_array);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) static int acpi_processor_add(struct acpi_device *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) const struct acpi_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) struct acpi_processor *pr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) int result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) pr = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) if (!pr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) if (!zalloc_cpumask_var(&pr->throttling.shared_cpu_map, GFP_KERNEL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) result = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) goto err_free_pr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) pr->handle = device->handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) device->driver_data = pr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) result = acpi_processor_get_info(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) if (result) /* Processor is not physically present or unavailable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) BUG_ON(pr->id >= nr_cpu_ids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) * Buggy BIOS check.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) * ACPI id of processors can be reported wrongly by the BIOS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) * Don't trust it blindly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) if (per_cpu(processor_device_array, pr->id) != NULL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) per_cpu(processor_device_array, pr->id) != device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) dev_warn(&device->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) "BIOS reported wrong ACPI id %d for the processor\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) pr->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) /* Give up, but do not abort the namespace scan. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) * processor_device_array is not cleared on errors to allow buggy BIOS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) * checks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) per_cpu(processor_device_array, pr->id) = device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) per_cpu(processors, pr->id) = pr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) dev = get_cpu_device(pr->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) if (!dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) result = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) result = acpi_bind_one(dev, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) if (result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) pr->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) /* Trigger the processor driver's .probe() if present. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) if (device_attach(dev) >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) dev_err(dev, "Processor driver could not be attached\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) acpi_unbind_one(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) free_cpumask_var(pr->throttling.shared_cpu_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) device->driver_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) per_cpu(processors, pr->id) = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) err_free_pr:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) kfree(pr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) #ifdef CONFIG_ACPI_HOTPLUG_CPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) /* --------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) Removal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) -------------------------------------------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) static void acpi_processor_remove(struct acpi_device *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) struct acpi_processor *pr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) if (!device || !acpi_driver_data(device))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) pr = acpi_driver_data(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) if (pr->id >= nr_cpu_ids)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) * The only reason why we ever get here is CPU hot-removal. The CPU is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) * already offline and the ACPI device removal locking prevents it from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) * being put back online at this point.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) * Unbind the driver from the processor device and detach it from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) * ACPI companion object.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) device_release_driver(pr->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) acpi_unbind_one(pr->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) /* Clean up. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) per_cpu(processor_device_array, pr->id) = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) per_cpu(processors, pr->id) = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) cpu_maps_update_begin();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) cpu_hotplug_begin();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) /* Remove the CPU. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) arch_unregister_cpu(pr->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) acpi_unmap_cpu(pr->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) cpu_hotplug_done();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) cpu_maps_update_done();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) try_offline_node(cpu_to_node(pr->id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) free_cpumask_var(pr->throttling.shared_cpu_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) kfree(pr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) #endif /* CONFIG_ACPI_HOTPLUG_CPU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) #ifdef CONFIG_X86
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) static bool acpi_hwp_native_thermal_lvt_set;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) static acpi_status __init acpi_hwp_native_thermal_lvt_osc(acpi_handle handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) u32 lvl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) void *context,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) void **rv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) u8 sb_uuid_str[] = "4077A616-290C-47BE-9EBD-D87058713953";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) u32 capbuf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) struct acpi_osc_context osc_context = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) .uuid_str = sb_uuid_str,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) .rev = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) .cap.length = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) .cap.pointer = capbuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) if (acpi_hwp_native_thermal_lvt_set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) return AE_CTRL_TERMINATE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) capbuf[0] = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) capbuf[1] = 0x1000; /* set bit 12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) if (ACPI_SUCCESS(acpi_run_osc(handle, &osc_context))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) if (osc_context.ret.pointer && osc_context.ret.length > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) u32 *capbuf_ret = osc_context.ret.pointer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) if (capbuf_ret[1] & 0x1000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) acpi_handle_info(handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) "_OSC native thermal LVT Acked\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) acpi_hwp_native_thermal_lvt_set = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) kfree(osc_context.ret.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) return AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) void __init acpi_early_processor_osc(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) if (boot_cpu_has(X86_FEATURE_HWP)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) ACPI_UINT32_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) acpi_hwp_native_thermal_lvt_osc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) NULL, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) acpi_hwp_native_thermal_lvt_osc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) * The following ACPI IDs are known to be suitable for representing as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) * processor devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) static const struct acpi_device_id processor_device_ids[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) { ACPI_PROCESSOR_OBJECT_HID, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) { ACPI_PROCESSOR_DEVICE_HID, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) static struct acpi_scan_handler processor_handler = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) .ids = processor_device_ids,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) .attach = acpi_processor_add,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) #ifdef CONFIG_ACPI_HOTPLUG_CPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) .detach = acpi_processor_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) .hotplug = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) .enabled = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) static int acpi_processor_container_attach(struct acpi_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) const struct acpi_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) static const struct acpi_device_id processor_container_ids[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) { ACPI_PROCESSOR_CONTAINER_HID, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) static struct acpi_scan_handler processor_container_handler = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) .ids = processor_container_ids,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) .attach = acpi_processor_container_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) /* The number of the unique processor IDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) static int nr_unique_ids __initdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) /* The number of the duplicate processor IDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) static int nr_duplicate_ids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) /* Used to store the unique processor IDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) static int unique_processor_ids[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) [0 ... NR_CPUS - 1] = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) /* Used to store the duplicate processor IDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) static int duplicate_processor_ids[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) [0 ... NR_CPUS - 1] = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) static void __init processor_validated_ids_update(int proc_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) if (nr_unique_ids == NR_CPUS||nr_duplicate_ids == NR_CPUS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) * Firstly, compare the proc_id with duplicate IDs, if the proc_id is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) * already in the IDs, do nothing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) for (i = 0; i < nr_duplicate_ids; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) if (duplicate_processor_ids[i] == proc_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) * Secondly, compare the proc_id with unique IDs, if the proc_id is in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) * the IDs, put it in the duplicate IDs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) for (i = 0; i < nr_unique_ids; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) if (unique_processor_ids[i] == proc_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) duplicate_processor_ids[nr_duplicate_ids] = proc_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) nr_duplicate_ids++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) * Lastly, the proc_id is a unique ID, put it in the unique IDs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) unique_processor_ids[nr_unique_ids] = proc_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) nr_unique_ids++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) static acpi_status __init acpi_processor_ids_walk(acpi_handle handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) u32 lvl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) void *context,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) void **rv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) acpi_object_type acpi_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) unsigned long long uid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) union acpi_object object = { 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) status = acpi_get_type(handle, &acpi_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) if (ACPI_FAILURE(status))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) switch (acpi_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) case ACPI_TYPE_PROCESSOR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) status = acpi_evaluate_object(handle, NULL, NULL, &buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) if (ACPI_FAILURE(status))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) uid = object.processor.proc_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) case ACPI_TYPE_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) status = acpi_evaluate_integer(handle, "_UID", NULL, &uid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) if (ACPI_FAILURE(status))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) processor_validated_ids_update(uid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) return AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) /* Exit on error, but don't abort the namespace walk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) acpi_handle_info(handle, "Invalid processor object\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) return AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) static void __init acpi_processor_check_duplicates(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) /* check the correctness for all processors in ACPI namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) ACPI_UINT32_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) acpi_processor_ids_walk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) NULL, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID, acpi_processor_ids_walk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) bool acpi_duplicate_processor_id(int proc_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) * compare the proc_id with duplicate IDs, if the proc_id is already
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) * in the duplicate IDs, return true, otherwise, return false.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) for (i = 0; i < nr_duplicate_ids; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) if (duplicate_processor_ids[i] == proc_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) void __init acpi_processor_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) acpi_processor_check_duplicates();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) acpi_scan_add_handler_with_hotplug(&processor_handler, "processor");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) acpi_scan_add_handler(&processor_container_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) #ifdef CONFIG_ACPI_PROCESSOR_CSTATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) * acpi_processor_claim_cst_control - Request _CST control from the platform.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) bool acpi_processor_claim_cst_control(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) static bool cst_control_claimed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) if (!acpi_gbl_FADT.cst_control || cst_control_claimed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) status = acpi_os_write_port(acpi_gbl_FADT.smi_command,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) acpi_gbl_FADT.cst_control, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) pr_warn("ACPI: Failed to claim processor _CST control\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) cst_control_claimed = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) EXPORT_SYMBOL_GPL(acpi_processor_claim_cst_control);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) * acpi_processor_evaluate_cst - Evaluate the processor _CST control method.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) * @handle: ACPI handle of the processor object containing the _CST.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) * @cpu: The numeric ID of the target CPU.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) * @info: Object write the C-states information into.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) * Extract the C-state information for the given CPU from the output of the _CST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) * control method under the corresponding ACPI processor object (or processor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) * device object) and populate @info with it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) * If any ACPI_ADR_SPACE_FIXED_HARDWARE C-states are found, invoke
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) * acpi_processor_ffh_cstate_probe() to verify them and update the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) * cpu_cstate_entry data for @cpu.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) int acpi_processor_evaluate_cst(acpi_handle handle, u32 cpu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) struct acpi_processor_power *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) union acpi_object *cst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) u64 count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) int last_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) int i, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) status = acpi_evaluate_object(handle, "_CST", NULL, &buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) acpi_handle_debug(handle, "No _CST\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) cst = buffer.pointer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) /* There must be at least 2 elements. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) if (!cst || cst->type != ACPI_TYPE_PACKAGE || cst->package.count < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) acpi_handle_warn(handle, "Invalid _CST output\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) ret = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) goto end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) count = cst->package.elements[0].integer.value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) /* Validate the number of C-states. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) if (count < 1 || count != cst->package.count - 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) acpi_handle_warn(handle, "Inconsistent _CST data\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) ret = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) goto end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) for (i = 1; i <= count; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) union acpi_object *element;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) union acpi_object *obj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) struct acpi_power_register *reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) struct acpi_processor_cx cx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) * If there is not enough space for all C-states, skip the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) * excess ones and log a warning.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) if (last_index >= ACPI_PROCESSOR_MAX_POWER - 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) acpi_handle_warn(handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) "No room for more idle states (limit: %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) ACPI_PROCESSOR_MAX_POWER - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) memset(&cx, 0, sizeof(cx));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) element = &cst->package.elements[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) if (element->type != ACPI_TYPE_PACKAGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) acpi_handle_info(handle, "_CST C%d type(%x) is not package, skip...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) i, element->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) if (element->package.count != 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) acpi_handle_info(handle, "_CST C%d package count(%d) is not 4, skip...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) i, element->package.count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) obj = &element->package.elements[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) if (obj->type != ACPI_TYPE_BUFFER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) acpi_handle_info(handle, "_CST C%d package element[0] type(%x) is not buffer, skip...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) i, obj->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) reg = (struct acpi_power_register *)obj->buffer.pointer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) obj = &element->package.elements[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) if (obj->type != ACPI_TYPE_INTEGER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) acpi_handle_info(handle, "_CST C[%d] package element[1] type(%x) is not integer, skip...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) i, obj->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) cx.type = obj->integer.value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) * There are known cases in which the _CST output does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) * contain C1, so if the type of the first state found is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) * C1, leave an empty slot for C1 to be filled in later.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) if (i == 1 && cx.type != ACPI_STATE_C1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) last_index = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) cx.address = reg->address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) cx.index = last_index + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) if (reg->space_id == ACPI_ADR_SPACE_FIXED_HARDWARE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) if (!acpi_processor_ffh_cstate_probe(cpu, &cx, reg)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) * In the majority of cases _CST describes C1 as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) * a FIXED_HARDWARE C-state, but if the command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) * line forbids using MWAIT, use CSTATE_HALT for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) * C1 regardless.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (cx.type == ACPI_STATE_C1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) boot_option_idle_override == IDLE_NOMWAIT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) cx.entry_method = ACPI_CSTATE_HALT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) snprintf(cx.desc, ACPI_CX_DESC_LEN, "ACPI HLT");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) cx.entry_method = ACPI_CSTATE_FFH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) } else if (cx.type == ACPI_STATE_C1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) * In the special case of C1, FIXED_HARDWARE can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) * be handled by executing the HLT instruction.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) cx.entry_method = ACPI_CSTATE_HALT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) snprintf(cx.desc, ACPI_CX_DESC_LEN, "ACPI HLT");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) acpi_handle_info(handle, "_CST C%d declares FIXED_HARDWARE C-state but not supported in hardware, skip...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) } else if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) cx.entry_method = ACPI_CSTATE_SYSTEMIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) snprintf(cx.desc, ACPI_CX_DESC_LEN, "ACPI IOPORT 0x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) cx.address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) acpi_handle_info(handle, "_CST C%d space_id(%x) neither FIXED_HARDWARE nor SYSTEM_IO, skip...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) i, reg->space_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) if (cx.type == ACPI_STATE_C1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) cx.valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) obj = &element->package.elements[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) if (obj->type != ACPI_TYPE_INTEGER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) acpi_handle_info(handle, "_CST C%d package element[2] type(%x) not integer, skip...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) i, obj->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) cx.latency = obj->integer.value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) obj = &element->package.elements[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) if (obj->type != ACPI_TYPE_INTEGER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) acpi_handle_info(handle, "_CST C%d package element[3] type(%x) not integer, skip...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) i, obj->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) memcpy(&info->states[++last_index], &cx, sizeof(cx));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) acpi_handle_info(handle, "Found %d idle states\n", last_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) info->count = last_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) kfree(buffer.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) EXPORT_SYMBOL_GPL(acpi_processor_evaluate_cst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) #endif /* CONFIG_ACPI_PROCESSOR_CSTATE */