On Sun, May 15, 2011 at 03:56:16PM +0530, Martin Pieuchot wrote: > 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 .
Man page looks ok to me. Changes to GENERIC we usually wait for Theo to ok as I understand it. The driver itself, as a mac mini owner, I can't test so I won't comment on other to say that it reads fine to me. .... Ken