]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/IOKit/IOService.h
xnu-792.22.5.tar.gz
[apple/xnu.git] / iokit / IOKit / IOService.h
index 9dd414e63d06af3f62119ed171c5cd48721971d5..4cb1724a3decd85184d7672dc7da04d7ab4919bd 100644 (file)
@@ -1,23 +1,29 @@
 /*
  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
- * 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.
+ * 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.
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * 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
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * 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.
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /*
  * Copyright (c) 1998,1999 Apple Computer, Inc.  All rights reserved. 
@@ -99,6 +105,7 @@ extern const OSSymbol *      gIONameMatchKey;
 extern const OSSymbol *                gIONameMatchedKey;
 extern const OSSymbol *                gIOPropertyMatchKey;
 extern const OSSymbol *                gIOLocationMatchKey;
+extern const OSSymbol *                gIOParentMatchKey;
 extern const OSSymbol *                gIOPathMatchKey;
 extern const OSSymbol *                gIOMatchCategoryKey;
 extern const OSSymbol *                gIODefaultMatchCategoryKey;
@@ -313,12 +320,24 @@ public:
 
     virtual bool didTerminate( IOService * provider, IOOptionBits options, bool * defer );
 
+    /* method available in Mac OS X 10.4 or later */
+/*! @function nextIdleTimeout
+    @abstract Allows subclasses to customize idle power management behavior.
+    @discussion Returns the next time that the device should idle into its next lower power state. Subclasses may override for custom idle behavior.
+    @param currentTime The current time
+    @param lastActivity The time of last activity on this device
+    @param powerState The device's current power state.
+    @result Returns the next time the device should idle off (in seconds, relative to the current time). */
+
+    virtual SInt32 nextIdleTimeout(AbsoluteTime currentTime, 
+        AbsoluteTime lastActivity, unsigned int powerState);
+
 private:
     OSMetaClassDeclareReservedUsed(IOService, 0);
     OSMetaClassDeclareReservedUsed(IOService, 1);
     OSMetaClassDeclareReservedUsed(IOService, 2);
+    OSMetaClassDeclareReservedUsed(IOService, 3);
 
-    OSMetaClassDeclareReservedUnused(IOService, 3);
     OSMetaClassDeclareReservedUnused(IOService, 4);
     OSMetaClassDeclareReservedUnused(IOService, 5);
     OSMetaClassDeclareReservedUnused(IOService, 6);
@@ -363,6 +382,8 @@ private:
     OSMetaClassDeclareReservedUnused(IOService, 45);
     OSMetaClassDeclareReservedUnused(IOService, 46);
     OSMetaClassDeclareReservedUnused(IOService, 47);
+
+#ifdef __ppc__
     OSMetaClassDeclareReservedUnused(IOService, 48);
     OSMetaClassDeclareReservedUnused(IOService, 49);
     OSMetaClassDeclareReservedUnused(IOService, 50);
@@ -379,6 +400,7 @@ private:
     OSMetaClassDeclareReservedUnused(IOService, 61);
     OSMetaClassDeclareReservedUnused(IOService, 62);
     OSMetaClassDeclareReservedUnused(IOService, 63);
+#endif
 
 public:
 /*! @function getState
@@ -392,8 +414,7 @@ public:
     @discussion When an IOService is successfully terminated, it is immediately made inactive, which blocks further attach()es, matching or notifications occuring on the object. It remains inactive until the last client closes, and is then finalized and destroyed.
     @result Returns true if the IOService has been terminated. */
 
-    inline bool isInactive( void ) const
-       { return( 0 != (kIOServiceInactiveState & getState())); }
+    bool isInactive( void ) const;
 
     /* Stack creation */
 
@@ -962,7 +983,7 @@ public:
 
 /*! @function disableInterrupt
     @abstract Disable a device interrupt.
-    @discussion Disable a device interrupt. It is the callers responsiblity to keep track of the enable state of the interrupt source.
+    @discussion Synchronously disable a device interrupt.  If the interrupt routine is running, the call will block until the routine completes.  It is the callers responsiblity to keep track of the enable state of the interrupt source.
     @param source The index of the interrupt source in the device.
     @result An IOReturn code.<br>kIOReturnNoInterrupt is returned if the source is not valid. */
 
@@ -1146,11 +1167,16 @@ public:
     static void actionFinalize( IOService * victim, IOOptionBits options );
     static void actionStop( IOService * client, IOService * provider );
 
-    void PMfree( void );
-
     virtual IOReturn resolveInterrupt(IOService *nub, int source);
     virtual IOReturn lookupInterrupt(int source, bool resolve, IOInterruptController **interruptController);
 
+    // SPI to control CPU low power modes
+    void  setCPUSnoopDelay(UInt32 ns);
+    UInt32 getCPUSnoopDelay();
+    void   requireMaxBusStall(UInt32 ns);
+
+    void PMfree( void );
+
     /* power management */
     
 /*! @function PMinit
@@ -1792,35 +1818,44 @@ private:
     IOReturn notifyAll ( bool is_prechange );
     bool notifyChild ( IOPowerConnection * nextObject, bool is_prechange );
     bool inform ( IOPMinformee * nextObject, bool is_prechange );
-    void our_prechange_03 ( void );
-    void our_prechange_04 ( void );
-    void our_prechange_05 ( void );
-    void our_prechange_1 ( void );
-    void our_prechange_2 ( void );
-    void our_prechange_3 ( void );
-    void our_prechange_4 ( void );
-    IOReturn parent_down_0 ( void );
-    IOReturn parent_down_02 ( void );
-    void parent_down_04 ( void );
-    void parent_down_05 ( void );
-    IOReturn parent_down_1 ( void );
-    IOReturn parent_down_2 ( void );
-    void parent_down_3 ( void );
-    void parent_down_4 ( void );
-    void parent_down_5 ( void );
-    void parent_down_6 ( void );
-    void parent_up_0 ( void );
-    IOReturn parent_up_1 ( void );
-    IOReturn parent_up_2 ( void );
-    IOReturn parent_up_3 ( void );
-    void parent_up_4 ( void );
-    void parent_up_5 ( void );
-    void parent_up_6 ( void );
+    
+    // Power Management state machine
+    // power change initiated by driver
+    void OurChangeTellClientsPowerDown ( void );
+    void OurChangeTellPriorityClientsPowerDown ( void );
+    void OurChangeNotifyInterestedDriversWillChange ( void );
+    void OurChangeSetPowerState ( void );
+    void OurChangeWaitForPowerSettle ( void );
+    void OurChangeNotifyInterestedDriversDidChange ( void );
+    void OurChangeFinish ( void );
+    
+    // downward power change initiated by a power parent
+    IOReturn ParentDownTellPriorityClientsPowerDown_Immediate ( void );
+    IOReturn ParentDownNotifyInterestedDriversWillChange_Immediate ( void );
+    void ParentDownTellPriorityClientsPowerDown_Delayed ( void );
+    void ParentDownNotifyInterestedDriversWillChange_Delayed ( void );
+    IOReturn ParentDownSetPowerState_Immediate ( void );
+    IOReturn ParentDownWaitForPowerSettleAndNotifyDidChange_Immediate ( void );
+    void ParentDownNotifyDidChangeAndAcknowledgeChange_Delayed ( void );
+    void ParentDownSetPowerState_Delayed ( void );
+    void ParentDownWaitForPowerSettle_Delayed ( void );
+    void ParentDownAcknowledgeChange_Delayed ( void );
+    
+    // upward power change initiated by a power parent
+    void ParentUpSetPowerState_Delayed ( void );
+    IOReturn ParentUpSetPowerState_Immediate ( void );
+    IOReturn ParentUpWaitForSettleTime_Immediate ( void );
+    IOReturn ParentUpNotifyInterestedDriversDidChange_Immediate ( void );
+    void ParentUpWaitForSettleTime_Delayed ( void );
+    void ParentUpNotifyInterestedDriversDidChange_Delayed ( void );
+    void ParentUpAcknowledgePowerChange_Delayed ( void );
+    
     void all_done ( void );
     void all_acked ( void );
     void driver_acked ( void );
     void start_ack_timer ( void );
     void stop_ack_timer ( void );
+
     unsigned long compute_settle_time ( void );
     IOReturn startSettleTimer ( unsigned long delay );
     IOReturn changeState ( void );
@@ -1835,6 +1870,8 @@ private:
     bool responseValid ( unsigned long x );
     IOReturn allowCancelCommon ( void );
     void computeDesiredState ( void );
+    void rebuildChildClampBits ( void );
+    IOReturn temporaryMakeUsable ( void );
 };
 
 #endif /* ! _IOKIT_IOSERVICE_H */