ACPI P-State: Add init method for CPU driver.
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Tue, 7 Jul 2009 05:48:37 +0000 (13:48 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 8 Jul 2009 10:50:47 +0000 (18:50 +0800)
This method could be used by certain Intel ACPI P-State CPU drivers
to set "Enhanced SpeedStep" enable bit in IA32_MISC_ENABLE MSR.

Add a NOP implementation for AMD P-State CPU drivers.

sys/dev/acpica5/acpi_cpu_pstate.c
sys/dev/acpica5/acpi_cpu_pstate.h
sys/platform/pc32/acpica5/acpi_pstate_machdep.c

index 4a7cfa4..22dfa32 100644 (file)
@@ -124,6 +124,7 @@ static int  acpi_pst_domain_set_pstate(struct acpi_pst_domain *, int);
 
 static int     acpi_pst_check_csr(struct acpi_pst_softc *);
 static int     acpi_pst_check_pstates(struct acpi_pst_softc *);
+static int     acpi_pst_init(struct acpi_pst_softc *);
 static int     acpi_pst_set_pstate(struct acpi_pst_softc *,
                    const struct acpi_pstate *);
 static const struct acpi_pstate *
@@ -133,6 +134,7 @@ static int  acpi_pst_alloc_resource(device_t, ACPI_OBJECT *, int,
 
 static void    acpi_pst_check_csr_handler(struct netmsg *);
 static void    acpi_pst_check_pstates_handler(struct netmsg *);
+static void    acpi_pst_init_handler(struct netmsg *);
 static void    acpi_pst_set_pstate_handler(struct netmsg *);
 static void    acpi_pst_get_pstate_handler(struct netmsg *);
 
@@ -719,6 +721,21 @@ acpi_pst_postattach(void *arg __unused)
                        continue;
                }
 
+               /*
+                * Do necssary P-State initialization
+                */
+               LIST_FOREACH(sc, &dom->pd_pstlist, pst_link) {
+                       error = acpi_pst_init(sc);
+                       if (error)
+                               break;
+               }
+               if (sc != NULL) {
+                       kprintf("ACPI: domain%u P-State initialization "
+                               "check failed\n", dom->pd_dom);
+                       dom->pd_flags |= ACPI_PSTDOM_FLAG_DEAD;
+                       continue;
+               }
+
                has_domain = 1;
 
                ksnprintf(buf, sizeof(buf), "px_dom%u", dom->pd_dom);
@@ -939,6 +956,32 @@ acpi_pst_check_pstates(struct acpi_pst_softc *sc)
 }
 
 static void
+acpi_pst_init_handler(struct netmsg *nmsg)
+{
+       struct netmsg_acpi_pst *msg = (struct netmsg_acpi_pst *)nmsg;
+       int error;
+
+       error = acpi_pst_md->pmd_init(msg->ctrl, msg->status);
+       lwkt_replymsg(&nmsg->nm_lmsg, error);
+}
+
+static int
+acpi_pst_init(struct acpi_pst_softc *sc)
+{
+       struct netmsg_acpi_pst msg;
+
+       if (acpi_pst_md == NULL)
+               return 0;
+
+       netmsg_init(&msg.nmsg, &curthread->td_msgport,
+                   MSGF_MPSAFE | MSGF_PRIORITY, acpi_pst_init_handler);
+       msg.ctrl = &sc->pst_creg;
+       msg.status = &sc->pst_sreg;
+
+       return lwkt_domsg(cpu_portfn(sc->pst_cpuid), &msg.nmsg.nm_lmsg, 0);
+}
+
+static void
 acpi_pst_set_pstate_handler(struct netmsg *nmsg)
 {
        struct netmsg_acpi_pst *msg = (struct netmsg_acpi_pst *)nmsg;
index 081e6b0..1d217bd 100644 (file)
@@ -63,6 +63,10 @@ struct acpi_pst_md {
        int                     (*pmd_check_pstates)
                                (const struct acpi_pstate *, int);
 
+       int                     (*pmd_init)
+                               (const struct acpi_pst_res *,
+                                const struct acpi_pst_res *);
+
        int                     (*pmd_set_pstate)
                                (const struct acpi_pst_res *,
                                 const struct acpi_pst_res *,
index 506a9cd..e86f547 100644 (file)
@@ -73,6 +73,8 @@ static int    acpi_pst_amd1x_check_pstates(const struct acpi_pstate *, int,
                    uint32_t, uint32_t);
 static int     acpi_pst_amd10_check_pstates(const struct acpi_pstate *, int);
 static int     acpi_pst_amd0f_check_pstates(const struct acpi_pstate *, int);
+static int     acpi_pst_amd_init(const struct acpi_pst_res *,
+                   const struct acpi_pst_res *);
 static int     acpi_pst_amd1x_set_pstate(const struct acpi_pst_res *,
                    const struct acpi_pst_res *, const struct acpi_pstate *);
 static int     acpi_pst_amd0f_set_pstate(const struct acpi_pst_res *,
@@ -87,6 +89,7 @@ static const struct acpi_pstate *
 static const struct acpi_pst_md        acpi_pst_amd10 = {
        .pmd_check_csr          = acpi_pst_amd_check_csr,
        .pmd_check_pstates      = acpi_pst_amd10_check_pstates,
+       .pmd_init               = acpi_pst_amd_init,
        .pmd_set_pstate         = acpi_pst_amd1x_set_pstate,
        .pmd_get_pstate         = acpi_pst_amd1x_get_pstate
 };
@@ -94,6 +97,7 @@ static const struct acpi_pst_md       acpi_pst_amd10 = {
 static const struct acpi_pst_md        acpi_pst_amd0f = {
        .pmd_check_csr          = acpi_pst_amd_check_csr,
        .pmd_check_pstates      = acpi_pst_amd0f_check_pstates,
+       .pmd_init               = acpi_pst_amd_init,
        .pmd_set_pstate         = acpi_pst_amd0f_set_pstate,
        .pmd_get_pstate         = acpi_pst_amd0f_get_pstate
 };
@@ -329,3 +333,10 @@ acpi_pst_amd0f_get_pstate(const struct acpi_pst_res *status __unused,
        }
        return NULL;
 }
+
+static int
+acpi_pst_amd_init(const struct acpi_pst_res *ctrl __unused,
+                 const struct acpi_pst_res *status __unused)
+{
+       return 0;
+}