CUBX: Implement CMD-648 disabling via ACPI GPIO, fixes #6169.

This commit is contained in:
OBattler
2025-09-14 23:30:40 +02:00
parent 82ad957380
commit da398832c4
4 changed files with 24 additions and 11 deletions

View File

@@ -32,6 +32,8 @@
int hdc_current[HDC_MAX] = { 0, 0 };
int hdc_onboard_enabled = 1;
#ifdef ENABLE_HDC_LOG
int hdc_do_log = ENABLE_HDC_LOG;
@@ -114,6 +116,8 @@ hdc_init(void)
void
hdc_reset(void)
{
hdc_onboard_enabled = 1;
for (int i = 0; i < HDC_MAX; i++) {
hdc_log("HDC %i: reset(current=%d, internal=%d)\n", i,
hdc_current[i], hdc_current[i] == HDC_INTERNAL);

View File

@@ -145,6 +145,7 @@ cmd646_ide_handlers(cmd646_t *dev)
int first = 0;
int reg09 = dev->regs[0x09];
int reg50 = dev->regs[0x50];
int dev_enabled = (hdc_onboard_enabled || !(dev->local & CMD64X_ONBOARD));
if ((dev->local & CMD_TYPE_648) && (dev->local & CMD648_RAID)) {
reg09 = 0xff;
@@ -180,7 +181,7 @@ cmd646_ide_handlers(cmd646_t *dev)
if (dev->local & CMD_TYPE_648)
pri_enabled = pri_enabled && (dev->regs[0x51] & 0x04);
if (pri_enabled)
if (dev_enabled && pri_enabled)
ide_handlers(first, 1);
if (dev->single_channel)
@@ -205,7 +206,7 @@ cmd646_ide_handlers(cmd646_t *dev)
sff_set_irq_mode(dev->bm[1], irq_mode[1]);
cmd646_log("IDE %i: %04X, %04X, %i\n", first + 1, main, side, irq_mode[1]);
if ((dev->regs[0x04] & 0x01) && (dev->regs[0x51] & 0x08))
if (dev_enabled && (dev->regs[0x04] & 0x01) && (dev->regs[0x51] & 0x08))
ide_handlers(first + 1, 1);
}
@@ -213,9 +214,10 @@ static void
cmd646_ide_bm_handlers(cmd646_t *dev)
{
uint16_t base = (dev->regs[0x20] & 0xf0) | (dev->regs[0x21] << 8);
int dev_enabled = (hdc_onboard_enabled || !(dev->local & CMD64X_ONBOARD));
sff_bus_master_handler(dev->bm[0], (dev->regs[0x04] & 1), base);
sff_bus_master_handler(dev->bm[1], (dev->regs[0x04] & 1), base + 8);
sff_bus_master_handler(dev->bm[0], dev_enabled && (dev->regs[0x04] & 1), base);
sff_bus_master_handler(dev->bm[1], dev_enabled && (dev->regs[0x04] & 1), base + 8);
}
uint8_t
@@ -296,15 +298,16 @@ cmd646_bios_handler(cmd646_t *dev)
static void
cmd646_pci_write(int func, int addr, uint8_t val, void *priv)
{
cmd646_t *dev = (cmd646_t *) priv;
int reg50 = dev->regs[0x50];
cmd646_t *dev = (cmd646_t *) priv;
int reg50 = dev->regs[0x50];
int dev_enabled = (hdc_onboard_enabled || !(dev->local & CMD64X_ONBOARD));
if ((dev->local & CMD_TYPE_648) && (dev->regs[0x0a] == 0x04) && (dev->regs[0x0b] == 0x01))
reg50 |= 0x40;
cmd646_log("[%04X:%08X] (%08X) cmd646_pci_write(%i, %02X, %02X)\n", CS, cpu_state.pc, ESI, func, addr, val);
if (func == 0x00)
if (dev_enabled && (func == 0x00))
switch (addr) {
case 0x04:
if (dev->has_bios)
@@ -480,10 +483,11 @@ cmd646_pci_write(int func, int addr, uint8_t val, void *priv)
static uint8_t
cmd646_pci_read(int func, int addr, void *priv)
{
cmd646_t *dev = (cmd646_t *) priv;
uint8_t ret = 0xff;
cmd646_t *dev = (cmd646_t *) priv;
uint8_t ret = 0xff;
int dev_enabled = (hdc_onboard_enabled || !(dev->local & CMD64X_ONBOARD));
if (func == 0x00) {
if (dev_enabled && (func == 0x00)) {
ret = dev->regs[addr];
if ((addr == 0x09) && (dev->local & CMD_TYPE_648) && (dev->regs[0x0a] == 0x04))