static void
acpi_cpu_cx_probe(struct acpi_cpu_softc *sc)
{
    ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);

    /* Use initial sleep value of 1 sec. to start with lowest idle state. */
    sc->cpu_prev_sleep = 1000000;
    sc->cpu_cx_lowest = 0;

    /*
     * Check for the ACPI 2.0 _CST sleep states object. If we can't find
     * any, we'll revert to generic FADT/P_BLK Cx control method which will
     * be handled by acpi_cpu_startup. We need to defer to after having
     * probed all the cpus in the system before probing for generic Cx
     * states as we may already have found cpus with valid _CST packages
     */
    if (!cpu_cx_generic && acpi_cpu_cx_cst(sc) != 0) {
	/*
	 * We were unable to find a _CST package for this cpu or there
	 * was an error parsing it. Switch back to generic mode.
	 */
	cpu_cx_generic = TRUE;
	if (bootverbose)
	    device_printf(sc->cpu_dev, "switching to generic Cx mode\n");
    }

    /*
     * TODO: _CSD Package should be checked here.
     */
}
Esempio n. 2
0
/*
 * Re-evaluate the _CST object when we are notified that it changed.
 *
 * XXX Re-evaluation disabled until locking is done.
 */
static void
acpi_cpu_cst_notify(device_t dev)
{
    struct acpi_cpu_softc *sc = device_get_softc(dev);
    struct acpi_cpu_softc *isc;
    int i;
    
    /* Update the list of Cx states. */
    acpi_cpu_cx_cst(sc);
    acpi_cpu_cx_list(sc);

    /* Update the new lowest useable Cx state for all CPUs. */
    crit_enter();
    cpu_cx_count = 0;
    for (i = 0; i < cpu_ndevices; i++) {
	isc = device_get_softc(cpu_devices[i]);
	if (isc->cpu_cx_count > cpu_cx_count)
	    cpu_cx_count = isc->cpu_cx_count;
    }
    crit_exit();
}
/*
 * Re-evaluate the _CST object when we are notified that it changed.
 *
 * XXX Re-evaluation disabled until locking is done.
 */
static void
acpi_cpu_notify(ACPI_HANDLE h, UINT32 notify, void *context)
{
    struct acpi_cpu_softc *sc = (struct acpi_cpu_softc *)context;
    struct acpi_cpu_softc *isc;
    int i;
    
    if (notify != ACPI_NOTIFY_CX_STATES)
	return;

    /* Update the list of Cx states. */
    acpi_cpu_cx_cst(sc);
    acpi_cpu_cx_list(sc);

    /* Update the new lowest useable Cx state for all CPUs. */
    ACPI_SERIAL_BEGIN(cpu);
    cpu_cx_count = 0;
    for (i = 0; i < cpu_ndevices; i++) {
	isc = device_get_softc(cpu_devices[i]);
	if (isc->cpu_cx_count > cpu_cx_count)
	    cpu_cx_count = isc->cpu_cx_count;
    }
    ACPI_SERIAL_END(cpu);
}