Skip to content

Instantly share code, notes, and snippets.

@al3xtjames
Last active July 15, 2016 20:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save al3xtjames/83fddf4f6caf3ed5592a0f6d2ea88baf to your computer and use it in GitHub Desktop.
Save al3xtjames/83fddf4f6caf3ed5592a0f6d2ea88baf to your computer and use it in GitHub Desktop.
Haswell XHC Port Enable/Disable

Haswell DSDT excerpt:

Scope (_SB.PCI0.XHC.RHUB.HS01)
{
    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
    {
        If (!PRTE (_ADR))
        {
            Return (UPCN) /* \_SB_.PCI0.XHC_.RHUB.UPCN */
        }

        Return (UPC3) /* \_SB_.PCI0.XHC_.RHUB.UPC3 */
    }

    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
    {
        If (!PRTE (_ADR))
        {
            Return (PLDN) /* \_SB_.PCI0.XHC_.RHUB.PLDN */
        }

        Return (PLD1) /* \_SB_.PCI0.XHC_.RHUB.PLD1 */
    }
}

_PLD() calls PRTE(_ADR) to determine if the port should be enabled.

        Method (PRTE, 1, Serialized)
        {
            Name (_T_2, Zero)  // _T_x: Emitted by ASL Compiler
            Name (_T_1, Zero)  // _T_x: Emitted by ASL Compiler
            Name (_T_0, Zero)  // _T_x: Emitted by ASL Compiler
            If ((Arg0 <= XHPC))
            {
                If ((PCHV () == LPTH))
                {
                    While (One)
                    {
                        _T_0 = Arg0
                        If ((_T_0 == One))
                        {
                            Return ((PR2 & One))
                        }
                        ElseIf ((_T_0 == 0x02))
                        {
                            Return ((PR2 & 0x02))
                        }
                        ElseIf ((_T_0 == 0x03))
                        {
                            Return ((PR2 & 0x04))
                        }
                        ElseIf ((_T_0 == 0x04))
                        {
                            Return ((PR2 & 0x08))
                        }
                        ElseIf ((_T_0 == 0x05))
                        {
                            Return ((PR2 & 0x0100))
                        }
                        ElseIf ((_T_0 == 0x06))
                        {
                            Return ((PR2 & 0x0200))
                        }
                        ElseIf ((_T_0 == 0x07))
                        {
                            Return ((PR2 & 0x0400))
                        }
                        ElseIf ((_T_0 == 0x08))
                        {
                            Return ((PR2 & 0x0800))
                        }
                        ElseIf ((_T_0 == 0x09))
                        {
                            Return ((PR2 & 0x10))
                        }
                        ElseIf ((_T_0 == 0x0A))
                        {
                            Return ((PR2 & 0x20))
                        }
                        ElseIf ((_T_0 == 0x0B))
                        {
                            Return ((PR2 & 0x1000))
                        }
                        ElseIf ((_T_0 == 0x0C))
                        {
                            Return ((PR2 & 0x2000))
                        }
                        ElseIf ((_T_0 == 0x0D))
                        {
                            Return ((PR2 & 0x40))
                        }
                        ElseIf ((_T_0 == 0x0E))
                        {
                            Return ((PR2 & 0x80))
                        }
                        Else
                        {
                            Return (Zero)
                        }

                        Break
                    }
                }
                Else
                {
                    While (One)
                    {
                        _T_1 = Arg0
                        If ((_T_1 == One))
                        {
                            Return ((PR2 & One))
                        }
                        ElseIf ((_T_1 == 0x02))
                        {
                            Return ((PR2 & 0x02))
                        }
                        ElseIf ((_T_1 == 0x03))
                        {
                            Return ((PR2 & 0x04))
                        }
                        ElseIf ((_T_1 == 0x04))
                        {
                            Return ((PR2 & 0x08))
                        }
                        ElseIf ((_T_1 == 0x05))
                        {
                            Return ((PR2 & 0x10))
                        }
                        ElseIf ((_T_1 == 0x06))
                        {
                            Return ((PR2 & 0x20))
                        }
                        ElseIf ((_T_1 == 0x07))
                        {
                            Return ((PR2 & 0x40))
                        }
                        ElseIf ((_T_1 == 0x08))
                        {
                            Return ((PR2 & 0x80))
                        }
                        ElseIf ((_T_1 == 0x09))
                        {
                            Return ((PR2 & 0x0100))
                        }
                        ElseIf ((_T_1 == 0x0A))
                        {
                            Return ((PR2 & 0x0200))
                        }
                        Else
                        {
                            Return (Zero)
                        }

                        Break
                    }
                }
            }

            If (((Arg0 == (XHPC + One)) && (XRPC == One)))
            {
                If ((PCHV () == LPTH))
                {
                    Return ((PR2 & 0x4000))
                }

                If ((PCHV () == LPTL))
                {
                    Return ((PR2 & 0x0100))
                }

                If ((PCHV () == WPTL))
                {
                    Return ((PR2 & 0x0400))
                }
            }

            If ((Arg0 >= XSPA))
            {
                Local0 = (Arg0 - XSPA) /* \XSPA */
                While (One)
                {
                    _T_2 = Local0
                    If ((_T_2 == Zero))
                    {
                        Return ((PR3 & One))
                    }
                    ElseIf ((_T_2 == One))
                    {
                        Return ((PR3 & 0x02))
                    }
                    ElseIf ((_T_2 == 0x02))
                    {
                        Return ((PR3 & 0x04))
                    }
                    ElseIf ((_T_2 == 0x03))
                    {
                        Return ((PR3 & 0x08))
                    }
                    ElseIf ((_T_2 == 0x04))
                    {
                        Return ((PR3 & 0x10))
                    }
                    ElseIf ((_T_2 == 0x05))
                    {
                        Return ((PR3 & 0x20))
                    }
                    Else
                    {
                        Return (Zero)
                    }

                    Break
                }
            }

            Return (Zero)
        }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment