blob: f201037f06133e2d53a3de01009281d47f8c2502 [file] [log] [blame]
Shelley Chen9b230ae2023-09-15 16:01:31 -07001/* SPDX-License-Identifier: GPL-2.0-or-later */
2
3#define GPS_FUNC_SUPPORT 0
4#define GPS_FUNC_GETCALLBACKS 0x13
5#define GPS_FUNC_PSHARESTATUS 0x20
6#define GPS_FUNC_PSHAREPARAMS 0x2a
7#define GPS_FUNC_REQUESTDXSTATE 0x12
8
9#define QUERY_GET_STATUS 0
10#define QUERY_GET_SUPPORTED_FIELDS 1
11#define QUERY_GET_CURRENT_LIMITS 2
12
13#define EC_D_NOTIFY_MASK 0x7
14
15/* GPS return Package */
16Name (GPSP, Buffer (0x28) {0x0})
17CreateDWordField (GPSP, 0, RETN)
18CreateDWordField (GPSP, 4, VRV1)
19CreateDWordField (GPSP, 8, TGPU)
20
21/* GETCALLBACKS return value
22 [0]: Callback for post-mode set
23 [1]: Callback for pre-mode set
24 [2]: Callback for post power state transition */
25Name (GPSR, Buffer (4) { 0x4, 0x0, 0x0, 0x0 })
26
27Method (GPS, 2, Serialized)
28{
29 Switch (ToInteger (Arg0))
30 {
31 Case (GPS_FUNC_SUPPORT)
32 {
33 Return (LTOB(
34 (1 << GPS_FUNC_SUPPORT) |
35 (1 << GPS_FUNC_GETCALLBACKS) |
36 (1 << GPS_FUNC_PSHARESTATUS) |
37 (1 << GPS_FUNC_PSHAREPARAMS) |
38 (1 << GPS_FUNC_REQUESTDXSTATE)))
39 }
40 Case (GPS_FUNC_GETCALLBACKS)
41 {
42 CreateDWordField (Arg1, 0, QURY)
43
44 /* Driver querying for which callbacks the ACPI code
45 wants callbacks for. */
46 If (QURY == 0)
47 {
48 Return (GPSR)
49 }
50
51 If (QURY & 0x4)
52 {
53 Printf("GPS: Kernel driver callback post power state transition")
54 Return (GPSR)
55 }
56 }
57 Case (GPS_FUNC_PSHARESTATUS)
58 {
59 Return (ITOB(
60 (0 << 0) | /* GPS_FUNC_PSHAREPARAMS should not be called
61 again after initialization, i.e., its return
62 value is not dynamically updated. */
63 (1 << 0) | /* System uses both a GPIO and ACPI notification
64 codes to set multiple GPU power limits. */
65 (0 << 21))) /* EDPpeak limit is default */
66 }
67 Case (GPS_FUNC_PSHAREPARAMS)
68 {
69 CreateField (Arg1, 0, 4, QUTY) /* Query type */
70
71 /* Version of return value */
72 VRV1 = 0x10000
73 Switch (ToInteger (QUTY))
74 {
75 Case (QUERY_GET_STATUS)
76 {
77 Return (GPSP)
78 }
79 Case (QUERY_GET_SUPPORTED_FIELDS)
80 {
81 /* Only GPU temperature is supported */
82 RETN = 0x100 | ToInteger (QUTY)
83 Return (GPSP)
84 }
85 Case (QUERY_GET_CURRENT_LIMITS)
86 {
87 /* Request a limit of '0' for the GPU temperature,
88 meaning there is no limit. */
89 RETN = 0x102
90 TGPU = 0
91 Return (GPSP)
92 }
93 }
94 }
95 Case (GPS_FUNC_REQUESTDXSTATE)
96 {
97 Local0 = ToInteger(\_SB.PCI0.LPCB.EC0.GPUD) & EC_D_NOTIFY_MASK
98 \_SB.PCI0.PEG0.PEGP.DNOT (Local0, 1)
99 Return (NV_ERROR_SUCCESS)
100 }
101 }
102
103 Return (NV_ERROR_UNSUPPORTED)
104}