X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/8f6c56a50524aa785f7e596d52dddfb331e18961..0c530ab8987f0ae6a1a3d9284f40182b88852816:/osfmk/ppc/pmsCPU.c diff --git a/osfmk/ppc/pmsCPU.c b/osfmk/ppc/pmsCPU.c index 81a70c9ca..86d179fed 100644 --- a/osfmk/ppc/pmsCPU.c +++ b/osfmk/ppc/pmsCPU.c @@ -1,29 +1,23 @@ /* * Copyright (c) 2004-2005 Apple Computer, Inc. All rights reserved. * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * @APPLE_LICENSE_HEADER_START@ * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + * @APPLE_LICENSE_HEADER_END@ */ #include #include @@ -33,12 +27,15 @@ #include #include #include -#include +#include #include #include #include +static void pmsCPURemote(uint32_t nstep); + + pmsDef pmsDefault[] = { { .pmsLimit = century, /* We can normally stay here for 100 years */ @@ -186,6 +183,15 @@ pCCfinish: return; } +/* + * Machine-dependent initialization + */ +void +pmsCPUMachineInit(void) +{ + return; +} + /* * This function should be called once for each processor to force the * processor to the correct voltage and frequency. @@ -207,7 +213,7 @@ void pmsCPUInit(void) { return; } -uint32_t pmsCPUquery(void) { +uint32_t pmsCPUQuery(void) { uint32_t result; struct per_proc_info *pp; @@ -236,4 +242,67 @@ uint32_t pmsCPUquery(void) { return result; } +/* + * These are not implemented for PPC. + */ +void pmsCPUYellowFlag(void) { +} + +void pmsCPUGreenFlag(void) { +} + +uint32_t pmsCPUPackageQuery(void) +{ + /* multi-core CPUs are not supported. */ + return(~(uint32_t)0); +} + +/* + * Broadcast a change to all processors including ourselves. + * This must transition before broadcasting because we may block and end up on a different processor. + * + * This will block until all processors have transitioned, so + * obviously, this can block. + * + * Called with interruptions disabled. + * + */ + +void pmsCPURun(uint32_t nstep) { + + pmsRunLocal(nstep); /* If we aren't parking (we are already parked), transition ourselves */ + (void)cpu_broadcast(&pmsBroadcastWait, pmsCPURemote, nstep); /* Tell everyone else to do it too */ + + return; + +} + +/* + * Receive a broadcast and react. + * This is called from the interprocessor signal handler. + * We wake up the initiator after we are finished. + * + */ + +static void pmsCPURemote(uint32_t nstep) { + + pmsRunLocal(nstep); /* Go set the step */ + if(!hw_atomic_sub(&pmsBroadcastWait, 1)) { /* Drop the wait count */ + thread_wakeup((event_t)&pmsBroadcastWait); /* If we were the last, wake up the signaller */ + } + return; +} + +/* + * Control the Power Management Stepper. + * Called from user state by the superuser via a ppc system call. + * Interruptions disabled. + * + */ +int pmsCntrl(struct savearea *save) { + save->save_r3 = pmsControl(save->save_r3, (user_addr_t)(uintptr_t)save->save_r4, save->save_r5); + return 1; +} + +