summaryrefslogtreecommitdiff
path: root/Core/EM/ACPI/PCIEHP.ASL
diff options
context:
space:
mode:
Diffstat (limited to 'Core/EM/ACPI/PCIEHP.ASL')
-rw-r--r--Core/EM/ACPI/PCIEHP.ASL346
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
+