xref: /onnv-gate/usr/src/uts/sun4u/sys/cpudrv_mach.h (revision 8906:e559381f1e2b)
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 /*
22*8906SEric.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 #ifndef _SYS_CPUDRV_MACH_H
277319SMark.Haywood@Sun.COM #define	_SYS_CPUDRV_MACH_H
287319SMark.Haywood@Sun.COM 
297319SMark.Haywood@Sun.COM #include <sys/cpu_module.h>
307319SMark.Haywood@Sun.COM #include <sys/cpudrv.h>
317319SMark.Haywood@Sun.COM 
327319SMark.Haywood@Sun.COM #ifdef  __cplusplus
337319SMark.Haywood@Sun.COM extern "C" {
347319SMark.Haywood@Sun.COM #endif
357319SMark.Haywood@Sun.COM 
367319SMark.Haywood@Sun.COM /*
377319SMark.Haywood@Sun.COM  * We currently refuse to power manage if the CPU in not ready to
387319SMark.Haywood@Sun.COM  * take cross calls (cross calls fail silently if CPU is not ready
397319SMark.Haywood@Sun.COM  * for it).
407319SMark.Haywood@Sun.COM  */
41*8906SEric.Saxe@Sun.COM #define	CPUDRV_XCALL_IS_READY(cpuid) (CPU_XCALL_READY(cpuid))
427319SMark.Haywood@Sun.COM 
437319SMark.Haywood@Sun.COM /*
447319SMark.Haywood@Sun.COM  * Currently, there is no governor on sun4u,
457319SMark.Haywood@Sun.COM  */
46*8906SEric.Saxe@Sun.COM #define	CPUDRV_RESET_GOVERNOR_THREAD(cpupm)
477319SMark.Haywood@Sun.COM 
487319SMark.Haywood@Sun.COM /*
497319SMark.Haywood@Sun.COM  * Currently, there is no need for a handler on sun4u.
507319SMark.Haywood@Sun.COM  */
51*8906SEric.Saxe@Sun.COM #define	CPUDRV_INSTALL_MAX_CHANGE_HANDLER(cpuid)
527319SMark.Haywood@Sun.COM 
537319SMark.Haywood@Sun.COM /*
548409SMark.Haywood@Sun.COM  * Topspeed is always the head speed.
558409SMark.Haywood@Sun.COM  */
56*8906SEric.Saxe@Sun.COM #define	CPUDRV_TOPSPEED(cpupm)	(cpupm)->head_spd
578409SMark.Haywood@Sun.COM 
588409SMark.Haywood@Sun.COM /*
597319SMark.Haywood@Sun.COM  * There is no notion of changing topspeed on sun4u.
607319SMark.Haywood@Sun.COM  */
61*8906SEric.Saxe@Sun.COM #define	CPUDRV_REDEFINE_TOPSPEED(dip)
627319SMark.Haywood@Sun.COM 
637319SMark.Haywood@Sun.COM /*
647319SMark.Haywood@Sun.COM  * There are no PPM callbacks for sun4u.
657319SMark.Haywood@Sun.COM  */
66*8906SEric.Saxe@Sun.COM #define	CPUDRV_SET_PPM_CALLBACKS()
677319SMark.Haywood@Sun.COM 
687319SMark.Haywood@Sun.COM /*
697319SMark.Haywood@Sun.COM  * clock-divisors property tells the supported speeds
707319SMark.Haywood@Sun.COM  * as divisors of the normal speed. Divisors are in increasing
717319SMark.Haywood@Sun.COM  * order starting with 1 (for normal speed). For example, a
727319SMark.Haywood@Sun.COM  * property value of "1, 2, 32" represents full, 1/2 and 1/32
737319SMark.Haywood@Sun.COM  * speeds.
747319SMark.Haywood@Sun.COM  */
75*8906SEric.Saxe@Sun.COM #define	CPUDRV_GET_SPEEDS(cpudsp, speeds, nspeeds) { \
767319SMark.Haywood@Sun.COM 	if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, cpudsp->dip, \
777319SMark.Haywood@Sun.COM 	    DDI_PROP_DONTPASS, "clock-divisors", &speeds, \
787319SMark.Haywood@Sun.COM 	    &nspeeds) != DDI_PROP_SUCCESS) { \
79*8906SEric.Saxe@Sun.COM 		nspeeds = 0; \
80*8906SEric.Saxe@Sun.COM 		DPRINTF(D_PM_INIT, ("cpudrv_init: instance %d: " \
817319SMark.Haywood@Sun.COM 		    "clock-divisors property not defined\n", \
82*8906SEric.Saxe@Sun.COM 		    ddi_get_instance(cpudsp->dip))); \
837319SMark.Haywood@Sun.COM 	} \
847319SMark.Haywood@Sun.COM }
85*8906SEric.Saxe@Sun.COM #define	CPUDRV_FREE_SPEEDS(speeds, nspeeds) { \
86*8906SEric.Saxe@Sun.COM 	if (nspeeds > 0) \
87*8906SEric.Saxe@Sun.COM 		ddi_prop_free(speeds); \
88*8906SEric.Saxe@Sun.COM }
897319SMark.Haywood@Sun.COM 
907319SMark.Haywood@Sun.COM /*
917319SMark.Haywood@Sun.COM  * Convert speed to Hz.
927319SMark.Haywood@Sun.COM  */
93*8906SEric.Saxe@Sun.COM #define	CPUDRV_SPEED_HZ(mhz, divisor) (((uint64_t)mhz * 1000000) / divisor)
947319SMark.Haywood@Sun.COM 
957319SMark.Haywood@Sun.COM /*
967319SMark.Haywood@Sun.COM  * Compute the idle cnt percentage for a given speed.
977319SMark.Haywood@Sun.COM  */
98*8906SEric.Saxe@Sun.COM #define	CPUDRV_IDLE_CNT_PERCENT(hwm, speeds, i) \
997319SMark.Haywood@Sun.COM 	(100 - ((100 - hwm) * speeds[i]))
1007319SMark.Haywood@Sun.COM 
1017319SMark.Haywood@Sun.COM /*
1027319SMark.Haywood@Sun.COM  * Compute the user cnt percentage for a given speed.
1037319SMark.Haywood@Sun.COM  */
104*8906SEric.Saxe@Sun.COM #define	CPUDRV_USER_CNT_PERCENT(hwm, speeds, i) \
1057319SMark.Haywood@Sun.COM 	((hwm * speeds[i - 1]) / speeds[i])
1067319SMark.Haywood@Sun.COM 
1077319SMark.Haywood@Sun.COM /*
1087319SMark.Haywood@Sun.COM  * pm-components property defintions for sun4u.
1097319SMark.Haywood@Sun.COM  *
1107319SMark.Haywood@Sun.COM  * Fully constructed pm-components property should be an array of
1117319SMark.Haywood@Sun.COM  * strings that look something like:
1127319SMark.Haywood@Sun.COM  *
1137319SMark.Haywood@Sun.COM  * pmc[0] = "NAME=CPU Speed"
1147319SMark.Haywood@Sun.COM  * pmc[1] = "1=1/32 of Normal"
1157319SMark.Haywood@Sun.COM  * pmc[2] = "2=1/2 of Normal"
1167319SMark.Haywood@Sun.COM  * pmc[3] = "3=Normal"
1177319SMark.Haywood@Sun.COM  *
1187319SMark.Haywood@Sun.COM  * The amount of memory needed for each string is:
1197319SMark.Haywood@Sun.COM  *      digits for power level + '=' + '1/' + digits for speed +
1207319SMark.Haywood@Sun.COM  *      description text + '\0'
1217319SMark.Haywood@Sun.COM  */
122*8906SEric.Saxe@Sun.COM #define	CPUDRV_COMP_NORMAL "Normal"
123*8906SEric.Saxe@Sun.COM #define	CPUDRV_COMP_OTHER " of Normal"
124*8906SEric.Saxe@Sun.COM #define	CPUDRV_COMP_SIZE() \
125*8906SEric.Saxe@Sun.COM 	(CPUDRV_COMP_MAX_DIG + 1 + 2 + CPUDRV_COMP_MAX_DIG + \
126*8906SEric.Saxe@Sun.COM 	    sizeof (CPUDRV_COMP_OTHER) + 1);
127*8906SEric.Saxe@Sun.COM #define	CPUDRV_COMP_SPEED(cpupm, cur_spd) \
1287319SMark.Haywood@Sun.COM 	((cur_spd == cpupm->head_spd) ? cur_spd->pm_level : cur_spd->speed)
129*8906SEric.Saxe@Sun.COM #define	CPUDRV_COMP_SPRINT(pmc, cpupm, cur_spd, comp_spd) { \
1307319SMark.Haywood@Sun.COM 	if (cur_spd == cpupm->head_spd) \
131*8906SEric.Saxe@Sun.COM 		(void) sprintf(pmc, "%d=%s", comp_spd, CPUDRV_COMP_NORMAL);\
1327319SMark.Haywood@Sun.COM 	else \
1337319SMark.Haywood@Sun.COM 		(void) sprintf(pmc, "%d=1/%d%s", cur_spd->pm_level, \
134*8906SEric.Saxe@Sun.COM 		    comp_spd, CPUDRV_COMP_OTHER); \
1357319SMark.Haywood@Sun.COM }
1367319SMark.Haywood@Sun.COM 
1377319SMark.Haywood@Sun.COM #ifdef  __cplusplus
1387319SMark.Haywood@Sun.COM }
1397319SMark.Haywood@Sun.COM #endif
1407319SMark.Haywood@Sun.COM 
1417319SMark.Haywood@Sun.COM #endif /* _SYS_CPUDRV_MACH_H */
142