From 9f5ff6169fb7fd56e754f63848a0552520046ffc Mon Sep 17 00:00:00 2001 From: Panagiotis <58827426+tiseno100@users.noreply.github.com> Date: Fri, 15 Jan 2021 17:30:56 +0200 Subject: [PATCH] Implemented the Chipset unlock mechanism properly for the ALi's ALi M1217 & M1429 can be unlocked and locked back properly now. --- src/chipset/ali1217.c | 26 ++++++++++++++++++-------- src/chipset/ali1429.c | 11 +++++------ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/chipset/ali1217.c b/src/chipset/ali1217.c index 97410a224..b1d757bdd 100644 --- a/src/chipset/ali1217.c +++ b/src/chipset/ali1217.c @@ -53,6 +53,7 @@ ali1217_log(const char *fmt, ...) typedef struct { uint8_t index, regs[256]; + int cfg_locked; } ali1217_t; static void ali1217_shadow_recalc(ali1217_t *dev) @@ -65,7 +66,7 @@ static void ali1217_shadow_recalc(ali1217_t *dev) shadowbios = !!(dev->regs[0x15] & 5); shadowbios_write = !!(dev->regs[0x15] & 0x0a); - + flushmmucache(); } @@ -80,15 +81,22 @@ ali1217_write(uint16_t addr, uint8_t val, void *priv) dev->index = val; break; case 0x23: - ali1217_log("ALi M1217: dev->regs[%02x] = %02x\n", dev->index, val); - dev->regs[dev->index] = val; + if (dev->index != 0x13) + ali1217_log("ALi M1217: dev->regs[%02x] = %02x\n", dev->index, val); - switch (dev->index) + if(dev->index == 0x13) + dev->cfg_locked = !(val == 0xc5); + + if (!dev->cfg_locked) { - case 0x14: - case 0x15: - ali1217_shadow_recalc(dev); - break; + dev->regs[dev->index] = val; + switch (dev->index) + { + case 0x14: + case 0x15: + ali1217_shadow_recalc(dev); + break; + } } break; } @@ -118,6 +126,8 @@ ali1217_init(const device_t *info) device_add(&port_92_device); + dev->cfg_locked = 1; + /* ALi M1217 Ports diff --git a/src/chipset/ali1429.c b/src/chipset/ali1429.c index e9c83b0f7..0326a1471 100644 --- a/src/chipset/ali1429.c +++ b/src/chipset/ali1429.c @@ -101,17 +101,16 @@ ali1429_write(uint16_t addr, uint8_t val, void *priv) /* Don't log register unlock patterns */ if(dev->index != 0x03) - { ali1429_log("M1429: dev->regs[%02x] = %02x\n", dev->index, val); - } - - dev->regs[dev->index] = val; /* Unlock/Lock Registers */ - dev->cfg_locked = !(dev->regs[0x03] && 0xc5); + if(dev->index == 0x03) + dev->cfg_locked = !(val == 0xc5); - if(dev->cfg_locked == 0) + if(!dev->cfg_locked) { + dev->regs[dev->index] = val; + switch(dev->index){ /* Shadow RAM */ case 0x13: