From 867ca0cd64323ca16f04e742e21762e240ecfdf7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 6 May 2020 00:25:06 +0200 Subject: [PATCH] Split PIIX rev. 02 (with faulty bus mastering) from the normal rev. 00, made the PB640 use it, and made rev. 00 initialize with IDE enabled which allows for DOS IDE DMA drivers on P54TP4XE and PowerMate V. --- src/include/86box/piix.h | 1 + src/intel_piix.c | 29 +++++++++++++++++++++++++++-- src/machine/m_at_socket4_5.c | 4 ---- src/machine/m_at_socket7_s7.c | 6 ++---- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/include/86box/piix.h b/src/include/86box/piix.h index 9f6724fae..025410b1a 100644 --- a/src/include/86box/piix.h +++ b/src/include/86box/piix.h @@ -18,6 +18,7 @@ */ extern const device_t piix_device; +extern const device_t piix_rev02_device; extern const device_t piix3_device; extern const device_t piix4_device; extern const device_t piix4e_device; diff --git a/src/intel_piix.c b/src/intel_piix.c index 4a9a80f1e..a33eeeecc 100644 --- a/src/intel_piix.c +++ b/src/intel_piix.c @@ -993,12 +993,14 @@ piix_reset_hard(piix_t *dev) fregs[0x08] = dev->rev; fregs[0x09] = 0x00; fregs[0x0a] = 0x01; fregs[0x0b] = 0x06; - fregs[0x0e] = (dev->type > 1) ? 0x80 : 0x00; + fregs[0x0e] = ((dev->type > 1) || (dev->rev != 2)) ? 0x80 : 0x00; fregs[0x4c] = 0x4d; fregs[0x4e] = 0x03; fregs[0x60] = fregs[0x61] = fregs[0x62] = fregs[0x63] = 0x80; fregs[0x64] = (dev->type > 3) ? 0x10 : 0x00; fregs[0x69] = 0x02; + if ((dev->type == 1) && (dev->rev != 2)) + fregs[0x6a] = 0x04; fregs[0x70] = (dev->type < 4) ? 0x80 : 0x00; fregs[0x71] = (dev->type < 3) ? 0x80 : 0x00; if (dev->type <= 4) { @@ -1041,7 +1043,10 @@ piix_reset_hard(piix_t *dev) fregs[0x3c] = 0x0e; fregs[0x3d] = 0x01; } - dev->max_func = 0; /* It starts with IDE disabled, then enables it. */ + if ((dev->type == 1) && (dev->rev == 2)) + dev->max_func = 0; /* It starts with IDE disabled, then enables it. */ + else + dev->max_func = 1; /* Function 2: USB */ if (dev->type > 1) { @@ -1180,6 +1185,12 @@ static void dev->bm[0] = device_add_inst(&sff8038i_device, 1); dev->bm[1] = device_add_inst(&sff8038i_device, 2); + if ((dev->type == 1) && (dev->rev == 2)) { + /* PIIX rev. 02 has faulty bus mastering on real hardware, + so set our devices IDE devices to force ATA-3 (no DMA). */ + ide_board_set_force_ata3(0, 1); + ide_board_set_force_ata3(1, 1); + } if (dev->type >= 3) dev->usb = device_add(&usb_device); @@ -1300,6 +1311,20 @@ const device_t piix_device = NULL }; +const device_t piix_rev02_device = +{ + "Intel 82371FB (PIIX) (Faulty BusMastering!!)", + DEVICE_PCI, + 0x122e0121, + piix_init, + piix_close, + piix_reset, + NULL, + NULL, + NULL, + NULL +}; + const device_t piix3_device = { "Intel 82371SB (PIIX3)", diff --git a/src/machine/m_at_socket4_5.c b/src/machine/m_at_socket4_5.c index 81dcb13ac..a73cba1d9 100644 --- a/src/machine/m_at_socket4_5.c +++ b/src/machine/m_at_socket4_5.c @@ -244,8 +244,6 @@ machine_at_p54tp4xe_init(const machine_t *model) device_add(&keyboard_ps2_pci_device); device_add(&i430fx_device); device_add(&piix_device); - ide_board_set_force_ata3(0, 1); - ide_board_set_force_ata3(1, 1); device_add(&fdc37c665_device); device_add(&intel_flash_bxt_device); @@ -438,8 +436,6 @@ machine_at_powermate_v_init(const machine_t *model) device_add(&keyboard_ps2_ami_pci_device); device_add(&i430fx_device); device_add(&piix_device); - ide_board_set_force_ata3(0, 1); - ide_board_set_force_ata3(1, 1); device_add(&fdc37c665_device); device_add(&intel_flash_bxt_device); diff --git a/src/machine/m_at_socket7_s7.c b/src/machine/m_at_socket7_s7.c index 24a6d533c..d18132a49 100644 --- a/src/machine/m_at_socket7_s7.c +++ b/src/machine/m_at_socket7_s7.c @@ -124,14 +124,12 @@ machine_at_pb640_init(const machine_t *model) pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 2, 1, 4); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430fx_pb640_device); - device_add(&piix_device); - ide_board_set_force_ata3(0, 1); - ide_board_set_force_ata3(1, 1); + device_add(&piix_rev02_device); if (gfxcard == VID_INTERNAL) device_add(&gd5440_onboard_pci_device); - device_add(&keyboard_ps2_ami_pci_device); + device_add(&keyboard_ps2_intel_ami_pci_device); device_add(&pc87306_device); device_add(&intel_flash_bxt_ami_device);