xref: /dflybsd-src/sys/dev/acpica/acpi_cpu.c (revision df21e16d16b51cf8e1828be094b4866e5d0a1bc8)
15db2f26eSSascha Wildner /*-
25db2f26eSSascha Wildner  * Copyright (c) 2003-2005 Nate Lawson (SDG)
35db2f26eSSascha Wildner  * Copyright (c) 2001 Michael Smith
45db2f26eSSascha Wildner  * All rights reserved.
55db2f26eSSascha Wildner  *
65db2f26eSSascha Wildner  * Redistribution and use in source and binary forms, with or without
75db2f26eSSascha Wildner  * modification, are permitted provided that the following conditions
85db2f26eSSascha Wildner  * are met:
95db2f26eSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
105db2f26eSSascha Wildner  *    notice, this list of conditions and the following disclaimer.
115db2f26eSSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
125db2f26eSSascha Wildner  *    notice, this list of conditions and the following disclaimer in the
135db2f26eSSascha Wildner  *    documentation and/or other materials provided with the distribution.
145db2f26eSSascha Wildner  *
155db2f26eSSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
165db2f26eSSascha Wildner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
175db2f26eSSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
185db2f26eSSascha Wildner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
195db2f26eSSascha Wildner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
205db2f26eSSascha Wildner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
215db2f26eSSascha Wildner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
225db2f26eSSascha Wildner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
235db2f26eSSascha Wildner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
245db2f26eSSascha Wildner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
255db2f26eSSascha Wildner  * SUCH DAMAGE.
265db2f26eSSascha Wildner  *
275db2f26eSSascha Wildner  * $FreeBSD: src/sys/dev/acpica/acpi_cpu.c,v 1.72 2008/04/12 12:06:00 rpaulo Exp $
285db2f26eSSascha Wildner  */
295db2f26eSSascha Wildner 
305db2f26eSSascha Wildner #include "opt_acpi.h"
315db2f26eSSascha Wildner 
325db2f26eSSascha Wildner #include <sys/param.h>
335db2f26eSSascha Wildner #include <sys/bus.h>
345db2f26eSSascha Wildner #include <sys/kernel.h>
355db2f26eSSascha Wildner #include <sys/sysctl.h>
365db2f26eSSascha Wildner 
375db2f26eSSascha Wildner #include <machine/globaldata.h>
385db2f26eSSascha Wildner #include <machine/smp.h>
395db2f26eSSascha Wildner 
405db2f26eSSascha Wildner #include "acpi.h"
415db2f26eSSascha Wildner #include "acpivar.h"
425db2f26eSSascha Wildner #include "acpi_cpu.h"
43c000328cSSepherosa Ziehau #include "cpu_if.h"
445db2f26eSSascha Wildner 
45a029078fSSepherosa Ziehau #define ACPI_NOTIFY_PX_STATES	0x80	/* _PPC/_PDL changed. */
465db2f26eSSascha Wildner #define ACPI_NOTIFY_CX_STATES	0x81	/* _CST changed. */
475db2f26eSSascha Wildner 
485db2f26eSSascha Wildner static int	acpi_cpu_probe(device_t dev);
495db2f26eSSascha Wildner static int	acpi_cpu_attach(device_t dev);
505db2f26eSSascha Wildner static struct resource_list *
515db2f26eSSascha Wildner 		acpi_cpu_get_rlist(device_t, device_t);
525db2f26eSSascha Wildner static struct resource *
535db2f26eSSascha Wildner 		acpi_cpu_alloc_resource(device_t, device_t,
545db2f26eSSascha Wildner 			int, int *, u_long, u_long, u_long, u_int, int);
555db2f26eSSascha Wildner static int	acpi_cpu_release_resource(device_t, device_t,
565db2f26eSSascha Wildner 			int, int, struct resource *);
57c000328cSSepherosa Ziehau static struct ksensordev *
58c000328cSSepherosa Ziehau 		acpi_cpu_get_sensdev(device_t);
595db2f26eSSascha Wildner 
605db2f26eSSascha Wildner static int	acpi_cpu_get_id(uint32_t, uint32_t *, uint32_t *);
615db2f26eSSascha Wildner static void	acpi_cpu_notify(ACPI_HANDLE, UINT32, void *);
625db2f26eSSascha Wildner 
635db2f26eSSascha Wildner static device_method_t acpi_cpu_methods[] = {
645db2f26eSSascha Wildner     /* Device interface */
655db2f26eSSascha Wildner     DEVMETHOD(device_probe,		acpi_cpu_probe),
665db2f26eSSascha Wildner     DEVMETHOD(device_attach,		acpi_cpu_attach),
675db2f26eSSascha Wildner     DEVMETHOD(device_detach,		bus_generic_detach),
685db2f26eSSascha Wildner     DEVMETHOD(device_shutdown,		bus_generic_shutdown),
695db2f26eSSascha Wildner     DEVMETHOD(device_suspend,		bus_generic_suspend),
705db2f26eSSascha Wildner     DEVMETHOD(device_resume,		bus_generic_resume),
715db2f26eSSascha Wildner 
725db2f26eSSascha Wildner     /* Bus interface */
735db2f26eSSascha Wildner     DEVMETHOD(bus_add_child,		bus_generic_add_child),
745db2f26eSSascha Wildner     DEVMETHOD(bus_print_child,		bus_generic_print_child),
755db2f26eSSascha Wildner     DEVMETHOD(bus_read_ivar,		bus_generic_read_ivar),
765db2f26eSSascha Wildner     DEVMETHOD(bus_write_ivar,		bus_generic_write_ivar),
775db2f26eSSascha Wildner     DEVMETHOD(bus_get_resource_list,	acpi_cpu_get_rlist),
785db2f26eSSascha Wildner     DEVMETHOD(bus_set_resource,		bus_generic_rl_set_resource),
795db2f26eSSascha Wildner     DEVMETHOD(bus_get_resource,		bus_generic_rl_get_resource),
805db2f26eSSascha Wildner     DEVMETHOD(bus_alloc_resource,	acpi_cpu_alloc_resource),
815db2f26eSSascha Wildner     DEVMETHOD(bus_release_resource,	acpi_cpu_release_resource),
825db2f26eSSascha Wildner     DEVMETHOD(bus_driver_added,		bus_generic_driver_added),
835db2f26eSSascha Wildner     DEVMETHOD(bus_activate_resource,	bus_generic_activate_resource),
845db2f26eSSascha Wildner     DEVMETHOD(bus_deactivate_resource,	bus_generic_deactivate_resource),
855db2f26eSSascha Wildner     DEVMETHOD(bus_setup_intr,		bus_generic_setup_intr),
865db2f26eSSascha Wildner     DEVMETHOD(bus_teardown_intr,	bus_generic_teardown_intr),
875db2f26eSSascha Wildner 
88c000328cSSepherosa Ziehau     /* CPU interface */
89c000328cSSepherosa Ziehau     DEVMETHOD(cpu_get_sensdev,		acpi_cpu_get_sensdev),
90c000328cSSepherosa Ziehau 
91d3c9c58eSSascha Wildner     DEVMETHOD_END
925db2f26eSSascha Wildner };
935db2f26eSSascha Wildner 
945db2f26eSSascha Wildner static driver_t acpi_cpu_driver = {
955db2f26eSSascha Wildner     "cpu",
965db2f26eSSascha Wildner     acpi_cpu_methods,
975025fc65SMatthew Dillon     sizeof(struct acpi_cpu_softc),
98*df21e16dSImre Vadász     .gpri = KOBJ_GPRI_ACPI+2
995db2f26eSSascha Wildner };
1005db2f26eSSascha Wildner 
1015db2f26eSSascha Wildner static devclass_t acpi_cpu_devclass;
1025db2f26eSSascha Wildner DRIVER_MODULE(cpu, acpi, acpi_cpu_driver, acpi_cpu_devclass, NULL, NULL);
1035db2f26eSSascha Wildner MODULE_DEPEND(cpu, acpi, 1, 1, 1);
1045db2f26eSSascha Wildner 
1055db2f26eSSascha Wildner static int
acpi_cpu_probe(device_t dev)1065db2f26eSSascha Wildner acpi_cpu_probe(device_t dev)
1075db2f26eSSascha Wildner {
1085db2f26eSSascha Wildner     int acpi_id, cpu_id;
1095db2f26eSSascha Wildner     ACPI_BUFFER buf;
1105db2f26eSSascha Wildner     ACPI_HANDLE handle;
1115db2f26eSSascha Wildner     ACPI_STATUS	status;
1125db2f26eSSascha Wildner     ACPI_OBJECT *obj;
1135db2f26eSSascha Wildner 
1145db2f26eSSascha Wildner     if (acpi_disabled("cpu") || acpi_get_type(dev) != ACPI_TYPE_PROCESSOR)
1155db2f26eSSascha Wildner 	return ENXIO;
1165db2f26eSSascha Wildner 
1175db2f26eSSascha Wildner     handle = acpi_get_handle(dev);
1185db2f26eSSascha Wildner 
1195db2f26eSSascha Wildner     /*
1205db2f26eSSascha Wildner      * Get our Processor object.
1215db2f26eSSascha Wildner      */
1225db2f26eSSascha Wildner     buf.Pointer = NULL;
1235db2f26eSSascha Wildner     buf.Length = ACPI_ALLOCATE_BUFFER;
1245db2f26eSSascha Wildner     status = AcpiEvaluateObject(handle, NULL, NULL, &buf);
1255db2f26eSSascha Wildner     if (ACPI_FAILURE(status)) {
1265db2f26eSSascha Wildner 	device_printf(dev, "probe failed to get Processor obj - %s\n",
1275db2f26eSSascha Wildner 		      AcpiFormatException(status));
1285db2f26eSSascha Wildner 	return ENXIO;
1295db2f26eSSascha Wildner     }
1305db2f26eSSascha Wildner 
1315db2f26eSSascha Wildner     obj = (ACPI_OBJECT *)buf.Pointer;
1325db2f26eSSascha Wildner     if (obj->Type != ACPI_TYPE_PROCESSOR) {
1335db2f26eSSascha Wildner 	device_printf(dev, "Processor object has bad type %d\n", obj->Type);
1345db2f26eSSascha Wildner 	AcpiOsFree(obj);
1355db2f26eSSascha Wildner 	return ENXIO;
1365db2f26eSSascha Wildner     }
1375db2f26eSSascha Wildner 
1385db2f26eSSascha Wildner     acpi_id = obj->Processor.ProcId;
1395db2f26eSSascha Wildner     AcpiOsFree(obj);
1405db2f26eSSascha Wildner 
1415db2f26eSSascha Wildner     /*
1425db2f26eSSascha Wildner      * Find the processor associated with our unit.  We could use the
1435db2f26eSSascha Wildner      * ProcId as a key, however, some boxes do not have the same values
1445db2f26eSSascha Wildner      * in their Processor object as the ProcId values in the MADT.
1455db2f26eSSascha Wildner      */
1465db2f26eSSascha Wildner     if (acpi_cpu_get_id(device_get_unit(dev), &acpi_id, &cpu_id) != 0)
1475db2f26eSSascha Wildner 	return ENXIO;
1485db2f26eSSascha Wildner 
1495db2f26eSSascha Wildner     acpi_set_magic(dev, cpu_id);
1505db2f26eSSascha Wildner     device_set_desc(dev, "ACPI CPU");
1515db2f26eSSascha Wildner 
1525db2f26eSSascha Wildner     return 0;
1535db2f26eSSascha Wildner }
1545db2f26eSSascha Wildner 
1555db2f26eSSascha Wildner static int
acpi_cpu_attach(device_t dev)1565db2f26eSSascha Wildner acpi_cpu_attach(device_t dev)
1575db2f26eSSascha Wildner {
15841d9045eSSepherosa Ziehau     struct acpi_cpu_softc *sc = device_get_softc(dev);
1595db2f26eSSascha Wildner     ACPI_HANDLE handle;
1605db2f26eSSascha Wildner     device_t child;
1615db2f26eSSascha Wildner     int cpu_id, cpu_features;
1625db2f26eSSascha Wildner     struct acpi_softc *acpi_sc;
1635db2f26eSSascha Wildner 
164a029078fSSepherosa Ziehau     sc->cpu_dev = dev;
165a029078fSSepherosa Ziehau 
1665db2f26eSSascha Wildner     handle = acpi_get_handle(dev);
1675db2f26eSSascha Wildner     cpu_id = acpi_get_magic(dev);
1685db2f26eSSascha Wildner 
1695db2f26eSSascha Wildner     acpi_sc = acpi_device_get_parent_softc(dev);
1705db2f26eSSascha Wildner     if (cpu_id == 0) {
1715db2f26eSSascha Wildner 	sysctl_ctx_init(&sc->glob_sysctl_ctx);
1725db2f26eSSascha Wildner 	sc->glob_sysctl_tree = SYSCTL_ADD_NODE(&sc->glob_sysctl_ctx,
1735db2f26eSSascha Wildner 			       SYSCTL_CHILDREN(acpi_sc->acpi_sysctl_tree),
1745db2f26eSSascha Wildner 			       OID_AUTO, "cpu", CTLFLAG_RD, 0,
1755db2f26eSSascha Wildner 			       "node for CPU global settings");
1765db2f26eSSascha Wildner     	if (sc->glob_sysctl_tree == NULL)
1775db2f26eSSascha Wildner 	    return ENOMEM;
1785db2f26eSSascha Wildner     }
1795db2f26eSSascha Wildner 
1805db2f26eSSascha Wildner     sysctl_ctx_init(&sc->pcpu_sysctl_ctx);
1815db2f26eSSascha Wildner     sc->pcpu_sysctl_tree = SYSCTL_ADD_NODE(&sc->pcpu_sysctl_ctx,
1825db2f26eSSascha Wildner 			   SYSCTL_CHILDREN(acpi_sc->acpi_sysctl_tree),
1835db2f26eSSascha Wildner 			   OID_AUTO, device_get_nameunit(dev), CTLFLAG_RD, 0,
1845db2f26eSSascha Wildner 			   "node for per-CPU settings");
1855db2f26eSSascha Wildner     if (sc->pcpu_sysctl_tree == NULL) {
1865db2f26eSSascha Wildner 	sysctl_ctx_free(&sc->glob_sysctl_ctx);
1875db2f26eSSascha Wildner 	return ENOMEM;
1885db2f26eSSascha Wildner     }
1895db2f26eSSascha Wildner 
1905db2f26eSSascha Wildner     /*
1915db2f26eSSascha Wildner      * Before calling any CPU methods, collect child driver feature hints
1925db2f26eSSascha Wildner      * and notify ACPI of them.  We support unified SMP power control
1935db2f26eSSascha Wildner      * so advertise this ourselves.  Note this is not the same as independent
1945db2f26eSSascha Wildner      * SMP control where each CPU can have different settings.
1955db2f26eSSascha Wildner      */
1965db2f26eSSascha Wildner     cpu_features = ACPI_PDC_MP_C1PXTX | ACPI_PDC_MP_C2C3;
1975db2f26eSSascha Wildner     cpu_features |= acpi_cpu_md_features();
1985db2f26eSSascha Wildner 
1995db2f26eSSascha Wildner     /*
2005db2f26eSSascha Wildner      * CPU capabilities are specified as a buffer of 32-bit integers:
2015db2f26eSSascha Wildner      * revision, count, and one or more capabilities.
2025db2f26eSSascha Wildner      */
2035db2f26eSSascha Wildner     if (cpu_features) {
2045db2f26eSSascha Wildner 	uint32_t cap_set[3];
2055db2f26eSSascha Wildner 	ACPI_STATUS status;
2065db2f26eSSascha Wildner 
2075db2f26eSSascha Wildner 	cap_set[0] = 0;
2085db2f26eSSascha Wildner 	cap_set[1] = cpu_features;
2095ca62c87SSascha Wildner 	status = acpi_eval_osc(dev, handle,
2105ca62c87SSascha Wildner 	    "4077A616-290C-47BE-9EBD-D87058713953", 1, cap_set, 2);
2115ca62c87SSascha Wildner 
2125ca62c87SSascha Wildner 	if (ACPI_FAILURE(status)) {
2135ca62c87SSascha Wildner 	    ACPI_OBJECT_LIST arglist;
2145ca62c87SSascha Wildner 	    ACPI_OBJECT arg[4];
2155ca62c87SSascha Wildner 
2165db2f26eSSascha Wildner 	    if (bootverbose)
217e7882125SSascha Wildner 		device_printf(dev, "_OSC failed, using _PDC\n");
2185db2f26eSSascha Wildner 
2195db2f26eSSascha Wildner 	    arglist.Pointer = arg;
2205db2f26eSSascha Wildner 	    arglist.Count = 1;
2215db2f26eSSascha Wildner 	    arg[0].Type = ACPI_TYPE_BUFFER;
2225db2f26eSSascha Wildner 	    arg[0].Buffer.Length = sizeof(cap_set);
2235db2f26eSSascha Wildner 	    arg[0].Buffer.Pointer = (uint8_t *)cap_set;
2245db2f26eSSascha Wildner 	    cap_set[0] = 1; /* revision */
2255db2f26eSSascha Wildner 	    cap_set[1] = 1; /* # of capabilities integers */
2265db2f26eSSascha Wildner 	    cap_set[2] = cpu_features;
2275db2f26eSSascha Wildner 	    AcpiEvaluateObject(handle, "_PDC", &arglist, NULL);
2285db2f26eSSascha Wildner 	}
2295db2f26eSSascha Wildner     }
2305db2f26eSSascha Wildner 
231c000328cSSepherosa Ziehau     ksnprintf(sc->cpu_sensdev.xname, sizeof(sc->cpu_sensdev.xname), "%s",
232c000328cSSepherosa Ziehau 	device_get_nameunit(dev));
233c000328cSSepherosa Ziehau     sensordev_install(&sc->cpu_sensdev);
234c000328cSSepherosa Ziehau 
2355db2f26eSSascha Wildner     child = BUS_ADD_CHILD(dev, dev, 0, "cpu_cst", -1);
2365db2f26eSSascha Wildner     if (child == NULL)
2375db2f26eSSascha Wildner 	return ENXIO;
2385db2f26eSSascha Wildner     acpi_set_handle(child, handle);
2395db2f26eSSascha Wildner     acpi_set_magic(child, cpu_id);
24041d9045eSSepherosa Ziehau     sc->cpu_cst = child;
2415db2f26eSSascha Wildner 
2425db2f26eSSascha Wildner     child = BUS_ADD_CHILD(dev, dev, 0, "cpu_pst", -1);
2435db2f26eSSascha Wildner     if (child == NULL)
2445db2f26eSSascha Wildner 	return ENXIO;
2455db2f26eSSascha Wildner     acpi_set_handle(child, handle);
2465db2f26eSSascha Wildner     acpi_set_magic(child, cpu_id);
247a029078fSSepherosa Ziehau     sc->cpu_pst = child;
2485db2f26eSSascha Wildner 
249cb60b845SSepherosa Ziehau     bus_generic_probe(dev);
2505db2f26eSSascha Wildner     bus_generic_attach(dev);
2515db2f26eSSascha Wildner 
2525db2f26eSSascha Wildner     AcpiInstallNotifyHandler(handle, ACPI_DEVICE_NOTIFY, acpi_cpu_notify, sc);
2535db2f26eSSascha Wildner 
2545db2f26eSSascha Wildner     return 0;
2555db2f26eSSascha Wildner }
2565db2f26eSSascha Wildner 
2575db2f26eSSascha Wildner /*
2585db2f26eSSascha Wildner  * All resources are assigned directly to us by acpi,
2595db2f26eSSascha Wildner  * so 'child' is bypassed here.
2605db2f26eSSascha Wildner  */
2615db2f26eSSascha Wildner static struct resource_list *
acpi_cpu_get_rlist(device_t dev,device_t child __unused)2625db2f26eSSascha Wildner acpi_cpu_get_rlist(device_t dev, device_t child __unused)
2635db2f26eSSascha Wildner {
2645db2f26eSSascha Wildner     return BUS_GET_RESOURCE_LIST(device_get_parent(dev), dev);
2655db2f26eSSascha Wildner }
2665db2f26eSSascha Wildner 
2675db2f26eSSascha Wildner static struct resource *
acpi_cpu_alloc_resource(device_t dev,device_t child __unused,int type,int * rid,u_long start,u_long end,u_long count,u_int flags,int cpuid)2685db2f26eSSascha Wildner acpi_cpu_alloc_resource(device_t dev, device_t child __unused,
2695db2f26eSSascha Wildner 			int type, int *rid, u_long start, u_long end,
2705db2f26eSSascha Wildner 			u_long count, u_int flags, int cpuid)
2715db2f26eSSascha Wildner {
2725db2f26eSSascha Wildner     return BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, type, rid,
2735db2f26eSSascha Wildner 			      start, end, count, flags, cpuid);
2745db2f26eSSascha Wildner }
2755db2f26eSSascha Wildner 
2765db2f26eSSascha Wildner static int
acpi_cpu_release_resource(device_t dev,device_t child __unused,int type,int rid,struct resource * r)2775db2f26eSSascha Wildner acpi_cpu_release_resource(device_t dev, device_t child __unused,
2785db2f26eSSascha Wildner 			  int type, int rid, struct resource *r)
2795db2f26eSSascha Wildner {
2805db2f26eSSascha Wildner     return BUS_RELEASE_RESOURCE(device_get_parent(dev), dev, type, rid, r);
2815db2f26eSSascha Wildner }
2825db2f26eSSascha Wildner 
2835db2f26eSSascha Wildner /*
2845db2f26eSSascha Wildner  * Find the nth present CPU and return its pc_cpuid as well as set the
2855db2f26eSSascha Wildner  * pc_acpi_id from the most reliable source.
2865db2f26eSSascha Wildner  */
2875db2f26eSSascha Wildner static int
acpi_cpu_get_id(uint32_t idx,uint32_t * acpi_id,uint32_t * cpu_id)2885db2f26eSSascha Wildner acpi_cpu_get_id(uint32_t idx, uint32_t *acpi_id, uint32_t *cpu_id)
2895db2f26eSSascha Wildner {
2905db2f26eSSascha Wildner     struct mdglobaldata *md;
2915db2f26eSSascha Wildner     uint32_t i;
2925db2f26eSSascha Wildner 
2935db2f26eSSascha Wildner     KASSERT(acpi_id != NULL, ("Null acpi_id"));
2945db2f26eSSascha Wildner     KASSERT(cpu_id != NULL, ("Null cpu_id"));
2955db2f26eSSascha Wildner     for (i = 0; i < ncpus; i++) {
296c07315c4SMatthew Dillon 	if (CPUMASK_TESTBIT(smp_active_mask, i) == 0)
2975db2f26eSSascha Wildner 	    continue;
2985db2f26eSSascha Wildner 	md = (struct mdglobaldata *)globaldata_find(i);
2995db2f26eSSascha Wildner 	KASSERT(md != NULL, ("no pcpu data for %d", i));
3005db2f26eSSascha Wildner 	if (idx-- == 0) {
3015db2f26eSSascha Wildner 	    /*
3028005c0c8SSepherosa Ziehau 	     * If gd_acpi_id was not initialized (e.g., box w/o MADT)
3035db2f26eSSascha Wildner 	     * override it with the value from the ASL.  Otherwise, if the
3045db2f26eSSascha Wildner 	     * two don't match, prefer the MADT-derived value.  Finally,
3058005c0c8SSepherosa Ziehau 	     * return the gd_cpuid to reference this processor.
3065db2f26eSSascha Wildner 	     */
3078005c0c8SSepherosa Ziehau 	    if (md->gd_acpi_id == 0xffffffff) {
3088005c0c8SSepherosa Ziehau 		kprintf("cpu%d: acpi id was not set, set it to %u\n",
3098005c0c8SSepherosa Ziehau 		    i, *acpi_id);
3105db2f26eSSascha Wildner 		md->gd_acpi_id = *acpi_id;
3118005c0c8SSepherosa Ziehau 	    } else if (md->gd_acpi_id != *acpi_id) {
3128005c0c8SSepherosa Ziehau 		kprintf("cpu%d: acpi id mismatch, madt %u, "
3138005c0c8SSepherosa Ziehau 		    "processor object %u\n",
3148005c0c8SSepherosa Ziehau 		    i, md->gd_acpi_id, *acpi_id);
3155db2f26eSSascha Wildner 		*acpi_id = md->gd_acpi_id;
3168005c0c8SSepherosa Ziehau 	    }
3175db2f26eSSascha Wildner 	    *cpu_id = md->mi.gd_cpuid;
3185db2f26eSSascha Wildner 	    return 0;
3195db2f26eSSascha Wildner 	}
3205db2f26eSSascha Wildner     }
3215db2f26eSSascha Wildner     return ESRCH;
3225db2f26eSSascha Wildner }
3235db2f26eSSascha Wildner 
3245db2f26eSSascha Wildner static void
acpi_cpu_notify(ACPI_HANDLE handle __unused,UINT32 notify,void * xsc)3255dd7b15cSSascha Wildner acpi_cpu_notify(ACPI_HANDLE handle __unused, UINT32 notify, void *xsc)
3265db2f26eSSascha Wildner {
32741d9045eSSepherosa Ziehau     struct acpi_cpu_softc *sc = xsc;
3285db2f26eSSascha Wildner 
3295db2f26eSSascha Wildner     switch (notify) {
3305db2f26eSSascha Wildner     case ACPI_NOTIFY_CX_STATES:
33141d9045eSSepherosa Ziehau 	if (sc->cpu_cst_notify != NULL)
33241d9045eSSepherosa Ziehau 	    sc->cpu_cst_notify(sc->cpu_cst);
3335db2f26eSSascha Wildner 	break;
334a029078fSSepherosa Ziehau     case ACPI_NOTIFY_PX_STATES:
335a029078fSSepherosa Ziehau 	if (sc->cpu_pst_notify != NULL)
336a029078fSSepherosa Ziehau 	    sc->cpu_pst_notify(sc->cpu_pst);
337a029078fSSepherosa Ziehau 	break;
338d1fb95bdSSascha Wildner     default:
339a029078fSSepherosa Ziehau 	device_printf(sc->cpu_dev, "unknown notify: %#x\n", notify);
340d1fb95bdSSascha Wildner 	break;
3415db2f26eSSascha Wildner     }
3425db2f26eSSascha Wildner }
343c000328cSSepherosa Ziehau 
344c000328cSSepherosa Ziehau static struct ksensordev *
acpi_cpu_get_sensdev(device_t dev)345c000328cSSepherosa Ziehau acpi_cpu_get_sensdev(device_t dev)
346c000328cSSepherosa Ziehau {
347c000328cSSepherosa Ziehau     struct acpi_cpu_softc *sc = device_get_softc(dev);
348c000328cSSepherosa Ziehau 
349c000328cSSepherosa Ziehau     return &sc->cpu_sensdev;
350c000328cSSepherosa Ziehau }
351