• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2
3#define JT_FUNC_SUPPORT		0
4#define JT_FUNC_CAPS		1
5#define JT_FUNC_POWERCONTROL	3
6#define JT_FUNC_PLATPOLICY	4
7
8Method (NVJT, 2, Serialized)
9{
10	Switch (ToInteger(Arg0))
11	{
12		Case (JT_FUNC_SUPPORT)
13		{
14			Return (ITOB(
15				(1 << JT_FUNC_SUPPORT) |
16				(1 << JT_FUNC_CAPS) |
17				(1 << JT_FUNC_POWERCONTROL) |
18				(1 << JT_FUNC_PLATPOLICY)))
19		}
20		Case (JT_FUNC_CAPS)
21		{
22			Return (ITOB(
23				(0 << 0) |		/* JTE: G-Sync NVSR Power Features Enabled */
24				(1 << 0) |		/* NVSE: NVSR Disabled */
25				(0 << 3) |		/* PPR: Panel Power Rail */
26				(0 << 5) |		/* SRPR: Self-Refresh Controller Power Rail */
27				(0 << 6) |		/* FBPR: FB Power Rail */
28				(0 << 8) |		/* GPR: GPU Power Rail */
29				(0 << 10) |		/* GCR: GC6 ROM */
30				(1 << 11) |		/* PTH: No SMI Handler */
31				(0 << 12) |		/* NOT: Supports Notify on GC6 State done */
32				(1 << 13) |		/* MHYB: MS Hybrid Support (deferred GC6) */
33				(0 << 14) |		/* RPC: Root Port Control */
34				(0 << 15) |		/* GC6 Version (GC6-E) */
35				(0 << 17) |		/* GEI: GC6 Exit ISR Support */
36				(0 << 18) |		/* GSW: GC6 Self Wakeup */
37				(0x200 << 20)))		/* MXRV: Highest Revision */
38		}
39		Case (JT_FUNC_POWERCONTROL)
40		{
41			CreateField (Arg1, 0, 3, GPC)	/* GPU Power Control */
42			CreateField (Arg1, 4, 1, PPC)	/* Panel Power Control */
43			CreateField (Arg1, 14, 2, DFGC)	/* Defer GC6 enter/exit */
44			CreateField (Arg1, 16, 3, GPCX) /* Deferred GC6 exit */
45
46			/* Deferred GC6 entry/exit is requested */
47			If (ToInteger(GPC) != 0 || ToInteger(DFGC) != 0)
48			{
49				DFEN = ToInteger(DFGC)
50				DFCI = ToInteger(GPC)
51				DFCO = ToInteger(GPCX)
52			}
53
54			Local0 = Buffer (4) { 0x0 }
55			CreateField (Local0, 0, 3, CGCS)	/* Current GC State */
56			CreateField (Local0, 3, 1, CGPS)	/* Current GPU power status */
57			CreateField (Local0, 7, 1, CPSS)	/* Current panel and SRC state */
58
59			/* Leave early if deferred GC6 is requested */
60			If (DFEN != 0)
61			{
62				CGCS = 1
63				CGPS = 1
64				Return (Local0)
65			}
66
67			Switch (ToInteger(GPC))
68			{
69				/* Get GCU GCx Sleep Status */
70				Case (NVJT_GPC_GSS)
71				{
72					If (PSTA () != 0)
73					{
74						CGPS = 1
75						CGCS = 1
76					}
77					Else
78					{
79						CGPS = 0
80						CGCS = 3
81					}
82				}
83				Case (NVJT_GPC_EGNS)
84				{
85					/* Enter GC6; no self-refresh */
86					GC6I ()
87					CPSS = 1
88					CGCS = 0
89				}
90				Case (NVJT_GPC_EGIS)
91				{
92					/* Enter GC6; enable self-refresh */
93					GC6I ()
94					If (ToInteger (PPC) == 0)
95					{
96						CPSS = 0
97					}
98					CGCS = 0
99				}
100				Case (NVJT_GPS_XGXS)
101				{
102					/* Exit GC6; stop self-refresh */
103					GC6O ()
104					CGCS = 1
105					CGPS = 1
106					If (ToInteger (PPC) != 0)
107					{
108						CPSS = 0
109					}
110				}
111				Case (NVJT_GPS_XGIS)
112				{
113					/* Exit GC6 for self-refresh */
114					GC6O ()
115					CGCS = 1
116					CGPS = 1
117					If (ToInteger (PPC) != 0)
118					{
119						CPSS = 0
120					}
121				}
122			}
123
124			Return (Local0)
125		}
126	}
127
128	Return (NV_ERROR_UNSUPPORTED)
129}
130