Home | History | Annotate | Download | only in Ssdt
      1 /*-----------------------------------------------------------------------------
      2 
      3 
      4  Intel Silvermont Processor Power Management BIOS Reference Code
      5 
      6  Copyright (c) 2006 - 2014, Intel Corporation
      7 
      8   This program and the accompanying materials are licensed and made available under
      9   the terms and conditions of the BSD License that accompanies this distribution.
     10   The full text of the license may be found at
     11   http://opensource.org/licenses/bsd-license.php.
     12 
     13   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     14   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     15 
     16 
     17  Filename:    CPUPM.ASL
     18 
     19  Revision:    Refer to Readme
     20 
     21  Date:        Refer to Readme
     22 -------------------------------------------------------------------------------
     23 
     24  This Processor Power Management BIOS Source Code is furnished under license
     25  and may only be used or copied in accordance with the terms of the license.
     26  The information in this document is furnished for informational use only, is
     27  subject to change without notice, and should not be construed as a commitment
     28  by Intel Corporation. Intel Corporation assumes no responsibility or liability
     29  for any errors or inaccuracies that may appear in this document or any
     30  software that may be provided in association with this document.
     31 
     32  Except as permitted by such license, no part of this document may be
     33  reproduced, stored in a retrieval system, or transmitted in any form or by
     34  any means without the express written consent of Intel Corporation.
     35 
     36  WARNING: You are authorized and licensed to install and use this BIOS code
     37  ONLY on an IST PC. This utility may damage any system that does not
     38  meet these requirements.
     39 
     40     An IST PC is a computer which
     41     (1) Is capable of seamlessly and automatically transitioning among
     42     multiple performance states (potentially operating at different
     43     efficiency ratings) based upon power source changes, END user
     44     preference, processor performance demand, and thermal conditions; and
     45     (2) Includes an Intel Pentium II processors, Intel Pentium III
     46     processor, Mobile Intel Pentium III Processor-M, Mobile Intel Pentium 4
     47     Processor-M, Intel Pentium M Processor, or any other future Intel
     48     processors that incorporates the capability to transition between
     49     different performance states by altering some, or any combination of,
     50     the following processor attributes: core voltage, core frequency, bus
     51     frequency, number of processor cores available, or any other attribute
     52     that changes the efficiency (instructions/unit time-power) at which the
     53     processor operates.
     54 -------------------------------------------------------------------------------
     55 
     56 NOTES:
     57     (1) <TODO> - Except for the SSDT package, the objects in this ASL code
     58     may be moved to the DSDT. It is kept separate in this reference package
     59     for ease of distribution only.
     60 ------------------------------------------------------------------------------*/
     61 
     62 DefinitionBlock (
     63     "CPUPM.aml",
     64     "SSDT",
     65     0x01,
     66     "PmRef",
     67     "CpuPm",
     68     0x3000
     69     )
     70 {
     71     External(\_PR.CPU0, DeviceObj)
     72     External(\_PR.CPU1, DeviceObj)
     73     External(\_PR.CPU2, DeviceObj)
     74     External(\_PR.CPU3, DeviceObj)
     75     External(SMIF)
     76 
     77   Scope(\)
     78   {
     79 
     80       // Package of pointers to SSDT's
     81       //
     82       // First column is SSDT name, used for debug only.
     83       // (First column must be EXACTLY eight characters.)
     84       // Second column is physical address.
     85       // Third column is table length.
     86       //
     87       // IF modifying this file, see warnings listed in ppminit.asm.
     88       //
     89       Name(SSDT,Package()
     90       {
     91           "CPU0IST ", 0x80000000, 0x80000000,
     92           "APIST   ", 0x80000000, 0x80000000,
     93           "CPU0CST ", 0x80000000, 0x80000000,
     94           "APCST   ", 0x80000000, 0x80000000
     95       })
     96 
     97       //
     98       // Note:  See PpmBiosInit in PPMINIT.ASM for a definition of
     99       // the PpmFlags mirrored in CFGD.
    100       //
    101       Name(CFGD, 0x80000000)
    102 
    103       Name(\PDC0,0x80000000)    // CPU0 _PDC Flags.
    104       Name(\PDC1,0x80000000)    // CPU1 _PDC Flags.
    105       Name(\PDC2,0x80000000)    // CPU2 _PDC Flags.
    106       Name(\PDC3,0x80000000)    // CPU3 _PDC Flags.
    107       Name(\SDTL,0x00)          // Loaded SSDT Flags.
    108   }
    109 
    110   Scope(\_PR.CPU0)
    111   {
    112       //
    113       // Define handles for opregions (used by load.)
    114       //
    115       Name(HI0,0)        // Handle to CPU0IST
    116       Name(HC0,0)        // Handle to CPU0CST
    117 
    118       Method(_PDC,1)
    119       {
    120           //
    121           // Check and extract the _PDC information.
    122           //
    123           Store(CPDC(Arg0), Local0)
    124           //
    125           // Save the capability information and load tables as needed.
    126           //
    127           GCAP(Local0)
    128           //
    129           // Return status.
    130           //
    131           //Return (Local0)
    132       }
    133 
    134       Method(_OSC, 4)
    135       {
    136           //
    137           // Check and extract the _OSC information.
    138           //
    139           Store(COSC(Arg0, Arg1, Arg2, Arg3), Local0)
    140           //
    141           // Save the capability information and load tables as needed.
    142           //
    143           GCAP(Local0)
    144           //
    145           // Return status.
    146           //
    147           Return (Local0)
    148       }
    149 
    150       //
    151       // Implement a generic Method to check _PDC information which may be called
    152       // by any of the processor scopes.  (The use of _PDC is deprecated in ACPI 3.
    153       // in favor of _OSC. However, for backwards compatibility, _PDC may be
    154       // implemented using _OSC as follows:)
    155       //
    156       Method(CPDC,1)
    157       {
    158           CreateDwordField (Arg0, 0, REVS)
    159           CreateDwordField (Arg0, 4, SIZE)
    160 
    161           //
    162           // Local0 = Number of bytes for Arg0
    163           //
    164           Store (SizeOf (Arg0), Local0)
    165 
    166           //
    167           // Local1 = Number of Capabilities bytes in Arg0
    168           //
    169           Store (Subtract (Local0, 8), Local1)
    170 
    171           //
    172           // TEMP = Temporary field holding Capability DWORDs
    173           //
    174           CreateField (Arg0, 64, Multiply (Local1, 8), TEMP)
    175 
    176           //
    177           // Create the Status (STAT) buffer with the first DWORD = 0
    178           // This is required as per ACPI 3.0 Spec which says the
    179           // first DWORD is used to return errors defined by _OSC.
    180           //
    181           Name (STS0, Buffer () {0x00, 0x00, 0x00, 0x00})
    182 
    183           //
    184           // Concatenate the _PDC capabilities bytes to the STS0 Buffer
    185           // and store them in a local variable for calling OSC
    186           //
    187           Concatenate (STS0, TEMP, Local2)
    188 
    189           Return(COSC (ToUUID("4077A616-290C-47BE-9EBD-D87058713953"), REVS, SIZE, Local2))
    190       }
    191 
    192       //
    193       // Implement a generic Method to check _OSC information which may be called
    194       // by any of the processor scopes.
    195       //
    196       Method(COSC, 4)
    197       {
    198           //
    199           // Point to Status DWORD in the Arg3 buffer (STATUS)
    200           //
    201           CreateDWordField(Arg3, 0, STS0)
    202           //
    203           // Point to Caps DWORDs of the Arg3 buffer (CAPABILITIES)
    204           //
    205           CreateDwordField(Arg3, 4, CAP0)
    206 
    207           //
    208           // _OSC needs to validate the UUID and Revision.
    209           //
    210           // IF Unrecognized UUID
    211           //    Return Unrecognized UUID _OSC Failure
    212           // IF Unsupported Revision
    213           //    Return Unsupported Revision _OSC Failure
    214           //
    215           //    STS0[0] = Reserved
    216           //    STS0[1] = _OSC Failure
    217           //    STS0[2] = Unrecognized UUID
    218           //    STS0[3] = Unsupported Revision
    219           //    STS0[4] = Capabilities masked
    220           //
    221           // Note:  The comparison method used is necessary due to
    222           // limitations of certain OSes which cannot perform direct
    223           // buffer comparisons.
    224           //
    225           // Create a set of "Input" UUID fields.
    226           //
    227           CreateDwordField(Arg0, 0x0, IID0)
    228           CreateDwordField(Arg0, 0x4, IID1)
    229           CreateDwordField(Arg0, 0x8, IID2)
    230           CreateDwordField(Arg0, 0xC, IID3)
    231           //
    232           // Create a set of "Expected" UUID fields.
    233           //
    234           Name(UID0, ToUUID("4077A616-290C-47BE-9EBD-D87058713953"))
    235           CreateDwordField(UID0, 0x0, EID0)
    236           CreateDwordField(UID0, 0x4, EID1)
    237           CreateDwordField(UID0, 0x8, EID2)
    238           CreateDwordField(UID0, 0xC, EID3)
    239           //
    240           // Verify the input UUID matches the expected UUID.
    241           //
    242           If(LNot(LAnd(LAnd(LEqual(IID0, EID0),LEqual(IID1, EID1)),LAnd(LEqual(IID2, EID2),LEqual(IID3, EID3)))))
    243           {
    244               //
    245               // Return Unrecognized UUID _OSC Failure
    246               //
    247               Store (0x6, STS0)
    248               Return (Arg3)
    249           }
    250 
    251           If(LNot(LEqual(Arg1,1)))
    252           {
    253               //
    254               // Return Unsupported Revision _OSC Failure
    255               //
    256               Store (0xA, STS0)
    257               Return (Arg3)
    258           }
    259 
    260           Return (Arg3)
    261       }
    262 
    263       //
    264       // Get the capability information and load appropriate tables as needed.
    265       //
    266       Method(GCAP, 1)
    267       {
    268 
    269           // Point to Status DWORD in the Arg0 buffer (STATUS)
    270           CreateDWordField(Arg0, 0, STS0)
    271 
    272           // Point to Caps DWORDs of the Arg0 buffer (CAPABILITIES)
    273           CreateDwordField(Arg0, 4, CAP0)
    274 
    275           //
    276           // If the UUID was unrecognized or the _OSC revision was unsupported,
    277           // return without updating capabilities.
    278           //
    279           If(LOr(LEqual(STS0,0x6),LEqual(STS0,0xA)))
    280           {
    281               Return()
    282           }
    283 
    284           //
    285           // Check if this is a query (BIT0 of Status = 1).
    286           // If so, mask off the bits we support and return.
    287           //
    288           if (And(STS0, 1))
    289           {
    290               And(CAP0, 0xBFF, CAP0)
    291               Return()
    292           }
    293 
    294           //
    295           // Store result of PDC. (We clear out the MSB, which was just
    296           // used as a placeholder for the compiler; and then "OR" the
    297           // value in case we get multiple calls, each of which only
    298           // reports partial support.)
    299           //
    300           Or(And(PDC0, 0x7FFFFFFF), CAP0, PDC0)
    301 
    302           //
    303           // Check IF the IST SSDTs should be loaded.
    304           //
    305           //   CFGD[0] = GV3 Capable/Enabled
    306           //
    307           If(And(CFGD,0x01))
    308           {
    309               //
    310               // Load the IST SSDTs if:
    311               //   (1) CMP capable and enabled.
    312               //   (2) Driver supports P-States in MP configurations
    313               //   (3) Driver supports direct HW P-State control
    314               //   (4) SSDT is not already loaded
    315               //
    316               //   CFGD[24] = Two or more cores enabled
    317               //   PDCx[3]  = OS supports C1 and P-states in MP systems
    318               //   PDCx[0]  = OS supports direct access of the perf MSR
    319               //   SDTL[0]  = CPU0 IST SSDT Loaded
    320               //
    321               If(LAnd(LAnd(And(CFGD,0x01000000),LEqual(And(PDC0, 0x0009), 0x0009)),LNot(And(SDTL,0x01))))
    322               {
    323                   //
    324                   // Flag the IST SSDT as loaded for CPU0
    325                   //
    326                   Or(SDTL, 0x01, SDTL)
    327 
    328                   OperationRegion(IST0,SystemMemory,DeRefOf(Index(SSDT,1)),DeRefOf(Index(SSDT,2)))
    329                   Load(IST0, HI0)    // Dynamically load the CPU0IST SSDT
    330               }
    331           }
    332 
    333           //
    334           // Check IF the CST SSDTs should be loaded.
    335           //
    336           //   CFGD[11,7,2,1] = C6, C4, C1E, C1 Capable/Enabled
    337           //
    338           If(And(CFGD,0x82))
    339           {
    340               //
    341               // Load the CST SSDTs if:
    342               //   (1) CMP capable/enabled
    343               //   (2) Driver supports multi-processor configurations
    344               //   (3) CPU0 CST ISDT is not already loaded
    345               //
    346               //   CFGD[24] = Two or more cores enabled
    347               //   PDCx[3]  = OS supports C1 and P-states in MP systems
    348               //   PDCx[4]  = OS supports ind. C2/C3 in MP systems
    349               //   SDTL[1]  = CPU0 CST SSDT Loaded
    350               //
    351               If(LAnd(LAnd(And(CFGD,0x01000000),And(PDC0,0x0018)),LNot(And(SDTL,0x02))))
    352               {
    353                   //
    354                   // Flag the CST SSDT as loaded for CPU0
    355                   //
    356                   Or(SDTL, 0x02, SDTL)
    357 
    358                   OperationRegion(CST0,SystemMemory,DeRefOf(Index(SSDT,7)),DeRefOf(Index(SSDT,8)))
    359                   Load(CST0, HC0)    // Dynamically load the CPU0CST SSDT
    360               }
    361           }
    362 
    363           Return ()
    364       }
    365   }
    366 
    367 
    368   Scope(\_PR.CPU1)
    369   {
    370       //
    371       // Define handles for opregions (used by load.)
    372       //
    373       Name(HI1,0)        // Handle to APIST
    374       Name(HC1,0)        // Handle to APCST
    375 
    376       Method(_PDC,1)
    377       {
    378           //
    379           // Refer to \_PR.CPU0._PDC for description.
    380           //
    381           Store(\_PR.CPU0.CPDC(Arg0), Local0)
    382           GCAP(Local0)
    383           //Return (Local0)
    384       }
    385 
    386       Method(_OSC, 4)
    387       {
    388           //
    389           // Refer to \_PR.CPU0._OSC for description.
    390           //
    391           Store(\_PR.CPU0.COSC(Arg0, Arg1, Arg2, Arg3), Local0)
    392           GCAP(Local0)
    393           Return (Local0)
    394       }
    395 
    396       //
    397       // Get the capability information and load appropriate tables as needed.
    398       //
    399       Method(GCAP, 1)
    400       {
    401           //
    402           // Point to Status DWORD in the Arg0 buffer (STATUS)
    403           //
    404           CreateDWordField(Arg0, 0, STS1)
    405           //
    406           // Point to Caps DWORDs of the Arg0 buffer (CAPABILITIES)
    407           //
    408           CreateDwordField(Arg0, 4, CAP1)
    409           //
    410           // If the UUID was unrecognized or the _OSC revision was unsupported,
    411           // return without updating capabilities.
    412           //
    413           If(LOr(LEqual(STS1,0x6),LEqual(STS1,0xA)))
    414           {
    415               Return()
    416           }
    417 
    418           //
    419           // Check if this is a query (BIT0 of Status = 1).
    420           // If so, mask off the bits we support and return.
    421           //
    422           if (And(STS1, 1))
    423           {
    424               And(CAP1, 0xBFF, CAP1)
    425               Return()
    426           }
    427 
    428           //
    429           // Store result of PDC. (We clear out the MSB, which was just
    430           // used as a placeholder for the compiler; and then "OR" the
    431           // value in case we get multiple calls, each of which only
    432           // reports partial support.)
    433           //
    434           Or(And(PDC1, 0x7FFFFFFF), CAP1, PDC1)
    435 
    436           //
    437           // Attempt to dynamically load the IST SSDTs if:
    438           //   (1) Driver supports P-States in MP configurations
    439           //   (2) Driver supports direct HW P-State control
    440           //
    441           //   PDCx[3]  = OS supports C1 and P-states in MP systems
    442           //   PDCx[0]  = OS supports direct access of the perf MSR
    443           //
    444           If(LEqual(And(PDC0, 0x0009), 0x0009))
    445           {
    446               APPT()
    447           }
    448 
    449           //
    450           // Load the CST SSDTs if:
    451           //   (1) Driver supports multi-processor configurations
    452           //
    453           //   PDCx[3]  = OS supports C1 and P-states in MP systems
    454           //   PDCx[4]  = OS supports ind. C2/C3 in MP systems
    455           //
    456           If(And(PDC0,0x0018))
    457           {
    458               APCT()
    459           }
    460 
    461           Return()
    462       }
    463 
    464       //
    465       // Dynamically load the CST SSDTs if:
    466       //   (1) C-States are enabled
    467       //   (2) SSDT is not already loaded
    468       //
    469       //   CFGD[11,7,2,1] = C6, C4, C1E, C1 Capable/Enabled
    470       //   SDTL[5]   = AP CST SSDT Loaded
    471       //
    472       Method(APCT,0)
    473       {
    474           If(LAnd(And(CFGD,0x82),LNot(And(SDTL,0x20))))
    475           {
    476               //
    477               // Flag the CST SSDT as loaded for the AP's
    478               //
    479               Or(SDTL, 0x20, SDTL)
    480               //
    481               // Dynamically load the APCST SSDT
    482               //
    483               OperationRegion(CST1,SystemMemory,DeRefOf(Index(SSDT,10)),DeRefOf(Index(SSDT,11)))
    484               Load(CST1, HC1)
    485           }
    486       }
    487 
    488       //
    489       // Dynamically load the IST SSDTs if:
    490       //   (1) If GV3 capable and enabled
    491       //   (2) SSDT is not already loaded
    492       //
    493       //   CFGD[0] = GV3 Capable/Enabled
    494       //   SDTL[4] = AP IST SSDT Loaded
    495       //
    496       Method(APPT,0)
    497       {
    498           If(LAnd(And(CFGD,0x01),LNot(And(SDTL,0x10))))
    499           {
    500               //
    501               // Flag the IST SSDT as loaded for CPU0
    502               //
    503               Or(SDTL, 0x10, SDTL)
    504 
    505               OperationRegion(IST1,SystemMemory,DeRefOf(Index(SSDT,4)),DeRefOf(Index(SSDT,5)))
    506               Load(IST1, HI1)    // Dynamically load the CPU1IST SSDT
    507           }
    508       }
    509   }    // End CPU1
    510 
    511   Scope(\_PR.CPU2)
    512   {
    513       //
    514       // Define handles for opregions (used by load.)
    515       //
    516       Name(HI1,0)        // Handle to APIST
    517       Name(HC1,0)        // Handle to APCST
    518 
    519       Method(_PDC,1)
    520       {
    521           //
    522           // Refer to \_PR.CPU0._PDC for description.
    523           //
    524           Store(\_PR.CPU0.CPDC(Arg0), Local0)
    525           GCAP(Local0)
    526           //Return (Local0)
    527       }
    528 
    529       Method(_OSC, 4)
    530       {
    531           //
    532           // Refer to \_PR.CPU0._OSC for description.
    533           //
    534           Store(\_PR.CPU0.COSC(Arg0, Arg1, Arg2, Arg3), Local0)
    535           GCAP(Local0)
    536           Return (Local0)
    537       }
    538 
    539       //
    540       // Get the capability information and load appropriate tables as needed.
    541       //
    542       Method(GCAP, 1)
    543       {
    544           //
    545           // Point to Status DWORD in the Arg0 buffer (STATUS)
    546           //
    547           CreateDWordField(Arg0, 0, STS1)
    548           //
    549           // Point to Caps DWORDs of the Arg0 buffer (CAPABILITIES)
    550           //
    551           CreateDwordField(Arg0, 4, CAP1)
    552           //
    553           // If the UUID was unrecognized or the _OSC revision was unsupported,
    554           // return without updating capabilities.
    555           //
    556           If(LOr(LEqual(STS1,0x6),LEqual(STS1,0xA)))
    557           {
    558               Return()
    559           }
    560 
    561           //
    562           // Check if this is a query (BIT0 of Status = 1).
    563           // If so, mask off the bits we support and return.
    564           //
    565           if (And(STS1, 1))
    566           {
    567               And(CAP1, 0xBFF, CAP1)
    568               Return()
    569           }
    570 
    571           //
    572           // Store result of PDC. (We clear out the MSB, which was just
    573           // used as a placeholder for the compiler; and then "OR" the
    574           // value in case we get multiple calls, each of which only
    575           // reports partial support.)
    576           //
    577           Or(And(PDC1, 0x7FFFFFFF), CAP1, PDC1)
    578 
    579           //
    580           // Attempt to dynamically load the IST SSDTs if:
    581           //   (1) Driver supports P-States in MP configurations
    582           //   (2) Driver supports direct HW P-State control
    583           //
    584           //   PDCx[3]  = OS supports C1 and P-states in MP systems
    585           //   PDCx[0]  = OS supports direct access of the perf MSR
    586           //
    587           If(LEqual(And(PDC0, 0x0009), 0x0009))
    588           {
    589               APPT()
    590           }
    591 
    592           //
    593           // Load the CST SSDTs if:
    594           //   (1) Driver supports multi-processor configurations
    595           //
    596           //   PDCx[3]  = OS supports C1 and P-states in MP systems
    597           //   PDCx[4]  = OS supports ind. C2/C3 in MP systems
    598           //
    599           If(And(PDC0,0x0018))
    600           {
    601               APCT()
    602           }
    603 
    604           Return()
    605       }
    606 
    607       //
    608       // Dynamically load the CST SSDTs if:
    609       //   (1) C-States are enabled
    610       //   (2) SSDT is not already loaded
    611       //
    612       //   CFGD[11,7,2,1] = C6, C4, C1E, C1 Capable/Enabled
    613       //   SDTL[5]   = AP CST SSDT Loaded
    614       //
    615       Method(APCT,0)
    616       {
    617           If(LAnd(And(CFGD,0x82),LNot(And(SDTL,0x20))))
    618           {
    619               //
    620               // Flag the CST SSDT as loaded for the AP's
    621               //
    622               Or(SDTL, 0x20, SDTL)
    623               //
    624               // Dynamically load the APCST SSDT
    625               //
    626               OperationRegion(CST1,SystemMemory,DeRefOf(Index(SSDT,10)),DeRefOf(Index(SSDT,11)))
    627               Load(CST1, HC1)
    628           }
    629       }
    630 
    631       //
    632       // Dynamically load the IST SSDTs if:
    633       //   (1) If GV3 capable and enabled
    634       //   (2) SSDT is not already loaded
    635       //
    636       //   CFGD[0] = GV3 Capable/Enabled
    637       //   SDTL[4] = AP IST SSDT Loaded
    638       //
    639       Method(APPT,0)
    640       {
    641           If(LAnd(And(CFGD,0x01),LNot(And(SDTL,0x10))))
    642           {
    643               //
    644               // Flag the IST SSDT as loaded for CPU0
    645               //
    646               Or(SDTL, 0x10, SDTL)
    647 
    648               OperationRegion(IST1,SystemMemory,DeRefOf(Index(SSDT,4)),DeRefOf(Index(SSDT,5)))
    649               Load(IST1, HI1)    // Dynamically load the CPU1IST SSDT
    650           }
    651       }
    652   }    // End CPU1
    653 
    654   Scope(\_PR.CPU3)
    655   {
    656       //
    657       // Define handles for opregions (used by load.)
    658       //
    659       Name(HI1,0)        // Handle to APIST
    660       Name(HC1,0)        // Handle to APCST
    661 
    662       Method(_PDC,1)
    663       {
    664           //
    665           // Refer to \_PR.CPU0._PDC for description.
    666           //
    667           Store(\_PR.CPU0.CPDC(Arg0), Local0)
    668           GCAP(Local0)
    669           //Return (Local0)
    670       }
    671 
    672       Method(_OSC, 4)
    673       {
    674           //
    675           // Refer to \_PR.CPU0._OSC for description.
    676           //
    677           Store(\_PR.CPU0.COSC(Arg0, Arg1, Arg2, Arg3), Local0)
    678           GCAP(Local0)
    679           Return (Local0)
    680       }
    681 
    682       //
    683       // Get the capability information and load appropriate tables as needed.
    684       //
    685       Method(GCAP, 1)
    686       {
    687           //
    688           // Point to Status DWORD in the Arg0 buffer (STATUS)
    689           //
    690           CreateDWordField(Arg0, 0, STS1)
    691           //
    692           // Point to Caps DWORDs of the Arg0 buffer (CAPABILITIES)
    693           //
    694           CreateDwordField(Arg0, 4, CAP1)
    695           //
    696           // If the UUID was unrecognized or the _OSC revision was unsupported,
    697           // return without updating capabilities.
    698           //
    699           If(LOr(LEqual(STS1,0x6),LEqual(STS1,0xA)))
    700           {
    701               Return()
    702           }
    703 
    704           //
    705           // Check if this is a query (BIT0 of Status = 1).
    706           // If so, mask off the bits we support and return.
    707           //
    708           if (And(STS1, 1))
    709           {
    710               And(CAP1, 0xBFF, CAP1)
    711               Return()
    712           }
    713 
    714           //
    715           // Store result of PDC. (We clear out the MSB, which was just
    716           // used as a placeholder for the compiler; and then "OR" the
    717           // value in case we get multiple calls, each of which only
    718           // reports partial support.)
    719           //
    720           Or(And(PDC1, 0x7FFFFFFF), CAP1, PDC1)
    721 
    722           //
    723           // Attempt to dynamically load the IST SSDTs if:
    724           //   (1) Driver supports P-States in MP configurations
    725           //   (2) Driver supports direct HW P-State control
    726           //
    727           //   PDCx[3]  = OS supports C1 and P-states in MP systems
    728           //   PDCx[0]  = OS supports direct access of the perf MSR
    729           //
    730           If(LEqual(And(PDC0, 0x0009), 0x0009))
    731           {
    732               APPT()
    733           }
    734 
    735           //
    736           // Load the CST SSDTs if:
    737           //   (1) Driver supports multi-processor configurations
    738           //
    739           //   PDCx[3]  = OS supports C1 and P-states in MP systems
    740           //   PDCx[4]  = OS supports ind. C2/C3 in MP systems
    741           //
    742           If(And(PDC0,0x0018))
    743           {
    744               APCT()
    745           }
    746 
    747           Return()
    748       }
    749 
    750       //
    751       // Dynamically load the CST SSDTs if:
    752       //   (1) C-States are enabled
    753       //   (2) SSDT is not already loaded
    754       //
    755       //   CFGD[11,7,2,1] = C6, C4, C1E, C1 Capable/Enabled
    756       //   SDTL[5]   = AP CST SSDT Loaded
    757       //
    758       Method(APCT,0)
    759       {
    760           If(LAnd(And(CFGD,0x82),LNot(And(SDTL,0x20))))
    761           {
    762               //
    763               // Flag the CST SSDT as loaded for the AP's
    764               //
    765               Or(SDTL, 0x20, SDTL)
    766               //
    767               // Dynamically load the APCST SSDT
    768               //
    769               OperationRegion(CST1,SystemMemory,DeRefOf(Index(SSDT,10)),DeRefOf(Index(SSDT,11)))
    770               Load(CST1, HC1)
    771           }
    772       }
    773 
    774       //
    775       // Dynamically load the IST SSDTs if:
    776       //   (1) If GV3 capable and enabled
    777       //   (2) SSDT is not already loaded
    778       //
    779       //   CFGD[0] = GV3 Capable/Enabled
    780       //   SDTL[4] = AP IST SSDT Loaded
    781       //
    782       Method(APPT,0)
    783       {
    784           If(LAnd(And(CFGD,0x01),LNot(And(SDTL,0x10))))
    785           {
    786               //
    787               // Flag the IST SSDT as loaded for CPU0
    788               //
    789               Or(SDTL, 0x10, SDTL)
    790 
    791               OperationRegion(IST1,SystemMemory,DeRefOf(Index(SSDT,4)),DeRefOf(Index(SSDT,5)))
    792               Load(IST1, HI1)    // Dynamically load the CPU1IST SSDT
    793           }
    794       }
    795   }    // End CPU3
    796 } // End of Definition Block
    797 
    798 
    799 
    800