On 04/05/11(Wed) 20:29, Miod Vallat wrote: > > > Speaking of DELAY()... it is implemented using the processor internal > > > counter register. Is this register impacted by frequency changes? If so, > > > shouldn't you update the computed ns_per_tick delay() constant? > > > > Reading the doc again, it's said that the time base register is clocked > > at one-fourth of the bus clock. But the DFS feature divides the processor > > to system bus ratio. So, if I understand well there is no impact on the > > time base counter frequency. > > Good. This is easy to check, does ntpd start complaining after running a > few minutes at `setperf=0' speed? > > > Index: sys/arch/macppc/dev/dfs.c > > > +#include <sys/param.h> > > +#include <sys/filedesc.h> > > Could you use <sys/proc.h> instead of <sys/filedesc.h> here? This is the > preferred (yet objectionable) form of satisfying <sys/sysctl.h> > dependencies. > > > +struct cfattach dfs_ca = { > > + sizeof(struct device), dfs_match, dfs_attach > > This needs to be sizeof(struct dfs_softc) now. That is, unless you want > to get funny panics after dfs0 attaches.
After some tests and discussions with the powermac owners it appears that there is no obvious way to enable dfs on these machines. So no dfs support for the mac mini. Updated diff, now looking for oks for the driver and the manpage. Martin Index: conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/macppc/conf/GENERIC,v retrieving revision 1.207 diff -u -p -r1.207 GENERIC --- conf/GENERIC 19 Apr 2011 23:07:54 -0000 1.207 +++ conf/GENERIC 15 May 2011 09:25:14 -0000 @@ -155,6 +155,7 @@ macgpio* at macobio? # GPIO, PMU interru macgpio* at macgpio? # GPIO, PMU interrupt router. sysbutton* at macgpio? # Xserve system id button. pgs* at macgpio? # Programmer Switch. +dfs* at macgpio? # Dynamic Frequence Switching. akbd* at adb? # ADB keyboard wskbd* at akbd? mux 1 ams* at adb? # ADB mouse Index: conf/files.macppc =================================================================== RCS file: /cvs/src/sys/arch/macppc/conf/files.macppc,v retrieving revision 1.63 diff -u -p -r1.63 files.macppc --- conf/files.macppc 6 Dec 2010 20:10:18 -0000 1.63 +++ conf/files.macppc 15 May 2011 09:25:14 -0000 @@ -237,6 +237,10 @@ device pgs {} attach pgs at macgpio file arch/macppc/dev/pgs.c +device dfs {} +attach dfs at macgpio +file arch/macppc/dev/dfs.c + attach wdc at mediabay, macobio, kauaiata with wdc_obio file arch/macppc/dev/wdc_obio.c wdc_obio Index: dev/dfs.c =================================================================== RCS file: dev/dfs.c diff -N dev/dfs.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ dev/dfs.c 15 May 2011 09:25:14 -0000 @@ -0,0 +1,167 @@ +/* $OpenBSD$ */ +/* + * Copyright (c) 2011 Martin Pieuchot <m...@nolizard.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/param.h> +#include <sys/proc.h> +#include <sys/sysctl.h> + +#include <dev/ofw/openfirm.h> + +#include <machine/cpu.h> +#include <machine/autoconf.h> +#include <macppc/pci/macobio.h> + +#define DFS2 (1 << 22) /* Divide-by-Two */ +#define DFS4 (1 << 23) /* Divide-by-Four (MPC7448 Specific) */ + +extern int perflevel; + +struct dfs_softc { + struct device sc_dev; + int sc_voltage; +}; + +int dfs_match(struct device *, void *, void *); +void dfs_attach(struct device *, struct device *, void *); +void dfs_setperf(int); +void dfs_scale_frequency(u_int); + +struct cfattach dfs_ca = { + sizeof(struct dfs_softc), dfs_match, dfs_attach +}; + +struct cfdriver dfs_cd = { + NULL, "dfs", DV_DULL +}; + +int +dfs_match(struct device *parent, void *arg, void *aux) +{ + struct confargs *ca = aux; + uint16_t cpu; + + if (strcmp(ca->ca_name, "cpu-vcore-select") != 0) + return (0); + + cpu = ppc_mfpvr() >> 16; + if (cpu == PPC_CPU_MPC7447A || cpu == PPC_CPU_MPC7448) + return (1); + + return (0); +} + +void +dfs_attach(struct device *parent, struct device *self, void *aux) +{ + struct dfs_softc *sc = (struct dfs_softc *)self; + struct confargs *ca = aux; + uint32_t hid1, reg; + uint16_t cpu; + + /* + * On some models the vcore-select offset is relative to + * its parent offset and not to the bus base address. + */ + OF_getprop(OF_parent(ca->ca_node), "reg", ®, sizeof(reg)); + if (reg > ca->ca_reg[0]) + sc->sc_voltage = reg + ca->ca_reg[0]; + else + sc->sc_voltage = ca->ca_reg[0]; + + hid1 = ppc_mfhid1(); + + if (hid1 & DFS4) { + ppc_curfreq = ppc_maxfreq / 4; + perflevel = 25; + } else if (hid1 & DFS2) { + ppc_curfreq = ppc_maxfreq / 2; + perflevel = 50; + } + + cpu_setperf = dfs_setperf; + + printf(": speeds: %d, %d", ppc_maxfreq, ppc_maxfreq / 2); + + cpu = ppc_mfpvr() >> 16; + if (cpu == PPC_CPU_MPC7448) + printf(", %d", ppc_maxfreq / 4); + printf(" MHz\n"); +} + +void +dfs_setperf(int perflevel) +{ + struct dfs_softc *sc = dfs_cd.cd_devs[0]; + + if (perflevel > 50) { + if (ppc_curfreq != ppc_maxfreq) { + macobio_write(sc->sc_voltage, GPIO_DDR_OUTPUT | 1); + delay(1000); + dfs_scale_frequency(FREQ_FULL); + } + } else { + uint16_t cpu; + + cpu = ppc_mfpvr() >> 16; + if (cpu == PPC_CPU_MPC7448 && perflevel <= 25) { + if (ppc_curfreq != ppc_maxfreq / 4) { + dfs_scale_frequency(FREQ_QUARTER); + macobio_write(sc->sc_voltage, + GPIO_DDR_OUTPUT | 0); + delay(1000); + } + } else { + if (ppc_curfreq != ppc_maxfreq / 2) { + dfs_scale_frequency(FREQ_HALF); + macobio_write(sc->sc_voltage, + GPIO_DDR_OUTPUT | 0); + delay(1000); + } + } + } +} + +void +dfs_scale_frequency(u_int freq_scale) +{ + uint32_t hid1; + int s; + + s = splhigh(); + hid1 = ppc_mfhid1(); + + hid1 &= ~(DFS2 | DFS4); + switch (freq_scale) { + case FREQ_QUARTER: + hid1 |= DFS4; + ppc_curfreq = ppc_maxfreq / 4; + break; + case FREQ_HALF: + hid1 |= DFS2; + ppc_curfreq = ppc_maxfreq / 2; + break; + case FREQ_FULL: /* FALLTHROUGH */ + default: + ppc_curfreq = ppc_maxfreq; + } + + asm volatile ("sync"); + ppc_mthid1(hid1); + asm volatile ("sync; isync"); + + splx(s); +} Index: Makefile =================================================================== RCS file: /cvs/src/share/man/man4/man4.macppc/Makefile,v retrieving revision 1.33 diff -u -p -r1.33 Makefile --- Makefile 9 Apr 2010 19:25:38 -0000 1.33 +++ Makefile 15 May 2011 09:34:50 -0000 @@ -3,7 +3,7 @@ # Id: Makefile,v 1.4 1995/12/14 05:41:38 deraadt Exp $ MAN= abtn.4 adb.4 aoa.4 apm.4 asms.4 autoconf.4 awacs.4 \ - bm.4 daca.4 esp.4 fcu.4 ht.4 intro.4 \ + bm.4 daca.4 dfs.4 esp.4 fcu.4 ht.4 intro.4 \ kauaiata.4 kiic.4 macobio.4 macgpio.4 mc.4 mediabay.4 mem.4 memc.4 \ mesh.4 mpcpcibr.4 openpic.4 openprom.4 onyx.4 pgs.4 piic.4 smu.4 \ snapper.4 sysbutton.4 tpms.4 tumbler.4 xlights.4 zs.4 Index: dfs.4 =================================================================== RCS file: dfs.4 diff -N dfs.4 --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ dfs.4 15 May 2011 09:34:50 -0000 @@ -0,0 +1,53 @@ +.\" $OpenBSD$ +.\" +.\" Copyright (c) 2011 Martin Pieuchot <m...@nolizard.org> +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd $Mdocdate: April 27 2011 $ +.Dt DFS 4 macppc +.Os +.Sh NAME +.Nm dfs +.Nd Dynamic Frequence Switching +.Sh SYNOPSIS +.Cd "dfs* at macgpio?" +.Sh DESCRIPTION +The +.Nm +driver provides support for the Dynamic Frequence Switching +feature found on some PowerPC microprocessors. +.Pp +It conserves power by lowering the processor operating frequency. +Depending on the processor model, the processor-to-system bus ratio can +be divided by two or four. +.Sh HARDWARE +Processors supported by the +.Nm +driver are part of the PowerPC G4 family and are found on various iBook +and PowerBook machines: +.Bd -literal -offset indent +MPC7447A PowerPC 7447 "Apollo 7" +MPC7448 PowerPC 7448 "Apollo 8" +.Ed +.Sh SEE ALSO +.Xr macgpio 4 , +.Xr sysctl 8 , +.Rs +.%T MPC7450 RISC Microprocessor Family Reference Manual +.Re +.Sh HISTORY +Support for the +.Nm +driver first appeared in +.Ox 5.0 .