• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
56NOTES:
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
62DefinitionBlock (
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