Lines Matching +full:device +full:- +full:handle

1 // SPDX-License-Identifier: GPL-2.0-only
3 * acpi_processor.c - ACPI processor enumeration support
14 #include <linux/device.h>
39 return -EINVAL; in acpi_processor_errata_piix4()
45 switch (dev->revision) { in acpi_processor_errata_piix4()
47 dev_dbg(&dev->dev, "Found PIIX4 A-step\n"); in acpi_processor_errata_piix4()
50 dev_dbg(&dev->dev, "Found PIIX4 B-step\n"); in acpi_processor_errata_piix4()
53 dev_dbg(&dev->dev, "Found PIIX4E\n"); in acpi_processor_errata_piix4()
56 dev_dbg(&dev->dev, "Found PIIX4M\n"); in acpi_processor_errata_piix4()
59 dev_dbg(&dev->dev, "Found unknown PIIX4\n"); in acpi_processor_errata_piix4()
63 switch (dev->revision) { in acpi_processor_errata_piix4()
65 case 0: /* PIIX4 A-step */ in acpi_processor_errata_piix4()
66 case 1: /* PIIX4 B-step */ in acpi_processor_errata_piix4()
80 * See erratum #18 ("C3 Power State/BMIDE and Type-F DMA in acpi_processor_errata_piix4()
86 * BM-IDE in acpi_processor_errata_piix4()
87 * ------ in acpi_processor_errata_piix4()
102 * Type-F DMA in acpi_processor_errata_piix4()
103 * ---------- in acpi_processor_errata_piix4()
105 * DMA controller's status to see if Type-F (Fast) DMA mode in acpi_processor_errata_piix4()
125 dev_dbg(&dev->dev, "Bus master activity detection (BM-IDE) erratum enabled\n"); in acpi_processor_errata_piix4()
127 dev_dbg(&dev->dev, "Type-F DMA livelock erratum (C3 disabled)\n"); in acpi_processor_errata_piix4()
153 int __weak acpi_map_cpu(acpi_handle handle, in acpi_map_cpu() argument
156 return -ENODEV; in acpi_map_cpu()
161 return -ENODEV; in acpi_unmap_cpu()
166 return -ENODEV; in arch_register_cpu()
177 if (invalid_phys_cpuid(pr->phys_id)) in acpi_processor_hotadd_init()
178 return -ENODEV; in acpi_processor_hotadd_init()
180 status = acpi_evaluate_integer(pr->handle, "_STA", NULL, &sta); in acpi_processor_hotadd_init()
182 return -ENODEV; in acpi_processor_hotadd_init()
187 ret = acpi_map_cpu(pr->handle, pr->phys_id, pr->acpi_id, &pr->id); in acpi_processor_hotadd_init()
191 ret = arch_register_cpu(pr->id); in acpi_processor_hotadd_init()
193 acpi_unmap_cpu(pr->id); in acpi_processor_hotadd_init()
198 * CPU got hot-added, but cpu_data is not initialized yet. Set a flag in acpi_processor_hotadd_init()
202 pr_info("CPU%d has been hot-added\n", pr->id); in acpi_processor_hotadd_init()
203 pr->flags.need_hotplug_init = 1; in acpi_processor_hotadd_init()
213 return -ENODEV; in acpi_processor_hotadd_init()
217 static int acpi_processor_get_info(struct acpi_device *device) in acpi_processor_get_info() argument
221 struct acpi_processor *pr = acpi_driver_data(device); in acpi_processor_get_info()
234 pr->flags.bm_control = 1; in acpi_processor_get_info()
235 dev_dbg(&device->dev, "Bus mastering arbitration control present\n"); in acpi_processor_get_info()
237 dev_dbg(&device->dev, "No bus mastering arbitration control\n"); in acpi_processor_get_info()
239 if (!strcmp(acpi_device_hid(device), ACPI_PROCESSOR_OBJECT_HID)) { in acpi_processor_get_info()
241 status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer); in acpi_processor_get_info()
243 dev_err(&device->dev, in acpi_processor_get_info()
246 return -ENODEV; in acpi_processor_get_info()
249 pr->acpi_id = object.processor.proc_id; in acpi_processor_get_info()
252 * Declared with "Device" statement; match _UID. in acpi_processor_get_info()
254 status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID, in acpi_processor_get_info()
257 dev_err(&device->dev, in acpi_processor_get_info()
260 return -ENODEV; in acpi_processor_get_info()
263 pr->acpi_id = value; in acpi_processor_get_info()
266 if (acpi_duplicate_processor_id(pr->acpi_id)) { in acpi_processor_get_info()
267 if (pr->acpi_id == 0xff) in acpi_processor_get_info()
268 dev_info_once(&device->dev, in acpi_processor_get_info()
269 "Entry not well-defined, consider updating BIOS\n"); in acpi_processor_get_info()
271 dev_err(&device->dev, in acpi_processor_get_info()
273 pr->acpi_id); in acpi_processor_get_info()
274 return -ENODEV; in acpi_processor_get_info()
277 pr->phys_id = acpi_get_phys_id(pr->handle, device_declaration, in acpi_processor_get_info()
278 pr->acpi_id); in acpi_processor_get_info()
279 if (invalid_phys_cpuid(pr->phys_id)) in acpi_processor_get_info()
280 dev_dbg(&device->dev, "Failed to get CPU physical ID.\n"); in acpi_processor_get_info()
282 pr->id = acpi_map_cpuid(pr->phys_id, pr->acpi_id); in acpi_processor_get_info()
286 * Handle UP system running SMP kernel, with no CPU in acpi_processor_get_info()
289 if (invalid_logical_cpuid(pr->id) && (num_online_cpus() == 1)) in acpi_processor_get_info()
290 pr->id = 0; in acpi_processor_get_info()
299 * because cpuid <-> apicid mapping is persistent now. in acpi_processor_get_info()
301 if (invalid_logical_cpuid(pr->id) || !cpu_present(pr->id)) { in acpi_processor_get_info()
313 * Rename the processor device bus id. And the new bus id will be in acpi_processor_get_info()
317 sprintf(acpi_device_bid(device), "CPU%X", pr->id); in acpi_processor_get_info()
318 dev_dbg(&device->dev, "Processor [%d:%d]\n", pr->id, pr->acpi_id); in acpi_processor_get_info()
321 dev_dbg(&device->dev, "No PBLK (NULL address)\n"); in acpi_processor_get_info()
323 dev_err(&device->dev, "Invalid PBLK length [%d]\n", in acpi_processor_get_info()
326 pr->throttling.address = object.processor.pblk_address; in acpi_processor_get_info()
327 pr->throttling.duty_offset = acpi_gbl_FADT.duty_offset; in acpi_processor_get_info()
328 pr->throttling.duty_width = acpi_gbl_FADT.duty_width; in acpi_processor_get_info()
330 pr->pblk = object.processor.pblk_address; in acpi_processor_get_info()
338 status = acpi_evaluate_integer(pr->handle, "_SUN", NULL, &value); in acpi_processor_get_info()
340 arch_fix_phys_package_id(pr->id, value); in acpi_processor_get_info()
353 static int acpi_processor_add(struct acpi_device *device, in acpi_processor_add() argument
357 struct device *dev; in acpi_processor_add()
362 return -ENOMEM; in acpi_processor_add()
364 if (!zalloc_cpumask_var(&pr->throttling.shared_cpu_map, GFP_KERNEL)) { in acpi_processor_add()
365 result = -ENOMEM; in acpi_processor_add()
369 pr->handle = device->handle; in acpi_processor_add()
370 strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME); in acpi_processor_add()
371 strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS); in acpi_processor_add()
372 device->driver_data = pr; in acpi_processor_add()
374 result = acpi_processor_get_info(device); in acpi_processor_add()
378 BUG_ON(pr->id >= nr_cpu_ids); in acpi_processor_add()
385 if (per_cpu(processor_device_array, pr->id) != NULL && in acpi_processor_add()
386 per_cpu(processor_device_array, pr->id) != device) { in acpi_processor_add()
387 dev_warn(&device->dev, in acpi_processor_add()
389 pr->id); in acpi_processor_add()
397 per_cpu(processor_device_array, pr->id) = device; in acpi_processor_add()
398 per_cpu(processors, pr->id) = pr; in acpi_processor_add()
400 dev = get_cpu_device(pr->id); in acpi_processor_add()
402 result = -ENODEV; in acpi_processor_add()
406 result = acpi_bind_one(dev, device); in acpi_processor_add()
410 pr->dev = dev; in acpi_processor_add()
420 free_cpumask_var(pr->throttling.shared_cpu_map); in acpi_processor_add()
421 device->driver_data = NULL; in acpi_processor_add()
422 per_cpu(processors, pr->id) = NULL; in acpi_processor_add()
430 static void acpi_processor_remove(struct acpi_device *device) in acpi_processor_remove() argument
434 if (!device || !acpi_driver_data(device)) in acpi_processor_remove()
437 pr = acpi_driver_data(device); in acpi_processor_remove()
438 if (pr->id >= nr_cpu_ids) in acpi_processor_remove()
442 * The only reason why we ever get here is CPU hot-removal. The CPU is in acpi_processor_remove()
443 * already offline and the ACPI device removal locking prevents it from in acpi_processor_remove()
446 * Unbind the driver from the processor device and detach it from the in acpi_processor_remove()
449 device_release_driver(pr->dev); in acpi_processor_remove()
450 acpi_unbind_one(pr->dev); in acpi_processor_remove()
453 per_cpu(processor_device_array, pr->id) = NULL; in acpi_processor_remove()
454 per_cpu(processors, pr->id) = NULL; in acpi_processor_remove()
460 arch_unregister_cpu(pr->id); in acpi_processor_remove()
461 acpi_unmap_cpu(pr->id); in acpi_processor_remove()
466 try_offline_node(cpu_to_node(pr->id)); in acpi_processor_remove()
469 free_cpumask_var(pr->throttling.shared_cpu_map); in acpi_processor_remove()
476 static acpi_status __init acpi_hwp_native_thermal_lvt_osc(acpi_handle handle, in acpi_hwp_native_thermal_lvt_osc() argument
481 u8 sb_uuid_str[] = "4077A616-290C-47BE-9EBD-D87058713953"; in acpi_hwp_native_thermal_lvt_osc()
496 if (ACPI_SUCCESS(acpi_run_osc(handle, &osc_context))) { in acpi_hwp_native_thermal_lvt_osc()
501 acpi_handle_info(handle, in acpi_hwp_native_thermal_lvt_osc()
573 [0 ... NR_CPUS - 1] = -1,
578 [0 ... NR_CPUS - 1] = -1,
616 static acpi_status __init acpi_processor_ids_walk(acpi_handle handle, in acpi_processor_ids_walk() argument
627 status = acpi_get_type(handle, &acpi_type); in acpi_processor_ids_walk()
633 status = acpi_evaluate_object(handle, NULL, NULL, &buffer); in acpi_processor_ids_walk()
640 status = acpi_evaluate_integer(handle, "_UID", NULL, &uid); in acpi_processor_ids_walk()
653 acpi_handle_info(handle, "Invalid processor object\n"); in acpi_processor_ids_walk()
693 * acpi_processor_claim_cst_control - Request _CST control from the platform.
716 * acpi_processor_evaluate_cst - Evaluate the processor _CST control method.
717 * @handle: ACPI handle of the processor object containing the _CST.
719 * @info: Object write the C-states information into.
721 * Extract the C-state information for the given CPU from the output of the _CST
723 * device object) and populate @info with it.
725 * If any ACPI_ADR_SPACE_FIXED_HARDWARE C-states are found, invoke
729 int acpi_processor_evaluate_cst(acpi_handle handle, u32 cpu, in acpi_processor_evaluate_cst() argument
739 status = acpi_evaluate_object(handle, "_CST", NULL, &buffer); in acpi_processor_evaluate_cst()
741 acpi_handle_debug(handle, "No _CST\n"); in acpi_processor_evaluate_cst()
742 return -ENODEV; in acpi_processor_evaluate_cst()
748 if (!cst || cst->type != ACPI_TYPE_PACKAGE || cst->package.count < 2) { in acpi_processor_evaluate_cst()
749 acpi_handle_warn(handle, "Invalid _CST output\n"); in acpi_processor_evaluate_cst()
750 ret = -EFAULT; in acpi_processor_evaluate_cst()
754 count = cst->package.elements[0].integer.value; in acpi_processor_evaluate_cst()
756 /* Validate the number of C-states. */ in acpi_processor_evaluate_cst()
757 if (count < 1 || count != cst->package.count - 1) { in acpi_processor_evaluate_cst()
758 acpi_handle_warn(handle, "Inconsistent _CST data\n"); in acpi_processor_evaluate_cst()
759 ret = -EFAULT; in acpi_processor_evaluate_cst()
770 * If there is not enough space for all C-states, skip the in acpi_processor_evaluate_cst()
773 if (last_index >= ACPI_PROCESSOR_MAX_POWER - 1) { in acpi_processor_evaluate_cst()
774 acpi_handle_warn(handle, in acpi_processor_evaluate_cst()
776 ACPI_PROCESSOR_MAX_POWER - 1); in acpi_processor_evaluate_cst()
782 element = &cst->package.elements[i]; in acpi_processor_evaluate_cst()
783 if (element->type != ACPI_TYPE_PACKAGE) { in acpi_processor_evaluate_cst()
784 acpi_handle_info(handle, "_CST C%d type(%x) is not package, skip...\n", in acpi_processor_evaluate_cst()
785 i, element->type); in acpi_processor_evaluate_cst()
789 if (element->package.count != 4) { in acpi_processor_evaluate_cst()
790 acpi_handle_info(handle, "_CST C%d package count(%d) is not 4, skip...\n", in acpi_processor_evaluate_cst()
791 i, element->package.count); in acpi_processor_evaluate_cst()
795 obj = &element->package.elements[0]; in acpi_processor_evaluate_cst()
797 if (obj->type != ACPI_TYPE_BUFFER) { in acpi_processor_evaluate_cst()
798 acpi_handle_info(handle, "_CST C%d package element[0] type(%x) is not buffer, skip...\n", in acpi_processor_evaluate_cst()
799 i, obj->type); in acpi_processor_evaluate_cst()
803 reg = (struct acpi_power_register *)obj->buffer.pointer; in acpi_processor_evaluate_cst()
805 obj = &element->package.elements[1]; in acpi_processor_evaluate_cst()
806 if (obj->type != ACPI_TYPE_INTEGER) { in acpi_processor_evaluate_cst()
807 acpi_handle_info(handle, "_CST C[%d] package element[1] type(%x) is not integer, skip...\n", in acpi_processor_evaluate_cst()
808 i, obj->type); in acpi_processor_evaluate_cst()
812 cx.type = obj->integer.value; in acpi_processor_evaluate_cst()
821 cx.address = reg->address; in acpi_processor_evaluate_cst()
824 if (reg->space_id == ACPI_ADR_SPACE_FIXED_HARDWARE) { in acpi_processor_evaluate_cst()
828 * a FIXED_HARDWARE C-state, but if the command in acpi_processor_evaluate_cst()
847 …acpi_handle_info(handle, "_CST C%d declares FIXED_HARDWARE C-state but not supported in hardware, … in acpi_processor_evaluate_cst()
851 } else if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { in acpi_processor_evaluate_cst()
856 acpi_handle_info(handle, "_CST C%d space_id(%x) neither FIXED_HARDWARE nor SYSTEM_IO, skip...\n", in acpi_processor_evaluate_cst()
857 i, reg->space_id); in acpi_processor_evaluate_cst()
864 obj = &element->package.elements[2]; in acpi_processor_evaluate_cst()
865 if (obj->type != ACPI_TYPE_INTEGER) { in acpi_processor_evaluate_cst()
866 acpi_handle_info(handle, "_CST C%d package element[2] type(%x) not integer, skip...\n", in acpi_processor_evaluate_cst()
867 i, obj->type); in acpi_processor_evaluate_cst()
871 cx.latency = obj->integer.value; in acpi_processor_evaluate_cst()
873 obj = &element->package.elements[3]; in acpi_processor_evaluate_cst()
874 if (obj->type != ACPI_TYPE_INTEGER) { in acpi_processor_evaluate_cst()
875 acpi_handle_info(handle, "_CST C%d package element[3] type(%x) not integer, skip...\n", in acpi_processor_evaluate_cst()
876 i, obj->type); in acpi_processor_evaluate_cst()
880 memcpy(&info->states[++last_index], &cx, sizeof(cx)); in acpi_processor_evaluate_cst()
883 acpi_handle_info(handle, "Found %d idle states\n", last_index); in acpi_processor_evaluate_cst()
885 info->count = last_index; in acpi_processor_evaluate_cst()