| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| /* Helper package for determining IO, DMA, IRQ location according to LDN */ |
| Name (DCAT, Package (0x10) { |
| 0x07, /* UARTA */ |
| 0x08, /* UARTB */ |
| 0x11, /* LPT */ |
| 0x0B, /* Floppy */ |
| 0xFF, |
| 0xFF, |
| 0xFF, |
| 0xFF, |
| 0xFF, |
| 0xFF, |
| 1, /* KBC */ |
| 0xFF, |
| 0xFF, |
| 0xFF, |
| 1, /* KBC */ |
| 0xFF |
| }) |
| |
| Method (CGLD, 1, NotSerialized) |
| { |
| Return (DerefOf (DCAT [Arg0])) |
| } |
| |
| /* Return Parallel port mode*/ |
| Method (LPTM, 1, NotSerialized) |
| { |
| ENTER_CONFIG_MODE (CGLD (Arg0)) |
| Local0 = (OPT0 & 0x02) |
| EXIT_CONFIG_MODE () |
| Return (Local0) |
| } |
| |
| /* Device Status */ |
| Method (DSTA, 1, NotSerialized) |
| { |
| ENTER_CONFIG_MODE (CGLD (Arg0)) |
| Local0 = PNP_DEVICE_ACTIVE |
| If (Local0 == 0xFF) |
| { |
| Return (0) |
| } |
| |
| Local0 &= 1 |
| If (Arg0 < 0x10) |
| { |
| IOST |= (Local0 << Arg0) |
| } |
| |
| If (Local0) |
| { |
| Return (DEVICE_PRESENT_ACTIVE) |
| } |
| ElseIf ((1 << Arg0) & IOST) |
| { |
| Return (DEVICE_PRESENT_INACTIVE) |
| } |
| Else |
| { |
| Return (0) |
| } |
| |
| EXIT_CONFIG_MODE () |
| } |
| |
| Method (DCNT, 2, NotSerialized) |
| { |
| ENTER_CONFIG_MODE (CGLD (Arg0)) |
| PNP_DEVICE_ACTIVE = Arg1 |
| EXIT_CONFIG_MODE () |
| } |
| |
| /* Resource templates for SIO LDNs */ |
| Name (CRS1, ResourceTemplate () |
| { |
| IO (Decode16, |
| 0x0000, |
| 0x0000, |
| 0x01, |
| 0x00, |
| _Y16) |
| IRQ (Edge, ActiveHigh, Exclusive, _Y14) {} |
| DMA (Compatibility, NotBusMaster, Transfer8, _Y15) {} |
| }) |
| |
| CreateWordField (CRS1, \_SB.PCI0.LPCB.SIO1._Y14._INT, IRQM) |
| CreateByteField (CRS1, \_SB.PCI0.LPCB.SIO1._Y15._DMA, DMAM) |
| CreateWordField (CRS1, \_SB.PCI0.LPCB.SIO1._Y16._MIN, IO11) |
| CreateWordField (CRS1, \_SB.PCI0.LPCB.SIO1._Y16._MAX, IO12) |
| CreateByteField (CRS1, \_SB.PCI0.LPCB.SIO1._Y16._LEN, LEN1) |
| |
| Name (CRS2, ResourceTemplate () |
| { |
| IO (Decode16, |
| 0x0000, |
| 0x0000, |
| 0x01, |
| 0x00, |
| _Y19) |
| IO (Decode16, |
| 0x0000, |
| 0x0000, |
| 0x01, |
| 0x00, |
| _Y1A) |
| IRQ (Edge, ActiveHigh, Exclusive, _Y17) {} |
| DMA (Compatibility, NotBusMaster, Transfer8, _Y18) {} |
| }) |
| |
| CreateWordField (CRS2, \_SB.PCI0.LPCB.SIO1._Y17._INT, IRQE) |
| CreateByteField (CRS2, \_SB.PCI0.LPCB.SIO1._Y18._DMA, DMAE) |
| CreateWordField (CRS2, \_SB.PCI0.LPCB.SIO1._Y19._MIN, IO21) |
| CreateWordField (CRS2, \_SB.PCI0.LPCB.SIO1._Y19._MAX, IO22) |
| CreateByteField (CRS2, \_SB.PCI0.LPCB.SIO1._Y19._LEN, LEN2) |
| CreateWordField (CRS2, \_SB.PCI0.LPCB.SIO1._Y1A._MIN, IO31) |
| CreateWordField (CRS2, \_SB.PCI0.LPCB.SIO1._Y1A._MAX, IO32) |
| CreateByteField (CRS2, \_SB.PCI0.LPCB.SIO1._Y1A._LEN, LEN3) |
| |
| /* Read IO resource */ |
| Method (GIOB, 1, NotSerialized) |
| { |
| If (CGLD (Arg0) == 0x07) /* UARTA */ |
| { |
| SWITCH_LDN (SUPERIO_LPC_LDN) |
| Local0 = (CR6B << 0x08) |
| Local0 |= CR6A |
| Return (Local0) |
| } |
| |
| If (CGLD (Arg0) == 0x08) /* UARTB */ |
| { |
| SWITCH_LDN (SUPERIO_LPC_LDN) |
| Local0 = (CR6F << 0x08) |
| Local0 |= CR6E |
| Return (Local0) |
| } |
| |
| If (CGLD (Arg0) == 0x11) /* LPT */ |
| { |
| SWITCH_LDN (SUPERIO_LPC_LDN) |
| Local0 = (CR83 << 0x08) |
| Local0 |= CR82 |
| Return (Local0) |
| } |
| |
| If (CGLD (Arg0) == 0x0B) /* Floppy */ |
| { |
| SWITCH_LDN (SUPERIO_LPC_LDN) |
| Local0 = (CR7F << 0x08) |
| Local0 |= CR7E |
| Return (Local0) |
| } |
| |
| Return (0) |
| } |
| |
| /* Read IRQ resource */ |
| Method (GIRQ, 1, NotSerialized) |
| { |
| SWITCH_LDN (SUPERIO_LPC_LDN) |
| Local0 = 0x0F /* 15 IRQ regs, 1 for each IRQ number */ |
| While (Local0) |
| { |
| Local1 = (0x40 + Local0) /* IRQ regs begin at offset 0x40 */ |
| PNP_ADDR_REG = Local1 |
| Local1 = PNP_DATA_REG |
| If (CGLD (Arg0) == Local1) |
| { |
| Local1 = 1 |
| Local0 = (Local1 << Local0) |
| Return (Local0) |
| } |
| |
| Local0-- |
| } |
| |
| Return (0xFF) |
| } |
| |
| /* Read DMA resource */ |
| Method (GDMA, 1, NotSerialized) |
| { |
| SWITCH_LDN (SUPERIO_LPC_LDN) |
| Local0 = 0x03 /* Only DMA Channels 0-3 */ |
| While (Local0) |
| { |
| Local1 = (Local0 << 1) |
| Local1 += 0x51 /* DMA regs begin at offset 0x50 */ |
| PNP_ADDR_REG = Local1 |
| Local1 = PNP_DATA_REG |
| If ((0x80 | CGLD (Arg0)) == Local1) |
| { |
| Local1 = 1 |
| Local0 = (Local1 << Local0) |
| Return (Local0) |
| } |
| |
| Local0-- |
| } |
| |
| Return (0xFF) |
| } |
| |
| /* Set IO resource */ |
| Method (STIO, 2, NotSerialized) |
| { |
| SWITCH_LDN (SUPERIO_LPC_LDN) |
| Local0 = (Arg1 & 0xFF) |
| PNP_ADDR_REG = Arg0 |
| PNP_DATA_REG = Local0 |
| Local0 = (Arg1 >> 0x08) |
| Local1 = (Arg0 + 1) |
| PNP_ADDR_REG = Local1 |
| PNP_DATA_REG = Local0 |
| } |
| |
| /* Set IRQ resource */ |
| Method (SIRQ, 2, NotSerialized) |
| { |
| SWITCH_LDN (SUPERIO_LPC_LDN) |
| FindSetRightBit (Arg1, Local0) |
| Local0 -= 1 |
| Local1 = 0x0F |
| While (Local1) |
| { |
| Local2 = (0x40 + Local1) |
| PNP_ADDR_REG = Local2 |
| Local3 = PNP_DATA_REG |
| If (CGLD (Arg0) == Local3) |
| { |
| If (Local0 != Local1) |
| { |
| PNP_ADDR_REG = Local2 |
| PNP_DATA_REG = 0xFF |
| Break |
| } |
| Else |
| { |
| Return (0) |
| } |
| } |
| |
| Local1-- |
| } |
| |
| Local0 += 0x40 |
| PNP_ADDR_REG = Local0 |
| PNP_DATA_REG = CGLD (Arg0) |
| Return (0xFF) |
| } |
| |
| /* Set DMA resource */ |
| Method (SDMA, 2, NotSerialized) |
| { |
| SWITCH_LDN (SUPERIO_LPC_LDN) |
| FindSetRightBit (Arg1, Local0) |
| Local0 -= 1 |
| Local1 = 0x03 |
| While (Local1) |
| { |
| Local2 = (Local1 << 1) |
| Local3 = (0x51 + Local2) |
| PNP_ADDR_REG = Local3 |
| Local4 = PNP_DATA_REG |
| If ((0x80 | CGLD (Arg0)) == Local4) |
| { |
| If (Local0 != Local1) |
| { |
| PNP_ADDR_REG = Local3 |
| PNP_DATA_REG = 0 |
| Break |
| } |
| Else |
| { |
| Return (0) |
| } |
| } |
| |
| Local1-- |
| } |
| |
| Local0 <<= 1 |
| Local0 += 0x51 |
| PNP_ADDR_REG = Local0 |
| PNP_DATA_REG = (0x80 | CGLD (Arg0)) |
| Return (0) |
| } |
| |
| /* Device Current Resource Settings */ |
| Method (DCRS, 2, NotSerialized) |
| { |
| If (CGLD (Arg0) == 0x07) /* UARTA resources */ |
| { |
| ENTER_CONFIG_MODE (SUPERIO_LPC_LDN) |
| IO11 = GIOB (Arg0) |
| IO12 = IO11 |
| LEN1 = 0x08 |
| IRQM = GIRQ (Arg0) |
| If ((GDMA (Arg0) > 0x03) || (Arg1 == 0)) |
| { |
| DMAM = 0 |
| } |
| Else |
| { |
| DMAM = GDMA (Arg0) |
| } |
| |
| EXIT_CONFIG_MODE () |
| Return (CRS1) |
| } |
| |
| If (CGLD (Arg0) == 0x08) /* UARTB resources */ |
| { |
| ENTER_CONFIG_MODE (SUPERIO_LPC_LDN) |
| IO11 = GIOB (Arg0) |
| IO12 = IO11 |
| LEN1 = 0x08 |
| IRQM = GIRQ (Arg0) |
| If ((GDMA (Arg0) > 0x03) || (Arg1 == 0)) |
| { |
| DMAM = 0 |
| } |
| Else |
| { |
| DMAM = GDMA (Arg0) |
| } |
| |
| EXIT_CONFIG_MODE () |
| Return (CRS1) |
| } |
| |
| If (CGLD (Arg0) == 0x11) /* LPT resources */ |
| { |
| If (LPTM (Arg0)) |
| { |
| ENTER_CONFIG_MODE (SUPERIO_LPC_LDN) |
| IO21 = GIOB (Arg0) |
| IO22 = IO21 |
| IO31 = (IO21 + 0x0400) |
| IO32 = IO31 |
| If ((IO21 & 0xFF) == 0xBC) |
| { |
| LEN2 = 0x04 |
| LEN3 = 0x04 |
| } |
| Else |
| { |
| LEN2 = 0x08 |
| LEN3 = 0x04 |
| } |
| |
| IRQE = GIRQ (Arg0) |
| If ((GDMA (Arg0) > 0x03) || (Arg1 == 0)) |
| { |
| DMAM = 0 |
| } |
| Else |
| { |
| DMAE = GDMA (Arg0) |
| } |
| |
| EXIT_CONFIG_MODE () |
| Return (CRS2) /* \_SB_.PCI0.LPCB.SIO1.CRS2 */ |
| } |
| Else |
| { |
| ENTER_CONFIG_MODE (SUPERIO_LPC_LDN) |
| IO11 = GIOB (Arg0) |
| IO12 = IO11 /* \_SB_.PCI0.LPCB.SIO1.IO11 */ |
| If ((IO11 & 0xFF) == 0xBC) |
| { |
| LEN1 = 0x04 |
| } |
| Else |
| { |
| LEN1 = 0x08 |
| } |
| |
| IRQM = GIRQ (Arg0) |
| EXIT_CONFIG_MODE () |
| Return (CRS1) /* \_SB_.PCI0.LPCB.SIO1.CRS1 */ |
| } |
| } |
| |
| If (CGLD (Arg0) == 0x0B) /* Floppy resources */ |
| { |
| ENTER_CONFIG_MODE (SUPERIO_LPC_LDN) |
| IO21 = GIOB (Arg0) |
| IO22 = IO21 /* \_SB_.PCI0.LPCB.SIO1.IO21 */ |
| LEN2 = 0x06 |
| IO31 = (IO21 + 0x07) |
| IO32 = IO31 /* \_SB_.PCI0.LPCB.SIO1.IO31 */ |
| LEN3 = 1 |
| IRQE = GIRQ (Arg0) |
| If ((GDMA (Arg0) > 0x03) || (Arg1 == 0)) |
| { |
| DMAM = 0 |
| } |
| Else |
| { |
| DMAE = GDMA (Arg0) |
| } |
| |
| EXIT_CONFIG_MODE () |
| Return (CRS2) /* \_SB_.PCI0.LPCB.SIO1.CRS2 */ |
| } |
| |
| Return (CRS1) /* \_SB_.PCI0.LPCB.SIO1.CRS1 */ |
| } |