• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* SPDX-License-Identifier: GPL-2.0-only */
2
3/* 0:12.0 - EHCI */
4Device(EHC0) {
5	Name(_ADR, 0x00120000)
6	Name(_PRW, Package() { 0xb, 3 })
7	Device (RHUB) {
8		Name (_ADR, 0)
9		Device (HS01) { Name (_ADR, 1) }
10		Device (HS02) { Name (_ADR, 2) }
11		Device (HS03) { Name (_ADR, 3) }
12		Device (HS04) { Name (_ADR, 4) }
13		Device (HS05) { Name (_ADR, 5) }
14		Device (HS06) { Name (_ADR, 6) }
15		Device (HS07) { Name (_ADR, 7) }
16		Device (HS08) { Name (_ADR, 8) }
17	}
18
19	Name(_PR0, Package() { P0U2 }) /* Indicate support for D0 */
20	Name(_PR3, Package() { P3U2 }) /* Indicate support for D3cold */
21
22	Method(_S0W,0) {
23		Return(0)
24	}
25
26	Method(_S3W,0) {
27		Return(4)
28	}
29
30	Method(_S4W,0) {
31		Return(4)
32	}
33} /* end EHC0 */
34
35
36/* 0:10.0 - XHCI 0*/
37Device(XHC0) {
38	Name(_ADR, 0x00100000)
39	Name(_PRW, Package() { 0xb, 3 })
40	Device (SS01) { Name (_ADR, 1) }
41	Device (SS02) { Name (_ADR, 2) }
42	Device (SS03) { Name (_ADR, 3) }
43
44	Name(_PR0, Package() { P0U3 }) /* Indicate support for D0 */
45	Name(_PR3, Package() { P3U3 }) /* Indicate support for D3cold */
46
47	Method(_S0W,0) {
48		Return(0)
49	}
50
51	Method(_S3W,0) {
52		Return(4)
53	}
54
55	Method(_S4W,0) {
56		Return(4)
57	}
58
59} /* end XHC0 */
60
61Scope(\_SB)
62{
63	Name(XHD0, 0)
64	Name(XHD3, 0)
65	PowerResource(P0U3, 0, 0) {
66		Method(_STA) {
67			Return(XHD0)
68		}
69		Method(_ON) {
70			XHD0 = 0x01
71		}
72		Method(_OFF) {
73			XHD0 = 0x00
74		}
75	}
76	PowerResource(P3U3, 0, 0) {
77		Method(_STA) {
78			Return(XHD3)
79		}
80		Method(_ON) {
81			XHD3 = 0x01
82		}
83		Method(_OFF) {
84			XHD3 = 0x00
85		}
86	}
87
88	Name(EHD0, 0)
89	Name(EHD3, 0)
90	PowerResource(P0U2, 0, 0) {
91		Method(_STA) {
92			Return(EHD0)
93		}
94		Method(_ON) {
95			EHD0 = 0x01
96		}
97		Method(_OFF) {
98			EHD0 = 0x00
99		}
100	}
101	PowerResource(P3U2, 0, 0) {
102		Method(_STA) {
103			Return(EHD3)
104		}
105		Method(_ON) {
106			EHD3 = 0x01
107		}
108		Method(_OFF) {
109			EHD3 = 0x00
110		}
111	}
112}
113
114OperationRegion(EHMC, SystemMemory, EH10, 0x100)
115Field(EHMC, DwordAcc, NoLock, Preserve)
116{
117	Offset(0xb0),
118	, 5,
119	ESIM, 1,
120}
121
122Method(U2D3,0, Serialized)
123{
124	if (EH10 != 0) {
125		EHBA = EH10
126		EHME = 1
127		SSIM = ESIM
128	}
129
130	if (E_PS == 3) {
131		RQTY = 0
132		RQ18 = 1
133
134		Local0 = U2SR
135		while (Local0) {
136			Local0 = U2SR
137		}
138
139		U2PD = 0
140
141		Local0 = U2DS
142		while (Local0 != 0) {
143			Local0 = U2DS
144		}
145
146		U2TD = 0x03
147
148		if (U3TD == 0x03) { /* Shutdown USB2 PLL */
149		    PWGC (0x40, 0)
150		    U2RP = 1
151		}
152	}
153}
154
155Method(U2D0,0, Serialized)
156{
157	PWGC (0x40, 1)
158	U2RP = 0
159	U2TD =  0x00
160
161	U2TD = 0
162	U2PD = 1
163
164	Local0 = U2DS
165	while (Local0 != 0x7) {
166		Local0 = U2DS
167	}
168
169	RQTY = 1
170	RQ18 = 1
171	Local0 = U2SR
172	while (!Local0) {
173		Local0 = U2SR
174	}
175	EH2C = EHID
176
177
178	if (EH10 != 0) {
179		EHBA = EH10
180		EHME = 1
181		ESIM = SSIM
182	}
183
184	EH54 = ES54
185	EH64 = ES64
186}
187
188Method(LXFW,3, Serialized)  //Load Xhci FirmWare
189{
190	FWLM = 1  /* Firmware Load Mode */
191	ROAM = Arg0 /* ROM/RAM */
192	UA04 = Arg1
193	UA08 = Arg2
194	FPLS = 1    /* Firmware Preload Start */
195	Local0 = FPLC /* Firmware Preload Complete */
196	while (!Local0) {
197		Local0 = FPLC
198	}
199	FPLS = 0
200}
201
202Method(U3D3,0, Serialized)
203{
204	if (U_PS == 3) {
205		X0_S ()
206
207		PGA3 |= 0x20 /* SwUsb3SlpShutdown */
208		Local0 = PGA3 & 0x20
209		while (!Local0) { /* wait for it to complete */
210			Local0 = PGA3 & 0x20
211		}
212		UD3P = 1 /* U3P_D3Cold_PWRDN */
213
214		U3PD = 0 /* PwrOnDev */
215		Local0 = U3DS
216		while (Local0) { /* RstBState, RefClkOkState, PwrRstBState */
217			Local0 = U3DS
218		}
219
220		U3TD = 0x3 /* TargetedDeviceState */
221
222		U3RP = 1 /* USB3_RefClk_Pwdn */
223
224		if (U2TD == 0x3) { /* If EHCI targeted in D3cold */
225			PGA3 &= 0x9f /* SwUsb2S5RstB */
226			U2RP = 1   /* USB2_RefClk_Pwdn */
227		}
228		U3PG = 0 /* XhcPwrGood  */
229		U3PS = 1  /* Usb3PowerSel */
230	}
231}
232
233Method(U3D0,0, Serialized)
234{
235	U3PS = 0 /* Usb3PowerSel */
236	U3PG = 1  /* XhcPwrGood  */
237
238	U2RP = 0
239	U3RP = 0
240
241	Local0 = PGA3 & 0xdf
242	Local0 |= 0x40
243	PGA3 = Local0 /* SwUsb2S5RstB */
244
245	U3TD = 0 /* TargetedDeviceState */
246	U3PD = 1  /* PwrOnDev */
247
248	Local0 = U3DS /* wait for RstBState, RefClkOkState, PwrRstBState */
249	while (Local0 != 0x7) {
250		Local0 = U3DS
251	}
252
253	Local0 = U3PY /* USB3 PHY Lock */
254	while (!Local0) {
255		Local0 = U3PY
256	}
257
258	U3PR = 0 /* U3P_RESTORE_RESET */
259
260	Local0 = AUSS /* AutoSizeStart */
261	if (Local0 != 1) {
262		AUSS = 1
263	}
264	Local0 = AUSS
265	while (Local0 != 1) {
266		Local0 = AUSS
267	}
268
269	LXFW (1, FW00, FW01)
270	LXFW (0, FW02, FW03)
271
272	X0_R ()
273
274	U3PR = 1  /* U3P_RESTORE_RESET */
275	UD3P = 0 /* U3P_D3Cold_PWRDN */
276	U3TD = 1  /* TargetedDeviceState */
277}
278
279Name (SVBF, Buffer (0x1000) {0})    /* length from FchCarrizo.asl, new fields */
280CreateDWordField(SVBF, 0x000, S000) /* will be easier to add from there */
281CreateDWordField(SVBF, 0x004, S004)
282CreateDWordField(SVBF, 0x008, S008)
283CreateDWordField(SVBF, 0x00C, S00C)
284CreateDWordField(SVBF, 0x018, S018)
285CreateDWordField(SVBF, 0x01C, S01C)
286CreateDWordField(SVBF, 0x020, S020)
287CreateDWordField(SVBF, 0x030, S030)
288CreateDWordField(SVBF, 0x118, S118)
289CreateDWordField(SVBF, 0x158, S158)
290CreateDWordField(SVBF, 0x198, S198)
291CreateDWordField(SVBF, 0x1D8, S1D8)
292CreateDWordField(SVBF, 0x300, S300)
293CreateDWordField(SVBF, 0x304, S304)
294CreateDWordField(SVBF, 0x308, S308)
295CreateDWordField(SVBF, 0x30C, S30C)
296CreateDWordField(SVBF, 0x310, S310)
297CreateDWordField(SVBF, 0x428, S428)
298CreateDWordField(SVBF, 0x438, S438)
299CreateDWordField(SVBF, 0x43C, S43C)
300CreateDWordField(SVBF, 0x458, S458)
301CreateDWordField(SVBF, 0x468, S468)
302CreateDWordField(SVBF, 0x46C, S46C)
303CreateDWordField(SVBF, 0x470, S470)
304CreateDWordField(SVBF, 0x480, S480)
305CreateDWordField(SVBF, 0x484, S484)
306CreateDWordField(SVBF, 0x488, S488)
307CreateDWordField(SVBF, 0x48C, S48C)
308CreateDWordField(SVBF, 0x730, EHID) /* EHCI SSID    */
309CreateDWordField(SVBF, 0x734, XHID) /* XHCI SSID    */
310CreateByteField(SVBF, 0x740, ES54)  /* EHCI PCIx54  */
311CreateByteField(SVBF, 0x741, ES64)  /* EHCI PCIx64  */
312CreateDWordField(SVBF, 0x7B0, SSIM) /* EHCI SIM BIT */
313
314Method(X0_S,0)
315{
316	XHID = XH2C
317	IDEX = 0
318	S000 = DATA
319	IDEX = 0x00000004
320	S004 = DATA
321	IDEX = 0x00000008
322	S008 = DATA
323	IDEX = 0x0000000C
324	S00C = DATA
325	IDEX = 0x00000018
326	S018 = DATA
327	IDEX = 0x0000001C
328	S01C = DATA
329	IDEX = 0x00000020
330	S020 = DATA
331	IDEX = 0x00000030
332	S030 = DATA
333	IDEX = 0x00000118
334	S118 = DATA
335	IDEX = 0x00000158
336	S158 = DATA
337	IDEX = 0x00000198
338	S198 = DATA
339	IDEX = 0x000001D8
340	S1D8 = DATA
341	IDEX = 0x00000300
342	S300 = DATA
343	IDEX = 0x00000304
344	S304 = DATA
345	IDEX = 0x00000308
346	S308 = DATA
347	IDEX = 0x0000030C
348	S30C = DATA
349	IDEX = 0x00000310
350	S310 = DATA
351	IDEX = 0x40000028
352	S428 = DATA
353	IDEX = 0x40000038
354	S438 = DATA
355	IDEX = 0x4000003C
356	S43C = DATA
357	IDEX = 0x40000058
358	S458 = DATA
359	IDEX = 0x40000068
360	S468 = DATA
361	IDEX = 0x4000006C
362	S46C = DATA
363	IDEX = 0x40000070
364	S470 = DATA
365	IDEX = 0x40000080
366	S480 = DATA
367	IDEX = 0x40000084
368	S484 = DATA
369	IDEX = 0x40000088
370	S488 = DATA
371	IDEX = 0x4000008C
372	S48C = DATA
373}
374
375Method(X0_R,0)
376{
377	XH2C = XHID
378	IDEX = 0
379	DATA = S000
380	IDEX = 0x000000004
381	DATA = S004
382	IDEX = 0x000000008
383	DATA = S008
384	IDEX = 0x00000000C
385	DATA = S00C
386	IDEX = 0x000000018
387	DATA = S018
388	IDEX = 0x00000001C
389	DATA = S01C
390	IDEX = 0x000000020
391	DATA = S020
392	IDEX = 0x00000030
393	DATA = S030
394	IDEX = 0x00000118
395	DATA = S118
396	IDEX = 0x00000158
397	DATA = S158
398	IDEX = 0x00000198
399	DATA = S198
400	IDEX = 0x000001D8
401	DATA = S1D8
402	IDEX = 0x00000300
403	DATA = S300
404	IDEX = 0x00000304
405	DATA = S304
406	IDEX = 0x00000308
407	DATA = S308
408	IDEX = 0x0000030C
409	DATA = S30C
410	IDEX = 0x00000310
411	DATA = S310
412	IDEX = 0x40000028
413	DATA = S428
414	IDEX = 0x40000038
415	DATA = S438
416	IDEX = 0x4000003C
417	DATA = S43C
418	IDEX = 0x40000058
419	DATA = S458
420	IDEX = 0x40000068
421	DATA = S468
422	IDEX = 0x4000006C
423	DATA = S46C
424	IDEX = 0x40000070
425	DATA = S470
426	IDEX = 0x40000080
427	DATA = S480
428	IDEX = 0x40000084
429	DATA = S484
430	IDEX = 0x40000088
431	DATA = S488
432	IDEX = 0x4000008C
433	DATA = S48C
434}
435