Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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 */