X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/8f6c56a50524aa785f7e596d52dddfb331e18961..4a3eedf9ecc9bbe3f3a5c6ce5e53ad199d639d32:/osfmk/ppc/pmsCPU.c diff --git a/osfmk/ppc/pmsCPU.c b/osfmk/ppc/pmsCPU.c index 81a70c9ca..0b12f2d31 100644 --- a/osfmk/ppc/pmsCPU.c +++ b/osfmk/ppc/pmsCPU.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2005 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2004-2006 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -33,12 +33,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 */ @@ -129,8 +132,7 @@ pmsDef pmsDefault[] = { */ void pmsCPUSet(uint32_t sel) { - int nvoltage, nfreq; - uint32_t oldaack; + int nfreq; struct per_proc_info *pp; pp = getPerProc(); /* Get our per_proc */ @@ -171,12 +173,11 @@ void pmsCPUConf(void) { kern_return_t ret; pmsSetFunc_t pmsDfltFunc[pmsSetFuncMax]; /* List of functions for the external power control to use */ - for(i = 0; i < pmsSetFuncMax; i++) pmsDfltFunc[i] = 0; /* Clear this */ + for(i = 0; i < pmsSetFuncMax; i++) pmsDfltFunc[i] = NULL; /* Clear this */ ret = pmsBuild((pmsDef *)&pmsDefault, sizeof(pmsDefault), pmsDfltFunc, 0, (pmsQueryFunc_t)0); /* Configure the default stepper */ -pCCfinish: if(ret != KERN_SUCCESS) { /* Some screw up? */ panic("pmsCPUConf: initial stepper table build failed, ret = %08X\n", ret); /* Squeal */ } @@ -186,6 +187,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. @@ -203,12 +213,13 @@ void pmsCPUInit(void) { pmsPark(); /* Then park */ kprintf("************ Stepper hardware initialized, cpu %d ******************\n", cpu); /* (BRINGUP) */ - - return; } -uint32_t pmsCPUquery(void) { +extern uint32_t hid1get(void); +uint32_t +pmsCPUQuery(void) +{ uint32_t result; struct per_proc_info *pp; uint64_t scdata; @@ -236,4 +247,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; +} + +