Lines Matching +full:device +full:- +full:handle
1 // SPDX-License-Identifier: GPL-2.0-or-later
29 /* --------------------------------------------------------------------------
31 -------------------------------------------------------------------------- */
33 static int xen_acpi_processor_enable(struct acpi_device *device) in xen_acpi_processor_enable() argument
39 struct acpi_processor *pr = acpi_driver_data(device); in xen_acpi_processor_enable()
41 if (!strcmp(acpi_device_hid(device), ACPI_PROCESSOR_OBJECT_HID)) { in xen_acpi_processor_enable()
43 status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer); in xen_acpi_processor_enable()
46 return -ENODEV; in xen_acpi_processor_enable()
49 pr->acpi_id = object.processor.proc_id; in xen_acpi_processor_enable()
51 /* Declared with "Device" statement; match _UID */ in xen_acpi_processor_enable()
52 status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID, in xen_acpi_processor_enable()
56 return -ENODEV; in xen_acpi_processor_enable()
59 pr->acpi_id = value; in xen_acpi_processor_enable()
62 pr->id = xen_pcpu_id(pr->acpi_id); in xen_acpi_processor_enable()
64 if (invalid_logical_cpuid(pr->id)) in xen_acpi_processor_enable()
68 pr->acpi_id); in xen_acpi_processor_enable()
69 return -ENODEV; in xen_acpi_processor_enable()
75 static int xen_acpi_processor_add(struct acpi_device *device) in xen_acpi_processor_add() argument
80 if (!device) in xen_acpi_processor_add()
81 return -EINVAL; in xen_acpi_processor_add()
85 return -ENOMEM; in xen_acpi_processor_add()
87 pr->handle = device->handle; in xen_acpi_processor_add()
88 strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME); in xen_acpi_processor_add()
89 strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS); in xen_acpi_processor_add()
90 device->driver_data = pr; in xen_acpi_processor_add()
92 ret = xen_acpi_processor_enable(device); in xen_acpi_processor_add()
99 static int xen_acpi_processor_remove(struct acpi_device *device) in xen_acpi_processor_remove() argument
103 if (!device) in xen_acpi_processor_remove()
104 return -EINVAL; in xen_acpi_processor_remove()
106 pr = acpi_driver_data(device); in xen_acpi_processor_remove()
108 return -EINVAL; in xen_acpi_processor_remove()
114 /*--------------------------------------------------------------
116 --------------------------------------------------------------*/
118 static int is_processor_present(acpi_handle handle) in is_processor_present() argument
124 status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); in is_processor_present()
135 pr_info(PREFIX "Processor Device is not present"); in is_processor_present()
139 static int xen_apic_id(acpi_handle handle) in xen_apic_id() argument
146 if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer))) in xen_apic_id()
147 return -EINVAL; in xen_apic_id()
150 return -EINVAL; in xen_apic_id()
153 if (obj->type != ACPI_TYPE_BUFFER || in xen_apic_id()
154 obj->buffer.length < sizeof(*lapic)) { in xen_apic_id()
156 return -EINVAL; in xen_apic_id()
159 lapic = (struct acpi_madt_local_apic *)obj->buffer.pointer; in xen_apic_id()
161 if (lapic->header.type != ACPI_MADT_TYPE_LOCAL_APIC || in xen_apic_id()
162 !(lapic->lapic_flags & ACPI_MADT_ENABLED)) { in xen_apic_id()
164 return -EINVAL; in xen_apic_id()
167 apic_id = (uint32_t)lapic->id; in xen_apic_id()
180 apic_id = xen_apic_id(pr->handle); in xen_hotadd_cpu()
183 pr->acpi_id); in xen_hotadd_cpu()
184 return -ENODEV; in xen_hotadd_cpu()
187 pxm = xen_acpi_get_pxm(pr->handle); in xen_hotadd_cpu()
190 pr->acpi_id); in xen_hotadd_cpu()
196 op.u.cpu_add.acpi_id = pr->acpi_id; in xen_hotadd_cpu()
202 pr->acpi_id); in xen_hotadd_cpu()
209 if (!is_processor_present(pr->handle)) in xen_acpi_cpu_hotadd()
212 pr->id = xen_hotadd_cpu(pr); in xen_acpi_cpu_hotadd()
213 if (invalid_logical_cpuid(pr->id)) in xen_acpi_cpu_hotadd()
225 static int acpi_processor_device_remove(struct acpi_device *device) in acpi_processor_device_remove() argument
229 return -ENOSYS; in acpi_processor_device_remove()
232 static void acpi_processor_hotplug_notify(acpi_handle handle, in acpi_processor_hotplug_notify() argument
236 struct acpi_device *device = NULL; in acpi_processor_hotplug_notify() local
250 if (!is_processor_present(handle)) in acpi_processor_hotplug_notify()
253 acpi_bus_get_device(handle, &device); in acpi_processor_hotplug_notify()
254 if (acpi_device_enumerated(device)) in acpi_processor_hotplug_notify()
257 result = acpi_bus_scan(handle); in acpi_processor_hotplug_notify()
259 pr_err(PREFIX "Unable to add the device\n"); in acpi_processor_hotplug_notify()
262 device = NULL; in acpi_processor_hotplug_notify()
263 acpi_bus_get_device(handle, &device); in acpi_processor_hotplug_notify()
264 if (!acpi_device_enumerated(device)) { in acpi_processor_hotplug_notify()
265 pr_err(PREFIX "Missing device object\n"); in acpi_processor_hotplug_notify()
275 if (acpi_bus_get_device(handle, &device)) { in acpi_processor_hotplug_notify()
276 pr_err(PREFIX "Device don't exist, dropping EJECT\n"); in acpi_processor_hotplug_notify()
279 pr = acpi_driver_data(device); in acpi_processor_hotplug_notify()
289 acpi_processor_device_remove(device); in acpi_processor_hotplug_notify()
296 /* non-hotplug event; possibly handled by other handler */ in acpi_processor_hotplug_notify()
300 (void) acpi_evaluate_ost(handle, event, ost_code, NULL); in acpi_processor_hotplug_notify()
306 static acpi_status is_processor_device(acpi_handle handle) in is_processor_device() argument
312 status = acpi_get_object_info(handle, &info); in is_processor_device()
316 if (info->type == ACPI_TYPE_PROCESSOR) { in is_processor_device()
321 if (!(info->valid & ACPI_VALID_HID)) { in is_processor_device()
326 hid = info->hardware_id.string; in is_processor_device()
333 return AE_OK; /* found a processor device object */ in is_processor_device()
337 processor_walk_namespace_cb(acpi_handle handle, in processor_walk_namespace_cb() argument
343 status = is_processor_device(handle); in processor_walk_namespace_cb()
349 acpi_install_notify_handler(handle, in processor_walk_namespace_cb()
355 acpi_remove_notify_handler(handle, in processor_walk_namespace_cb()
409 return -ENODEV; in xen_acpi_processor_init()
443 ACPI_MODULE_NAME("xen-acpi-cpuhotplug");