From d876534e6337748372cc55c2beb130c06a86e241 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 14 Oct 2020 16:33:30 -0300 Subject: [PATCH] Proper masking of VIA IDE registers --- src/chipset/via_pipc.c | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/chipset/via_pipc.c b/src/chipset/via_pipc.c index 377f26147..34f01cf2c 100644 --- a/src/chipset/via_pipc.c +++ b/src/chipset/via_pipc.c @@ -170,8 +170,8 @@ pipc_reset_hard(void *priv) dev->ide_regs[0x34] = 0xc0; dev->ide_regs[0x3c] = 0x0e; - if (dev->local < VIA_PIPC_686A) - dev->ide_regs[0x40] = 0x08; + if (dev->local <= VIA_PIPC_586B) + dev->ide_regs[0x40] = 0x04; dev->ide_regs[0x41] = 0x02; dev->ide_regs[0x42] = 0x09; dev->ide_regs[0x43] = (dev->local >= VIA_PIPC_686A) ? 0x0a : 0x3a; @@ -426,7 +426,7 @@ pipc_read(int func, int addr, void *priv) else if ((func <= (pm_func + 2)) && !(dev->pci_isa_regs[0x85] & ((func == (pm_func + 1)) ? 0x04 : 0x08))) /* AC97 / MC97 */ ret = dev->ac97_regs[func - pm_func - 1][addr]; - pipc_log("PIPC: read(%d, %02X) = %02X\n", func, addr, ret); + if (func == 1) pipc_log("PIPC: read(%d, %02X) = %02X\n", func, addr, ret); return ret; } @@ -461,7 +461,7 @@ pipc_write(int func, int addr, uint8_t val, void *priv) if (func > dev->max_func) return; - pipc_log("PIPC: write(%d, %02X, %02X)\n", func, addr, val); + if (func == 1) pipc_log("PIPC: write(%d, %02X, %02X)\n", func, addr, val); if (func == 0) { /* PCI-ISA bridge */ /* Read-only addresses */ @@ -656,10 +656,37 @@ pipc_write(int func, int addr, uint8_t val, void *priv) break; case 0x40: - dev->ide_regs[0x40] = val; + if (dev->local <= VIA_PIPC_586B) { + dev->ide_regs[0x40] = val & 0x03; + dev->ide_regs[0x40] |= 0x04; + } else + dev->ide_regs[0x40] = val & 0x0f; pipc_ide_handlers(dev); break; + case 0x50: case 0x52: + if (dev->local <= VIA_PIPC_586B) + dev->ide_regs[addr] = val & 0xe3; + else if (dev->local <= VIA_PIPC_596B) + dev->ide_regs[addr] = val & 0xeb; + else if (dev->local <= VIA_PIPC_686A) + dev->ide_regs[addr] = val & 0xef; + else + dev->ide_regs[addr] = val & 0xf7; + break; + case 0x51: case 0x53: + if (dev->local <= VIA_PIPC_596B) + dev->ide_regs[addr] = val & 0xe3; + else if (dev->local <= VIA_PIPC_686A) + dev->ide_regs[addr] = val & 0xe7; + else + dev->ide_regs[addr] = val & 0xf7; + break; + + case 0x61: case 0x69: + dev->ide_regs[addr] = val & 0x0f; + break; + default: dev->ide_regs[addr] = val; break;