https://svn.code.sf.net/p/edk2/code/trunk/edk2/, which are for MinnowBoard MAX open source project. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: David Wei <david.wei@intel.com> Reviewed-by: Mike Wu <mike.wu@intel.com> Reviewed-by: Hot Tian <hot.tian@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16599 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			492 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			492 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| 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.
 | |
| }
 |