1/*++
2
3Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
4
5  SPDX-License-Identifier: BSD-2-Clause-Patent
6
7
8
9Module Name:
10
11  INTELGFX.ASL
12
13Abstract:
14
15  IGD OpRegion/Software ACPI Reference Code for the Baytrail Family.
16
17--*/
18
19// Enable/Disable Output Switching.  In WIN2K/WINXP, _DOS = 0 will
20// get called during initialization to prepare for an ACPI Display
21// Switch Event.  During an ACPI Display Switch, the OS will call
22// _DOS = 2 immediately after a Notify=0x80 to temporarily disable
23// all Display Switching.  After ACPI Display Switching is complete,
24// the OS will call _DOS = 0 to re-enable ACPI Display Switching.
25
26Method(_DOS,1)
27{
28  // Store Display Switching and LCD brightness BIOS control bit
29  Store(And(Arg0,7),DSEN)
30}
31
32// Enumerate the Display Environment.  This method will return
33// valid addresses for all display device encoders present in the
34// system.  The Miniport Driver will reject the addresses for every
35// encoder that does not have an attached display device.  After
36// enumeration is complete, the OS will call the _DGS methods
37// during a display switch only for the addresses accepted by the
38// Miniport Driver.  For hot-insertion and removal of display
39// devices, a re-enumeration notification will be required so the
40// address of the newly present display device will be accepted by
41// the Miniport Driver.
42
43Method(_DOD, 0, Serialized)
44{
45  Store(0, NDID)
46  If(LNotEqual(DIDL, Zero))
47  {
48    Store(SDDL(DIDL),DID1)
49  }
50  If(LNotEqual(DDL2, Zero))
51  {
52    Store(SDDL(DDL2),DID2)
53  }
54  If(LNotEqual(DDL3, Zero))
55  {
56    Store(SDDL(DDL3),DID3)
57  }
58  If(LNotEqual(DDL4, Zero))
59  {
60    Store(SDDL(DDL4),DID4)
61  }
62  If(LNotEqual(DDL5, Zero))
63  {
64    Store(SDDL(DDL5),DID5)
65  }
66
67  // TODO - This level of flexibility is not needed for a true
68  //      OEM design.  Simply determine the greatest number of
69  //      encoders the platform will suppport then remove all
70  //      return packages beyond that value.  Note that for
71  //      current silicon, the maximum number of encoders
72  //      possible is 5.
73
74  If(LEqual(NDID,1))
75  {
76    If (LNOTEqual (ISPD, 0))
77    {
78      Name(TMP0,Package() {0xFFFFFFFF,0xFFFFFFFF})
79      Store(Or(0x10000,DID1),Index(TMP0,0))
80      //Add ISP device to GFX0
81      Store(0x00020F38, Index(TMP0,1))
82      Return(TMP0)
83    } Else
84    {
85      Name(TMP1,Package() {0xFFFFFFFF})
86      Store(Or(0x10000,DID1),Index(TMP1,0))
87      Return(TMP1)
88    }
89  }
90
91  If(LEqual(NDID,2))
92  {
93    If (LNOTEqual (ISPD, 0))
94    {
95      Name(TMP2,Package() {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF})
96      Store(Or(0x10000,DID1),Index(TMP2,0))
97      Store(Or(0x10000,DID2),Index(TMP2,1))
98      //Add ISP device to GFX0
99      Store(0x00020F38, Index(TMP2,2))
100      Return(TMP2)
101    } Else
102    {
103      Name(TMP3,Package() {0xFFFFFFFF, 0xFFFFFFFF})
104      Store(Or(0x10000,DID1),Index(TMP3,0))
105      Store(Or(0x10000,DID2),Index(TMP3,1))
106      Return(TMP3)
107    }
108  }
109
110  If(LEqual(NDID,3))
111  {
112    If (LNOTEqual (ISPD, 0))
113    {
114      Name(TMP4,Package() {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF})
115      Store(Or(0x10000,DID1),Index(TMP4,0))
116      Store(Or(0x10000,DID2),Index(TMP4,1))
117      Store(Or(0x10000,DID3),Index(TMP4,2))
118      //Add ISP device to GFX0
119      Store(0x00020F38, Index(TMP4,3))
120      Return(TMP4)
121    } Else
122    {
123      Name(TMP5,Package() {0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF})
124      Store(Or(0x10000,DID1),Index(TMP5,0))
125      Store(Or(0x10000,DID2),Index(TMP5,1))
126      Store(Or(0x10000,DID3),Index(TMP5,2))
127      Return(TMP5)
128    }
129  }
130
131  If(LEqual(NDID,4))
132  {
133    If (LNOTEqual (ISPD, 0))
134    {
135      Name(TMP6,Package() {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF})
136      Store(Or(0x10000,DID1),Index(TMP6,0))
137      Store(Or(0x10000,DID2),Index(TMP6,1))
138      Store(Or(0x10000,DID3),Index(TMP6,2))
139      Store(Or(0x10000,DID4),Index(TMP6,3))
140      //Add ISP device to GFX0
141      Store(0x00020F38, Index(TMP6,4))
142      Return(TMP6)
143    } Else
144    {
145      Name(TMP7,Package() {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF})
146      Store(Or(0x10000,DID1),Index(TMP7,0))
147      Store(Or(0x10000,DID2),Index(TMP7,1))
148      Store(Or(0x10000,DID3),Index(TMP7,2))
149      Store(Or(0x10000,DID4),Index(TMP7,3))
150      Return(TMP7)
151    }
152  }
153
154  If(LGreater(NDID,4))
155  {
156    If (LNOTEqual (ISPD, 0))
157    {
158      Name(TMP8,Package() {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF})
159      Store(Or(0x10000,DID1),Index(TMP8,0))
160      Store(Or(0x10000,DID2),Index(TMP8,1))
161      Store(Or(0x10000,DID3),Index(TMP8,2))
162      Store(Or(0x10000,DID4),Index(TMP8,3))
163      Store(Or(0x10000,DID5),Index(TMP8,4))
164      //Add ISP device to GFX0
165      Store(0x00020F38, Index(TMP8,5))
166      Return(TMP8)
167    } Else
168    {
169      Name(TMP9,Package() {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF})
170      Store(Or(0x10000,DID1),Index(TMP9,0))
171      Store(Or(0x10000,DID2),Index(TMP9,1))
172      Store(Or(0x10000,DID3),Index(TMP9,2))
173      Store(Or(0x10000,DID4),Index(TMP9,3))
174      Store(Or(0x10000,DID5),Index(TMP9,4))
175      Return(TMP9)
176    }
177  }
178
179  // If nothing else, return Unknown LFP.
180  // (Prevents compiler warning.)
181
182  //Add ISP device to GFX0
183  If (LNOTEqual (ISPD, 0))
184  {
185    Return(Package() {0x00000400, 0x00020F38})
186  } Else
187  {
188    Return(Package() {0x00000400})
189  }
190}
191
192Device(DD01)
193{
194
195  // Return Unique ID.
196
197  Method(_ADR,0,Serialized)
198  {
199    If(LEqual(And(0x0F00,DID1),0x400))
200    {
201      Store(0x1, EDPV)
202      Store(DID1, DIDX)
203      Return(1)
204    }
205    If(LEqual(DID1,0))
206    {
207      Return(1)
208    }
209    Else
210    {
211      Return(And(0xFFFF,DID1))
212    }
213  }
214
215  // Return the Current Status.
216
217  Method(_DCS,0)
218  {
219    Return(CDDS(DID1))
220  }
221
222  // Query Graphics State (active or inactive).
223
224  Method(_DGS,0)
225  {
226    Return(NDDS(DID1))
227  }
228
229  // Device Set State.
230
231  // _DSS Table:
232  //
233  //      BIT31   BIT30   Execution
234  //      0       0       Don't implement.
235  //      0       1       Cache change.  Nothing to Implement.
236  //      1       0       Don't Implement.
237  //      1       1       Display Switch Complete.  Implement.
238
239  Method(_DSS,1)
240  {
241    If(LEqual(And(Arg0,0xC0000000),0xC0000000))
242    {
243
244      // State change was performed by the
245      // Video Drivers.  Simply update the
246      // New State.
247
248      Store(NSTE,CSTE)
249    }
250  }
251}
252
253Device(DD02)
254{
255
256  // Return Unique ID.
257
258  Method(_ADR,0,Serialized)
259  {
260    If(LEqual(And(0x0F00,DID2),0x400))
261    {
262      Store(0x2, EDPV)
263      Store(DID2, DIDX)
264      Return(2)
265    }
266    If(LEqual(DID2,0))
267    {
268      Return(2)
269    }
270    Else
271    {
272      Return(And(0xFFFF,DID2))
273    }
274  }
275
276  // Return the Current Status.
277
278  Method(_DCS,0)
279  {
280    Return(CDDS(DID2))
281  }
282
283  // Query Graphics State (active or inactive).
284
285  Method(_DGS,0)
286  {
287    // Return the Next State.
288    Return(NDDS(DID2))
289  }
290
291  // Device Set State. (See table above.)
292
293  Method(_DSS,1)
294  {
295    If(LEqual(And(Arg0,0xC0000000),0xC0000000))
296    {
297
298      // State change was performed by the
299      // Video Drivers.  Simply update the
300      // New State.
301
302      Store(NSTE,CSTE)
303    }
304  }
305}
306
307Device(DD03)
308{
309
310  // Return Unique ID.
311
312  Method(_ADR,0,Serialized)
313  {
314    If(LEqual(And(0x0F00,DID3),0x400))
315    {
316      Store(0x3, EDPV)
317      Store(DID3, DIDX)
318      Return(3)
319    }
320    If(LEqual(DID3,0))
321    {
322      Return(3)
323    }
324    Else
325    {
326      Return(And(0xFFFF,DID3))
327    }
328  }
329
330  // Return the Current Status.
331
332  Method(_DCS,0)
333  {
334    If(LEqual(DID3,0))
335    {
336      Return(0x0B)
337    }
338    Else
339    {
340      Return(CDDS(DID3))
341    }
342  }
343
344  // Query Graphics State (active or inactive).
345
346  Method(_DGS,0)
347  {
348    Return(NDDS(DID3))
349  }
350
351  // Device Set State. (See table above.)
352
353  Method(_DSS,1)
354  {
355    If(LEqual(And(Arg0,0xC0000000),0xC0000000))
356    {
357      // State change was performed by the
358      // Video Drivers.  Simply update the
359      // New State.
360
361      Store(NSTE,CSTE)
362    }
363  }
364}
365
366Device(DD04)
367{
368
369  // Return Unique ID.
370
371  Method(_ADR,0,Serialized)
372  {
373    If(LEqual(And(0x0F00,DID4),0x400))
374    {
375      Store(0x4, EDPV)
376      Store(DID4, DIDX)
377      Return(4)
378    }
379    If(LEqual(DID4,0))
380    {
381      Return(4)
382    }
383    Else
384    {
385      Return(And(0xFFFF,DID4))
386    }
387  }
388
389  // Return the Current Status.
390
391  Method(_DCS,0)
392  {
393    If(LEqual(DID4,0))
394    {
395      Return(0x0B)
396    }
397    Else
398    {
399      Return(CDDS(DID4))
400    }
401  }
402
403  // Query Graphics State (active or inactive).
404
405  Method(_DGS,0)
406  {
407    Return(NDDS(DID4))
408  }
409
410  // Device Set State. (See table above.)
411
412  Method(_DSS,1)
413  {
414    If(LEqual(And(Arg0,0xC0000000),0xC0000000))
415    {
416
417      // State change was performed by the
418      // Video Drivers.  Simply update the
419      // New State.
420
421      Store(NSTE,CSTE)
422    }
423  }
424}
425
426
427Device(DD05)
428{
429
430  // Return Unique ID.
431
432  Method(_ADR,0,Serialized)
433  {
434    If(LEqual(And(0x0F00,DID5),0x400))
435    {
436      Store(0x5, EDPV)
437      Store(DID5, DIDX)
438      Return(5)
439    }
440    If(LEqual(DID5,0))
441    {
442      Return(5)
443    }
444    Else
445    {
446      Return(And(0xFFFF,DID5))
447    }
448  }
449
450  // Return the Current Status.
451
452  Method(_DCS,0)
453  {
454    If(LEqual(DID5,0))
455    {
456      Return(0x0B)
457    }
458    Else
459    {
460      Return(CDDS(DID5))
461    }
462  }
463
464  // Query Graphics State (active or inactive).
465
466  Method(_DGS,0)
467  {
468    Return(NDDS(DID5))
469  }
470
471  // Device Set State. (See table above.)
472
473  Method(_DSS,1)
474  {
475    If(LEqual(And(Arg0,0xC0000000),0xC0000000))
476    {
477      // State change was performed by the
478      // Video Drivers.  Simply update the
479      // New State.
480
481      Store(NSTE,CSTE)
482    }
483  }
484}
485
486
487Device(DD06)
488{
489
490  // Return Unique ID.
491
492  Method(_ADR,0,Serialized)
493  {
494    If(LEqual(And(0x0F00,DID6),0x400))
495    {
496      Store(0x6, EDPV)
497      Store(DID6, DIDX)
498      Return(6)
499    }
500    If(LEqual(DID6,0))
501    {
502      Return(6)
503    }
504    Else
505    {
506      Return(And(0xFFFF,DID6))
507    }
508  }
509
510  // Return the Current Status.
511
512  Method(_DCS,0)
513  {
514    If(LEqual(DID6,0))
515    {
516      Return(0x0B)
517    }
518    Else
519    {
520      Return(CDDS(DID6))
521    }
522  }
523
524  // Query Graphics State (active or inactive).
525
526  Method(_DGS,0)
527  {
528    Return(NDDS(DID6))
529  }
530
531  // Device Set State. (See table above.)
532
533  Method(_DSS,1)
534  {
535    If(LEqual(And(Arg0,0xC0000000),0xC0000000))
536    {
537      // State change was performed by the
538      // Video Drivers.  Simply update the
539      // New State.
540
541      Store(NSTE,CSTE)
542    }
543  }
544}
545
546
547Device(DD07)
548{
549
550  // Return Unique ID.
551
552  Method(_ADR,0,Serialized)
553  {
554    If(LEqual(And(0x0F00,DID7),0x400))
555    {
556      Store(0x7, EDPV)
557      Store(DID7, DIDX)
558      Return(7)
559    }
560    If(LEqual(DID7,0))
561    {
562      Return(7)
563    }
564    Else
565    {
566      Return(And(0xFFFF,DID7))
567    }
568  }
569
570  // Return the Current Status.
571
572  Method(_DCS,0)
573  {
574    If(LEqual(DID7,0))
575    {
576      Return(0x0B)
577    }
578    Else
579    {
580      Return(CDDS(DID7))
581    }
582  }
583
584  // Query Graphics State (active or inactive).
585
586  Method(_DGS,0)
587  {
588    Return(NDDS(DID7))
589  }
590
591  // Device Set State. (See table above.)
592
593  Method(_DSS,1)
594  {
595    If(LEqual(And(Arg0,0xC0000000),0xC0000000))
596    {
597      // State change was performed by the
598      // Video Drivers.  Simply update the
599      // New State.
600
601      Store(NSTE,CSTE)
602    }
603  }
604}
605
606
607Device(DD08)
608{
609
610  // Return Unique ID.
611
612  Method(_ADR,0,Serialized)
613  {
614    If(LEqual(And(0x0F00,DID8),0x400))
615    {
616      Store(0x8, EDPV)
617      Store(DID8, DIDX)
618      Return(8)
619    }
620    If(LEqual(DID8,0))
621    {
622      Return(8)
623    }
624    Else
625    {
626      Return(And(0xFFFF,DID8))
627    }
628  }
629
630  // Return the Current Status.
631
632  Method(_DCS,0)
633  {
634    If(LEqual(DID8,0))
635    {
636      Return(0x0B)
637    }
638    Else
639    {
640      Return(CDDS(DID8))
641    }
642  }
643
644  // Query Graphics State (active or inactive).
645
646  Method(_DGS,0)
647  {
648    Return(NDDS(DID8))
649  }
650
651  // Device Set State. (See table above.)
652
653  Method(_DSS,1)
654  {
655    If(LEqual(And(Arg0,0xC0000000),0xC0000000))
656    {
657      // State change was performed by the
658      // Video Drivers.  Simply update the
659      // New State.
660
661      Store(NSTE,CSTE)
662    }
663  }
664}
665
666//device for eDP
667Device(DD1F)
668{
669  // Return Unique ID.
670
671  Method(_ADR,0,Serialized)
672  {
673    If(LEqual(EDPV, 0x0))
674    {
675      Return(0x1F)
676    }
677    Else
678    {
679      Return(And(0xFFFF,DIDX))
680    }
681  }
682
683  // Return the Current Status.
684
685  Method(_DCS,0)
686  {
687    If(LEqual(EDPV, 0x0))
688    {
689      Return(0x00)
690    }
691    Else
692    {
693      Return(CDDS(DIDX))
694    }
695  }
696
697  // Query Graphics State (active or inactive).
698
699  Method(_DGS,0)
700  {
701    Return(NDDS(DIDX))
702  }
703
704  // Device Set State. (See table above.)
705
706  Method(_DSS,1)
707  {
708    If(LEqual(And(Arg0,0xC0000000),0xC0000000))
709    {
710      // State change was performed by the
711      // Video Drivers.  Simply update the
712      // New State.
713      Store(NSTE,CSTE)
714    }
715  }
716  // Query List of Brightness Control Levels Supported.
717
718  Method(_BCL,0)
719  {
720    // List of supported brightness levels in the following sequence.
721
722    // Level when machine has full power.
723    // Level when machine is on batteries.
724    // Other supported levels.
725    Return(Package() {80, 50, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100})
726  }
727
728  // Set the Brightness Level.
729
730  Method (_BCM,1)
731  {
732    // Set the requested level if it is between 0 and 100%.
733
734    If(LAnd(LGreaterEqual(Arg0,0),LLessEqual(Arg0,100)))
735    {
736      \_SB.PCI0.GFX0.AINT(1, Arg0)
737      Store(Arg0,BRTL)  // Store Brightness Level.
738    }
739  }
740
741  // Brightness Query Current level.
742
743  Method (_BQC,0)
744  {
745    Return(BRTL)
746  }
747}
748
749Method(SDDL,1)
750{
751  Increment(NDID)
752  Store(And(Arg0,0xF0F),Local0)
753  Or(0x80000000,Local0, Local1)
754  If(LEqual(DIDL,Local0))
755  {
756    Return(Local1)
757  }
758  If(LEqual(DDL2,Local0))
759  {
760    Return(Local1)
761  }
762  If(LEqual(DDL3,Local0))
763  {
764    Return(Local1)
765  }
766  If(LEqual(DDL4,Local0))
767  {
768    Return(Local1)
769  }
770  If(LEqual(DDL5,Local0))
771  {
772    Return(Local1)
773  }
774  If(LEqual(DDL6,Local0))
775  {
776    Return(Local1)
777  }
778  If(LEqual(DDL7,Local0))
779  {
780    Return(Local1)
781  }
782  If(LEqual(DDL8,Local0))
783  {
784    Return(Local1)
785  }
786  Return(0)
787}
788
789Method(CDDS,1)
790{
791  Store(And(Arg0,0xF0F),Local0)
792
793  If(LEqual(0, Local0))
794  {
795    Return(0x1D)
796  }
797  If(LEqual(CADL, Local0))
798  {
799    Return(0x1F)
800  }
801  If(LEqual(CAL2, Local0))
802  {
803    Return(0x1F)
804  }
805  If(LEqual(CAL3, Local0))
806  {
807    Return(0x1F)
808  }
809  If(LEqual(CAL4, Local0))
810  {
811    Return(0x1F)
812  }
813  If(LEqual(CAL5, Local0))
814  {
815    Return(0x1F)
816  }
817  If(LEqual(CAL6, Local0))
818  {
819    Return(0x1F)
820  }
821  If(LEqual(CAL7, Local0))
822  {
823    Return(0x1F)
824  }
825  If(LEqual(CAL8, Local0))
826  {
827    Return(0x1F)
828  }
829  Return(0x1D)
830}
831
832Method(NDDS,1)
833{
834  Store(And(Arg0,0xF0F),Local0)
835
836  If(LEqual(0, Local0))
837  {
838    Return(0)
839  }
840  If(LEqual(NADL, Local0))
841  {
842    Return(1)
843  }
844  If(LEqual(NDL2, Local0))
845  {
846    Return(1)
847  }
848  If(LEqual(NDL3, Local0))
849  {
850    Return(1)
851  }
852  If(LEqual(NDL4, Local0))
853  {
854    Return(1)
855  }
856  If(LEqual(NDL5, Local0))
857  {
858    Return(1)
859  }
860  If(LEqual(NDL6, Local0))
861  {
862    Return(1)
863  }
864  If(LEqual(NDL7, Local0))
865  {
866    Return(1)
867  }
868  If(LEqual(NDL8, Local0))
869  {
870    Return(1)
871  }
872  Return(0)
873}
874
875//
876// Include IGD OpRegion/Software SCI interrupt handler which is use by
877// the graphics drivers to request data from system BIOS.
878//
879include("IgdOpRn.ASL")
880