From 215c507634d288a438e2335e4912568452067da7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 8 Jan 2024 02:35:03 +0100 Subject: [PATCH] Soft reset on IDE device 1 causes the assertion of PDIAG- which causes the error register of device 0 to also be set to 1, indicating diagnostics passed successfully (+ a PIIX3 fix), fixes #4002. --- src/chipset/intel_piix.c | 6 ++++++ src/disk/hdc_ide.c | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/chipset/intel_piix.c b/src/chipset/intel_piix.c index 70035f6df..49d720d8b 100644 --- a/src/chipset/intel_piix.c +++ b/src/chipset/intel_piix.c @@ -597,6 +597,12 @@ piix_write(int func, int addr, uint8_t val, void *priv) pci_set_mirq_routing(PCI_MIRQ0 + (addr & 0x01), PCI_IRQ_DISABLED); else pci_set_mirq_routing(PCI_MIRQ0 + (addr & 0x01), val & 0xf); + if (dev->type == 3) { + if (val & 0x20) + sff_set_irq_mode(dev->bm[1], IRQ_MODE_MIRQ_0); + else + sff_set_irq_mode(dev->bm[1], IRQ_MODE_LEGACY); + } piix_log("MIRQ%i is %s\n", addr & 0x01, (val & 0x20) ? "disabled" : "enabled"); } break; diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 522f1ee66..4041b9ff6 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -1397,6 +1397,7 @@ ide_write_devctl(UNUSED(uint16_t addr), uint8_t val, void *priv) } else ide->tf->atastat = DRDY_STAT | DSC_STAT; ide->tf->error = 1; + ide_other->tf->error = 1; /* Assert PDIAG-. */ dev->cur_dev &= ~1; ch = dev->cur_dev; @@ -1410,7 +1411,8 @@ ide_write_devctl(UNUSED(uint16_t addr), uint8_t val, void *priv) old = dev->devctl; dev->devctl = val; - if (!(val & 0x02) && (old & 0x02)) + // if (!(val & 0x02) && (old & 0x02)) + if ((old ^ val) & 0x02) ide_irq_update(ide_boards[ide->board], 1); } @@ -1566,6 +1568,7 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv) if ((ide->type == IDE_NONE) || ((ide->type & IDE_SHADOW) && (val != WIN_DRIVE_DIAGNOSTICS))) break; + pclog("IRQ lower\n"); ide_irq_lower(ide); ide->command = val; @@ -2459,6 +2462,7 @@ ide_callback(void *priv) else { ide->blocksize = ide->tf->secount; ide->tf->atastat = DRDY_STAT | DSC_STAT; + pclog("IRQ raise\n"); ide_irq_raise(ide); } break;