17319SMark.Haywood@Sun.COM /*
27319SMark.Haywood@Sun.COM * CDDL HEADER START
37319SMark.Haywood@Sun.COM *
47319SMark.Haywood@Sun.COM * The contents of this file are subject to the terms of the
57319SMark.Haywood@Sun.COM * Common Development and Distribution License (the "License").
67319SMark.Haywood@Sun.COM * You may not use this file except in compliance with the License.
77319SMark.Haywood@Sun.COM *
87319SMark.Haywood@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97319SMark.Haywood@Sun.COM * or http://www.opensolaris.org/os/licensing.
107319SMark.Haywood@Sun.COM * See the License for the specific language governing permissions
117319SMark.Haywood@Sun.COM * and limitations under the License.
127319SMark.Haywood@Sun.COM *
137319SMark.Haywood@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
147319SMark.Haywood@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157319SMark.Haywood@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
167319SMark.Haywood@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
177319SMark.Haywood@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
187319SMark.Haywood@Sun.COM *
197319SMark.Haywood@Sun.COM * CDDL HEADER END
207319SMark.Haywood@Sun.COM */
217319SMark.Haywood@Sun.COM /*
228906SEric.Saxe@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
237319SMark.Haywood@Sun.COM * Use is subject to license terms.
247319SMark.Haywood@Sun.COM */
257319SMark.Haywood@Sun.COM
267319SMark.Haywood@Sun.COM /*
277319SMark.Haywood@Sun.COM * CPU power management driver support for sun4u.
287319SMark.Haywood@Sun.COM */
297319SMark.Haywood@Sun.COM #include <sys/ddi.h>
307319SMark.Haywood@Sun.COM #include <sys/sunddi.h>
318906SEric.Saxe@Sun.COM #include <sys/cpupm.h>
327319SMark.Haywood@Sun.COM #include <sys/cpudrv_mach.h>
337319SMark.Haywood@Sun.COM #include <sys/machsystm.h>
347319SMark.Haywood@Sun.COM
357319SMark.Haywood@Sun.COM /*
367319SMark.Haywood@Sun.COM * Change CPU speed.
377319SMark.Haywood@Sun.COM */
387319SMark.Haywood@Sun.COM int
cpudrv_change_speed(cpudrv_devstate_t * cpudsp,cpudrv_pm_spd_t * new_spd)398906SEric.Saxe@Sun.COM cpudrv_change_speed(cpudrv_devstate_t *cpudsp, cpudrv_pm_spd_t *new_spd)
407319SMark.Haywood@Sun.COM {
417319SMark.Haywood@Sun.COM xc_one(cpudsp->cpu_id, (xcfunc_t *)cpu_change_speed, \
427319SMark.Haywood@Sun.COM (uint64_t)new_spd->speed, 0);
437319SMark.Haywood@Sun.COM return (DDI_SUCCESS);
447319SMark.Haywood@Sun.COM }
457319SMark.Haywood@Sun.COM
467319SMark.Haywood@Sun.COM /*
477319SMark.Haywood@Sun.COM * Determine the cpu_id for the CPU device.
487319SMark.Haywood@Sun.COM */
497319SMark.Haywood@Sun.COM boolean_t
cpudrv_get_cpu_id(dev_info_t * dip,processorid_t * cpu_id)508906SEric.Saxe@Sun.COM cpudrv_get_cpu_id(dev_info_t *dip, processorid_t *cpu_id)
517319SMark.Haywood@Sun.COM {
527319SMark.Haywood@Sun.COM return (dip_to_cpu_id(dip, cpu_id) == DDI_SUCCESS);
537319SMark.Haywood@Sun.COM }
547319SMark.Haywood@Sun.COM
557319SMark.Haywood@Sun.COM /*
567319SMark.Haywood@Sun.COM * A noop for this machine type.
577319SMark.Haywood@Sun.COM */
58*10490SMark.Haywood@Sun.COM /* ARGSUSED */
597319SMark.Haywood@Sun.COM boolean_t
cpudrv_power_ready(cpu_t * cp)6010488SMark.Haywood@Sun.COM cpudrv_power_ready(cpu_t *cp)
617319SMark.Haywood@Sun.COM {
627319SMark.Haywood@Sun.COM return (B_TRUE);
637319SMark.Haywood@Sun.COM }
647319SMark.Haywood@Sun.COM
657319SMark.Haywood@Sun.COM /*
667319SMark.Haywood@Sun.COM * A noop for this machine type.
677319SMark.Haywood@Sun.COM */
687319SMark.Haywood@Sun.COM /* ARGSUSED */
697319SMark.Haywood@Sun.COM boolean_t
cpudrv_is_governor_thread(cpudrv_pm_t * cpupm)708906SEric.Saxe@Sun.COM cpudrv_is_governor_thread(cpudrv_pm_t *cpupm)
717319SMark.Haywood@Sun.COM {
727319SMark.Haywood@Sun.COM return (B_FALSE);
737319SMark.Haywood@Sun.COM }
747319SMark.Haywood@Sun.COM
757319SMark.Haywood@Sun.COM /*
767319SMark.Haywood@Sun.COM * A noop for this machine type.
777319SMark.Haywood@Sun.COM */
787319SMark.Haywood@Sun.COM /*ARGSUSED*/
797319SMark.Haywood@Sun.COM boolean_t
cpudrv_mach_init(cpudrv_devstate_t * cpudsp)808906SEric.Saxe@Sun.COM cpudrv_mach_init(cpudrv_devstate_t *cpudsp)
817319SMark.Haywood@Sun.COM {
827319SMark.Haywood@Sun.COM return (B_TRUE);
837319SMark.Haywood@Sun.COM }
847319SMark.Haywood@Sun.COM
857319SMark.Haywood@Sun.COM /*
868906SEric.Saxe@Sun.COM * On SPARC all instances support power management unless attach fails.
878906SEric.Saxe@Sun.COM * In the case of attach failure, cpudrv_enabled will be false.
887319SMark.Haywood@Sun.COM */
897319SMark.Haywood@Sun.COM /*ARGSUSED*/
908906SEric.Saxe@Sun.COM boolean_t
cpudrv_is_enabled(cpudrv_devstate_t * cpudsp)918906SEric.Saxe@Sun.COM cpudrv_is_enabled(cpudrv_devstate_t *cpudsp)
927319SMark.Haywood@Sun.COM {
938906SEric.Saxe@Sun.COM return (cpudrv_enabled);
947319SMark.Haywood@Sun.COM }
957319SMark.Haywood@Sun.COM
968906SEric.Saxe@Sun.COM void
cpudrv_set_supp_freqs(cpudrv_devstate_t * cpudsp)978906SEric.Saxe@Sun.COM cpudrv_set_supp_freqs(cpudrv_devstate_t *cpudsp)
987319SMark.Haywood@Sun.COM {
998906SEric.Saxe@Sun.COM int *speeds;
1008906SEric.Saxe@Sun.COM uint_t nspeeds;
1018906SEric.Saxe@Sun.COM
1028906SEric.Saxe@Sun.COM CPUDRV_GET_SPEEDS(cpudsp, speeds, nspeeds);
1038906SEric.Saxe@Sun.COM if (nspeeds == 0)
1048906SEric.Saxe@Sun.COM return;
1058906SEric.Saxe@Sun.COM cpupm_set_supp_freqs(cpudsp->cp, speeds, nspeeds);
1068906SEric.Saxe@Sun.COM CPUDRV_FREE_SPEEDS(speeds, nspeeds);
1077319SMark.Haywood@Sun.COM }
108