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