• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* 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}
105