Home | History | Annotate | Line # | Download | only in acpi
acpi_cpu.c revision 1.51.10.1
      1  1.51.10.1    martin /* $NetBSD: acpi_cpu.c,v 1.51.10.1 2020/04/08 14:08:02 martin Exp $ */
      2        1.1    jruoho 
      3        1.1    jruoho /*-
      4       1.28    jruoho  * Copyright (c) 2010, 2011 Jukka Ruohonen <jruohonen (at) iki.fi>
      5        1.1    jruoho  * All rights reserved.
      6        1.1    jruoho  *
      7        1.1    jruoho  * Redistribution and use in source and binary forms, with or without
      8        1.1    jruoho  * modification, are permitted provided that the following conditions
      9        1.1    jruoho  * are met:
     10        1.1    jruoho  *
     11        1.1    jruoho  * 1. Redistributions of source code must retain the above copyright
     12        1.1    jruoho  *    notice, this list of conditions and the following disclaimer.
     13        1.1    jruoho  * 2. Redistributions in binary form must reproduce the above copyright
     14        1.1    jruoho  *    notice, this list of conditions and the following disclaimer in the
     15        1.1    jruoho  *    documentation and/or other materials provided with the distribution.
     16        1.1    jruoho  *
     17        1.1    jruoho  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     18        1.1    jruoho  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     19        1.1    jruoho  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     20        1.1    jruoho  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     21        1.1    jruoho  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     22        1.1    jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     23        1.1    jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     24        1.1    jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     25        1.1    jruoho  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     26        1.1    jruoho  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     27        1.1    jruoho  * SUCH DAMAGE.
     28        1.1    jruoho  */
     29        1.1    jruoho #include <sys/cdefs.h>
     30  1.51.10.1    martin __KERNEL_RCSID(0, "$NetBSD: acpi_cpu.c,v 1.51.10.1 2020/04/08 14:08:02 martin Exp $");
     31        1.1    jruoho 
     32        1.1    jruoho #include <sys/param.h>
     33        1.1    jruoho #include <sys/cpu.h>
     34       1.33    jruoho #include <sys/evcnt.h>
     35        1.1    jruoho #include <sys/kernel.h>
     36        1.1    jruoho #include <sys/kmem.h>
     37        1.1    jruoho #include <sys/module.h>
     38       1.10    jruoho #include <sys/mutex.h>
     39       1.24    jruoho #include <sys/sysctl.h>
     40       1.45    jruoho #include <sys/cpufreq.h>
     41        1.1    jruoho 
     42        1.1    jruoho #include <dev/acpi/acpireg.h>
     43        1.1    jruoho #include <dev/acpi/acpivar.h>
     44        1.1    jruoho #include <dev/acpi/acpi_cpu.h>
     45        1.1    jruoho 
     46        1.1    jruoho #include <machine/acpi_machdep.h>
     47       1.30    jruoho #include <machine/cpuvar.h>
     48        1.1    jruoho 
     49        1.1    jruoho #define _COMPONENT	  ACPI_BUS_COMPONENT
     50        1.1    jruoho ACPI_MODULE_NAME	  ("acpi_cpu")
     51        1.1    jruoho 
     52        1.1    jruoho static int		  acpicpu_match(device_t, cfdata_t, void *);
     53        1.1    jruoho static void		  acpicpu_attach(device_t, device_t, void *);
     54        1.1    jruoho static int		  acpicpu_detach(device_t, int);
     55        1.1    jruoho static int		  acpicpu_once_attach(void);
     56        1.1    jruoho static int		  acpicpu_once_detach(void);
     57       1.17    jruoho static void		  acpicpu_start(device_t);
     58        1.1    jruoho 
     59       1.30    jruoho static ACPI_STATUS	  acpicpu_object(ACPI_HANDLE, struct acpicpu_object *);
     60        1.1    jruoho static uint32_t		  acpicpu_cap(struct acpicpu_softc *);
     61       1.21    jruoho static ACPI_STATUS	  acpicpu_cap_osc(struct acpicpu_softc *,
     62       1.21    jruoho 					  uint32_t, uint32_t *);
     63        1.1    jruoho static void		  acpicpu_notify(ACPI_HANDLE, uint32_t, void *);
     64        1.1    jruoho static bool		  acpicpu_suspend(device_t, const pmf_qual_t *);
     65        1.1    jruoho static bool		  acpicpu_resume(device_t, const pmf_qual_t *);
     66       1.33    jruoho static void		  acpicpu_evcnt_attach(device_t);
     67       1.33    jruoho static void		  acpicpu_evcnt_detach(device_t);
     68       1.33    jruoho static void		  acpicpu_debug_print(device_t);
     69       1.45    jruoho static const char	 *acpicpu_debug_print_method_c(uint8_t);
     70       1.45    jruoho static const char	 *acpicpu_debug_print_method_pt(uint8_t);
     71       1.33    jruoho static const char	 *acpicpu_debug_print_dep(uint32_t);
     72        1.1    jruoho 
     73       1.30    jruoho static uint32_t		  acpicpu_count = 0;
     74        1.1    jruoho struct acpicpu_softc	**acpicpu_sc = NULL;
     75       1.24    jruoho static bool		  acpicpu_dynamic = true;
     76       1.24    jruoho static bool		  acpicpu_passive = true;
     77        1.1    jruoho 
     78       1.36    jruoho static const struct {
     79       1.36    jruoho 	const char	 *manu;
     80       1.36    jruoho 	const char	 *prod;
     81       1.36    jruoho 	const char	 *vers;
     82       1.36    jruoho } acpicpu_quirks[] = {
     83       1.36    jruoho 	{ "Supermicro", "PDSMi-LN4", "0123456789" },
     84       1.49    jruoho 	{ "ASUSTeK Computer INC.", "M2A-MX", "Rev 1.xx" },
     85       1.36    jruoho };
     86       1.36    jruoho 
     87        1.1    jruoho CFATTACH_DECL_NEW(acpicpu, sizeof(struct acpicpu_softc),
     88        1.1    jruoho     acpicpu_match, acpicpu_attach, acpicpu_detach, NULL);
     89        1.1    jruoho 
     90        1.1    jruoho static int
     91        1.1    jruoho acpicpu_match(device_t parent, cfdata_t match, void *aux)
     92        1.1    jruoho {
     93       1.36    jruoho 	const char *manu, *prod, *vers;
     94       1.31    jruoho 	struct cpu_info *ci;
     95       1.36    jruoho 	size_t i;
     96        1.1    jruoho 
     97       1.30    jruoho 	if (acpi_softc == NULL)
     98        1.1    jruoho 		return 0;
     99        1.1    jruoho 
    100       1.49    jruoho 	manu = pmf_get_platform("board-vendor");
    101       1.49    jruoho 	prod = pmf_get_platform("board-product");
    102       1.49    jruoho 	vers = pmf_get_platform("board-version");
    103       1.36    jruoho 
    104       1.36    jruoho 	if (manu != NULL && prod != NULL && vers != NULL) {
    105       1.36    jruoho 
    106       1.36    jruoho 		for (i = 0; i < __arraycount(acpicpu_quirks); i++) {
    107       1.36    jruoho 
    108       1.36    jruoho 			if (strcasecmp(acpicpu_quirks[i].manu, manu) == 0 &&
    109       1.36    jruoho 			    strcasecmp(acpicpu_quirks[i].prod, prod) == 0 &&
    110       1.36    jruoho 			    strcasecmp(acpicpu_quirks[i].vers, vers) == 0)
    111       1.36    jruoho 				return 0;
    112       1.36    jruoho 		}
    113       1.36    jruoho 	}
    114       1.36    jruoho 
    115       1.31    jruoho 	ci = acpicpu_md_match(parent, match, aux);
    116       1.31    jruoho 
    117       1.31    jruoho 	if (ci == NULL)
    118        1.3  christos 		return 0;
    119        1.5    jruoho 
    120       1.42    jruoho 	if (acpi_match_cpu_info(ci) == NULL)
    121       1.42    jruoho 		return 0;
    122       1.42    jruoho 
    123       1.42    jruoho 	return 10;
    124        1.1    jruoho }
    125        1.1    jruoho 
    126        1.1    jruoho static void
    127        1.1    jruoho acpicpu_attach(device_t parent, device_t self, void *aux)
    128        1.1    jruoho {
    129        1.1    jruoho 	struct acpicpu_softc *sc = device_private(self);
    130       1.31    jruoho 	struct cpu_info *ci;
    131       1.42    jruoho 	ACPI_HANDLE hdl;
    132       1.27    jruoho 	cpuid_t id;
    133        1.1    jruoho 	int rv;
    134        1.1    jruoho 
    135       1.31    jruoho 	ci = acpicpu_md_attach(parent, self, aux);
    136       1.31    jruoho 
    137       1.31    jruoho 	if (ci == NULL)
    138       1.31    jruoho 		return;
    139       1.31    jruoho 
    140       1.30    jruoho 	sc->sc_ci = ci;
    141       1.30    jruoho 	sc->sc_dev = self;
    142       1.30    jruoho 	sc->sc_cold = true;
    143        1.1    jruoho 
    144       1.42    jruoho 	hdl = acpi_match_cpu_info(ci);
    145        1.1    jruoho 
    146       1.42    jruoho 	if (hdl == NULL) {
    147       1.30    jruoho 		aprint_normal(": failed to match processor\n");
    148        1.1    jruoho 		return;
    149       1.30    jruoho 	}
    150        1.1    jruoho 
    151       1.43    jruoho 	sc->sc_node = acpi_match_node(hdl);
    152       1.42    jruoho 
    153       1.30    jruoho 	if (acpicpu_once_attach() != 0) {
    154       1.30    jruoho 		aprint_normal(": failed to initialize\n");
    155        1.1    jruoho 		return;
    156        1.1    jruoho 	}
    157        1.1    jruoho 
    158       1.30    jruoho 	KASSERT(acpi_softc != NULL);
    159       1.30    jruoho 	KASSERT(acpicpu_sc != NULL);
    160       1.30    jruoho 	KASSERT(sc->sc_node != NULL);
    161       1.30    jruoho 
    162       1.27    jruoho 	id = sc->sc_ci->ci_acpiid;
    163       1.27    jruoho 
    164       1.27    jruoho 	if (acpicpu_sc[id] != NULL) {
    165       1.30    jruoho 		aprint_normal(": already attached\n");
    166        1.1    jruoho 		return;
    167        1.1    jruoho 	}
    168        1.1    jruoho 
    169       1.21    jruoho 	aprint_naive("\n");
    170       1.21    jruoho 	aprint_normal(": ACPI CPU\n");
    171       1.21    jruoho 
    172       1.30    jruoho 	rv = acpicpu_object(sc->sc_node->ad_handle, &sc->sc_object);
    173       1.30    jruoho 
    174       1.30    jruoho 	if (ACPI_FAILURE(rv))
    175       1.30    jruoho 		aprint_verbose_dev(self, "failed to obtain CPU object\n");
    176       1.30    jruoho 
    177       1.30    jruoho 	acpicpu_count++;
    178       1.27    jruoho 	acpicpu_sc[id] = sc;
    179        1.1    jruoho 
    180        1.1    jruoho 	sc->sc_cap = acpicpu_cap(sc);
    181       1.29    jruoho 	sc->sc_ncpus = acpi_md_ncpus();
    182       1.30    jruoho 	sc->sc_flags = acpicpu_md_flags();
    183        1.1    jruoho 
    184       1.30    jruoho 	KASSERT(acpicpu_count <= sc->sc_ncpus);
    185       1.30    jruoho 	KASSERT(sc->sc_node->ad_device == NULL);
    186       1.30    jruoho 
    187       1.30    jruoho 	sc->sc_node->ad_device = self;
    188       1.10    jruoho 	mutex_init(&sc->sc_mtx, MUTEX_DEFAULT, IPL_NONE);
    189       1.10    jruoho 
    190        1.1    jruoho 	acpicpu_cstate_attach(self);
    191       1.12    jruoho 	acpicpu_pstate_attach(self);
    192       1.15    jruoho 	acpicpu_tstate_attach(self);
    193       1.12    jruoho 
    194       1.30    jruoho 	acpicpu_debug_print(self);
    195       1.33    jruoho 	acpicpu_evcnt_attach(self);
    196       1.30    jruoho 
    197       1.30    jruoho 	(void)config_interrupts(self, acpicpu_start);
    198        1.1    jruoho 	(void)acpi_register_notify(sc->sc_node, acpicpu_notify);
    199        1.1    jruoho 	(void)pmf_device_register(self, acpicpu_suspend, acpicpu_resume);
    200        1.1    jruoho }
    201        1.1    jruoho 
    202        1.1    jruoho static int
    203        1.1    jruoho acpicpu_detach(device_t self, int flags)
    204        1.1    jruoho {
    205        1.1    jruoho 	struct acpicpu_softc *sc = device_private(self);
    206        1.1    jruoho 
    207       1.14    jruoho 	sc->sc_cold = true;
    208       1.34    jruoho 
    209       1.34    jruoho 	acpicpu_evcnt_detach(self);
    210        1.1    jruoho 	acpi_deregister_notify(sc->sc_node);
    211        1.1    jruoho 
    212       1.44    jruoho 	acpicpu_cstate_detach(self);
    213       1.44    jruoho 	acpicpu_pstate_detach(self);
    214       1.44    jruoho 	acpicpu_tstate_detach(self);
    215       1.15    jruoho 
    216       1.30    jruoho 	mutex_destroy(&sc->sc_mtx);
    217       1.30    jruoho 	sc->sc_node->ad_device = NULL;
    218        1.1    jruoho 
    219       1.30    jruoho 	acpicpu_count--;
    220       1.30    jruoho 	acpicpu_once_detach();
    221       1.10    jruoho 
    222        1.1    jruoho 	return 0;
    223        1.1    jruoho }
    224        1.1    jruoho 
    225        1.1    jruoho static int
    226        1.1    jruoho acpicpu_once_attach(void)
    227        1.1    jruoho {
    228        1.1    jruoho 	struct acpicpu_softc *sc;
    229        1.1    jruoho 	unsigned int i;
    230        1.1    jruoho 
    231       1.30    jruoho 	if (acpicpu_count != 0)
    232       1.30    jruoho 		return 0;
    233       1.30    jruoho 
    234       1.30    jruoho 	KASSERT(acpicpu_sc == NULL);
    235       1.30    jruoho 
    236        1.1    jruoho 	acpicpu_sc = kmem_zalloc(maxcpus * sizeof(*sc), KM_SLEEP);
    237        1.1    jruoho 
    238        1.1    jruoho 	for (i = 0; i < maxcpus; i++)
    239        1.1    jruoho 		acpicpu_sc[i] = NULL;
    240        1.1    jruoho 
    241        1.1    jruoho 	return 0;
    242        1.1    jruoho }
    243        1.1    jruoho 
    244        1.1    jruoho static int
    245        1.1    jruoho acpicpu_once_detach(void)
    246        1.1    jruoho {
    247        1.1    jruoho 	struct acpicpu_softc *sc;
    248        1.1    jruoho 
    249       1.30    jruoho 	if (acpicpu_count != 0)
    250       1.30    jruoho 		return EDEADLK;
    251        1.1    jruoho 
    252       1.46    jruoho 	cpufreq_deregister();
    253       1.46    jruoho 
    254       1.46    jruoho 	if (acpicpu_sc != NULL)
    255       1.30    jruoho 		kmem_free(acpicpu_sc, maxcpus * sizeof(*sc));
    256       1.30    jruoho 
    257       1.17    jruoho 	return 0;
    258       1.17    jruoho }
    259        1.1    jruoho 
    260       1.17    jruoho static void
    261       1.30    jruoho acpicpu_start(device_t self)
    262       1.17    jruoho {
    263       1.17    jruoho 	struct acpicpu_softc *sc = device_private(self);
    264       1.30    jruoho 	static uint32_t count = 0;
    265       1.45    jruoho 	struct cpufreq cf;
    266       1.45    jruoho 	uint32_t i;
    267       1.17    jruoho 
    268       1.30    jruoho 	/*
    269       1.30    jruoho 	 * Run the state-specific initialization routines. These
    270       1.30    jruoho 	 * must run only once, after interrupts have been enabled,
    271       1.30    jruoho 	 * all CPUs are running, and all ACPI CPUs have attached.
    272       1.30    jruoho 	 */
    273       1.30    jruoho 	if (++count != acpicpu_count || acpicpu_count != sc->sc_ncpus) {
    274       1.17    jruoho 		sc->sc_cold = false;
    275       1.17    jruoho 		return;
    276       1.17    jruoho 	}
    277       1.17    jruoho 
    278       1.17    jruoho 	/*
    279       1.30    jruoho 	 * Set the last ACPI CPU as non-cold
    280       1.30    jruoho 	 * only after C-states are enabled.
    281       1.17    jruoho 	 */
    282       1.17    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_C) != 0)
    283       1.17    jruoho 		acpicpu_cstate_start(self);
    284       1.17    jruoho 
    285       1.30    jruoho 	sc->sc_cold = false;
    286       1.30    jruoho 
    287       1.17    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_P) != 0)
    288       1.17    jruoho 		acpicpu_pstate_start(self);
    289       1.17    jruoho 
    290       1.17    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_T) != 0)
    291       1.17    jruoho 		acpicpu_tstate_start(self);
    292       1.17    jruoho 
    293       1.30    jruoho 	aprint_debug_dev(self, "ACPI CPUs started\n");
    294       1.45    jruoho 
    295       1.45    jruoho 	/*
    296       1.45    jruoho 	 * Register with cpufreq(9).
    297       1.45    jruoho 	 */
    298       1.45    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_P) != 0) {
    299       1.45    jruoho 
    300       1.45    jruoho 		(void)memset(&cf, 0, sizeof(struct cpufreq));
    301       1.45    jruoho 
    302       1.45    jruoho 		cf.cf_mp = false;
    303       1.45    jruoho 		cf.cf_cookie = NULL;
    304       1.45    jruoho 		cf.cf_get_freq = acpicpu_pstate_get;
    305       1.45    jruoho 		cf.cf_set_freq = acpicpu_pstate_set;
    306       1.45    jruoho 		cf.cf_state_count = sc->sc_pstate_count;
    307       1.45    jruoho 
    308       1.45    jruoho 		(void)strlcpy(cf.cf_name, "acpicpu", sizeof(cf.cf_name));
    309       1.45    jruoho 
    310       1.45    jruoho 		for (i = 0; i < sc->sc_pstate_count; i++) {
    311       1.45    jruoho 
    312       1.45    jruoho 			if (sc->sc_pstate[i].ps_freq == 0)
    313       1.45    jruoho 				continue;
    314       1.45    jruoho 
    315       1.45    jruoho 			cf.cf_state[i].cfs_freq = sc->sc_pstate[i].ps_freq;
    316       1.45    jruoho 			cf.cf_state[i].cfs_power = sc->sc_pstate[i].ps_power;
    317       1.45    jruoho 		}
    318       1.45    jruoho 
    319       1.45    jruoho 		if (cpufreq_register(&cf) != 0)
    320       1.45    jruoho 			aprint_error_dev(self, "failed to register cpufreq\n");
    321       1.45    jruoho 	}
    322        1.1    jruoho }
    323        1.1    jruoho 
    324  1.51.10.1    martin SYSCTL_SETUP(acpicpu_sysctl, "acpi_cpu sysctls")
    325       1.24    jruoho {
    326       1.24    jruoho 	const struct sysctlnode *node;
    327       1.24    jruoho 	int err;
    328       1.24    jruoho 
    329  1.51.10.1    martin 	err = sysctl_createv(clog, 0, NULL, &node,
    330       1.24    jruoho 	    CTLFLAG_PERMANENT, CTLTYPE_NODE, "acpi", NULL,
    331       1.50     pooka 	    NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL);
    332       1.24    jruoho 
    333       1.24    jruoho 	if (err != 0)
    334       1.24    jruoho 		goto fail;
    335       1.24    jruoho 
    336  1.51.10.1    martin 	err = sysctl_createv(clog, 0, &node, &node,
    337       1.24    jruoho 	    0, CTLTYPE_NODE, "cpu", SYSCTL_DESCR("ACPI CPU"),
    338       1.24    jruoho 	    NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL);
    339       1.24    jruoho 
    340       1.24    jruoho 	if (err != 0)
    341       1.24    jruoho 		goto fail;
    342       1.24    jruoho 
    343  1.51.10.1    martin 	err = sysctl_createv(clog, 0, &node, NULL,
    344       1.24    jruoho 	    CTLFLAG_READWRITE, CTLTYPE_BOOL, "dynamic",
    345       1.24    jruoho 	    SYSCTL_DESCR("Dynamic states"), NULL, 0,
    346       1.24    jruoho 	    &acpicpu_dynamic, 0, CTL_CREATE, CTL_EOL);
    347       1.24    jruoho 
    348       1.24    jruoho 	if (err != 0)
    349       1.24    jruoho 		goto fail;
    350       1.24    jruoho 
    351  1.51.10.1    martin 	err = sysctl_createv(clog, 0, &node, NULL,
    352       1.24    jruoho 	    CTLFLAG_READWRITE, CTLTYPE_BOOL, "passive",
    353       1.24    jruoho 	    SYSCTL_DESCR("Passive cooling"), NULL, 0,
    354       1.24    jruoho 	    &acpicpu_passive, 0, CTL_CREATE, CTL_EOL);
    355       1.24    jruoho 
    356       1.24    jruoho 	if (err != 0)
    357       1.24    jruoho 		goto fail;
    358       1.24    jruoho 
    359       1.24    jruoho 	return;
    360       1.24    jruoho 
    361       1.24    jruoho fail:
    362  1.51.10.1    martin 	aprint_error("%s: failed to init sysctl (err %d)\n", __func__, err);
    363       1.24    jruoho }
    364       1.24    jruoho 
    365       1.30    jruoho static ACPI_STATUS
    366        1.1    jruoho acpicpu_object(ACPI_HANDLE hdl, struct acpicpu_object *ao)
    367        1.1    jruoho {
    368        1.1    jruoho 	ACPI_OBJECT *obj;
    369        1.1    jruoho 	ACPI_BUFFER buf;
    370        1.1    jruoho 	ACPI_STATUS rv;
    371        1.1    jruoho 
    372        1.1    jruoho 	rv = acpi_eval_struct(hdl, NULL, &buf);
    373        1.1    jruoho 
    374        1.1    jruoho 	if (ACPI_FAILURE(rv))
    375       1.30    jruoho 		goto out;
    376        1.1    jruoho 
    377        1.1    jruoho 	obj = buf.Pointer;
    378        1.1    jruoho 
    379        1.1    jruoho 	if (obj->Type != ACPI_TYPE_PROCESSOR) {
    380        1.1    jruoho 		rv = AE_TYPE;
    381        1.1    jruoho 		goto out;
    382        1.1    jruoho 	}
    383        1.1    jruoho 
    384        1.1    jruoho 	if (obj->Processor.ProcId > (uint32_t)maxcpus) {
    385        1.1    jruoho 		rv = AE_LIMIT;
    386        1.1    jruoho 		goto out;
    387        1.1    jruoho 	}
    388        1.1    jruoho 
    389        1.1    jruoho 	KDASSERT((uint64_t)obj->Processor.PblkAddress < UINT32_MAX);
    390        1.1    jruoho 
    391        1.1    jruoho 	if (ao != NULL) {
    392        1.1    jruoho 		ao->ao_procid = obj->Processor.ProcId;
    393        1.1    jruoho 		ao->ao_pblklen = obj->Processor.PblkLength;
    394        1.1    jruoho 		ao->ao_pblkaddr = obj->Processor.PblkAddress;
    395        1.1    jruoho 	}
    396        1.1    jruoho 
    397        1.1    jruoho out:
    398        1.1    jruoho 	if (buf.Pointer != NULL)
    399        1.1    jruoho 		ACPI_FREE(buf.Pointer);
    400        1.1    jruoho 
    401       1.30    jruoho 	return rv;
    402        1.1    jruoho }
    403        1.1    jruoho 
    404        1.1    jruoho static uint32_t
    405        1.1    jruoho acpicpu_cap(struct acpicpu_softc *sc)
    406        1.1    jruoho {
    407       1.21    jruoho 	uint32_t flags, cap = 0;
    408        1.1    jruoho 	ACPI_STATUS rv;
    409        1.1    jruoho 
    410        1.1    jruoho 	/*
    411       1.21    jruoho 	 * Query and set machine-dependent capabilities.
    412       1.41    jruoho 	 * Note that the Intel-specific _PDC method has
    413       1.41    jruoho 	 * already been evaluated. It was furthermore
    414       1.21    jruoho 	 * deprecated in the ACPI 3.0 in favor of _OSC.
    415        1.1    jruoho 	 */
    416       1.41    jruoho 	flags = acpi_md_pdc();
    417       1.21    jruoho 	rv = acpicpu_cap_osc(sc, flags, &cap);
    418        1.1    jruoho 
    419       1.21    jruoho 	if (ACPI_FAILURE(rv) && rv != AE_NOT_FOUND) {
    420        1.1    jruoho 
    421       1.41    jruoho 		aprint_error_dev(sc->sc_dev, "failed to evaluate "
    422       1.41    jruoho 		    "_OSC: %s\n", AcpiFormatException(rv));
    423       1.21    jruoho 	}
    424        1.1    jruoho 
    425       1.41    jruoho 	return (cap != 0) ? cap : flags;
    426        1.1    jruoho }
    427        1.1    jruoho 
    428        1.1    jruoho static ACPI_STATUS
    429       1.21    jruoho acpicpu_cap_osc(struct acpicpu_softc *sc, uint32_t flags, uint32_t *val)
    430        1.1    jruoho {
    431       1.21    jruoho 	ACPI_OBJECT_LIST arg;
    432       1.21    jruoho 	ACPI_OBJECT obj[4];
    433       1.21    jruoho 	ACPI_OBJECT *osc;
    434        1.1    jruoho 	ACPI_BUFFER buf;
    435        1.1    jruoho 	ACPI_STATUS rv;
    436       1.21    jruoho 	uint32_t cap[2];
    437       1.21    jruoho 	uint32_t *ptr;
    438       1.21    jruoho 	int i = 5;
    439        1.1    jruoho 
    440       1.21    jruoho 	static uint8_t intel_uuid[16] = {
    441        1.1    jruoho 		0x16, 0xA6, 0x77, 0x40, 0x0C, 0x29, 0xBE, 0x47,
    442        1.1    jruoho 		0x9E, 0xBD, 0xD8, 0x70, 0x58, 0x71, 0x39, 0x53
    443        1.1    jruoho 	};
    444        1.1    jruoho 
    445       1.21    jruoho 	cap[0] = ACPI_OSC_QUERY;
    446       1.21    jruoho 	cap[1] = flags;
    447        1.1    jruoho 
    448       1.21    jruoho again:
    449       1.21    jruoho 	arg.Count = 4;
    450       1.21    jruoho 	arg.Pointer = obj;
    451       1.21    jruoho 
    452       1.21    jruoho 	obj[0].Type = ACPI_TYPE_BUFFER;
    453       1.21    jruoho 	obj[0].Buffer.Length = sizeof(intel_uuid);
    454       1.21    jruoho 	obj[0].Buffer.Pointer = intel_uuid;
    455       1.21    jruoho 
    456       1.21    jruoho 	obj[1].Type = ACPI_TYPE_INTEGER;
    457       1.21    jruoho 	obj[1].Integer.Value = ACPICPU_PDC_REVID;
    458       1.21    jruoho 
    459       1.21    jruoho 	obj[2].Type = ACPI_TYPE_INTEGER;
    460       1.21    jruoho 	obj[2].Integer.Value = __arraycount(cap);
    461       1.21    jruoho 
    462       1.21    jruoho 	obj[3].Type = ACPI_TYPE_BUFFER;
    463       1.21    jruoho 	obj[3].Buffer.Length = sizeof(cap);
    464       1.21    jruoho 	obj[3].Buffer.Pointer = (void *)cap;
    465        1.1    jruoho 
    466        1.1    jruoho 	buf.Pointer = NULL;
    467        1.1    jruoho 	buf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
    468        1.1    jruoho 
    469       1.21    jruoho 	rv = AcpiEvaluateObject(sc->sc_node->ad_handle, "_OSC", &arg, &buf);
    470        1.1    jruoho 
    471        1.1    jruoho 	if (ACPI_FAILURE(rv))
    472       1.21    jruoho 		goto out;
    473        1.1    jruoho 
    474       1.21    jruoho 	osc = buf.Pointer;
    475        1.1    jruoho 
    476       1.21    jruoho 	if (osc->Type != ACPI_TYPE_BUFFER) {
    477        1.1    jruoho 		rv = AE_TYPE;
    478        1.1    jruoho 		goto out;
    479        1.1    jruoho 	}
    480        1.1    jruoho 
    481       1.21    jruoho 	if (osc->Buffer.Length != sizeof(cap)) {
    482        1.1    jruoho 		rv = AE_BUFFER_OVERFLOW;
    483        1.1    jruoho 		goto out;
    484        1.1    jruoho 	}
    485        1.1    jruoho 
    486       1.21    jruoho 	ptr = (uint32_t *)osc->Buffer.Pointer;
    487       1.21    jruoho 
    488       1.21    jruoho 	if ((ptr[0] & ACPI_OSC_ERROR) != 0) {
    489       1.21    jruoho 		rv = AE_ERROR;
    490       1.21    jruoho 		goto out;
    491       1.21    jruoho 	}
    492       1.21    jruoho 
    493       1.21    jruoho 	if ((ptr[0] & (ACPI_OSC_ERROR_REV | ACPI_OSC_ERROR_UUID)) != 0) {
    494       1.21    jruoho 		rv = AE_BAD_PARAMETER;
    495       1.21    jruoho 		goto out;
    496       1.21    jruoho 	}
    497       1.21    jruoho 
    498       1.21    jruoho 	/*
    499       1.21    jruoho 	 * "It is strongly recommended that the OS evaluate
    500       1.21    jruoho 	 *  _OSC with the Query Support Flag set until _OSC
    501       1.21    jruoho 	 *  returns the Capabilities Masked bit clear, to
    502       1.21    jruoho 	 *  negotiate the set of features to be granted to
    503       1.21    jruoho 	 *  the OS for native support (ACPI 4.0, 6.2.10)."
    504       1.21    jruoho 	 */
    505       1.21    jruoho 	if ((ptr[0] & ACPI_OSC_ERROR_MASKED) != 0 && i >= 0) {
    506        1.1    jruoho 
    507        1.1    jruoho 		ACPI_FREE(buf.Pointer);
    508       1.21    jruoho 		i--;
    509        1.1    jruoho 
    510       1.21    jruoho 		goto again;
    511       1.21    jruoho 	}
    512        1.1    jruoho 
    513       1.21    jruoho 	if ((cap[0] & ACPI_OSC_QUERY) != 0) {
    514        1.1    jruoho 
    515       1.21    jruoho 		ACPI_FREE(buf.Pointer);
    516       1.21    jruoho 		cap[0] &= ~ACPI_OSC_QUERY;
    517        1.1    jruoho 
    518       1.21    jruoho 		goto again;
    519       1.21    jruoho 	}
    520        1.1    jruoho 
    521       1.21    jruoho 	/*
    522       1.21    jruoho 	 * It is permitted for _OSC to return all
    523       1.21    jruoho 	 * bits cleared, but this is specified to
    524       1.21    jruoho 	 * vary on per-device basis. Assume that
    525       1.21    jruoho 	 * everything rather than nothing will be
    526       1.23    jruoho 	 * supported in this case; we do not need
    527       1.21    jruoho 	 * the firmware to know the CPU features.
    528       1.21    jruoho 	 */
    529       1.21    jruoho 	*val = (ptr[1] != 0) ? ptr[1] : cap[1];
    530        1.1    jruoho 
    531       1.21    jruoho out:
    532       1.21    jruoho 	if (buf.Pointer != NULL)
    533       1.21    jruoho 		ACPI_FREE(buf.Pointer);
    534        1.1    jruoho 
    535       1.21    jruoho 	return rv;
    536        1.1    jruoho }
    537        1.1    jruoho 
    538        1.1    jruoho static void
    539        1.1    jruoho acpicpu_notify(ACPI_HANDLE hdl, uint32_t evt, void *aux)
    540        1.1    jruoho {
    541        1.1    jruoho 	ACPI_OSD_EXEC_CALLBACK func;
    542        1.1    jruoho 	struct acpicpu_softc *sc;
    543        1.1    jruoho 	device_t self = aux;
    544        1.1    jruoho 
    545        1.1    jruoho 	sc = device_private(self);
    546        1.1    jruoho 
    547       1.16    jruoho 	if (sc->sc_cold != false)
    548       1.16    jruoho 		return;
    549       1.16    jruoho 
    550       1.24    jruoho 	if (acpicpu_dynamic != true)
    551       1.24    jruoho 		return;
    552       1.24    jruoho 
    553        1.1    jruoho 	switch (evt) {
    554        1.1    jruoho 
    555        1.1    jruoho 	case ACPICPU_C_NOTIFY:
    556        1.1    jruoho 
    557        1.1    jruoho 		if ((sc->sc_flags & ACPICPU_FLAG_C) == 0)
    558        1.1    jruoho 			return;
    559        1.1    jruoho 
    560        1.1    jruoho 		func = acpicpu_cstate_callback;
    561        1.1    jruoho 		break;
    562        1.1    jruoho 
    563        1.1    jruoho 	case ACPICPU_P_NOTIFY:
    564        1.1    jruoho 
    565        1.1    jruoho 		if ((sc->sc_flags & ACPICPU_FLAG_P) == 0)
    566        1.1    jruoho 			return;
    567        1.1    jruoho 
    568       1.12    jruoho 		func = acpicpu_pstate_callback;
    569        1.1    jruoho 		break;
    570        1.1    jruoho 
    571        1.1    jruoho 	case ACPICPU_T_NOTIFY:
    572        1.1    jruoho 
    573        1.1    jruoho 		if ((sc->sc_flags & ACPICPU_FLAG_T) == 0)
    574        1.1    jruoho 			return;
    575        1.1    jruoho 
    576       1.15    jruoho 		func = acpicpu_tstate_callback;
    577        1.1    jruoho 		break;
    578        1.1    jruoho 
    579        1.1    jruoho 	default:
    580        1.1    jruoho 		aprint_error_dev(sc->sc_dev,  "unknown notify: 0x%02X\n", evt);
    581        1.1    jruoho 		return;
    582        1.1    jruoho 	}
    583        1.1    jruoho 
    584        1.1    jruoho 	(void)AcpiOsExecute(OSL_NOTIFY_HANDLER, func, sc->sc_dev);
    585        1.1    jruoho }
    586        1.1    jruoho 
    587        1.1    jruoho static bool
    588        1.1    jruoho acpicpu_suspend(device_t self, const pmf_qual_t *qual)
    589        1.1    jruoho {
    590        1.1    jruoho 	struct acpicpu_softc *sc = device_private(self);
    591        1.1    jruoho 
    592        1.1    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_C) != 0)
    593        1.1    jruoho 		(void)acpicpu_cstate_suspend(self);
    594        1.1    jruoho 
    595       1.12    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_P) != 0)
    596       1.12    jruoho 		(void)acpicpu_pstate_suspend(self);
    597       1.12    jruoho 
    598       1.15    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_T) != 0)
    599       1.15    jruoho 		(void)acpicpu_tstate_suspend(self);
    600       1.15    jruoho 
    601       1.18    jruoho 	sc->sc_cold = true;
    602       1.18    jruoho 
    603        1.1    jruoho 	return true;
    604        1.1    jruoho }
    605        1.1    jruoho 
    606        1.1    jruoho static bool
    607        1.1    jruoho acpicpu_resume(device_t self, const pmf_qual_t *qual)
    608        1.1    jruoho {
    609        1.1    jruoho 	struct acpicpu_softc *sc = device_private(self);
    610       1.38    jruoho 	static const int handler = OSL_NOTIFY_HANDLER;
    611        1.1    jruoho 
    612       1.18    jruoho 	sc->sc_cold = false;
    613       1.18    jruoho 
    614        1.1    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_C) != 0)
    615       1.38    jruoho 		(void)AcpiOsExecute(handler, acpicpu_cstate_resume, self);
    616        1.1    jruoho 
    617       1.12    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_P) != 0)
    618       1.38    jruoho 		(void)AcpiOsExecute(handler, acpicpu_pstate_resume, self);
    619       1.12    jruoho 
    620       1.15    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_T) != 0)
    621       1.38    jruoho 		(void)AcpiOsExecute(handler, acpicpu_tstate_resume, self);
    622       1.15    jruoho 
    623        1.1    jruoho 	return true;
    624        1.1    jruoho }
    625        1.1    jruoho 
    626       1.29    jruoho static void
    627       1.33    jruoho acpicpu_evcnt_attach(device_t self)
    628       1.33    jruoho {
    629       1.33    jruoho 	struct acpicpu_softc *sc = device_private(self);
    630       1.33    jruoho 	struct acpicpu_cstate *cs;
    631       1.33    jruoho 	struct acpicpu_pstate *ps;
    632       1.33    jruoho 	struct acpicpu_tstate *ts;
    633       1.33    jruoho 	const char *str;
    634       1.33    jruoho 	uint32_t i;
    635       1.33    jruoho 
    636       1.33    jruoho 	for (i = 0; i < __arraycount(sc->sc_cstate); i++) {
    637       1.33    jruoho 
    638       1.33    jruoho 		cs = &sc->sc_cstate[i];
    639       1.33    jruoho 
    640       1.33    jruoho 		if (cs->cs_method == 0)
    641       1.33    jruoho 			continue;
    642       1.33    jruoho 
    643       1.33    jruoho 		str = "HALT";
    644       1.33    jruoho 
    645       1.33    jruoho 		if (cs->cs_method == ACPICPU_C_STATE_FFH)
    646       1.33    jruoho 			str = "MWAIT";
    647       1.33    jruoho 
    648       1.33    jruoho 		if (cs->cs_method == ACPICPU_C_STATE_SYSIO)
    649       1.33    jruoho 			str = "I/O";
    650       1.33    jruoho 
    651       1.33    jruoho 		(void)snprintf(cs->cs_name, sizeof(cs->cs_name),
    652       1.33    jruoho 		    "C%d (%s)", i, str);
    653       1.33    jruoho 
    654       1.33    jruoho 		evcnt_attach_dynamic(&cs->cs_evcnt, EVCNT_TYPE_MISC,
    655       1.33    jruoho 		    NULL, device_xname(sc->sc_dev), cs->cs_name);
    656       1.33    jruoho 	}
    657       1.33    jruoho 
    658       1.33    jruoho 	for (i = 0; i < sc->sc_pstate_count; i++) {
    659       1.33    jruoho 
    660       1.33    jruoho 		ps = &sc->sc_pstate[i];
    661       1.33    jruoho 
    662       1.33    jruoho 		if (ps->ps_freq == 0)
    663       1.33    jruoho 			continue;
    664       1.33    jruoho 
    665       1.33    jruoho 		(void)snprintf(ps->ps_name, sizeof(ps->ps_name),
    666       1.33    jruoho 		    "P%u (%u MHz)", i, ps->ps_freq);
    667       1.33    jruoho 
    668       1.33    jruoho 		evcnt_attach_dynamic(&ps->ps_evcnt, EVCNT_TYPE_MISC,
    669       1.33    jruoho 		    NULL, device_xname(sc->sc_dev), ps->ps_name);
    670       1.33    jruoho 	}
    671       1.33    jruoho 
    672       1.33    jruoho 	for (i = 0; i < sc->sc_tstate_count; i++) {
    673       1.33    jruoho 
    674       1.33    jruoho 		ts = &sc->sc_tstate[i];
    675       1.33    jruoho 
    676       1.33    jruoho 		if (ts->ts_percent == 0)
    677       1.33    jruoho 			continue;
    678       1.33    jruoho 
    679       1.33    jruoho 		(void)snprintf(ts->ts_name, sizeof(ts->ts_name),
    680       1.33    jruoho 		    "T%u (%u %%)", i, ts->ts_percent);
    681       1.33    jruoho 
    682       1.33    jruoho 		evcnt_attach_dynamic(&ts->ts_evcnt, EVCNT_TYPE_MISC,
    683       1.33    jruoho 		    NULL, device_xname(sc->sc_dev), ts->ts_name);
    684       1.33    jruoho 	}
    685       1.33    jruoho }
    686       1.33    jruoho 
    687       1.33    jruoho static void
    688       1.33    jruoho acpicpu_evcnt_detach(device_t self)
    689       1.33    jruoho {
    690       1.33    jruoho 	struct acpicpu_softc *sc = device_private(self);
    691       1.33    jruoho 	struct acpicpu_cstate *cs;
    692       1.33    jruoho 	struct acpicpu_pstate *ps;
    693       1.33    jruoho 	struct acpicpu_tstate *ts;
    694       1.33    jruoho 	uint32_t i;
    695       1.33    jruoho 
    696       1.33    jruoho 	for (i = 0; i < __arraycount(sc->sc_cstate); i++) {
    697       1.33    jruoho 
    698       1.33    jruoho 		cs = &sc->sc_cstate[i];
    699       1.33    jruoho 
    700       1.33    jruoho 		if (cs->cs_method != 0)
    701       1.33    jruoho 			evcnt_detach(&cs->cs_evcnt);
    702       1.33    jruoho 	}
    703       1.33    jruoho 
    704       1.33    jruoho 	for (i = 0; i < sc->sc_pstate_count; i++) {
    705       1.33    jruoho 
    706       1.33    jruoho 		ps = &sc->sc_pstate[i];
    707       1.33    jruoho 
    708       1.33    jruoho 		if (ps->ps_freq != 0)
    709       1.33    jruoho 			evcnt_detach(&ps->ps_evcnt);
    710       1.33    jruoho 	}
    711       1.33    jruoho 
    712       1.33    jruoho 	for (i = 0; i < sc->sc_tstate_count; i++) {
    713       1.33    jruoho 
    714       1.33    jruoho 		ts = &sc->sc_tstate[i];
    715       1.33    jruoho 
    716       1.33    jruoho 		if (ts->ts_percent != 0)
    717       1.33    jruoho 			evcnt_detach(&ts->ts_evcnt);
    718       1.33    jruoho 	}
    719       1.33    jruoho }
    720       1.33    jruoho 
    721       1.33    jruoho static void
    722       1.30    jruoho acpicpu_debug_print(device_t self)
    723       1.29    jruoho {
    724       1.30    jruoho 	struct acpicpu_softc *sc = device_private(self);
    725       1.30    jruoho 	struct cpu_info *ci = sc->sc_ci;
    726       1.32    jruoho 	struct acpicpu_cstate *cs;
    727       1.32    jruoho 	struct acpicpu_pstate *ps;
    728       1.32    jruoho 	struct acpicpu_tstate *ts;
    729       1.32    jruoho 	static bool once = false;
    730       1.29    jruoho 	struct acpicpu_dep *dep;
    731       1.32    jruoho 	uint32_t i, method;
    732       1.32    jruoho 
    733       1.32    jruoho 	if (once != true) {
    734       1.32    jruoho 
    735       1.32    jruoho 		for (i = 0; i < __arraycount(sc->sc_cstate); i++) {
    736       1.32    jruoho 
    737       1.32    jruoho 			cs = &sc->sc_cstate[i];
    738       1.32    jruoho 
    739       1.32    jruoho 			if (cs->cs_method == 0)
    740       1.32    jruoho 				continue;
    741       1.32    jruoho 
    742       1.32    jruoho 			aprint_verbose_dev(sc->sc_dev, "C%d: %3s, "
    743       1.35    jruoho 			    "lat %3u us, pow %5u mW%s\n", i,
    744       1.45    jruoho 			    acpicpu_debug_print_method_c(cs->cs_method),
    745       1.32    jruoho 			    cs->cs_latency, cs->cs_power,
    746       1.35    jruoho 			    (cs->cs_flags != 0) ? ", bus master check" : "");
    747       1.32    jruoho 		}
    748       1.32    jruoho 
    749       1.32    jruoho 		method = sc->sc_pstate_control.reg_spaceid;
    750       1.32    jruoho 
    751       1.32    jruoho 		for (i = 0; i < sc->sc_pstate_count; i++) {
    752       1.32    jruoho 
    753       1.32    jruoho 			ps = &sc->sc_pstate[i];
    754       1.32    jruoho 
    755       1.32    jruoho 			if (ps->ps_freq == 0)
    756       1.32    jruoho 				continue;
    757       1.32    jruoho 
    758       1.32    jruoho 			aprint_verbose_dev(sc->sc_dev, "P%d: %3s, "
    759       1.35    jruoho 			    "lat %3u us, pow %5u mW, %4u MHz%s\n", i,
    760       1.45    jruoho 			    acpicpu_debug_print_method_pt(method),
    761       1.35    jruoho 			    ps->ps_latency, ps->ps_power, ps->ps_freq,
    762       1.35    jruoho 			    (ps->ps_flags & ACPICPU_FLAG_P_TURBO) != 0 ?
    763       1.35    jruoho 			    ", turbo boost" : "");
    764       1.32    jruoho 		}
    765       1.32    jruoho 
    766       1.32    jruoho 		method = sc->sc_tstate_control.reg_spaceid;
    767       1.32    jruoho 
    768       1.32    jruoho 		for (i = 0; i < sc->sc_tstate_count; i++) {
    769       1.32    jruoho 
    770       1.32    jruoho 			ts = &sc->sc_tstate[i];
    771       1.32    jruoho 
    772       1.32    jruoho 			if (ts->ts_percent == 0)
    773       1.32    jruoho 				continue;
    774       1.32    jruoho 
    775       1.32    jruoho 			aprint_verbose_dev(sc->sc_dev, "T%u: %3s, "
    776       1.32    jruoho 			    "lat %3u us, pow %5u mW, %3u %%\n", i,
    777       1.45    jruoho 			    acpicpu_debug_print_method_pt(method),
    778       1.32    jruoho 			    ts->ts_latency, ts->ts_power, ts->ts_percent);
    779       1.32    jruoho 		}
    780       1.32    jruoho 
    781       1.32    jruoho 		once = true;
    782       1.32    jruoho 	}
    783       1.29    jruoho 
    784       1.30    jruoho 	aprint_debug_dev(sc->sc_dev, "id %u, lapic id %u, "
    785       1.30    jruoho 	    "cap 0x%04x, flags 0x%08x\n", ci->ci_acpiid,
    786       1.30    jruoho 	    (uint32_t)ci->ci_cpuid, sc->sc_cap, sc->sc_flags);
    787       1.30    jruoho 
    788       1.29    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_C_DEP) != 0) {
    789       1.29    jruoho 
    790       1.29    jruoho 		dep = &sc->sc_cstate_dep;
    791       1.29    jruoho 
    792       1.29    jruoho 		aprint_debug_dev(sc->sc_dev, "C-state coordination: "
    793       1.29    jruoho 		    "%u CPUs, domain %u, type %s\n", dep->dep_ncpus,
    794       1.29    jruoho 		    dep->dep_domain, acpicpu_debug_print_dep(dep->dep_type));
    795       1.29    jruoho 	}
    796       1.29    jruoho 
    797       1.29    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_P_DEP) != 0) {
    798       1.29    jruoho 
    799       1.29    jruoho 		dep = &sc->sc_pstate_dep;
    800       1.29    jruoho 
    801       1.29    jruoho 		aprint_debug_dev(sc->sc_dev, "P-state coordination: "
    802       1.29    jruoho 		    "%u CPUs, domain %u, type %s\n", dep->dep_ncpus,
    803       1.29    jruoho 		    dep->dep_domain, acpicpu_debug_print_dep(dep->dep_type));
    804       1.29    jruoho 	}
    805       1.29    jruoho 
    806       1.29    jruoho 	if ((sc->sc_flags & ACPICPU_FLAG_T_DEP) != 0) {
    807       1.29    jruoho 
    808       1.29    jruoho 		dep = &sc->sc_tstate_dep;
    809       1.29    jruoho 
    810       1.29    jruoho 		aprint_debug_dev(sc->sc_dev, "T-state coordination: "
    811       1.29    jruoho 		    "%u CPUs, domain %u, type %s\n", dep->dep_ncpus,
    812       1.29    jruoho 		    dep->dep_domain, acpicpu_debug_print_dep(dep->dep_type));
    813       1.29    jruoho 	}
    814       1.29    jruoho }
    815       1.29    jruoho 
    816       1.29    jruoho static const char *
    817       1.45    jruoho acpicpu_debug_print_method_c(uint8_t val)
    818       1.32    jruoho {
    819       1.32    jruoho 
    820       1.40    jruoho 	if (val == ACPICPU_C_STATE_FFH)
    821       1.40    jruoho 		return "FFH";
    822       1.32    jruoho 
    823       1.40    jruoho 	if (val == ACPICPU_C_STATE_HALT)
    824       1.32    jruoho 		return "HLT";
    825       1.32    jruoho 
    826       1.40    jruoho 	if (val == ACPICPU_C_STATE_SYSIO)
    827       1.40    jruoho 		return "I/O";
    828       1.32    jruoho 
    829       1.45    jruoho 	return "???";
    830       1.45    jruoho }
    831       1.45    jruoho 
    832       1.45    jruoho static const char *
    833       1.45    jruoho acpicpu_debug_print_method_pt(uint8_t val)
    834       1.45    jruoho {
    835       1.45    jruoho 
    836       1.40    jruoho 	if (val == ACPI_ADR_SPACE_SYSTEM_IO)
    837       1.32    jruoho 		return "I/O";
    838       1.32    jruoho 
    839       1.40    jruoho 	if (val == ACPI_ADR_SPACE_FIXED_HARDWARE)
    840       1.40    jruoho 		return "FFH";
    841       1.40    jruoho 
    842       1.40    jruoho 	return "???";
    843       1.32    jruoho }
    844       1.32    jruoho 
    845       1.32    jruoho static const char *
    846       1.29    jruoho acpicpu_debug_print_dep(uint32_t val)
    847       1.29    jruoho {
    848       1.29    jruoho 
    849       1.29    jruoho 	switch (val) {
    850       1.29    jruoho 
    851       1.29    jruoho 	case ACPICPU_DEP_SW_ALL:
    852       1.29    jruoho 		return "SW_ALL";
    853       1.29    jruoho 
    854       1.29    jruoho 	case ACPICPU_DEP_SW_ANY:
    855       1.29    jruoho 		return "SW_ANY";
    856       1.29    jruoho 
    857       1.29    jruoho 	case ACPICPU_DEP_HW_ALL:
    858       1.29    jruoho 		return "HW_ALL";
    859       1.29    jruoho 
    860       1.29    jruoho 	default:
    861       1.29    jruoho 		return "unknown";
    862       1.29    jruoho 	}
    863       1.29    jruoho }
    864       1.29    jruoho 
    865        1.1    jruoho MODULE(MODULE_CLASS_DRIVER, acpicpu, NULL);
    866        1.1    jruoho 
    867       1.26    jruoho #ifdef _MODULE
    868       1.26    jruoho #include "ioconf.c"
    869       1.26    jruoho #endif
    870        1.1    jruoho 
    871        1.1    jruoho static int
    872       1.26    jruoho acpicpu_modcmd(modcmd_t cmd, void *aux)
    873        1.1    jruoho {
    874       1.26    jruoho 	int rv = 0;
    875        1.1    jruoho 
    876        1.1    jruoho 	switch (cmd) {
    877        1.1    jruoho 
    878        1.1    jruoho 	case MODULE_CMD_INIT:
    879        1.1    jruoho 
    880       1.26    jruoho #ifdef _MODULE
    881       1.26    jruoho 		rv = config_init_component(cfdriver_ioconf_acpicpu,
    882       1.26    jruoho 		    cfattach_ioconf_acpicpu, cfdata_ioconf_acpicpu);
    883       1.26    jruoho #endif
    884       1.26    jruoho 		break;
    885        1.1    jruoho 
    886        1.1    jruoho 	case MODULE_CMD_FINI:
    887        1.1    jruoho 
    888       1.26    jruoho #ifdef _MODULE
    889       1.26    jruoho 		rv = config_fini_component(cfdriver_ioconf_acpicpu,
    890       1.26    jruoho 		    cfattach_ioconf_acpicpu, cfdata_ioconf_acpicpu);
    891       1.26    jruoho #endif
    892       1.26    jruoho 		break;
    893        1.1    jruoho 
    894        1.1    jruoho 	default:
    895       1.26    jruoho 		rv = ENOTTY;
    896        1.1    jruoho 	}
    897       1.26    jruoho 
    898       1.26    jruoho 	return rv;
    899        1.1    jruoho }
    900