/*++ | |
Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved | |
This program and the accompanying materials are licensed and made available under | |
the terms and conditions of the BSD License that accompanies this distribution. | |
The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php. | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
Module Name: | |
IgdOMOBF.ASL | |
Abstract: | |
IGD OpRegion/Software SCI Reference Code for the Baytrail Family. | |
This file contains ASL code with the purpose of handling events | |
i.e. hotkeys and other system interrupts. | |
--*/ | |
// Notes: | |
// 1. The following routines are to be called from the appropriate event | |
// handlers. | |
// 2. This code cannot comprehend the exact implementation in the OEM's BIOS. | |
// Therefore, an OEM must call these methods from the existing event | |
// handler infrastructure. Details on when/why to call each method is | |
// included in the method header under the "usage" section. | |
/************************************************************************; | |
;* ACPI Notification Methods | |
;************************************************************************/ | |
/************************************************************************; | |
;* | |
;* Name: PDRD | |
;* | |
;* Description: Check if the graphics driver is ready to process | |
;* notifications and video extensions. | |
;* | |
;* Usage: This method is to be called prior to performing any | |
;* notifications or handling video extensions. | |
;* Ex: If (PDRD()) {Return (FAIL)} | |
;* | |
;* Input: None | |
;* | |
;* Output: None | |
;* | |
;* References: DRDY (Driver ready status), ASLP (Driver recommended | |
;* sleep timeout value). | |
;* | |
;************************************************************************/ | |
Method(PDRD) | |
{ | |
If(LNot(DRDY)) | |
{ | |
// Sleep for ASLP milliseconds if the driver is not ready. | |
Sleep(ASLP) | |
} | |
// If DRDY is clear, the driver is not ready. If the return value is | |
// !=0, do not perform any notifications or video extension handling. | |
Return(LNot(DRDY)) | |
} | |
/************************************************************************; | |
;* | |
;* Name: PSTS | |
;* | |
;* Description: Check if the graphics driver has completed the previous | |
;* "notify" command. | |
;* | |
;* Usage: This method is called before every "notify" command. A | |
;* "notify" should only be set if the driver has completed the | |
;* previous command. Else, ignore the event and exit the parent | |
;* method. | |
;* Ex: If (PSTS()) {Return (FAIL)} | |
;* | |
;* Input: None | |
;* | |
;* Output: None | |
;* | |
;* References: CSTS (Notification status), ASLP (Driver recommended sleep | |
;* timeout value). | |
;* | |
;************************************************************************/ | |
Method(PSTS) | |
{ | |
If(LGreater(CSTS, 2)) | |
{ | |
// Sleep for ASLP milliseconds if the status is not "success, | |
// failure, or pending" | |
// | |
Sleep(ASLP) | |
} | |
Return(LEqual(CSTS, 3)) // Return True if still Dispatched | |
} | |
/************************************************************************; | |
;* | |
;* Name: GNOT | |
;* | |
;* Description: Call the appropriate methods to query the graphics driver | |
;* status. If all methods return success, do a notification of | |
;* the graphics device. | |
;* | |
;* Usage: This method is to be called when a graphics device | |
;* notification is required (display switch hotkey, etc). | |
;* | |
;* Input: Arg0 = Current event type: | |
;* 1 = display switch | |
;* 2 = lid | |
;* 3 = dock | |
;* Arg1 = Notification type: | |
;* 0 = Re-enumeration | |
;* 0x80 = Display switch | |
;* | |
;* Output: Returns 0 = success, 1 = failure | |
;* | |
;* References: PDRD and PSTS methods. OSYS (OS version) | |
;* | |
;************************************************************************/ | |
Method(GNOT, 2) | |
{ | |
// Check for 1. Driver loaded, 2. Driver ready. | |
// If any of these cases is not met, skip this event and return failure. | |
// | |
If(PDRD()) | |
{ | |
Return(0x1) // Return failure if driver not loaded. | |
} | |
Store(Arg0, CEVT) // Set up the current event value | |
Store(3, CSTS) // CSTS=BIOS dispatched an event | |
If(LAnd(LEqual(CHPD, 0), LEqual(Arg1, 0))) // Do not re-enum if driver supports hotplug | |
{ | |
If(LOr(LGreater(OSYS, 2000), LLess(OSYS, 2006))) | |
{ | |
// | |
// WINXP requires that the entire PCI Bridge be re-enumerated. | |
// | |
Notify(\_SB.PCI0, Arg1) | |
} | |
Else | |
{ | |
// | |
// Re-enumerate the Graphics Device for non-XP operating systems. | |
// | |
Notify(\_SB.PCI0.GFX0, Arg1) | |
} | |
} | |
Notify(\_SB.PCI0.GFX0,0x80) | |
Return(0x0) // Return success | |
} | |
/************************************************************************; | |
;* | |
;* Name: GHDS | |
;* | |
;* Description: Handle a hotkey display switching event (performs a | |
;* Notify(GFX0, 0). | |
;* | |
;* Usage: This method must be called when a hotkey event occurs and the | |
;* purpose of that hotkey is to do a display switch. | |
;* | |
;* Input: Arg0 = Toggle table number. | |
;* | |
;* Output: Returns 0 = success, 1 = failure. | |
;* CEVT and TIDX are indirect outputs. | |
;* | |
;* References: TIDX, GNOT | |
;* | |
;************************************************************************/ | |
Method(GHDS, 1) | |
{ | |
Store(Arg0, TIDX) // Store the table number | |
// Call GNOT for CEVT = 1 = hotkey, notify value = 0 | |
Return(GNOT(1, 0)) // Return stats from GNOT | |
} | |
/************************************************************************; | |
;* | |
;* Name: GLID | |
;* | |
;* Description: Handle a lid event (performs the Notify(GFX0, 0), but not the | |
;* lid notify). | |
;* | |
;* Usage: This method must be called when a lid event occurs. A | |
;* Notify(LID0, 0x80) must follow the call to this method. | |
;* | |
;* Input: Arg0 = Lid state: | |
;* 0 = All closed | |
;* 1 = internal LFP lid open | |
;* 2 = external lid open | |
;* 3 = both external and internal open | |
;* | |
;* Output: Returns 0=success, 1=failure. | |
;* CLID and CEVT are indirect outputs. | |
;* | |
;* References: CLID, GNOT | |
;* | |
;************************************************************************/ | |
Method(GLID, 1) | |
{ | |
Store(Arg0, CLID) // Store the current lid state | |
// Call GNOT for CEVT=2=Lid, notify value = 0 | |
Return(GNOT(2, 0)) // Return stats from GNOT | |
} | |
/************************************************************************; | |
;* | |
;* Name: GDCK | |
;* | |
;* Description: Handle a docking event by updating the current docking status | |
;* and doing a notification. | |
;* | |
;* Usage: This method must be called when a docking event occurs. | |
;* | |
;* Input: Arg0 = Docking state: | |
;* 0 = Undocked | |
;* 1 = Docked | |
;* | |
;* Output: Returns 0=success, 1=failure. | |
;* CDCK and CEVT are indirect outputs. | |
;* | |
;* References: CDCK, GNOT | |
;* | |
;************************************************************************/ | |
Method(GDCK, 1) | |
{ | |
Store(Arg0, CDCK) // Store the current dock state | |
// Call GNOT for CEVT=4=Dock, notify value = 0 | |
Return(GNOT(4, 0)) // Return stats from GNOT | |
} | |
/************************************************************************; | |
;* ASLE Interrupt Methods | |
;************************************************************************/ | |
/************************************************************************; | |
;* | |
;* Name: PARD | |
;* | |
;* Description: Check if the driver is ready to handle ASLE interrupts | |
;* generate by the system BIOS. | |
;* | |
;* Usage: This method must be called before generating each ASLE | |
;* interrupt. | |
;* | |
;* Input: None | |
;* | |
;* Output: Returns 0 = success, 1 = failure. | |
;* | |
;* References: ARDY (Driver readiness), ASLP (Driver recommended sleep | |
;* timeout value) | |
;* | |
;************************************************************************/ | |
Method(PARD) | |
{ | |
If(LNot(ARDY)) | |
{ | |
// Sleep for ASLP milliseconds if the driver is not ready. | |
Sleep(ASLP) | |
} | |
// If ARDY is clear, the driver is not ready. If the return value is | |
// !=0, do not generate the ASLE interrupt. | |
Return(LNot(ARDY)) | |
} | |
/************************************************************************; | |
;* | |
;* Name: AINT | |
;* | |
;* Description: Call the appropriate methods to generate an ASLE interrupt. | |
;* This process includes ensuring the graphics driver is ready | |
;* to process the interrupt, ensuring the driver supports the | |
;* interrupt of interest, and passing information about the event | |
;* to the graphics driver. | |
;* | |
;* Usage: This method must called to generate an ASLE interrupt. | |
;* | |
;* Input: Arg0 = ASLE command function code: | |
;* 0 = Set ALS illuminance | |
;* 1 = Set backlight brightness | |
;* 2 = Do Panel Fitting | |
;* Arg1 = If Arg0 = 0, current ALS reading: | |
;* 0 = Reading below sensor range | |
;* 1-0xFFFE = Current sensor reading | |
;* 0xFFFF = Reading above sensor range | |
;* Arg1 = If Arg0 = 1, requested backlight percentage | |
;* | |
;* Output: Returns 0 = success, 1 = failure | |
;* | |
;* References: PARD method. | |
;* | |
;************************************************************************/ | |
Method(AINT, 2) | |
{ | |
// Return failure if the requested feature is not supported by the | |
// driver. | |
If(LNot(And(TCHE, ShiftLeft(1, Arg0)))) | |
{ | |
Return(0x1) | |
} | |
// Return failure if the driver is not ready to handle an ASLE | |
// interrupt. | |
If(PARD()) | |
{ | |
Return(0x1) | |
} | |
// Evaluate the first argument (Panel fitting, backlight brightness, or ALS). | |
If(LEqual(Arg0, 2)) // Arg0 = 2, so request a panel fitting mode change. | |
{ | |
If(CPFM) // If current mode field is non-zero use it. | |
{ | |
And(CPFM, 0x0F, Local0) // Create variables without reserved | |
And(EPFM, 0x0F, Local1) // or valid bits. | |
If(LEqual(Local0, 1)) // If current mode is centered, | |
{ | |
If(And(Local1, 6)) // and if stretched is enabled, | |
{ | |
Store(6, PFIT) // request stretched. | |
} | |
Else // Otherwise, | |
{ | |
If(And(Local1, 8)) // if aspect ratio is enabled, | |
{ | |
Store(8, PFIT) // request aspect ratio. | |
} | |
Else // Only centered mode is enabled | |
{ | |
Store(1, PFIT) // so request centered. (No change.) | |
} | |
} | |
} | |
If(LEqual(Local0, 6)) // If current mode is stretched, | |
{ | |
If(And(Local1, 8)) // and if aspect ratio is enabled, | |
{ | |
Store(8, PFIT) // request aspect ratio. | |
} | |
Else // Otherwise, | |
{ | |
If(And(Local1, 1)) // if centered is enabled, | |
{ | |
Store(1, PFIT) // request centered. | |
} | |
Else // Only stretched mode is enabled | |
{ | |
Store(6, PFIT) // so request stretched. (No change.) | |
} | |
} | |
} | |
If(LEqual(Local0, 8)) // If current mode is aspect ratio, | |
{ | |
If(And(Local1, 1)) // and if centered is enabled, | |
{ | |
Store(1, PFIT) // request centered. | |
} | |
Else // Otherwise, | |
{ | |
If(And(Local1, 6)) // if stretched is enabled, | |
{ | |
Store(6, PFIT) // request stretched. | |
} | |
Else // Only aspect ratio mode is enabled | |
{ | |
Store(8, PFIT) // so request aspect ratio. (No change.) | |
} | |
} | |
} | |
} | |
// The following code for panel fitting (within the Else condition) is retained for backward compatiblity. | |
Else // If CFPM field is zero use PFIT and toggle the | |
{ | |
Xor(PFIT,7,PFIT) // mode setting between stretched and centered only. | |
} | |
Or(PFIT,0x80000000,PFIT) // Set the valid bit for all cases. | |
Store(4, ASLC) // Store "Panel fitting event" to ASLC[31:1] | |
} | |
Else | |
{ | |
If(LEqual(Arg0, 1)) // Arg0=1, so set the backlight brightness. | |
{ | |
Store(Divide(Multiply(Arg1, 255), 100), BCLP) // Convert from percent to 0-255. | |
Or(BCLP, 0x80000000, BCLP) // Set the valid bit. | |
Store(2, ASLC) // Store "Backlight control event" to ASLC[31:1] | |
} | |
Else | |
{ | |
If(LEqual(Arg0, 0)) // Arg0=0, so set the ALS illuminace | |
{ | |
Store(Arg1, ALSI) | |
Store(1, ASLC) // Store "ALS event" to ASLC[31:1] | |
} | |
Else | |
{ | |
Return(0x1) // Unsupported function | |
} | |
} | |
} | |
Store(0x01, ASLE) // Generate ASLE interrupt | |
Return(0x0) // Return success | |
} | |
/************************************************************************; | |
;* | |
;* Name: SCIP | |
;* | |
;* Description: Checks the presence of the OpRegion and SCI | |
;* | |
;* Usage: This method is called before other OpRegion methods. The | |
;* former "GSMI True/False is not always valid. This method | |
;* checks if the OpRegion Version is non-zero and if non-zero, | |
;* (present and readable) then checks the GSMI flag. | |
;* | |
;* Input: None | |
;* | |
;* Output: Boolean True = SCI present. | |
;* | |
;* References: None | |
;* | |
;************************************************************************/ | |
Method(SCIP) | |
{ | |
If(LNotEqual(OVER,0)) // If OpRegion Version not 0. | |
{ | |
Return(LNot(GSMI)) // Return True if SCI. | |
} | |
Return(0) // Else Return False. | |
} |