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