;	File: $Id: PBG4_5_8+5_9Better.txt,v 1.8 2005/09/17 00:09:35 raddog Exp $
;
;	$Log: PBG4_5_8+5_9Better.txt,v $
;	Revision 1.8  2005/09/17 00:09:35  raddog
;	Set voltage high, frequency 1/2 for sleep for compatibility with hibernation
;	
;	Revision 1.7  2005/09/06 18:23:26  raddog
;	Keith Cox 'NuBetter' table
;	
;	Revision 1.6  2005/09/02 21:50:51  raddog
;	Latest stepper tables from Keith Cox
;	
;	Revision 1.5  2005/08/17 18:33:35  raddog
;	[4219960]improve overtemp behavior, [4210384]downstep voltage protection
;	
;	Revision 1.4  2005/07/29 22:40:02  raddog
;	[4173968] Q16C/Q41C Hang during DVD playback, [4197260] Q16C/Q41C CPU Core voltage remains high when stepper is in reduce speed mode
;	
;	Revision 1.3  2005/07/25 21:13:24  raddog
;	[4192395]Q16C/Q41C Stepper control
;	
;	Revision 1.2  2005/07/18 23:38:38  raddog
;	[4174343]1.5GHz hang during install.  Also clean up PowerPlay usage to match Ingrid's check-in (PBG4_StepCtrlLoop.cpp 1.3)
;	
;	Revision 1.1  2005/07/06 02:13:32  raddog
;	Initial checkin for stepper kernel support for PowerBooks
;	
;
;
;   Example step definition file
;
;   This file should be compiled with the pmsset program.  It will compile and check 
;   for errors.  Eventually when I finish it, it will push the step table into the kernel
;   and activate it on all processors.
;
;   This is for testing.  I assume that normally we will have something in the kernel to
;   define this stuff although this could be used to modify the defaults for special
;   user applications.
;
;   Step definitions 0 - 9 are required and should not change meaning.
;
;   pmsIdle is the power for the idle loop (including nap) and should be lowest. 
;       We step up when we have work to do and exit the loop.  There is no time limit here.
;
;   pmsNorm is still low power and is the first step out of idle.  Time limit here.
;
;   pmsNormHigh is the highest normal power and is where we assume we are after boot.
;
;   pmsBoost is the overdrive step and should have a time limit but can be unlimited.
;
;   pmsLow is the lowest power, no time limit.  Used to force low power, if needed.
;
;   pmsHigh is highest normal, no time limit.  Used to for highest non-overdrive power, if needed.
;
;   pmsPrepCng is Prepare for step table change
;
;   pmsPrepSleep is Prepare for sleep
;
;	pmsOverTemp is for when the processor has gotten too hot
;
;	pmsEnterNorm is used to transition back into the normal step program 
;
;   pmsParked transitions to a parked state.  There is no corresponding step table entry.  It is a fixed valid of 0xFFFFFFFF.
;
;
;   There can be up to 64 steps.
;
;   The down field is the step to transition to when power is to be dropped.  Normally this 
;       would be idle.  Currently the transition point is on entry to the idle loop.
;		A -1 specifies that the next step is parked.
;
;   The next field is the normal forward step.  The power could go down, up, or stay the same.
;       This is normally triggered by the expiration of the time limit.
;		A -1 specifies that the next step is parked.
;
;   The combination of HWSel and HWfun determine the actual power state.  When we transition
;       to a step, HWfun is called with HWSel as the parameter.  Nothing is called if HWfun
;       is 0, or if we are already in that state.  Note that there can be forced transitions
;       that will call HWfun (if it exists) regardless of the current state.
;
;   The limit field is the time before transition to the next step.  It is in units
;       of microseconds and can be from 100 to 3155760000000000 (one century).
;       Leaving the field blank or -1 defaults to a century.
;       A zero indicates that this is an immediate step with no wait
;
;   The TDelay field is only valid for a pmsDelay command and is used to hold off a step down for the time limit.
;       If the limit expires, then we step to TDelay.  A step up takes the next and an explicit down take the down.
;       The limit field must be specified and must be non-zero and not infinite.  Note that TDelay can not
;       transition to park.
;
;
;   The current implementation of the hardware selector for Powerbooks with Intrepid is as follows:
;
;       bits                        meaning
;
;       pmsCngXClk  0x80000000      Change external clock
;       pmsXClk     0x7F000000      External clock frequency
;       pmsCngCPU   0x00800000      Change CPU parameters
;       pmsSync     0x00400000      Make changes synchronously, i.e., spin until delay finished
;       pmsMustCmp  0x00200000      Delay must complete before next change
;       pmsCPU      0x001F0000      CPU frequency
;       pmsCngVolt  0x00008000      Change voltage
;       pmsVoltage  0x00007F00      Voltage
;       pmsPowerID  0x000000FF      Identify power state to HW
;
;		pmsDelay    0xFFFFFFFD		Delayed step, no processor or platform changes.  Timer expiration causes transition to pmsTDelay
;       pmsParkIt   0xFFFFFFFF      Special value to indicate that we are to park
;

;	Rule set for this table (per Keith Cox) [actually these assumptions are for the best case]
;		Operating at F=Full requires V=High
;		Transitioning between F=Qtr and F=Half requires V=High
;		Operating at F=Qtr, Half desirable for V=Low
;		All requests for V=High require a minimum 400µs assertion
;		All table entry point require a minimum 400µs delay before setting V=Low to guarantee V=High assertion time
;		Operation at F=Qtr requires AAck delay=2
;		Operation at F=Half, Full desirable for AAck delay=0
;		Idle times shorter than 500µs should not cause a performance step down

;   StID  Down  Next       SetCMD SetFunc      Limit TDelay

       0     0    10     81400000       1          0         ; pmsIdle:            synchronously set delay_aack to 1 before frequency change
       1     0    11     00000001       1       4600         ; pmsNorm:            5ms limit - 400 mics for transition delay
       2     0    12     00C00002       1          0         ; pmsNormHigh:        synchronously set frequency high
       3     0     2     00800003       1       1000         ; pmsBoost:           1ms
       4     4    20     81400004       1        400         ; pmsLow:             synchronously set delay_aack to 1 before frequency change, guarantee 400us voltage stability
       5     5    13     00400005       1        400         ; pmsHigh:            400 mics settle time - make sure voltage is stable
       6     6    15     00400006       1        400         ; pmsPrepCng:         400 mics settle time - make sure voltage is stable
       7     7    17     00400007       1        400         ; pmsPrepSleep:       400 mics settle time - make sure voltage is stable
       8    19    19     81400008       1        400         ; pmsOverTemp:        synchronously set delay_aack to 1 then go to low power for overtemp, guarantee 400us voltage stability
       9     9    21     81400009       1        400         ; pmsEnterNorm:       synchronously set delay_aack to 1 then go to low power for overtemp, guarantee 400us voltage stability

;   end of required steps

      10     0     1     0081800A       1                    ; pmsIdle2:           no time limit - half frequency - set voltage low

      11    22     2     0000810B       1        400         ; pmsNorm2:           400 mics delay until to allow voltage to rise to high.
      
      12    23    12     8000000C       1                    ; pmsNormHigh2:       no time limit - set delay_aack 0
      
      13    13    14     0040810D       1        400         ; pmsHigh1:           force 400 mic transition
      14    14    14     8080000E       1                    ; pmsHigh2:           Stick in high

      15    15    16     0040810F       1        400         ; pmsPrepCng1:        prepare to change tables - synchronous transition to high power
      16    -1    -1     00C00010       1          0         ; pmsPrepCng2:        Synchronously move high then park
       
      17    17    18     81408111       1        400         ; pmsPrepSleep1:      prepare to sleep by setting delay_aack 1 and voltage high
      18    -1    -1     00C10012       1          0         ; pmsPrepSleep2:      Synchronously move freq to 1/2 then park

;    Over temperature steps

      19    19    19     00818013       1                    ; pmsOverTemp1:       no time limit - half frequency - stay here until pmsEnterNorm invoked
 
 ;	Additional steps
 
      20    20    20     00818014       1                    ; pmsLow2:            Stick in medium forever

      21    21     1     00C18015       1          0         ; pmsEnterNorm2:      Transition back into normal step program

;	Delayed steps - note that an explicit step down and the delayed step could be different.  However, they are the same in this step table

      22     0    11     FFFFFFFD       1        500      0  ; pmsNorm2d:	       Delayed step down.  Freq is medium, voltage on way up, delay until it gets there

      23     0    12     FFFFFFFD       1        500      0  ; pmsNormHigh2d:      Delayed step down.  Freq is high, voltage high, delay entry to idle

