diff options
Diffstat (limited to 'Core/EM/ACPI/PCIEHP.ASL')
-rw-r--r-- | Core/EM/ACPI/PCIEHP.ASL | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/Core/EM/ACPI/PCIEHP.ASL b/Core/EM/ACPI/PCIEHP.ASL new file mode 100644 index 0000000..c5b69ee --- /dev/null +++ b/Core/EM/ACPI/PCIEHP.ASL @@ -0,0 +1,346 @@ +//**********************************************************************; +// *****************************************************************; +// ** **; +// ** (C)Copyright 1985-2004, American Megatrends, Inc. **; +// ** **; +// ** All Rights Reserved. **; +// ** **; +// ** 6145-F Northbelt Pkwy, Norcross, GA 30071 **; +// ** **; +// ** Phone (770)-246-8600 **; +// ** **; +// *****************************************************************; +//----------------------------------------------------------------------- +// $Header: /Alaska/BIN/Modules/ACPI/Template/Core/PCIEHP.ASL 1 5/07/09 2:44p Yakovlevs $ +// +// $Revision: 1 $ +// +// $Date: 5/07/09 2:44p $ +//****************************************************************; +//*****************************************************************; +// Revision History +// ---------------- +// $Log: /Alaska/BIN/Modules/ACPI/Template/Core/PCIEHP.ASL $ +// +// 1 5/07/09 2:44p Yakovlevs +// +// 1 1/15/09 2:11p Vasudevans +// Initial check-in for Tylersburg PCIe Hotplug support. +// +// 1 12/10/03 2:40p Srinin +// PCIe HP support added. +// +// 1 12/10/03 12:21p Srinin +// PCIe Hot plug support added. +// +// +// +//----------------------------------------------------------------------- +//Constants + +Name (SLHC, 0x040) // Slot Hot plug capable + +Name (SPDS, 0x040) // Slot Presence Detect state +Name (MRLS, 0x020) // MRL open +Name (CCOM, 0x010) // Command complete +Name (SPDC, 0x08) // Slot Presence Detect Changes +Name (MRLC, 0x04) // Slot MRL changed +Name (SPFD, 0x02) // Slot power fault Detected +Name (SABP, 0x01) // Slot attention button pressed + +Name (SPOF, 0x400) // Slot Power off +Name (SPON, 0x3FF) // Slot Power on Mask + + +Name (ALMK, 0xFF3F) // Slot atten. LED Mask +Name (ALON, 0x0040) // Slot atten. LED on +Name (ALBL, 0x0080) // Slot atten. LED Blink +Name (ALOF, 0x00C0) // Slot atten. LED off + +Name (PLMK, 0xFCFF) // Slot Pwr. LED Mask +Name (PLON, 0x100) // Slot Pwr. LED on +Name (PLBL, 0x200) // Slot Pwr. LED Blink +Name (PLOF, 0x300) // Slot Pwr. LED off + +Name (HPEV, 0x0F) // Possible interrupt events (all) + + +Scope (\_SB.PCI0) { + + Mutex (MUTH, 0) + +//--------------------------------------- +// Hot plug controller command +//--------------------------------------- + Method (HPCC, 2) { +// Arg0 : Memory mapped Address to PCIe Feature capability Structure +// ARG1 : Slot Control Register value + Acquire(MUTH, 0xFFF) + Store (Rwpe(Add(Arg0, XSCT)), Local0) + Store (Arg1, Local1) + And (Local0, 0x7C0, Local0) + And (Local1, 0x7C0, Local1) +// If (LNotEqual(Local1, Local0)) { + Wbpe(Add(Arg0,XSST), CCOM) // Clear the command complete status + Wwpe(Add(Arg0, XSCT), Arg1) + Store (0, Local0) + Sleep (2) // Give time to complete the command + While (LLess(Local0, 100)){ // Command completed ? + Sleep (10) + Add (Local0, 10, Local0) + if(LEqual(And(Rwpe(Add(Arg0, XSST)), CCOM), CCOM)){ // Command completed ? + If (LGreaterEqual(Local0, 100)) { + Break // May not work in all OSes + } + Store (100, Local0) + } + } + Wbpe(Add(Arg0,XSST), CCOM) // Clear the command complete status +// } +// else { // Don't wait for command status to update +// Wwpe(Add(Arg0, XSCT), Arg1) +// } + Release(MUTH) + } // end of HPCC + +//--------------------------------------- +// Attention button Indicator +//--------------------------------------- + Method (ATCM, 2) { +// Arg0 : Memory mapped Address to PCIe Feature capability Structure +// Arg1 : Attention Indicator Value +// Check if Attention Indicator is present + Store (Rwpe(Add(Arg0, XSCP)), Local0) // Read Slot Capability Register + if (And(Local0, 0x08)) { // Attention indicator present + Store (Rwpe(Add(Arg0, XSCT)), Local0)// Read Slot Control Register + And (Local0, ALMK, Local0) // Clear Attention indicator control + If (LEqual(Arg1, 0x01)) { // Attention indicator "ON"? + Or (Local0, ALON, Local0) + } + If (LEqual(Arg1, 0x02)) { // Attention indicator "BLINK"? + Or (Local0, ALBL, Local0) + } + If (LEqual(Arg1, 0x03)) { // Attention indicator "OFF"? + Or (Local0, ALOF, Local0) + } + HPCC (Arg0, local0) + } + } // End of ATCM + +//--------------------------------------- +// Power Indicator +//--------------------------------------- + Method (PWCM, 2) { +// Arg0 : Memory mapped Address to PCIe Feature capability Structure +// Arg1 : Power Indicator Value +// Check if Power Indicator is present + Store (Rwpe(Add(Arg0, XSCP)), Local0) // Read Slot Capability Register + if (And(Local0, 0x10)) { // Power indicator present + Store (Rwpe(Add(Arg0, XSCT)), Local0) + And (Local0, PLMK, Local0) + If (LEqual(Arg1, 0x01)) { // Power indicator "ON"? + Or (Local0, PLON, Local0) + } + If (LEqual(Arg1, 0x02)) { // Power indicator "BLINK"? + Or (Local0, PLBL, Local0) + } + If (LEqual(Arg1, 0x03)) { // Power indicator "OFF"? + Or (Local0, PLOF, Local0) + } + HPCC (Arg0, local0) + } + } // End of PWCM + +//--------------------------------------- +// Slot Power Control +//--------------------------------------- + Method (PWSL, 2) { +// Arg0 : Memory mapped Address to PCIe Feature capability Structure +// Arg1 : Power Controller on/off +// Check if Power controller is present? + Store (Rwpe(Add(Arg0, XSCP)), Local0) // Read Slot Capability Register + if (And(Local0, 0x2)) { // Power controller present + Store (Rwpe(Add(Arg0, XSCT)), Local0) + If (LEqual(Arg1, 0x0)) { // Power slot "OFF"? + Or (Local0, SPOF, Local0) + } + If (LEqual(Arg1, 0x01)) { // Power Slot "ON"? + And (Local0, SPON, Local0) + } + HPCC (Arg0, local0) + } + } // End of PWSL + +//--------------------------------------- +// Attention button Interupt Enable/Disable +//--------------------------------------- + Method (ABIE, 2) { +// Arg0 : Memory mapped Address to PCIe Feature capability Structure +// Arg1 : Attention button Interrupt Enable/Disable +// Check if Attention Button present + Store (Rwpe(Add(Arg0, XSCP)), Local0) // Read Slot Capability Register + if (And(Local0, SABP)) { // Attention button present + Store (Rwpe(Add(Arg0, XSCT)), Local0) + If (LEqual(Arg1, 0x0)) { // Disable Attention button interrupt + And (Local0, 0xFFFE, Local0) + } + If (LEqual(Arg1, 0x01)) { // Enable Attention button interrupt + Or (Local0, SABP, Local0) + } + HPCC (Arg0, local0) + } + } // End of ABIE + + +//--------------------------------------- +// EJection Main Handler +//--------------------------------------- + Method (EJMH, 1) { + Store(0x62, DBG8) // DBG8 name translates to IO port 80h +// Arg0 : Memory mapped Address to PCIe Feature capability Structure + Store (Rwpe(Add(Arg0, XSCT)), Local0) + Or (Local0, SPOF, Local0) // Power COntroller to Power OFF + Or (Local0, PLOF, Local0) // Power Indicator to OFF + Or (Local0, ALOF, Local0) // Attention "OFF" + HPCC (Arg0, Local0) + } // End of EJMH + +//--------------------------------------- +// Hnadler of Hot Plug Event +//--------------------------------------- + Method (HHPE, 1){ +// Arg0 : Memory mapped Address to PCIe Feature capability Structure + Store (RdPe(Arg0), Local0) + If (Lequal(Local0, 0xFFFFFFFF)) {Return (0xFF)} + Store (RbPe(Add(Arg0,XSST)), Local0) + If (And(HPEV, Local0)) { // Check for Slot status + Store (PP4H(Arg0), Local0) // Hot plug interrupt Handler + Return (Local0) // Return PP4H information + } + Else { + Return (0xFF) // This controller didn't interrupt + } + } + + Method (PP4H, 1) { +// Arg0 : Memory mapped Address to PCIe Feature capability Structure 1 + Store (RbPe(Add(Arg0,XSST)), Local0) + If (And(Local0, SABP)) { // Attention button pressed? 2 + Wbpe(Add(Arg0,XSST),SABP) // Clear interrupt status + If (LEqual(And(Local0, SPDS), 0x00)) { // Slot empty? 3 + PWSL (Arg0, 0x0) // Power off + PWCM (Arg0, 0x3) // Power indicator off + ATCM (Arg0, 0x3) // Attention indicator off + Return (0x03) // Eject Request + } // 3 +// Card is present and slot is already powered. User presses attention button to eject the card + Store (RwPe(Add(Arg0,XSCT)), Local0) + If (LEqual(And(Local0,SPOF), 0x00)) { // Slot already powered 4 + ABIE (Arg0, 0x0) // Disable Attention button interrupt + PWCM (Arg0, 0x02) // Set power Indicator to blink + Store (0x0, Local0) // 5sec counter + While (LNotEqual(And(Rwpe(Add(Arg0, XSST)), SABP), SABP)){ //Check for Attention button again 5 + Sleep (200) // Wiat 200msec + Add (Local0, 200, Local0) + If (Lequal (5000, Local0)){ // 6 + ABIE (Arg0, 0x1) // Enable Attention button interrupt + Return (0x03) // Continue with Eject Request + } // 6 + } // 5 +// User presses attention button again to abort eject request + PWCM (Arg0, 0x01) // Set power indicator off + Wbpe (Add(Arg0, XSST), SABP) // Clear attention status + ABIE (Arg0, 1) // Enable Attention button interrupt + Return (0xff) // Do nothing and abort + } // 4 +// Card is present and slot is not powered +// User presses attention button to indicate card is inserted + Else { // Slot power is "OFF". So power up the slot 7 + ABIE (Arg0, 0) // Disable Attention button interrupt + PWCM(Arg0, 0x2) // Set power indicator to blink +// Check if user presses attention button again to cancel the insertion + Store (0x0, Local0) // Set 5 sec accumulator to 0 + While (LNotEqual(And(Rwpe(Add(Arg0, XSST)), SABP), SABP)){ //Check for Attention button again 8 + Sleep(200) + Add(Local0, 200, Local0) + if (LEqual(5000, Local0)){ // 9 + ABIE (Arg0, 1) // Enable Attention button interrupt + ATCM (Arg0, 0x3) // Set attention indicator off + PWSL (Arg0, 0x1) // Power the slot + Sleep (500) // Wait for .5sec for the power to stabilize +// Check for Power fault Detection + If (LNotEqual(And(Rwpe(Add(Arg0, XSST)), SPFD), SPFD)) { // No power fault + PWCM (Arg0, 0x1) // Set power indicator to "ON" + Return (0x0) // Insertion request + } + Else { // Power Fault present 10 + PWCM (Arg0, 0x3) // Set power indicator to OFF + PWSL (Arg0, 0x0) // Set power off + ATCM (Arg0, 0x2) // Set attention indicator to Blink + Return (0x3) // Eject Request + } // 10 + } // 9 + } // 8 +// User presses attention button again, Leave slot unpowered + Wbpe (Add(Arg0, XSST), SABP) // Clear attention status + ABIE (Arg0, 1) // Enable Attention button interrupt + PWCM (Arg0, 0x3) // Set Power indicator back to "OFF" + Return (0xff) // + } // End if Slot power if "OFF" 7 + } // End for Attention button Hot plug interrupt 2 + + If (And(Rwpe(Add(Arg0, XSST)), SPFD)) { // Check if power fault detected + Wbpe (Add(Arg0, XSST), SPFD) // Clear the power fault Status + PWCM (Arg0, 0x3) // Set power indicator to "OFF" + PWSL (Arg0, 0x0) // Set power off + ATCM (Arg0, 0x2) // Set attention indicator "Blink" + Return (0x3) // Eject request + } // End for Power Fault Interrupt + + + If (And(Rwpe(Add(Arg0, XSST)), MRLC)) { // Check if interrupt caused by the MRL sensor + Wbpe (Add(Arg0, XSST), MRLC) // Clear the MRL status + Return (0x3) // Eject request + } + + If (And(Rwpe(Add(Arg0, XSST)), SPDC)) { // Check if Presence Detect changed status 11 + Wbpe (Add(Arg0, XSST), SPDC) // Clear Presence Detect Changed status + If (LEqual(And(Rwpe(Add(Arg0, XSST)), SPDS), 0x00)) { // Check if Slot empty + PWSL (Arg0, 0x0) // Set power slot "OFF" + PWCM (Arg0, 0x3) // Set power indicator to "OFF" + Return (0x3) // Eject Request + } + Else { // Card is present 12 + ABIE (Arg0, 0) // Attention button Interrupt disable + PWCM (Arg0, 0x2) // Set power indicator to blink + Store (0x0, Local0) // set 5 sec accumulator to 0 + While (LEqual(And(Rwpe(Add(Arg0, XSST)), SABP), 0x00)){ //Check for Attention button again 13 + Sleep (200) // wait 200ms + Add (Local0, 200, Local0) + If (LEqual(5000, Local0)){ // 14 + ABIE (Arg0, 1) // Enable Attention button interrupt + ATCM (Arg0, 0x3) // Set attention indicator "OFF" + PWSL (Arg0, 0x1) // Power the slot + Sleep (500) // wair for 0.5 sec for power to stabilize + If (LEqual(And(Rwpe(Add(Arg0, XSST)), SPFD), 0x00)) { // No power fault 16 + PWCM (Arg0, 0x1) // Set power indicator to "ON" + Return (0x0) // Notify OS to load the driver + } // 16 + Else { // Power Fault detected // 15 + PWCM (Arg0, 0x3) // Set power indicator to "OFF" + PWSL (Arg0, 0x0) // Set power "OFF" + ATCM (Arg0, 0x2) // Set attention indicator to "Blink" + Return (0x3) // Eject request + } // End of Power Fault 15 + } // 14 + } // 13 +// Attention button pressed to abort the process + ABIE (Arg0, 1) // Enable Attention button interrupt + PWCM (Arg0, 0x3) // Set power indicator back to "OFF" + Return (0xff) // + } // End of Slot power on/off 12 + } // End of Presence Detect changed Hot plug interrupt 11 + Return (0xff) // Control should not come here + } // End of PP4H 1 +} // End of \_SB.PCI0 + |