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 /* 220e751525SEric Saxe * Copyright 2009 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/cpuvar.h> 307f606aceSMark Haywood #include <sys/cpupm.h> 317f606aceSMark Haywood #include <sys/cpu_acpi.h> 327f606aceSMark Haywood #include <sys/cpudrv.h> 337f606aceSMark Haywood #include <sys/ksynch.h> 347f606aceSMark Haywood 357f606aceSMark Haywood #ifdef __cplusplus 367f606aceSMark Haywood extern "C" { 377f606aceSMark Haywood #endif 387f606aceSMark Haywood 397f606aceSMark Haywood /* 407f606aceSMark Haywood * We currently refuse to power manage if the CPU in not ready to 417f606aceSMark Haywood * take cross calls (cross calls fail silently if CPU is not ready 427f606aceSMark Haywood * for it). 437f606aceSMark Haywood */ 447f606aceSMark Haywood extern cpuset_t cpu_ready_set; 450e751525SEric Saxe #define CPUDRV_XCALL_IS_READY(cpuid) CPU_IN_SET(cpu_ready_set, (cpuid)) 467f606aceSMark Haywood 477f606aceSMark Haywood /* 487f606aceSMark Haywood * We're about to exit the _PPC thread so reset tag. 497f606aceSMark Haywood */ 500e751525SEric Saxe #define CPUDRV_RESET_GOVERNOR_THREAD(cpupm) { \ 517f606aceSMark Haywood if (curthread == cpupm->pm_governor_thread) \ 527f606aceSMark Haywood cpupm->pm_governor_thread = NULL; \ 537f606aceSMark Haywood } 547f606aceSMark Haywood 5517353130SMark Haywood /* 5617353130SMark Haywood * The current top speed as defined by the _PPC. 5717353130SMark Haywood */ 580e751525SEric Saxe #define CPUDRV_TOPSPEED(cpupm) (cpupm)->top_spd 5917353130SMark Haywood 607f606aceSMark Haywood /* 617f606aceSMark Haywood * Install a _PPC/_TPC change notification handler. 627f606aceSMark Haywood */ 630e751525SEric Saxe #define CPUDRV_INSTALL_MAX_CHANGE_HANDLER(cpudsp) \ 640e751525SEric Saxe cpudrv_install_notify_handler(cpudsp); 657f606aceSMark Haywood 66*444f66e7SMark Haywood /* 67*444f66e7SMark Haywood * Uninstall _PPC/_TPC change notification handler. 68*444f66e7SMark Haywood */ 69*444f66e7SMark Haywood #define CPUDRV_UNINSTALL_MAX_CHANGE_HANDLER(cpudsp) \ 70*444f66e7SMark Haywood cpudrv_uninstall_notify_handler(cpudsp); 71*444f66e7SMark Haywood 727f606aceSMark Haywood /* 737f606aceSMark Haywood * Redefine the topspeed. 747f606aceSMark Haywood */ 750e751525SEric Saxe #define CPUDRV_REDEFINE_TOPSPEED(dip) cpudrv_redefine_topspeed(dip) 767f606aceSMark Haywood 777f606aceSMark Haywood /* 787f606aceSMark Haywood * Set callbacks so that PPM can callback into CPUDRV 797f606aceSMark Haywood */ 800e751525SEric Saxe #define CPUDRV_SET_PPM_CALLBACKS() { \ 810e751525SEric Saxe cpupm_get_topspeed_callb = cpudrv_get_topspeed; \ 820e751525SEric Saxe cpupm_set_topspeed_callb = cpudrv_set_topspeed; \ 837f606aceSMark Haywood } 847f606aceSMark Haywood 857f606aceSMark Haywood /* 867f606aceSMark Haywood * ACPI provides the supported speeds. 877f606aceSMark Haywood */ 880e751525SEric Saxe #define CPUDRV_GET_SPEEDS(cpudsp, speeds, nspeeds) \ 890e751525SEric Saxe nspeeds = cpudrv_get_speeds(cpudsp, &speeds); 900e751525SEric Saxe #define CPUDRV_FREE_SPEEDS(speeds, nspeeds) \ 910e751525SEric Saxe cpudrv_free_speeds(speeds, nspeeds); 927f606aceSMark Haywood 937f606aceSMark Haywood /* 940e751525SEric Saxe * ACPI provides the supported C-states. 957f606aceSMark Haywood */ 960e751525SEric Saxe #define CPUDRV_GET_MAX_CSTATES(handle) \ 970e751525SEric Saxe cpu_acpi_get_max_cstates(handle); 987f606aceSMark Haywood 997f606aceSMark Haywood /* 1007f606aceSMark Haywood * Compute the idle cnt percentage for a given speed. 1017f606aceSMark Haywood */ 1020e751525SEric Saxe #define CPUDRV_IDLE_CNT_PERCENT(hwm, speeds, i) \ 1037f606aceSMark Haywood (100 - (((100 - hwm) * speeds[0]) / speeds[i])) 1047f606aceSMark Haywood 1057f606aceSMark Haywood /* 1067f606aceSMark Haywood * Compute the user cnt percentage for a given speed. 1077f606aceSMark Haywood */ 1080e751525SEric Saxe #define CPUDRV_USER_CNT_PERCENT(hwm, speeds, i) \ 1097f606aceSMark Haywood ((hwm * speeds[i]) / speeds[i - 1]); 1107f606aceSMark Haywood 1117f606aceSMark Haywood /* 1127f606aceSMark Haywood * pm-components property defintions for this machine type. 1137f606aceSMark Haywood * 1147f606aceSMark Haywood * Fully constructed pm-components property should be an array of 1157f606aceSMark Haywood * strings that look something like: 1167f606aceSMark Haywood * 1177f606aceSMark Haywood * pmc[0] = "NAME=CPU Speed" 1187f606aceSMark Haywood * pmc[1] = "1=2800MHz" 1197f606aceSMark Haywood * pmc[2] = "2=3200MHz" 1207f606aceSMark Haywood * 1217f606aceSMark Haywood * The amount of memory needed for each string is: 1227f606aceSMark Haywood * digits for power level + '=' + digits for freq + 'MHz' + '\0' 1237f606aceSMark Haywood */ 1240e751525SEric Saxe #define CPUDRV_COMP_SIZE() \ 1250e751525SEric Saxe (CPUDRV_COMP_MAX_DIG + 1 + CPUDRV_COMP_MAX_DIG + 3 + 1); 1260e751525SEric Saxe #define CPUDRV_COMP_SPEED(cpupm, cur_spd) cur_spd->speed; 1270e751525SEric Saxe #define CPUDRV_COMP_SPRINT(pmc, cpupm, cur_spd, comp_spd) \ 1287f606aceSMark Haywood (void) sprintf(pmc, "%d=%dMHz", cur_spd->pm_level, comp_spd); 1297f606aceSMark Haywood 1300e751525SEric Saxe extern void cpudrv_set_topspeed(void *, int); 1310e751525SEric Saxe extern int cpudrv_get_topspeed(void *); 1320e751525SEric Saxe extern int cpudrv_get_topthrottle(cpu_t *); 1330e751525SEric Saxe extern void cpudrv_manage_throttling(void *); 1340e751525SEric Saxe extern void cpudrv_install_notify_handler(cpudrv_devstate_t *); 135*444f66e7SMark Haywood extern void cpudrv_uninstall_notify_handler(cpudrv_devstate_t *); 1360e751525SEric Saxe extern void cpudrv_redefine_topspeed(void *); 1370e751525SEric Saxe extern uint_t cpudrv_get_speeds(cpudrv_devstate_t *, int **); 1380e751525SEric Saxe extern void cpudrv_free_speeds(int *, uint_t); 1397f606aceSMark Haywood 1407f606aceSMark Haywood #ifdef __cplusplus 1417f606aceSMark Haywood } 1427f606aceSMark Haywood #endif 1437f606aceSMark Haywood 1447f606aceSMark Haywood #endif /* _SYS_CPUDRV_MACH_H */ 145