From owner-svn-src-projects@FreeBSD.ORG Mon Sep 23 18:53:49 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id CF806731; Mon, 23 Sep 2013 18:53:49 +0000 (UTC) (envelope-from jhibbits@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id BCA1821C8; Mon, 23 Sep 2013 18:53:49 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r8NIrnx1094580; Mon, 23 Sep 2013 18:53:49 GMT (envelope-from jhibbits@svn.freebsd.org) Received: (from jhibbits@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r8NIrntY094577; Mon, 23 Sep 2013 18:53:49 GMT (envelope-from jhibbits@svn.freebsd.org) Message-Id: <201309231853.r8NIrntY094577@svn.freebsd.org> From: Justin Hibbits Date: Mon, 23 Sep 2013 18:53:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255823 - in projects/pmac_pmu/sys/powerpc: cpufreq powermac X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 Sep 2013 18:53:49 -0000 Author: jhibbits Date: Mon Sep 23 18:53:48 2013 New Revision: 255823 URL: http://svnweb.freebsd.org/changeset/base/255823 Log: Improve PMU-based cpufreq. This simplifies the logic in the pmufreq code, and simplifies the code in the low-level sleep code, to not depend on the external ap_timebase variable. Modified: projects/pmac_pmu/sys/powerpc/cpufreq/pmufreq.c projects/pmac_pmu/sys/powerpc/powermac/pmu.c projects/pmac_pmu/sys/powerpc/powermac/pmuvar.h Modified: projects/pmac_pmu/sys/powerpc/cpufreq/pmufreq.c ============================================================================== --- projects/pmac_pmu/sys/powerpc/cpufreq/pmufreq.c Mon Sep 23 18:50:47 2013 (r255822) +++ projects/pmac_pmu/sys/powerpc/cpufreq/pmufreq.c Mon Sep 23 18:53:48 2013 (r255823) @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD: head/sys/powerpc/cpu #include #include #include +#include #include #include @@ -83,16 +84,12 @@ DRIVER_MODULE(pmufreq, cpu, pmufreq_driv static void pmufreq_identify(driver_t *driver, device_t parent) { - uint16_t vers; - vers = mfpvr() >> 16; + phandle_t node; + uint32_t min_freq; - /* Check for an MPC7455 CPU */ - switch (vers) { - case MPC7455: - break; - default: - return; - } + node = ofw_bus_get_node(device_get_parent(parent)); + if (OF_getprop(node, "min-clock-frequency", &min_freq, sizeof(min_freq)) == -1) + return; /* Make sure we're not being doubly invoked. */ if (device_find_child(parent, "pmufreq", -1) != NULL) @@ -166,8 +163,8 @@ pmufreq_settings(device_t dev, struct cf sets[0].freq = sc->maxfreq; sets[0].dev = dev; sets[1].freq = sc->minfreq; sets[1].dev = dev; /* Set high latency for CPU frequency changes, it's a tedious process. */ - sets[0].lat = 1000000; - sets[1].lat = 1000000; + sets[0].lat = INT_MAX; + sets[1].lat = INT_MAX; *count = 2; return (0); @@ -186,9 +183,9 @@ pmufreq_set(device_t dev, const struct c sc = device_get_softc(dev); if (set->freq == sc->maxfreq) - speed_sel = 1; - else speed_sel = 0; + else + speed_sel = 1; error = pmu_set_speed(speed_sel); if (error == 0) Modified: projects/pmac_pmu/sys/powerpc/powermac/pmu.c ============================================================================== --- projects/pmac_pmu/sys/powerpc/powermac/pmu.c Mon Sep 23 18:50:47 2013 (r255822) +++ projects/pmac_pmu/sys/powerpc/powermac/pmu.c Mon Sep 23 18:53:48 2013 (r255823) @@ -1126,10 +1126,10 @@ pmu_resume(device_t dev) static register_t sprgs[4]; static register_t srrs[2]; extern void *ap_pcpu; -extern u_quad_t ap_timebase; void pmu_sleep_int(void) { + u_quad_t timebase; register_t hid0; register_t msr; register_t saved_msr; @@ -1141,7 +1141,7 @@ void pmu_sleep_int(void) *(unsigned long *)0x80 = 0x100; saved_msr = mfmsr(); - ap_timebase = mftb(); + timebase = mftb(); flush_disable_caches(); if (PCPU_GET(fputhread) != NULL) save_fpu(PCPU_GET(fputhread)); @@ -1165,6 +1165,7 @@ void pmu_sleep_int(void) while (1) mtmsr(msr); } + mttb(timebase); PCPU_SET(curthread, curthread); PCPU_SET(curpcb, curthread->td_pcb); pmap_activate(curthread); @@ -1176,6 +1177,10 @@ void pmu_sleep_int(void) mtspr(SPR_SRR0, srrs[0]); mtspr(SPR_SRR1, srrs[1]); mtmsr(saved_msr); + if (PCPU_GET(fputhread) == curthread) + enable_fpu(curthread); + if (PCPU_GET(vecthread) == curthread) + enable_vec(curthread); powerpc_sync(); } @@ -1205,7 +1210,7 @@ pmu_sleep(SYSCTL_HANDLER_ARGS) } int -pmu_set_speed(int high_speed) +pmu_set_speed(int low_speed) { struct pmu_softc *sc; uint8_t sleepcmd[] = {'W', 'O', 'O', 'F', 0}; @@ -1218,17 +1223,13 @@ pmu_set_speed(int high_speed) mb(); mtdec(0x7fffffff); - /* The PMU speed change command actually uses '1' to denote low-speed. */ - if (high_speed) - sleepcmd[4] = 0; - else - sleepcmd[4] = 1; - + sleepcmd[4] = low_speed; pmu_send(sc, PMU_CPU_SPEED, 5, sleepcmd, 16, resp); unin_chip_sleep(NULL, 1); pmu_sleep_int(); unin_chip_wake(NULL); + mtdec(1); /* Force a decrementer exception */ spinlock_exit(); pmu_write_reg(sc, vIER, 0x90); Modified: projects/pmac_pmu/sys/powerpc/powermac/pmuvar.h ============================================================================== --- projects/pmac_pmu/sys/powerpc/powermac/pmuvar.h Mon Sep 23 18:50:47 2013 (r255822) +++ projects/pmac_pmu/sys/powerpc/powermac/pmuvar.h Mon Sep 23 18:53:48 2013 (r255823) @@ -173,6 +173,6 @@ struct pmu_battstate { int voltage; }; -int pmu_set_speed(int high_speed); +int pmu_set_speed(int low_speed); #endif /* PMUVAR_H */