util/sconfig: Remove unused ioapic and irq keywords
[coreboot.git] / src / southbridge / intel / lynxpoint / acpi / xhci.asl
blobeec92c3fad8ce29744582cad458255dd94636b7d
1 /* SPDX-License-Identifier: GPL-2.0-only */
3 // XHCI Controller 0:14.0
5 Device (XHCI)
7         Name (_ADR, 0x00140000)
9         Name (PLSD, 5) // Port Link State - RxDetect
10         Name (PLSP, 7) // Port Link State - Polling
12         OperationRegion (XPRT, PCI_Config, 0, 0x100)
13         Field (XPRT, AnyAcc, NoLock, Preserve)
14         {
15                 DVID, 16,
16                 Offset (0x10),
17                 , 16,
18                 XMEM, 16, // MEM_BASE
19                 Offset (0x40),
20                 , 11,
21                 SWAI, 1,
22                 , 20,
23                 Offset (0x44),
24                 , 12,
25                 SAIP, 2,
26                 , 18,
27                 Offset (0x74),
28                 D0D3, 2,
29                 , 6,
30                 PMEE, 1,  // PME_EN
31                 , 6,
32                 PMES, 1,  // PME_STS
33                 Offset (0xb0),
34                 , 13,
35                 MB13, 1,
36                 MB14, 1,
37                 Offset (0xd0),
38                 PR2R, 32,  // USB2PR
39                 PR2M, 32,  // USB2PRM
40                 PR3R, 32,  // USB3PR
41                 PR3M, 32,  // USB3PRM
42         }
44         // Clear status bits
45         Method (LPCL, 0, Serialized)
46         {
47                 OperationRegion (XREG, SystemMemory, ^XMEM << 16, 0x600)
48                 Field (XREG, DWordAcc, Lock, Preserve)
49                 {
50                         Offset (0x510), // PORTSCNUSB3[0]
51                         PSC0, 32,
52                         Offset (0x520), // PORTSCNUSB3[1]
53                         PSC1, 32,
54                         Offset (0x530), // PORTSCNUSB3[2]
55                         PSC2, 32,
56                         Offset (0x540), // PORTSCNUSB3[3]
57                         PSC3, 32,
58                 }
60                 // Port Enabled/Disabled (Bit 1)
61                 Name (PEDB, 1 << 1)
63                 // Change Status (Bits 23:17)
64                 Name (CHST, 0x7f << 17)
66                 // Port 0
67                 Local0 = PSC0 & ~PEDB
68                 PSC0 = Local0 | CHST
70                 // Port 1
71                 Local0 = PSC1 & ~PEDB
72                 PSC1 = Local0 | CHST
74                 // Port 2
75                 Local0 = PSC2 & ~PEDB
76                 PSC2 = Local0 | CHST
78                 // Port 3
79                 Local0 = PSC3 & ~PEDB
80                 PSC3 = Local0 | CHST
81         }
83         Method (LPS0, 0, Serialized)
84         {
85                 OperationRegion (XREG, SystemMemory, ^XMEM << 16, 0x600)
86                 Field (XREG, DWordAcc, Lock, Preserve)
87                 {
88                         Offset (0x510), // PORTSCNUSB3
89                         , 5,
90                         PLS1, 4,        // [8:5] Port Link State
91                         PPR1, 1,        // [9] Port Power
92                         , 7,
93                         CSC1, 1,        // [17] Connect Status Change
94                         , 1,
95                         WRC1, 1,        // [19] Warm Port Reset Change
96                         , 11,
97                         WPR1, 1,        // [31] Warm Port Reset
98                         Offset (0x520), // PORTSCNUSB3
99                         , 5,
100                         PLS2, 4,        // [8:5] Port Link State
101                         PPR2, 1,        // [9] Port Power
102                         , 7,
103                         CSC2, 1,        // [17] Connect Status Change
104                         , 1,
105                         WRC2, 1,        // [19] Warm Port Reset Change
106                         , 11,
107                         WPR2, 1,        // [31] Warm Port Reset
108                         Offset (0x530), // PORTSCNUSB3
109                         , 5,
110                         PLS3, 4,        // [8:5] Port Link State
111                         PPR3, 1,        // [9] Port Power
112                         , 7,
113                         CSC3, 1,        // [17] Connect Status Change
114                         , 1,
115                         WRC3, 1,        // [19] Warm Port Reset Change
116                         , 11,
117                         WPR3, 1,        // [31] Warm Port Reset
118                         Offset (0x540), // PORTSCNUSB3
119                         , 5,
120                         PLS4, 4,        // [8:5] Port Link State
121                         PPR4, 1,        // [9] Port Power
122                         , 7,
123                         CSC4, 1,        // [17] Connect Status Change
124                         , 1,
125                         WRC4, 1,        // [19] Warm Port Reset Change
126                         , 11,
127                         WPR4, 1,        // [31] Warm Port Reset
128                 }
130                 // Wait for all powered ports to finish polling
131                 Local0 = 10
132                 While ((PPR1 == 1 && PLS1 == PLSP || PPR2 == 1 && PLS2 == PLSP) ||
133                        (PPR3 == 1 && PLS3 == PLSP || PPR4 == 1 && PLS4 == PLSP))
134                 {
135                         If (Local0 == 0) {
136                                 Break
137                         }
138                         Local0--
139                         Stall (10)
140                 }
142                 // For each USB3 Port:
143                 //   If port is disconnected (PLS=5 PP=1 CSC=0)
144                 //     1) Issue warm reset (WPR=1)
145                 //     2) Poll for warm reset complete (WRC=0)
146                 //     3) Write 1 to port status to clear
148                 // Local# indicate if port is reset
149                 Local1 = 0
150                 Local2 = 0
151                 Local3 = 0
152                 Local4 = 0
154                 If (PLS1 == PLSD && (CSC1 == 0 && PPR1 == 1)) {
155                         WPR1 = 1        // Issue warm reset
156                         Local1 = 1
157                 }
158                 If (PLS2 == PLSD && (CSC2 == 0 && PPR2 == 1)) {
159                         WPR2 = 1        // Issue warm reset
160                         Local2 = 1
161                 }
162                 If (PLS3 == PLSD && (CSC3 == 0 && PPR3 == 1)) {
163                         WPR3 = 1        // Issue warm reset
164                         Local3 = 1
165                 }
166                 If (PLS4 == PLSD && (CSC4 == 0 && PPR4 == 1)) {
167                         WPR4 = 1        // Issue warm reset
168                         Local4 = 1
169                 }
171                 // Poll for warm reset complete on all ports that were reset
172                 Local0 = 10
173                 While ((Local1 == 1 && WRC1 == 0 || Local2 == 1 && WRC2 == 0) ||
174                        (Local3 == 1 && WRC3 == 0 || Local4 == 1 && WRC4 == 0))
175                 {
176                         If (Local0 == 0) {
177                                 Break
178                         }
179                         Local0--
180                         Stall (10)
181                 }
183                 // Clear status bits in all ports
184                 LPCL ()
185         }
187         Method (_PSC, 0, NotSerialized)
188         {
189                 Return (^D0D3)
190         }
192         Method (_PS0, 0, Serialized)
193         {
194                 If (^DVID == 0xFFFF) {
195                         Return ()
196                 }
197                 If (^XMEM == 0xFFFF || ^XMEM == 0) {
198                         Return ()
199                 }
201                 OperationRegion (XREG, SystemMemory, (^XMEM << 16) + 0x8000, 0x200)
202                 Field (XREG, DWordAcc, Lock, Preserve)
203                 {
204                         Offset (0x0e0), // AUX Reset Control 1
205                         , 15,
206                         AX15, 1,
207                         Offset (0x154), // AUX Domain PM Control Register 2
208                         , 31,
209                         CLK2, 1,
210                         Offset (0x16c), // AUX Clock Control
211                         , 2,
212                         CLK0, 1,
213                         , 11,
214                         CLK1, 1, // USB3 Port Aux/Core Clock Gating Enable
215                 }
217                 // If device is in D3, set back to D0
218                 Local0 = ^D0D3
219                 if (Local0 == 3) {
220                         ^D0D3 = 0
221                 }
223 #if CONFIG(INTEL_LYNXPOINT_LP)
224                 // Clear PCI 0xB0[14:13]
225                 ^MB13 = 0
226                 ^MB14 = 0
228                 // Clear MMIO 0x816C[14,2]
229                 CLK0 = 0
230                 CLK1 = 0
232                 // Set MMIO 0x8154[31]
233                 CLK2 = 1
235                 // Handle per-port reset if needed
236                 LPS0 ()
238                 // Set MMIO 0x80e0[15]
239                 AX15 = 1
240 #else
241                 // Set MMIO 0x8154[31]
242                 CLK2 = 1
243 #endif
245                 // Clear PCI CFG offset 0x40[11]
246                 ^SWAI = 0
248                 // Clear PCI CFG offset 0x44[13:12]
249                 ^SAIP = 0
251                 Return ()
252         }
254         Method (_PS3, 0, Serialized)
255         {
256                 If (^DVID == 0xFFFF) {
257                         Return ()
258                 }
259                 If (^XMEM == 0xFFFF || ^XMEM == 0) {
260                         Return ()
261                 }
263                 OperationRegion (XREG, SystemMemory, (^XMEM << 16) + 0x8000, 0x200)
264                 Field (XREG, DWordAcc, Lock, Preserve)
265                 {
266                         Offset (0x0e0), // AUX Reset Control 1
267                         , 15,
268                         AX15, 1,
269                         Offset (0x154), // AUX Domain PM Control Register 2
270                         , 31,
271                         CLK2, 1,
272                         Offset (0x16c), // AUX Clock Control
273                         , 2,
274                         CLK0, 1,
275                         , 11,
276                         CLK1, 1, // USB3 Port Aux/Core Clock Gating Enable
277                 }
279                 ^PMES = 1 // Clear PME Status
280                 ^PMEE = 1 // Enable PME
282                 // If device is in D3, set back to D0
283                 Local0 = ^D0D3
284                 if (Local0 == 3) {
285                         ^D0D3 = 0
286                 }
288 #if CONFIG(INTEL_LYNXPOINT_LP)
289                 // Set PCI 0xB0[14:13]
290                 ^MB13 = 1
291                 ^MB14 = 1
293                 // Set MMIO 0x816C[14,2]
294                 CLK0 = 1
295                 CLK1 = 1
297                 // Clear MMIO 0x8154[31]
298                 CLK2 = 0
300                 // Clear MMIO 0x80e0[15]
301                 AX15 = 0
302 #else
303                 // Clear MMIO 0x8154[31]
304                 CLK2 = 0
305 #endif
307                 // Set PCI CFG offset 0x40[11]
308                 ^SWAI = 1
310                 // Set PCI CFG offset 0x44[13:12]
311                 ^SAIP = 1
313                 // Put device in D3
314                 ^D0D3 = 3
316                 Return ()
317         }
319         Name (_PRW, Package () { DEFAULT_PRW_VALUE, 3 })
321         // Leave USB ports on for to allow Wake from USB
323         Method (_S3D, 0)        // Highest D State in S3 State
324         {
325                 Return (3)
326         }
328         Method (_S4D, 0)        // Highest D State in S4 State
329         {
330                 Return (3)
331         }
333         Device (HUB7)
334         {
335                 Name (_ADR, 0)
337                 // GPLD: Generate Port Location Data (PLD)
338                 Method (GPLD, 1, Serialized) {
339                         Name (PCKG, Package () {
340                                 Buffer (0x10) {}
341                         })
343                         // REV: Revision 2 for ACPI 5.0
344                         CreateField (DerefOf (PCKG [0]), 0, 7, REV)
345                         REV = 2
347                         // VISI: Port visibility to user per port
348                         CreateField (DerefOf (PCKG [0]), 0x40, 1, VISI)
349                         VISI = Arg0
350                         Return (PCKG)
351                 }
353                 Device (PRT1) { Name (_ADR, 1) } // USB Port 0
354                 Device (PRT2) { Name (_ADR, 2) } // USB Port 1
355                 Device (PRT3) { Name (_ADR, 3) } // USB Port 2
356                 Device (PRT4) { Name (_ADR, 4) } // USB Port 3
357                 Device (PRT5) { Name (_ADR, 5) } // USB Port 4
358                 Device (PRT6) { Name (_ADR, 6) } // USB Port 5
359                 Device (PRT7) { Name (_ADR, 7) } // USB Port 6
360                 Device (PRT8) { Name (_ADR, 8) } // USB Port 7
361                 Device (SSP1) { Name (_ADR, 10) } // USB Port 10
362                 Device (SSP2) { Name (_ADR, 11) } // USB Port 11
363                 Device (SSP3) { Name (_ADR, 12) } // USB Port 12
364                 Device (SSP4) { Name (_ADR, 13) } // USB Port 13
365                 Device (SSP5) { Name (_ADR, 14) } // USB Port 14
366                 Device (SSP6) { Name (_ADR, 15) } // USB Port 15
367         }