Summary of Industry Feedback on APM 1.2 Specification
(And Frequently-Asked Questions)

Microsoft Corporation
February 15, 1996

I.  Feedback that resulted in changes to the Specification:
•	Typo: section 4.3 says there are power management events 01H-0EH.  Should be 01H‑0BH.
Resolution: Fixed typo.

•	Wherever there is a bit-mask returned by the BIOS (e.g. from Get Capabilities), spec. should require that reserved bits must be set to 0.  
Resolution: Added requirement for reserved bits to be returned as 0.

•	Typo: APM 1.1 should be changed to APM 1.2 in section 4.3.9.
Resolution: Fixed typo.

•	Engage/enable.  Paragraphs in 4.6.16 seem to contradict each other.   We should have a table/state diagram to describe this. Section 4.6.9 is not clear about what parts of power management are disabled. SECTION 4.6.16 - The initial status of all devices must be Engaged.  Is this correct that it means that we will assume a cooperative driver is installed?
Resolution: Added state transition table and additional description (including clarification that the initial status should be Disengaged for devices, but Engaged for the BIOS)

•	The spec. says that if capabilities change, you must reboot.  But, there are some scenarios where capabilities might change on the fly: you might have batteries in your dock.  
Resolution: Added new ‘Power Capabilities Changed’ event and removed requirement for reboot.

•	The spec says that Wake on Ring and Timer-based events should be disabled whenever APM Driver Version (0EH) or on Restore APM BIOS Power-On defaults (09H).  Why?  In 0EH, it's a needless side-effect.   In 09, it implies that Wake on Ring should be disabled every time the machine is powered on.
Resolution: Added ‘Get Current State’ subfunction to functions 12H and 13H and removed requirement for disable on power-up.

•	Clarification of the Get Capabilities and Get Power Status functions.
Resolution:  Added clarification and description of the use of Get Power Status and Get Capabilities functions (with APM 1.2, Get Capabilities and Get Power Status must be in sync).

•	In Section 4.4 under the actions which may be taken by the APM BIOS in a CPU Idle call the first item states that "The APM BIOS stops the clock until the next timer tick interrupt."  It should really say something like "The APM BIOS stops the clock until the next interrupt, including timer tick interrupts."
Resolution:  Added clarification.

•	Clarifications to Overall state diagram in Section 2.4 (missing transition arrows and missing event names.
Resolution:  Clarified drawing to include ‘resume events’

II.  Other Feedback:
•	There should be a Power Off request from the BIOS.  It's the only APM state that doesn't have a request
Resolution: No change.  Too complex to implement a driver within the constraints of the APM specification.

•	On Resume, the BIOS returns a bit in CX to tell whether or not PCMCIA was turned off.  Why not other devices like serial ports, display, etc.?
Resolution: No change.  Unnecessary.  This functionality is only required for wake-up devices (modems) which appear on the PCMCIA bus.

•	In addition to function 12H "Enable/Disable Resume on Ring", there should be a more general "Get/Set resume" for other devices or interrupts.
Resolution: No change.  A generic wake-up mechanism is too complex to implement within the constraints of the APM specification..

•	A clarification about the segment lengths returned by functions 02H and 03H:   I suggest adding that the value "0000H" means that the segments are 64 KB long. The necessary segment limit is "0FFFFH", which is one less than the size in this case too.
Resolution: No change.  Unnecessary.

•	About the APM connection mode (real/prot16/prot32), it should be clearly specified in chapter 4.2 that being connected in protected mode must not prevent from making APM BIOS calls (except a connect) in real mode.
Resolution:  Left as is.  No clarification required.

Frequently Asked Questions:
Q:	Which is the correct order for returning error codes on a function where multiple errors can be found?  Example:  AX=5307, BX= Incorrect ID, and the interface is not connected.  Is the AH=03h the correct error to return, or is AH=09h?  What is the priority for checking the error conditions?

A:	The ordering should be: 01h,03h,0bh,0ch,09h,0Ah, followed by any function-specific error codes (such as 02h or 0dh).

Q:	SECTION 4.6.1, 4.6.2, 4.6.3, 4.6.4 - All these functions mention that they are only supported in Real mode.  What is the proper error return code if they are called from an already established P16/P32 mode connection?

A:	09H, Invalid Device ID, is the correct error code to return when the driver calls a function that is only legal from one mode (i.e. real, protected) from the other mode

Q:	In the Standby definition in Page 10-11, the system should exit from this state by any interrupts. Is it necessary to have the capability of the timer resume from the Standby mode (AL=10h, bit 2 )?

A:	Timed resume from standby is supported by the specification, and is different from normal standby operation.  When entering the standby state, the CPU will be stopped and will remain stopped until any interrupt occurs (including timers).  The CPU will be started in response to the interrupt, but the system remains in standby state (i.e. no devices change power state; no resume notification is sent to the OS).  When the system returns to an idle state, the OS will use the System Idle call to stop the CPU clock once again.  For a timed resume from standby (i.e. the alarm timer interrupt occurs while the system is in standby), the BIOS will issue the resume notification to the OS, and may do other processing to take the system out of standby state.

Q:	How do you handle resume on timer from standby (where interrupts will wake the machine)?  Do you use IRQ8?  Do you virtualize IRQ8 so DOS apps can still use the timer?  

A:	If the user schedules an alarm, the OS will call the Set Resume Timer function before it enters standby or suspend state.  The BIOS then should set the timer and may need to cache the current setting of the timer if it is set at a later time than the wake-up time (i.e. there is already an alarm set via the BIOS or DOS apps).

Q:	Why is there no way for the BIOS to indicate which of the PCMCIA slots have been unpowered and which powered.  This is important because frequently systems will power one slot (the one with the modem, for example) and power down another. The specification, as defined, cannot represent this case.

A:	The policy about powering PCMCIA sockets is moved into the OS.  Since the power for each slot is independently controllable by the driver, the system BIOS and hardware should not do any control of PCMCIA slot power.  The slot power should remain in the state that it is placed into by the OS.

Q: 	Concerning Section 4.6.18 Get/Set/Disable Resume Timer in the APM 1.2 spec. pages 58-59:
>From the comments, it appears that the timer function should allow a unit to power on (from the OFF state) to perform a task as long as the timer is enabled when the unit power downs (disconnects from the APM BIOS).  Is this one of the intended capabilities of this function?

A:	No.  Waking from the ‘Off’ state is not supported.

Q:	‘Hibernation’, or other 0-volt, save-to-disk type modes are often implemented as an extension of the Suspend Mode, but the power switch is the only way to wake-up the system from this state.  ‘Hibernation’ is equivalent to the OFF state, but all H/W context is stored into the HDD, and this information is used to recover the system on next power on, and to send the resume notification to the APM driver.  In the 1.2 draft, there exists the Resume Timer Set (AL=11h), and Ring Indicator resume enable call (AL=12h). These functions are only valid for the actual Suspend Mode, or should they apply to ‘Hibernation’ mode as well ?

A:	In APM, these ‘0-volt Suspend’ modes are no different than Suspend to the OS.  Therefore, the BIOS is responsible for handling resume functionality correctly.  For instance, if a machine always does the 0-volt suspend in response to the Set power State=Suspend call, then the designer must decide if his machine can support wake on ring, or wake on resume functionality while in this mode and set the Power Capabilities bits accordingly.  If the machine implements both Suspend and ‘0-volt Suspend’ (i.e. enters the 0-volt suspend mode automatically after being in Suspend for some amount of time) then the BIOS is responsible for ensuring that the transition to ‘0-volt suspend’ does not occur if the OS has set resume on timer or resume on ring functionality.

Q:	Are the Device Power Management calls (set device power state) going to be limited to Class calls and no subclass requests are going to be made?

A:	The OS only uses device power management functions in the specification to turn off the monitor.  These functions will not be called for any other devices.

Q:	SECTION 4.3.12, and 4.6.8 seem to indicate that a Slow Clock implementation is possible.  However SECTION 2.3 mandates that a Stop Clock in Standby State is necessary.  What is the correct APM BIOS implementation? Is the APM Standby State supposed to Stop the CPU clock?

A:	In Standby, the CPU clock must be stopped and must restart on any interrupt (including timer ticks).

Feedback: Please send e-mail to ihv@microsoft.com