xref: /illumos-gate/usr/src/uts/sun4u/sys/cpudrv_mach.h (revision 173531301317dd4f31e83d4785873141e984ab86)
17f606aceSMark Haywood /*
27f606aceSMark Haywood  * CDDL HEADER START
37f606aceSMark Haywood  *
47f606aceSMark Haywood  * The contents of this file are subject to the terms of the
57f606aceSMark Haywood  * Common Development and Distribution License (the "License").
67f606aceSMark Haywood  * You may not use this file except in compliance with the License.
77f606aceSMark Haywood  *
87f606aceSMark Haywood  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97f606aceSMark Haywood  * or http://www.opensolaris.org/os/licensing.
107f606aceSMark Haywood  * See the License for the specific language governing permissions
117f606aceSMark Haywood  * and limitations under the License.
127f606aceSMark Haywood  *
137f606aceSMark Haywood  * When distributing Covered Code, include this CDDL HEADER in each
147f606aceSMark Haywood  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157f606aceSMark Haywood  * If applicable, add the following below this CDDL HEADER, with the
167f606aceSMark Haywood  * fields enclosed by brackets "[]" replaced with your own identifying
177f606aceSMark Haywood  * information: Portions Copyright [yyyy] [name of copyright owner]
187f606aceSMark Haywood  *
197f606aceSMark Haywood  * CDDL HEADER END
207f606aceSMark Haywood  */
217f606aceSMark Haywood /*
227f606aceSMark Haywood  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
237f606aceSMark Haywood  * Use is subject to license terms.
247f606aceSMark Haywood  */
257f606aceSMark Haywood 
267f606aceSMark Haywood #ifndef _SYS_CPUDRV_MACH_H
277f606aceSMark Haywood #define	_SYS_CPUDRV_MACH_H
287f606aceSMark Haywood 
297f606aceSMark Haywood #include <sys/cpu_module.h>
307f606aceSMark Haywood #include <sys/cpudrv.h>
317f606aceSMark Haywood 
327f606aceSMark Haywood #ifdef  __cplusplus
337f606aceSMark Haywood extern "C" {
347f606aceSMark Haywood #endif
357f606aceSMark Haywood 
367f606aceSMark Haywood /*
377f606aceSMark Haywood  * We currently refuse to power manage if the CPU in not ready to
387f606aceSMark Haywood  * take cross calls (cross calls fail silently if CPU is not ready
397f606aceSMark Haywood  * for it).
407f606aceSMark Haywood  */
417f606aceSMark Haywood #define	CPUDRV_PM_XCALL_IS_READY(cpuid) (CPU_XCALL_READY(cpuid))
427f606aceSMark Haywood 
437f606aceSMark Haywood /*
447f606aceSMark Haywood  * If a failure occurs during attach(), then CPU power management
457f606aceSMark Haywood  * is disabled.
467f606aceSMark Haywood  */
477f606aceSMark Haywood extern boolean_t cpudrv_enabled;
487f606aceSMark Haywood 
497f606aceSMark Haywood #define	CPUDRV_PM_DISABLE() (cpudrv_enabled = B_FALSE)
507f606aceSMark Haywood 
517f606aceSMark Haywood #define	CPUDRV_PM_DISABLED() (!cpudrv_enabled)
527f606aceSMark Haywood 
537f606aceSMark Haywood #define	CPUDRV_PM_POWER_ENABLED(cpudsp) cpudrv_pm_enabled()
547f606aceSMark Haywood 
557f606aceSMark Haywood /*
567f606aceSMark Haywood  * Currently, there is no governor on sun4u,
577f606aceSMark Haywood  */
587f606aceSMark Haywood #define	CPUDRV_PM_RESET_GOVERNOR_THREAD(cpupm)
597f606aceSMark Haywood 
607f606aceSMark Haywood /*
617f606aceSMark Haywood  * Currently, there is no need for a handler on sun4u.
627f606aceSMark Haywood  */
637f606aceSMark Haywood #define	CPUDRV_PM_INSTALL_MAX_CHANGE_HANDLER(cpudsp, dip)
647f606aceSMark Haywood 
657f606aceSMark Haywood /*
66*17353130SMark Haywood  * Topspeed is always the head speed.
67*17353130SMark Haywood  */
68*17353130SMark Haywood #define	CPUDRV_PM_TOPSPEED(cpupm)	(cpupm)->head_spd
69*17353130SMark Haywood 
70*17353130SMark Haywood /*
717f606aceSMark Haywood  * There is no notion of changing topspeed on sun4u.
727f606aceSMark Haywood  */
737f606aceSMark Haywood #define	CPUDRV_PM_REDEFINE_TOPSPEED(dip)
747f606aceSMark Haywood 
757f606aceSMark Haywood /*
767f606aceSMark Haywood  * There are no PPM callbacks for sun4u.
777f606aceSMark Haywood  */
787f606aceSMark Haywood #define	CPUDRV_PM_SET_PPM_CALLBACKS()
797f606aceSMark Haywood 
807f606aceSMark Haywood /*
817f606aceSMark Haywood  * clock-divisors property tells the supported speeds
827f606aceSMark Haywood  * as divisors of the normal speed. Divisors are in increasing
837f606aceSMark Haywood  * order starting with 1 (for normal speed). For example, a
847f606aceSMark Haywood  * property value of "1, 2, 32" represents full, 1/2 and 1/32
857f606aceSMark Haywood  * speeds.
867f606aceSMark Haywood  */
877f606aceSMark Haywood #define	CPUDRV_PM_GET_SPEEDS(cpudsp, speeds, nspeeds) { \
887f606aceSMark Haywood 	if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, cpudsp->dip, \
897f606aceSMark Haywood 	    DDI_PROP_DONTPASS, "clock-divisors", &speeds, \
907f606aceSMark Haywood 	    &nspeeds) != DDI_PROP_SUCCESS) { \
917f606aceSMark Haywood 		DPRINTF(D_PM_INIT, ("cpudrv_pm_init: instance %d: " \
927f606aceSMark Haywood 		    "clock-divisors property not defined\n", \
937f606aceSMark Haywood 				    ddi_get_instance(cpudsp->dip))); \
947f606aceSMark Haywood 		return (DDI_FAILURE); \
957f606aceSMark Haywood 	} \
967f606aceSMark Haywood }
977f606aceSMark Haywood #define	CPUDRV_PM_FREE_SPEEDS(speeds, unused) ddi_prop_free(speeds);
987f606aceSMark Haywood 
997f606aceSMark Haywood /*
1007f606aceSMark Haywood  * Convert speed to Hz.
1017f606aceSMark Haywood  */
1027f606aceSMark Haywood #define	CPUDRV_PM_SPEED_HZ(mhz, divisor) (((uint64_t)mhz * 1000000) / divisor)
1037f606aceSMark Haywood 
1047f606aceSMark Haywood /*
1057f606aceSMark Haywood  * Compute the idle cnt percentage for a given speed.
1067f606aceSMark Haywood  */
1077f606aceSMark Haywood #define	CPUDRV_PM_IDLE_CNT_PERCENT(hwm, speeds, i) \
1087f606aceSMark Haywood 	(100 - ((100 - hwm) * speeds[i]))
1097f606aceSMark Haywood 
1107f606aceSMark Haywood /*
1117f606aceSMark Haywood  * Compute the user cnt percentage for a given speed.
1127f606aceSMark Haywood  */
1137f606aceSMark Haywood #define	CPUDRV_PM_USER_CNT_PERCENT(hwm, speeds, i) \
1147f606aceSMark Haywood 	((hwm * speeds[i - 1]) / speeds[i])
1157f606aceSMark Haywood 
1167f606aceSMark Haywood /*
1177f606aceSMark Haywood  * pm-components property defintions for sun4u.
1187f606aceSMark Haywood  *
1197f606aceSMark Haywood  * Fully constructed pm-components property should be an array of
1207f606aceSMark Haywood  * strings that look something like:
1217f606aceSMark Haywood  *
1227f606aceSMark Haywood  * pmc[0] = "NAME=CPU Speed"
1237f606aceSMark Haywood  * pmc[1] = "1=1/32 of Normal"
1247f606aceSMark Haywood  * pmc[2] = "2=1/2 of Normal"
1257f606aceSMark Haywood  * pmc[3] = "3=Normal"
1267f606aceSMark Haywood  *
1277f606aceSMark Haywood  * The amount of memory needed for each string is:
1287f606aceSMark Haywood  *      digits for power level + '=' + '1/' + digits for speed +
1297f606aceSMark Haywood  *      description text + '\0'
1307f606aceSMark Haywood  */
1317f606aceSMark Haywood #define	CPUDRV_PM_COMP_NORMAL "Normal"
1327f606aceSMark Haywood #define	CPUDRV_PM_COMP_OTHER " of Normal"
1337f606aceSMark Haywood #define	CPUDRV_PM_COMP_SIZE() \
1347f606aceSMark Haywood 	(CPUDRV_PM_COMP_MAX_DIG + 1 + 2 + CPUDRV_PM_COMP_MAX_DIG + \
1357f606aceSMark Haywood 	    sizeof (CPUDRV_PM_COMP_OTHER) + 1);
1367f606aceSMark Haywood #define	CPUDRV_PM_COMP_SPEED(cpupm, cur_spd) \
1377f606aceSMark Haywood 	((cur_spd == cpupm->head_spd) ? cur_spd->pm_level : cur_spd->speed)
1387f606aceSMark Haywood #define	CPUDRV_PM_COMP_SPRINT(pmc, cpupm, cur_spd, comp_spd) { \
1397f606aceSMark Haywood 	if (cur_spd == cpupm->head_spd) \
1407f606aceSMark Haywood 		(void) sprintf(pmc, "%d=%s", comp_spd, CPUDRV_PM_COMP_NORMAL);\
1417f606aceSMark Haywood 	else \
1427f606aceSMark Haywood 		(void) sprintf(pmc, "%d=1/%d%s", cur_spd->pm_level, \
1437f606aceSMark Haywood 		    comp_spd, CPUDRV_PM_COMP_OTHER); \
1447f606aceSMark Haywood }
1457f606aceSMark Haywood 
1467f606aceSMark Haywood extern boolean_t cpudrv_pm_enabled(void);
1477f606aceSMark Haywood 
1487f606aceSMark Haywood #ifdef  __cplusplus
1497f606aceSMark Haywood }
1507f606aceSMark Haywood #endif
1517f606aceSMark Haywood 
1527f606aceSMark Haywood #endif /* _SYS_CPUDRV_MACH_H */
153