blob: 528bdb6365da3bb438b3816dce2f2a11be6dc211 [file] [log] [blame]
Michał Żygowskifba08302020-04-13 20:51:32 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2
3/* Helper package for determining IO, DMA, IRQ location according to LDN */
4Name (DCAT, Package (0x10) {
5 0x07, /* UARTA */
6 0x08, /* UARTB */
7 0x11, /* LPT */
8 0x0B, /* Floppy */
9 0xFF,
10 0xFF,
11 0xFF,
12 0xFF,
13 0xFF,
14 0xFF,
Felix Singerca4b5872022-12-26 08:17:06 +010015 1, /* KBC */
Michał Żygowskifba08302020-04-13 20:51:32 +020016 0xFF,
17 0xFF,
18 0xFF,
Felix Singerca4b5872022-12-26 08:17:06 +010019 1, /* KBC */
Michał Żygowskifba08302020-04-13 20:51:32 +020020 0xFF
21})
22
23Method (CGLD, 1, NotSerialized)
24{
25 Return (DerefOf (DCAT [Arg0]))
26}
27
28/* Return Parallel port mode*/
29Method (LPTM, 1, NotSerialized)
30{
31 ENTER_CONFIG_MODE (CGLD (Arg0))
32 Local0 = (OPT0 & 0x02)
33 EXIT_CONFIG_MODE ()
34 Return (Local0)
35}
36
37/* Device Status */
38Method (DSTA, 1, NotSerialized)
39{
40 ENTER_CONFIG_MODE (CGLD (Arg0))
41 Local0 = PNP_DEVICE_ACTIVE
42 If (Local0 == 0xFF)
43 {
Felix Singer42efd7f2022-12-26 09:38:45 +010044 Return (0)
Michał Żygowskifba08302020-04-13 20:51:32 +020045 }
46
Felix Singerca4b5872022-12-26 08:17:06 +010047 Local0 &= 1
Michał Żygowskifba08302020-04-13 20:51:32 +020048 If (Arg0 < 0x10)
49 {
50 IOST |= (Local0 << Arg0)
51 }
52
53 If (Local0)
54 {
55 Return (DEVICE_PRESENT_ACTIVE)
56 }
Felix Singerca4b5872022-12-26 08:17:06 +010057 ElseIf ((1 << Arg0) & IOST)
Michał Żygowskifba08302020-04-13 20:51:32 +020058 {
59 Return (DEVICE_PRESENT_INACTIVE)
60 }
61 Else
62 {
Felix Singer42efd7f2022-12-26 09:38:45 +010063 Return (0)
Michał Żygowskifba08302020-04-13 20:51:32 +020064 }
65
66 EXIT_CONFIG_MODE ()
67}
68
69Method (DCNT, 2, NotSerialized)
70{
71 ENTER_CONFIG_MODE (CGLD (Arg0))
72 PNP_DEVICE_ACTIVE = Arg1
73 EXIT_CONFIG_MODE ()
74}
75
76/* Resource templates for SIO LDNs */
77Name (CRS1, ResourceTemplate ()
78{
79 IO (Decode16,
80 0x0000,
81 0x0000,
82 0x01,
83 0x00,
84 _Y16)
85 IRQ (Edge, ActiveHigh, Exclusive, _Y14) {}
86 DMA (Compatibility, NotBusMaster, Transfer8, _Y15) {}
87})
88
89CreateWordField (CRS1, \_SB.PCI0.LPCB.SIO1._Y14._INT, IRQM)
90CreateByteField (CRS1, \_SB.PCI0.LPCB.SIO1._Y15._DMA, DMAM)
91CreateWordField (CRS1, \_SB.PCI0.LPCB.SIO1._Y16._MIN, IO11)
92CreateWordField (CRS1, \_SB.PCI0.LPCB.SIO1._Y16._MAX, IO12)
93CreateByteField (CRS1, \_SB.PCI0.LPCB.SIO1._Y16._LEN, LEN1)
94
95Name (CRS2, ResourceTemplate ()
96{
97 IO (Decode16,
98 0x0000,
99 0x0000,
100 0x01,
101 0x00,
102 _Y19)
103 IO (Decode16,
104 0x0000,
105 0x0000,
106 0x01,
107 0x00,
108 _Y1A)
109 IRQ (Edge, ActiveHigh, Exclusive, _Y17) {}
110 DMA (Compatibility, NotBusMaster, Transfer8, _Y18) {}
111})
112
113CreateWordField (CRS2, \_SB.PCI0.LPCB.SIO1._Y17._INT, IRQE)
114CreateByteField (CRS2, \_SB.PCI0.LPCB.SIO1._Y18._DMA, DMAE)
115CreateWordField (CRS2, \_SB.PCI0.LPCB.SIO1._Y19._MIN, IO21)
116CreateWordField (CRS2, \_SB.PCI0.LPCB.SIO1._Y19._MAX, IO22)
117CreateByteField (CRS2, \_SB.PCI0.LPCB.SIO1._Y19._LEN, LEN2)
118CreateWordField (CRS2, \_SB.PCI0.LPCB.SIO1._Y1A._MIN, IO31)
119CreateWordField (CRS2, \_SB.PCI0.LPCB.SIO1._Y1A._MAX, IO32)
120CreateByteField (CRS2, \_SB.PCI0.LPCB.SIO1._Y1A._LEN, LEN3)
121
122/* Read IO resource */
123Method (GIOB, 1, NotSerialized)
124{
125 If (CGLD (Arg0) == 0x07) /* UARTA */
126 {
127 SWITCH_LDN (SUPERIO_LPC_LDN)
128 Local0 = (CR6B << 0x08)
129 Local0 |= CR6A
130 Return (Local0)
131 }
132
133 If (CGLD (Arg0) == 0x08) /* UARTB */
134 {
135 SWITCH_LDN (SUPERIO_LPC_LDN)
136 Local0 = (CR6F << 0x08)
137 Local0 |= CR6E
138 Return (Local0)
139 }
140
141 If (CGLD (Arg0) == 0x11) /* LPT */
142 {
143 SWITCH_LDN (SUPERIO_LPC_LDN)
144 Local0 = (CR83 << 0x08)
145 Local0 |= CR82
146 Return (Local0)
147 }
148
149 If (CGLD (Arg0) == 0x0B) /* Floppy */
150 {
151 SWITCH_LDN (SUPERIO_LPC_LDN)
152 Local0 = (CR7F << 0x08)
153 Local0 |= CR7E
154 Return (Local0)
155 }
156
Felix Singer42efd7f2022-12-26 09:38:45 +0100157 Return (0)
Michał Żygowskifba08302020-04-13 20:51:32 +0200158}
159
160/* Read IRQ resource */
161Method (GIRQ, 1, NotSerialized)
162{
163 SWITCH_LDN (SUPERIO_LPC_LDN)
164 Local0 = 0x0F /* 15 IRQ regs, 1 for each IRQ number */
165 While (Local0)
166 {
167 Local1 = (0x40 + Local0) /* IRQ regs begin at offset 0x40 */
168 PNP_ADDR_REG = Local1
169 Local1 = PNP_DATA_REG
170 If (CGLD (Arg0) == Local1)
171 {
Felix Singerca4b5872022-12-26 08:17:06 +0100172 Local1 = 1
Michał Żygowskifba08302020-04-13 20:51:32 +0200173 Local0 = (Local1 << Local0)
174 Return (Local0)
175 }
176
177 Local0--
178 }
179
180 Return (0xFF)
181}
182
183/* Read DMA resource */
184Method (GDMA, 1, NotSerialized)
185{
186 SWITCH_LDN (SUPERIO_LPC_LDN)
187 Local0 = 0x03 /* Only DMA Channels 0-3 */
188 While (Local0)
189 {
Felix Singerca4b5872022-12-26 08:17:06 +0100190 Local1 = (Local0 << 1)
Michał Żygowskifba08302020-04-13 20:51:32 +0200191 Local1 += 0x51 /* DMA regs begin at offset 0x50 */
192 PNP_ADDR_REG = Local1
193 Local1 = PNP_DATA_REG
194 If ((0x80 | CGLD (Arg0)) == Local1)
195 {
Felix Singerca4b5872022-12-26 08:17:06 +0100196 Local1 = 1
Michał Żygowskifba08302020-04-13 20:51:32 +0200197 Local0 = (Local1 << Local0)
198 Return (Local0)
199 }
200
201 Local0--
202 }
203
204 Return (0xFF)
205}
206
207/* Set IO resource */
208Method (STIO, 2, NotSerialized)
209{
210 SWITCH_LDN (SUPERIO_LPC_LDN)
211 Local0 = (Arg1 & 0xFF)
212 PNP_ADDR_REG = Arg0
213 PNP_DATA_REG = Local0
214 Local0 = (Arg1 >> 0x08)
Felix Singerca4b5872022-12-26 08:17:06 +0100215 Local1 = (Arg0 + 1)
Michał Żygowskifba08302020-04-13 20:51:32 +0200216 PNP_ADDR_REG = Local1
217 PNP_DATA_REG = Local0
218}
219
220/* Set IRQ resource */
221Method (SIRQ, 2, NotSerialized)
222{
223 SWITCH_LDN (SUPERIO_LPC_LDN)
224 FindSetRightBit (Arg1, Local0)
Felix Singerca4b5872022-12-26 08:17:06 +0100225 Local0 -= 1
Michał Żygowskifba08302020-04-13 20:51:32 +0200226 Local1 = 0x0F
227 While (Local1)
228 {
229 Local2 = (0x40 + Local1)
230 PNP_ADDR_REG = Local2
231 Local3 = PNP_DATA_REG
232 If (CGLD (Arg0) == Local3)
233 {
234 If (Local0 != Local1)
235 {
236 PNP_ADDR_REG = Local2
237 PNP_DATA_REG = 0xFF
238 Break
239 }
240 Else
241 {
Felix Singer42efd7f2022-12-26 09:38:45 +0100242 Return (0)
Michał Żygowskifba08302020-04-13 20:51:32 +0200243 }
244 }
245
246 Local1--
247 }
248
249 Local0 += 0x40
250 PNP_ADDR_REG = Local0
251 PNP_DATA_REG = CGLD (Arg0)
252 Return (0xFF)
253}
254
255/* Set DMA resource */
256Method (SDMA, 2, NotSerialized)
257{
258 SWITCH_LDN (SUPERIO_LPC_LDN)
259 FindSetRightBit (Arg1, Local0)
Felix Singerca4b5872022-12-26 08:17:06 +0100260 Local0 -= 1
Michał Żygowskifba08302020-04-13 20:51:32 +0200261 Local1 = 0x03
262 While (Local1)
263 {
Felix Singerca4b5872022-12-26 08:17:06 +0100264 Local2 = (Local1 << 1)
Michał Żygowskifba08302020-04-13 20:51:32 +0200265 Local3 = (0x51 + Local2)
266 PNP_ADDR_REG = Local3
267 Local4 = PNP_DATA_REG
268 If ((0x80 | CGLD (Arg0)) == Local4)
269 {
270 If (Local0 != Local1)
271 {
272 PNP_ADDR_REG = Local3
Felix Singer42efd7f2022-12-26 09:38:45 +0100273 PNP_DATA_REG = 0
Michał Żygowskifba08302020-04-13 20:51:32 +0200274 Break
275 }
276 Else
277 {
Felix Singer42efd7f2022-12-26 09:38:45 +0100278 Return (0)
Michał Żygowskifba08302020-04-13 20:51:32 +0200279 }
280 }
281
282 Local1--
283 }
284
Felix Singerca4b5872022-12-26 08:17:06 +0100285 Local0 <<= 1
Michał Żygowskifba08302020-04-13 20:51:32 +0200286 Local0 += 0x51
287 PNP_ADDR_REG = Local0
288 PNP_DATA_REG = (0x80 | CGLD (Arg0))
Felix Singer42efd7f2022-12-26 09:38:45 +0100289 Return (0)
Michał Żygowskifba08302020-04-13 20:51:32 +0200290}
291
292/* Device Current Resource Settings */
293Method (DCRS, 2, NotSerialized)
294{
295 If (CGLD (Arg0) == 0x07) /* UARTA resources */
296 {
297 ENTER_CONFIG_MODE (SUPERIO_LPC_LDN)
298 IO11 = GIOB (Arg0)
299 IO12 = IO11
300 LEN1 = 0x08
301 IRQM = GIRQ (Arg0)
Felix Singer42efd7f2022-12-26 09:38:45 +0100302 If ((GDMA (Arg0) > 0x03) || (Arg1 == 0))
Michał Żygowskifba08302020-04-13 20:51:32 +0200303 {
Felix Singer42efd7f2022-12-26 09:38:45 +0100304 DMAM = 0
Michał Żygowskifba08302020-04-13 20:51:32 +0200305 }
306 Else
307 {
308 DMAM = GDMA (Arg0)
309 }
310
311 EXIT_CONFIG_MODE ()
312 Return (CRS1)
313 }
314
315 If (CGLD (Arg0) == 0x08) /* UARTB resources */
316 {
317 ENTER_CONFIG_MODE (SUPERIO_LPC_LDN)
318 IO11 = GIOB (Arg0)
319 IO12 = IO11
320 LEN1 = 0x08
321 IRQM = GIRQ (Arg0)
Felix Singer42efd7f2022-12-26 09:38:45 +0100322 If ((GDMA (Arg0) > 0x03) || (Arg1 == 0))
Michał Żygowskifba08302020-04-13 20:51:32 +0200323 {
Felix Singer42efd7f2022-12-26 09:38:45 +0100324 DMAM = 0
Michał Żygowskifba08302020-04-13 20:51:32 +0200325 }
326 Else
327 {
328 DMAM = GDMA (Arg0)
329 }
330
331 EXIT_CONFIG_MODE ()
332 Return (CRS1)
333 }
334
335 If (CGLD (Arg0) == 0x11) /* LPT resources */
336 {
337 If (LPTM (Arg0))
338 {
339 ENTER_CONFIG_MODE (SUPERIO_LPC_LDN)
340 IO21 = GIOB (Arg0)
341 IO22 = IO21
342 IO31 = (IO21 + 0x0400)
343 IO32 = IO31
344 If ((IO21 & 0xFF) == 0xBC)
345 {
346 LEN2 = 0x04
347 LEN3 = 0x04
348 }
349 Else
350 {
351 LEN2 = 0x08
352 LEN3 = 0x04
353 }
354
355 IRQE = GIRQ (Arg0)
Felix Singer42efd7f2022-12-26 09:38:45 +0100356 If ((GDMA (Arg0) > 0x03) || (Arg1 == 0))
Michał Żygowskifba08302020-04-13 20:51:32 +0200357 {
Felix Singer42efd7f2022-12-26 09:38:45 +0100358 DMAM = 0
Michał Żygowskifba08302020-04-13 20:51:32 +0200359 }
360 Else
361 {
362 DMAE = GDMA (Arg0)
363 }
364
365 EXIT_CONFIG_MODE ()
366 Return (CRS2) /* \_SB_.PCI0.LPCB.SIO1.CRS2 */
367 }
368 Else
369 {
370 ENTER_CONFIG_MODE (SUPERIO_LPC_LDN)
371 IO11 = GIOB (Arg0)
372 IO12 = IO11 /* \_SB_.PCI0.LPCB.SIO1.IO11 */
373 If ((IO11 & 0xFF) == 0xBC)
374 {
375 LEN1 = 0x04
376 }
377 Else
378 {
379 LEN1 = 0x08
380 }
381
382 IRQM = GIRQ (Arg0)
383 EXIT_CONFIG_MODE ()
384 Return (CRS1) /* \_SB_.PCI0.LPCB.SIO1.CRS1 */
385 }
386 }
387
388 If (CGLD (Arg0) == 0x0B) /* Floppy resources */
389 {
390 ENTER_CONFIG_MODE (SUPERIO_LPC_LDN)
391 IO21 = GIOB (Arg0)
392 IO22 = IO21 /* \_SB_.PCI0.LPCB.SIO1.IO21 */
393 LEN2 = 0x06
394 IO31 = (IO21 + 0x07)
395 IO32 = IO31 /* \_SB_.PCI0.LPCB.SIO1.IO31 */
Felix Singerca4b5872022-12-26 08:17:06 +0100396 LEN3 = 1
Michał Żygowskifba08302020-04-13 20:51:32 +0200397 IRQE = GIRQ (Arg0)
Felix Singer42efd7f2022-12-26 09:38:45 +0100398 If ((GDMA (Arg0) > 0x03) || (Arg1 == 0))
Michał Żygowskifba08302020-04-13 20:51:32 +0200399 {
Felix Singer42efd7f2022-12-26 09:38:45 +0100400 DMAM = 0
Michał Żygowskifba08302020-04-13 20:51:32 +0200401 }
402 Else
403 {
404 DMAE = GDMA (Arg0)
405 }
406
407 EXIT_CONFIG_MODE ()
408 Return (CRS2) /* \_SB_.PCI0.LPCB.SIO1.CRS2 */
409 }
410
411 Return (CRS1) /* \_SB_.PCI0.LPCB.SIO1.CRS1 */
412}