1    /*
2     * Some or all of this work - Copyright (c) 2006 - 2021, Intel Corp.
3     * All rights reserved.
4     *
5     * Redistribution and use in source and binary forms, with or without modification,
6     * are permitted provided that the following conditions are met:
7     *
8     * Redistributions of source code must retain the above copyright notice,
9     * this list of conditions and the following disclaimer.
10     * Redistributions in binary form must reproduce the above copyright notice,
11     * this list of conditions and the following disclaimer in the documentation
12     * and/or other materials provided with the distribution.
13     * Neither the name of Intel Corporation nor the names of its contributors
14     * may be used to endorse or promote products derived from this software
15     * without specific prior written permission.
16     *
17     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20     * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21     * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25     * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27     */
28    /*
29     * Data Table Region declarations
30     */
31    /*
32     * On testing following issues should be covered:
33     * - String objects can be used as DataTableRegion arguments,
34     * - global and dynamic DataTableRegion declarations,
35     * - check of the Table Length on access to appropriate Fields,
36     * - any table referenced in XSDT can be accessed,
37     * - computational data is allowed to be DataTableRegion arguments,
38     * - possibility to write into appropriate Fields.
39     *
40     * Can not be tested following issues:
41     * - providing of DataTableRegions to be "in memory marked by
42     *   AddressRangeReserved or AddressRangeNVS".
43     */
44    Name (Z142, 0x8E)
45    Device (DTR0)
46    {
47        DataTableRegion (DR00, "DSDT", "", "")
48        DataTableRegion (DR01, "SSDT", "", "")
49        /* This SSDT must be identical to SSDT1 in the AcpiExec utility */
50
51        Name (SSDT, Buffer (0x3E)
52        {
53            /* 0000 */  0x53, 0x53, 0x44, 0x54, 0x3E, 0x00, 0x00, 0x00,  // SSDT>...
54            /* 0008 */  0x02, 0x08, 0x49, 0x6E, 0x74, 0x65, 0x6C, 0x00,  // ..Intel.
55            /* 0010 */  0x73, 0x73, 0x64, 0x74, 0x31, 0x00, 0x00, 0x00,  // ssdt1...
56            /* 0018 */  0x01, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x54, 0x4C,  // ....INTL
57            /* 0020 */  0x20, 0x06, 0x12, 0x20, 0x14, 0x19, 0x5F, 0x54,  //  .. .._T
58            /* 0028 */  0x39, 0x38, 0x01, 0x70, 0x0D, 0x53, 0x53, 0x44,  // 98.p.SSD
59            /* 0030 */  0x54, 0x31, 0x20, 0x2D, 0x20, 0x5F, 0x54, 0x39,  // T1 - _T9
60            /* 0038 */  0x38, 0x00, 0x5B, 0x31, 0xA4, 0x00               // 8.[1..
61        })
62        Name (NFLG, 0x02)   /* Number of turn on/off Flag values */
63        Name (IRSK, 0x00)   /* Counter of the Invalid RSKs */
64        Name (IFLG, 0x00)   /* Counter of the Invalid Flags */
65        Name (VRSK, 0x00)   /* Counter of the Valid RSK 0x07 */
66        Name (ERSK, 0x02)   /* Expected Counters of the Valid RSK */
67        Name (VFLG,       /* Counters of the Valid Flags */Package (NFLG)
68        {
69            0x00,
70            0x00
71        })
72        /* Specific DataTable Regions availability notification Method */
73        /* \DTR0._REG(RegionSpaceKeyword, Flag) */
74        OperationRegion (JUNK, SystemMemory, 0x2000, 0x0100)
75        Method (_REG, 2, Serialized)  // _REG: Region Availability
76        {
77            Name (DBGF, 0x01)
78            If (DBGF)
79            {
80                DNAM (Arg0, Arg1, "\\DTR0._REG")
81            }
82
83            /*
84             * 0x7E is the SpaceID for DataTableRegions (subject to change
85             * with new releases of ACPI specification -- because this
86             * ID is an internal-ACPICA-only ID)
87             */
88            If ((Arg0 == 0x7E))
89            {
90                VRSK++
91            }
92            Else
93            {
94                IRSK++
95            }
96
97            If ((Arg1 < NFLG))
98            {
99                Local1 = VFLG [Arg1]
100                Local2 = RefOf (Local1)
101                DerefOf (Local2) = (DerefOf (Local1) + 0x01)
102            }
103            Else
104            {
105                IFLG++
106            }
107        }
108    }
109
110    /* Global DataTableRegions */
111
112    Method (M7F0, 1, NotSerialized)
113    {
114        Concatenate (Arg0, "-m7f0", Arg0)
115        \DTR0._REG (0x0101, 0x02)
116        If ((\DTR0.IRSK != 0x01))
117        {
118            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, \DTR0.IRSK, 0x01)
119        }
120
121        If ((\DTR0.IFLG != 0x01))
122        {
123            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, \DTR0.IFLG, 0x01)
124        }
125
126        If ((\DTR0.VRSK != 0x02))
127        {
128            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, \DTR0.VRSK, 0x02)
129        }
130
131        If ((DerefOf (\DTR0.VFLG [0x01]) != 0x02))
132        {
133            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, DerefOf (\DTR0.VFLG [0x01]), 0x02)
134        }
135    }
136
137    /* Dynamic DataTableRegions */
138    /* m7f1(CallChain) */
139    /* CallChain: String */
140    Method (M7F1, 1, Serialized)
141    {
142        Name (NFLG, 0x02)   /* Number of turn on/off Flag values */
143        Name (IRSK, 0x00)   /* Counter of the Invalid RSKs */
144        Name (IFLG, 0x00)   /* Counter of the Invalid Flags */
145        Name (VRSK, 0x00)   /* Counter of the Valid RSK 0x7E (DataTableRegion) */
146        Name (ERSK, 0x02)   /* Expected Counters of the Valid RSK */
147        Name (VFLG,       /* Counters of the Valid Flags */Package (NFLG)
148        {
149            0x00,
150            0x00
151        })
152        /* Specific DataTable Regions availability notification Method */
153        /* \m7f1._REG(RegionSpaceKeyword, Flag) */
154        OperationRegion (JUNK, SystemMemory, 0x2000, 0x0100)
155        Method (_REG, 2, Serialized)  // _REG: Region Availability
156        {
157            Name (DBGF, 0x01)
158            If (DBGF)
159            {
160                DNAM (Arg0, Arg1, "\\m7f1._REG")
161            }
162
163            /* DataTableRegion is SpaceID 0x7E */
164
165            If ((Arg0 == 0x7E))
166            {
167                VRSK++
168            }
169            Else
170            {
171                IRSK++
172            }
173
174            If ((Arg1 < NFLG))
175            {
176                Local1 = VFLG [Arg1]
177                Local2 = RefOf (Local1)
178                DerefOf (Local2) = (DerefOf (Local1) + 0x01)
179            }
180            Else
181            {
182                IFLG++
183            }
184        }
185
186        Concatenate (Arg0, "-m7f1", Arg0)
187        If ((VRSK != 0x00))
188        {
189            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, VRSK, 0x00)
190        }
191
192        If ((DerefOf (VFLG [0x01]) != 0x00))
193        {
194            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, DerefOf (VFLG [0x01]), 0x00)
195        }
196
197        DataTableRegion (DR00, "SSDT", "", "")
198        If ((IRSK != 0x00))
199        {
200            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, IRSK, 0x00)
201        }
202
203        If ((IFLG != 0x00))
204        {
205            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, IFLG, 0x00)
206        }
207
208        _REG (0x0101, 0x02)
209        If ((IRSK != 0x01))
210        {
211            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, IRSK, 0x01)
212        }
213
214        If ((IFLG != 0x01))
215        {
216            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, IFLG, 0x01)
217        }
218
219        If ((VRSK != 0x01))
220        {
221            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, VRSK, 0x01)
222        }
223
224        If ((DerefOf (VFLG [0x01]) != 0x01))
225        {
226            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, DerefOf (VFLG [0x01]), 0x01)
227        }
228    }
229
230    /* DataTableRegion Lengths */
231    /* m7f2(CallChain) */
232    /* CallChain: String */
233    Method (M7F2, 1, Serialized)
234    {
235        Concatenate (Arg0, "-m7f2", Arg0)
236        Field (\DTR0.DR01, AnyAcc, NoLock, Preserve)
237        {
238            FU01,   496
239        }
240
241        /* 0x1F0 == length of SSDT */
242
243        Local0 = RefOf (FU01)
244        Local1 = RefOf (Local0)
245        Local2 = DerefOf (Local0)
246        CH03 (Arg0, Z142, __LINE__, 0x00, 0x00)
247        Local3 = \DTR0.SSDT
248        If ((Local2 != Local3))
249        {
250            ERR (Arg0, Z142, __LINE__, 0x00, 0x00, Local2, Local3)
251        }
252    }
253
254    /* Check non-constant DataTableRegion *String arguments */
255    /* m7f3(CallChain) */
256    /* CallChain: String */
257    Method (M7F3, 1, Serialized)
258    {
259        Name (S000, "SSDT")
260        Name (S001, "")
261        Name (S002, "")
262        Method (M000, 1, Serialized)
263        {
264            DataTableRegion (DR00, "SSDT", "", "")
265            Field (DR00, AnyAcc, NoLock, Preserve)
266            {
267                FU01,   496
268            }
269
270            /* 0x1F0 == length of SSDT */
271
272            Local0 = FU01 /* \M7F3.M000.FU01 */
273            Local1 = \DTR0.SSDT
274            If ((Local0 != Local1))
275            {
276                ERR (Arg0, Z142, __LINE__, 0x00, 0x00, Local0, Local1)
277            }
278        }
279
280        /* ArgX */
281
282        Method (M001, 4, Serialized)
283        {
284            DataTableRegion (DR00, Arg1, Arg2, Arg3)
285            Field (DR00, AnyAcc, NoLock, Preserve)
286            {
287                FU01,   496
288            }
289
290            /* 0x1F0 == length of SSDT */
291
292            Local0 = FU01 /* \M7F3.M001.FU01 */
293            Local1 = \DTR0.SSDT
294            If ((Local0 != Local1))
295            {
296                ERR (Arg0, Z142, __LINE__, 0x00, 0x00, Local0, Local1)
297            }
298        }
299
300        /* Named */
301
302        Method (M002, 1, Serialized)
303        {
304            DataTableRegion (DR00, S000, S001, S002)
305            Field (DR00, AnyAcc, NoLock, Preserve)
306            {
307                FU01,   496
308            }
309
310            /* 0x1F0 == length of SSDT */
311
312            Local0 = FU01 /* \M7F3.M002.FU01 */
313            Local1 = \DTR0.SSDT
314            If ((Local0 != Local1))
315            {
316                ERR (Arg0, Z142, __LINE__, 0x00, 0x00, Local0, Local1)
317            }
318        }
319
320        /* LocalX */
321
322        Method (M003, 1, Serialized)
323        {
324            Local2 = S000 /* \M7F3.S000 */
325            Local3 = S001 /* \M7F3.S001 */
326            Local4 = S002 /* \M7F3.S002 */
327            DataTableRegion (DR00, Local2, Local3, Local4)
328            Field (DR00, AnyAcc, NoLock, Preserve)
329            {
330                FU01,   496
331            }
332
333            /* 0x1F0 == length of SSDT */
334
335            Local0 = FU01 /* \M7F3.M003.FU01 */
336            Local1 = \DTR0.SSDT
337            If ((Local0 != Local1))
338            {
339                ERR (Arg0, Z142, __LINE__, 0x00, 0x00, Local0, Local1)
340            }
341        }
342
343        /* Expression */
344
345        Method (M004, 1, Serialized)
346        {
347            Local2 = "SS"
348            Local3 = "DT"
349            DataTableRegion (DR00, Concatenate (Local2, Local3), Mid (S000, 0x01, 0x00), S002)
350            Field (DR00, AnyAcc, NoLock, Preserve)
351            {
352                FU01,   496
353            }
354
355            /* 0x1F0 == length of SSDT */
356
357            Local0 = FU01 /* \M7F3.M004.FU01 */
358            Local1 = \DTR0.SSDT
359            If ((Local0 != Local1))
360            {
361                ERR (Arg0, Z142, __LINE__, 0x00, 0x00, Local0, Local1)
362            }
363        }
364
365        Concatenate (Arg0, "-m7f1", Arg0)
366        M000 (Arg0)
367        M001 (Arg0, "SSDT", "", "")
368        M002 (Arg0)
369        M003 (Arg0)
370        M004 (Arg0)
371    }
372
373    /* Check different Table signatures */
374    /* m7f4(CallChain) */
375    /* CallChain: String */
376    Method (M7F4, 1, NotSerialized)
377    {
378        Method (M000, 3, Serialized)
379        {
380            DataTableRegion (DR00, Arg1, "", "")
381            Field (DR00, AnyAcc, NoLock, Preserve)
382            {
383                FU00,   32
384            }
385
386            Local0 = ToString (FU00, 0x04)
387            If ((Local0 != Arg1))
388            {
389                ERR (Arg0, Z142, __LINE__, 0x00, 0x00, Local0, Arg1)
390            }
391        }
392
393        Concatenate (Arg0, "-m7f4", Arg0)
394        M000 (Arg0, "DSDT", 0x1B)
395        M000 (Arg0, "SSDT", 0x1C)
396        /* no RSDT in simulator */
397        /*m000(arg0, "RSDT", 29) */
398        M000 (Arg0, "TEST", 0x1E)
399        M000 (Arg0, "BAD!", 0x1F)
400        M000 (Arg0, "FACP", 0x20)
401        M000 (Arg0, "SSDT", 0x21)
402        M000 (Arg0, "OEM1", 0x22)
403    }
404
405    Method (DRC0, 0, Serialized)
406    {
407        /* Global DataTableRegions */
408
409        SRMT ("m7f0")
410        M7F0 (__METHOD__)
411        /* Dynamic DataTableRegions */
412
413        SRMT ("m7f1")
414        M7F1 (__METHOD__)
415        /* DataTableRegion Lengths */
416
417        SRMT ("m7f2")
418        M7F2 (__METHOD__)
419        /* Non-constant DataTableRegion *String arguments */
420
421        SRMT ("m7f3")
422        If (Y223)
423        {
424            M7F3 (__METHOD__)
425        }
426        Else
427        {
428            BLCK ()
429        }
430
431        /* Different Table signatures */
432
433        SRMT ("m7f4")
434        If (Y223)
435        {
436            M7F4 (__METHOD__)
437        }
438        Else
439        {
440            BLCK ()
441        }
442    }
443