From 6bf299cd417c703b8ddb15c5556b836e5d956016 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 16 Oct 2021 21:36:58 -0300 Subject: [PATCH] Implement undocumented PMCNTRL mirrors on VIA 596 (unconfirmed), 686 (confirmed) and PIIX4 (unconfirmed) ACPI --- src/acpi.c | 46 ++++++++++++++++++++++++++++++---------- src/chipset/intel_piix.c | 8 +++++-- src/chipset/via_pipc.c | 1 + 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/acpi.c b/src/acpi.c index 1398edc4c..6f5471faa 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -1174,9 +1174,9 @@ acpi_reg_write_common(int size, uint16_t addr, uint8_t val, void *p) { acpi_t *dev = (acpi_t *) p; - if (dev->vendor == VEN_ALI) + if (dev->vendor == VEN_ALI) acpi_reg_write_ali(size, addr, val, p); - if (dev->vendor == VEN_VIA) + else if (dev->vendor == VEN_VIA) acpi_reg_write_via(size, addr, val, p); else if (dev->vendor == VEN_VIA_596B) acpi_reg_write_via_596b(size, addr, val, p); @@ -1195,7 +1195,11 @@ acpi_aux_reg_read_common(int size, uint16_t addr, void *p) acpi_t *dev = (acpi_t *) p; uint8_t ret = 0xff; - if (dev->vendor == VEN_SMC) + if (dev->vendor == VEN_VIA_596B) + ret = acpi_reg_read_via_596b(size, addr - (0xf0 - 0x04), p); + else if (dev->vendor == VEN_INTEL) + ret = acpi_reg_read_intel(size, addr - (0x40 - 0x04), p); + else if (dev->vendor == VEN_SMC) ret = acpi_aux_reg_read_smc(size, addr, p); return ret; @@ -1207,7 +1211,11 @@ acpi_aux_reg_write_common(int size, uint16_t addr, uint8_t val, void *p) { acpi_t *dev = (acpi_t *) p; - if (dev->vendor == VEN_SMC) + if (dev->vendor == VEN_VIA_596B) + acpi_reg_write_via_596b(size, addr - (0xf0 - 0x04), val, p); + else if (dev->vendor == VEN_INTEL) + acpi_reg_write_intel(size, addr - (0x40 - 0x04), val, p); + else if (dev->vendor == VEN_SMC) acpi_aux_reg_write_smc(size, addr, val, p); } @@ -1256,7 +1264,7 @@ acpi_reg_read(uint16_t addr, void *p) static uint32_t -acpi_aux_read_readl(uint16_t addr, void *p) +acpi_aux_reg_readl(uint16_t addr, void *p) { uint32_t ret = 0x00000000; @@ -1272,7 +1280,7 @@ acpi_aux_read_readl(uint16_t addr, void *p) static uint16_t -acpi_aux_read_readw(uint16_t addr, void *p) +acpi_aux_reg_readw(uint16_t addr, void *p) { uint16_t ret = 0x0000; @@ -1286,7 +1294,7 @@ acpi_aux_read_readw(uint16_t addr, void *p) static uint8_t -acpi_aux_read_read(uint16_t addr, void *p) +acpi_aux_reg_read(uint16_t addr, void *p) { uint8_t ret = 0x00; @@ -1396,17 +1404,33 @@ acpi_update_io_mapping(acpi_t *dev, uint32_t base, int chipset_en) void acpi_update_aux_io_mapping(acpi_t *dev, uint32_t base, int chipset_en) { + int size; + + switch (dev->vendor) { + case VEN_INTEL: + case VEN_VIA_596B: + /* Undocumented mirror of PMCNTRL. */ + size = 0x001; + break; + case VEN_SMC: + size = 0x008; + break; + default: + size = 0x000; + break; + } + if (dev->aux_io_base != 0x0000) { - io_removehandler(dev->aux_io_base, 0x08, - acpi_aux_read_read, acpi_aux_read_readw, acpi_aux_read_readl, + io_removehandler(dev->aux_io_base, size, + acpi_aux_reg_read, acpi_aux_reg_readw, acpi_aux_reg_readl, acpi_aux_reg_write, acpi_aux_reg_writew, acpi_aux_reg_writel, dev); } dev->aux_io_base = base; if (chipset_en && (dev->aux_io_base != 0x0000)) { - io_sethandler(dev->aux_io_base, 0x08, - acpi_aux_read_read, acpi_aux_read_readw, acpi_aux_read_readl, + io_sethandler(dev->aux_io_base, size, + acpi_aux_reg_read, acpi_aux_reg_readw, acpi_aux_reg_readl, acpi_aux_reg_write, acpi_aux_reg_writew, acpi_aux_reg_writel, dev); } } diff --git a/src/chipset/intel_piix.c b/src/chipset/intel_piix.c index a865e045a..032a94351 100644 --- a/src/chipset/intel_piix.c +++ b/src/chipset/intel_piix.c @@ -813,11 +813,13 @@ piix_write(int func, int addr, uint8_t val, void *priv) fregs[0x40] = (val & 0xc0) | 1; dev->acpi_io_base = (dev->regs[3][0x41] << 8) | (dev->regs[3][0x40] & 0xc0); acpi_update_io_mapping(dev->acpi, dev->acpi_io_base, (dev->regs[3][0x80] & 0x01)); + acpi_update_aux_io_mapping(dev->acpi, dev->acpi_io_base + 0x40, (dev->regs[3][0x80] & 0x01)); break; case 0x41: fregs[0x41] = val; dev->acpi_io_base = (dev->regs[3][0x41] << 8) | (dev->regs[3][0x40] & 0xc0); acpi_update_io_mapping(dev->acpi, dev->acpi_io_base, (dev->regs[3][0x80] & 0x01)); + acpi_update_aux_io_mapping(dev->acpi, dev->acpi_io_base + 0x40, (dev->regs[3][0x80] & 0x01)); break; case 0x44: case 0x45: case 0x46: case 0x47: case 0x48: case 0x49: @@ -844,10 +846,12 @@ piix_write(int func, int addr, uint8_t val, void *priv) break; case 0x4f: case 0x80: case 0xd2: fregs[addr] = val & 0x0f; - if (addr == 0x80) + if (addr == 0x80) { acpi_update_io_mapping(dev->acpi, dev->acpi_io_base, (dev->regs[3][0x80] & 0x01)); - else if (addr == 0xd2) + acpi_update_aux_io_mapping(dev->acpi, dev->acpi_io_base + 0x40, (dev->regs[3][0x80] & 0x01)); + } else if (addr == 0xd2) { smbus_update_io_mapping(dev); + } break; case 0x50: fregs[addr] = val & 0x3f; diff --git a/src/chipset/via_pipc.c b/src/chipset/via_pipc.c index 41667edfd..d609f47b5 100644 --- a/src/chipset/via_pipc.c +++ b/src/chipset/via_pipc.c @@ -1128,6 +1128,7 @@ pipc_write(int func, int addr, uint8_t val, void *priv) c -= 0x400; acpi_set_timer32(dev->acpi, dev->power_regs[0x41] & 0x08); acpi_update_io_mapping(dev->acpi, c, dev->power_regs[0x41] & 0x80); + acpi_update_aux_io_mapping(dev->acpi, c + 0xf0, dev->power_regs[0x41] & 0x80); break; case 0x42: