diff --git a/src/i430fx.c b/src/i430fx.c index 4d328b2..a562447 100644 --- a/src/i430fx.c +++ b/src/i430fx.c @@ -119,23 +119,6 @@ uint8_t i430fx_read(int func, int addr, void *priv) return card_i430fx[addr]; } -static uint8_t trc = 0; - -void i430fx_trc_write(uint16_t port, uint8_t val, void *p) -{ - if ((val & 4) && !(trc & 4)) - { - if (val & 2) /*Hard reset*/ - { - i430fx_write(0, 0x59, 0xf, NULL); /*Should reset all PCI devices, but just set PAM0 to point to ROM for now*/ - keyboard_at_reset(); /*Reset keyboard controller to reset system flag*/ - } - resetx86(); - } - - trc = val; -} - void i430fx_init() { pci_add_specific(0, i430fx_read, i430fx_write, NULL); @@ -158,6 +141,9 @@ void i430fx_init() card_i430fx[0x72] = 0x02; // card_i430fx[0x74] = 0x0e; // card_i430fx[0x78] = 0x23; - - io_sethandler(0x0cf9, 0x0001, NULL, NULL, NULL, i430fx_trc_write, NULL, NULL, NULL); +} + +void i430fx_reset() +{ + i430fx_write(0, 0x59, 0xf, NULL); /*Should reset all PCI devices, but just set PAM0 to point to ROM for now*/ } diff --git a/src/i430fx.h b/src/i430fx.h index fff11d2..0265f27 100644 --- a/src/i430fx.h +++ b/src/i430fx.h @@ -1 +1,2 @@ void i430fx_init(); +void i430fx_reset(); diff --git a/src/i430hx.c b/src/i430hx.c index d7133f5..0871ca9 100644 --- a/src/i430hx.c +++ b/src/i430hx.c @@ -142,3 +142,8 @@ void i430hx_init() card_i430hx[0x65] = card_i430hx[0x66] = card_i430hx[0x67] = 0x02; card_i430hx[0x68] = 0x11; } + +void i430hx_reset() +{ + i430hx_write(0, 0x59, 0xf, NULL); /*Should reset all PCI devices, but just set PAM0 to point to ROM for now*/ +} diff --git a/src/i430hx.h b/src/i430hx.h index 5a5a7b4..30a6685 100644 --- a/src/i430hx.h +++ b/src/i430hx.h @@ -1 +1,2 @@ void i430hx_init(); +void i430hx_reset(); diff --git a/src/i430lx.c b/src/i430lx.c index 17ef4a9..d051e96 100644 --- a/src/i430lx.c +++ b/src/i430lx.c @@ -1,6 +1,7 @@ #include #include "ibm.h" +#include "ide.h" #include "io.h" #include "keyboard_at.h" #include "mem.h" @@ -134,10 +135,11 @@ void i430lx_trc_write(uint16_t port, uint8_t val, void *p) { i430lx_write(0, 0x59, 0xf, NULL); /*Should reset all PCI devices, but just set PAM0 to point to ROM for now*/ keyboard_at_reset(); /*Reset keyboard controller to reset system flag*/ + ide_reset_devices(); } resetx86(); } - + trc = val; } diff --git a/src/i430vx.c b/src/i430vx.c index 79b7517..5d97d23 100644 --- a/src/i430vx.c +++ b/src/i430vx.c @@ -142,3 +142,8 @@ void i430vx_init() card_i430vx[0x74] = 0x0e; card_i430vx[0x78] = 0x23; } + +void i430vx_reset() +{ + i430vx_write(0, 0x59, 0xf, NULL); /*Should reset all PCI devices, but just set PAM0 to point to ROM for now*/ +} diff --git a/src/i430vx.h b/src/i430vx.h index 22bde47..25cda4a 100644 --- a/src/i430vx.h +++ b/src/i430vx.h @@ -1 +1,2 @@ void i430vx_init(); +void i430vx_reset(); diff --git a/src/ide.c b/src/ide.c index 4e8d5ef..552aa16 100644 --- a/src/ide.c +++ b/src/ide.c @@ -824,6 +824,7 @@ void callbackide(int ide_board) if (ide->type == IDE_NONE) { ide->cylinder=0xFFFF; + ide->error = 0xff; atapi->stop(); } if (IDE_DRIVE_IS_CDROM(ide_other)) @@ -835,6 +836,7 @@ void callbackide(int ide_board) if (ide_other->type == IDE_NONE) { ide_other->cylinder=0xFFFF; + ide_other->error = 0xff; atapi->stop(); } // pclog("Reset callback\n"); @@ -1281,6 +1283,30 @@ void ide_set_bus_master(int (*read_data)(int channel, uint8_t *data, int size, v ide_bus_master_p = p; } +void ide_reset_devices() +{ + if (ide_drives[0].type != IDE_NONE || ide_drives[1].type != IDE_NONE) + { + timer_set_delay_u64(&ide_timer[0], 500*IDE_TIME); + ide_drives[0].reset = ide_drives[1].reset = 1; + ide_drives[0].atastat = ide_drives[1].atastat = BUSY_STAT; + if (ide_drives[0].type != IDE_NONE) + cur_ide[0] = 0; + else + cur_ide[0] = 1; + } + if (ide_drives[2].type != IDE_NONE || ide_drives[3].type != IDE_NONE) + { + timer_set_delay_u64(&ide_timer[1], 500*IDE_TIME); + ide_drives[2].reset = ide_drives[3].reset = 1; + ide_drives[2].atastat = ide_drives[3].atastat = BUSY_STAT; + if (ide_drives[2].type != IDE_NONE) + cur_ide[1] = 2; + else + cur_ide[1] = 3; + } +} + device_t ide_device = { "Standard IDE", diff --git a/src/ide.h b/src/ide.h index 0c2ce0b..2ce681a 100644 --- a/src/ide.h +++ b/src/ide.h @@ -18,6 +18,7 @@ extern void ide_pri_disable(); extern void ide_sec_disable(); extern void ide_set_bus_master(int (*read_data)(int channel, uint8_t *data, int size, void *p), int (*write_data)(int channel, uint8_t *data, int size, void *p), void (*set_irq)(int channel, void *p), void *p); void ide_irq_raise(struct IDE *ide); +void ide_reset_devices(); extern int (*ide_bus_master_read_data)(int channel, uint8_t *data, int size, void *p); extern int (*ide_bus_master_write_data)(int channel, uint8_t *data, int size, void *p); diff --git a/src/model.c b/src/model.c index a7551eb..33b65c1 100644 --- a/src/model.c +++ b/src/model.c @@ -675,7 +675,7 @@ void at_endeavor_init() pci_slot(0xf); pci_slot(0x10); i430fx_init(); - piix_init(7, 0xd, 0xe, 0xf, 0x10); + piix_init(7, 0xd, 0xe, 0xf, 0x10, i430fx_reset); pc87306_init(0x2e); intel_endeavor_init(); device_add(&intel_flash_bxt_ami_device); @@ -687,7 +687,7 @@ void at_pb570_init() pci_slot(0x11); pci_slot(0x13); i430fx_init(); - piix_init(7, 0x11, 0x13, 0xb, 0x8); + piix_init(7, 0x11, 0x13, 0xb, 0x8, i430fx_reset); pc87306_init(0x2e); intel_endeavor_init(); device_add(&intel_flash_bxt_ami_device); @@ -701,7 +701,7 @@ void at_zappa_init() pci_slot(0xf); pci_slot(0x10); i430fx_init(); - piix_init(7, 0xd, 0xf, 0xe, 0x10); + piix_init(7, 0xd, 0xf, 0xe, 0x10, i430fx_reset); pc87306_init(0x2e); intel_zappa_init(); device_add(&intel_flash_bxt_ami_device); @@ -716,7 +716,7 @@ void at_p55va_init() pci_slot(0x0A); pci_slot(0x0B); i430vx_init(); - piix_init(7, 0x08, 0x09, 0x0A, 0x0B); + piix_init(7, 0x08, 0x09, 0x0A, 0x0B, i430vx_reset); fdc37c932fr_init(); device_add(&intel_flash_bxt_device); } @@ -730,7 +730,7 @@ void at_p55tvp4_init() pci_slot(0x0A); pci_slot(0x09); i430vx_init(); - piix_init(7, 0x0C, 0x0B, 0x0A, 0x09); + piix_init(7, 0x0C, 0x0B, 0x0A, 0x09, i430vx_reset); w83877f_init(0x3f0, 0x87); device_add(&intel_flash_bxt_device); } @@ -744,7 +744,7 @@ void at_i430vx_init() pci_slot(0x13); pci_slot(0x14); i430vx_init(); - piix_init(7, 18, 17, 20, 19); + piix_init(7, 18, 17, 20, 19, i430vx_reset); um8669f_init(); device_add(&intel_flash_bxt_device); } @@ -758,7 +758,7 @@ void at_p55t2p4_init() pci_slot(0x0A); pci_slot(0x09); i430hx_init(); - piix_init(7, 0x0C, 0x0B, 0x0A, 0x09); + piix_init(7, 0x0C, 0x0B, 0x0A, 0x09, i430hx_reset); w83877f_init(0x3f0, 0x87); device_add(&intel_flash_bxt_device); } diff --git a/src/piix.c b/src/piix.c index 73676cf..5ce6ec5 100644 --- a/src/piix.c +++ b/src/piix.c @@ -8,6 +8,7 @@ #include "ibm.h" #include "ide.h" #include "ide_sff8038i.h" +#include "keyboard_at.h" #include "io.h" #include "mem.h" #include "pci.h" @@ -17,6 +18,8 @@ static uint8_t card_piix[256], card_piix_ide[256]; static sff_busmaster_t piix_busmaster[2]; +static uint8_t piix_rc = 0; +static void (*piix_nb_reset)(); void piix_write(int func, int addr, uint8_t val, void *priv) { @@ -140,7 +143,28 @@ uint8_t piix_read(int func, int addr, void *priv) } -void piix_init(int card, int pci_a, int pci_b, int pci_c, int pci_d) +uint8_t piix_rc_read(uint16_t port, void *p) +{ + return piix_rc; +} + +void piix_rc_write(uint16_t port, uint8_t val, void *p) +{ + if (val & 4) + { + if (val & 2) /*Hard reset*/ + { + piix_nb_reset(); + keyboard_at_reset(); /*Reset keyboard controller to reset system flag*/ + ide_reset_devices(); + } + resetx86(); + } + + piix_rc = val & ~4; +} + +void piix_init(int card, int pci_a, int pci_b, int pci_c, int pci_d, void (*nb_reset)()) { pci_add_specific(card, piix_read, piix_write, NULL); @@ -190,4 +214,7 @@ void piix_init(int card, int pci_a, int pci_b, int pci_c, int pci_d) ide_sec_disable(); pic_init_elcrx(); + + io_sethandler(0x0cf9, 0x0001, piix_rc_read, NULL, NULL, piix_rc_write, NULL, NULL, NULL); + piix_nb_reset = nb_reset; } diff --git a/src/piix.h b/src/piix.h index 88a2666..e8d7039 100644 --- a/src/piix.h +++ b/src/piix.h @@ -1 +1 @@ -void piix_init(int card, int pci_a, int pci_b, int pci_c, int pci_d); +void piix_init(int card, int pci_a, int pci_b, int pci_c, int pci_d, void (*nb_reset)());