Fixed the ATi Mach64 and S3 Virge graphics cards;
HDD controller initializer now ignores non-IDE controllers if the specified model has IDE; The RTL8029AS NIC and BusLogic BT-958D SCSI controller are now APIC-aware.
This commit is contained in:
@@ -3352,8 +3352,6 @@ static void *mach64gx_init()
|
|||||||
else
|
else
|
||||||
mach64->config_stat0 |= 1; /*VLB, 256Kx16 DRAM*/
|
mach64->config_stat0 |= 1; /*VLB, 256Kx16 DRAM*/
|
||||||
|
|
||||||
mach64->use_block_decoded_io = PCI ? 4 : 0;
|
|
||||||
|
|
||||||
ati_eeprom_load(&mach64->eeprom, L"mach64.nvr", 1);
|
ati_eeprom_load(&mach64->eeprom, L"mach64.nvr", 1);
|
||||||
|
|
||||||
rom_init(&mach64->bios_rom, L"roms/mach64gx/bios.bin", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
rom_init(&mach64->bios_rom, L"roms/mach64gx/bios.bin", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||||
@@ -3371,6 +3369,8 @@ static void *mach64vt2_init()
|
|||||||
mach64->dac_cntl = 1 << 16; /*Internal 24-bit DAC*/
|
mach64->dac_cntl = 1 << 16; /*Internal 24-bit DAC*/
|
||||||
mach64->config_stat0 = 4;
|
mach64->config_stat0 = 4;
|
||||||
|
|
||||||
|
mach64->use_block_decoded_io = PCI ? 4 : 0;
|
||||||
|
|
||||||
ati_eeprom_load(&mach64->eeprom, L"mach64vt.nvr", 1);
|
ati_eeprom_load(&mach64->eeprom, L"mach64vt.nvr", 1);
|
||||||
|
|
||||||
rom_init(&mach64->bios_rom, L"roms/atimach64vt2pci.bin", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
rom_init(&mach64->bios_rom, L"roms/atimach64vt2pci.bin", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||||
|
|||||||
@@ -3728,9 +3728,9 @@ static void s3_virge_pci_write(int func, int addr, uint8_t val, void *p)
|
|||||||
mem_mapping_disable(&virge->bios_rom.mapping);
|
mem_mapping_disable(&virge->bios_rom.mapping);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
/* case 0x3c:
|
case 0x3c:
|
||||||
virge->pci_regs[0x3c] = val;
|
virge->pci_regs[0x3c] = val;
|
||||||
return; */
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -988,7 +988,7 @@ static void recalc_hdd_list(HWND hdlg, int model, int use_selected_hdd)
|
|||||||
|
|
||||||
h = GetDlgItem(hdlg, IDC_COMBO_HDC);
|
h = GetDlgItem(hdlg, IDC_COMBO_HDC);
|
||||||
|
|
||||||
if (models[model].flags & MODEL_HAS_IDE)
|
if (models[temp_model].flags & MODEL_HAS_IDE)
|
||||||
{
|
{
|
||||||
hdc_ignore = 1;
|
hdc_ignore = 1;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#include "ibm.h"
|
#include "ibm.h"
|
||||||
|
#include "CPU/cpu.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "hdd.h"
|
#include "hdd.h"
|
||||||
|
#include "model.h"
|
||||||
|
|
||||||
#include "hdd_esdi.h"
|
#include "hdd_esdi.h"
|
||||||
#include "mfm_at.h"
|
#include "mfm_at.h"
|
||||||
@@ -64,6 +66,11 @@ void hdd_controller_init(char *internal_name)
|
|||||||
{
|
{
|
||||||
int c = 0;
|
int c = 0;
|
||||||
|
|
||||||
|
if (models[model].flags & MODEL_HAS_IDE)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
while (hdd_controllers[c].device)
|
while (hdd_controllers[c].device)
|
||||||
{
|
{
|
||||||
if (!strcmp(internal_name, hdd_controllers[c].internal_name))
|
if (!strcmp(internal_name, hdd_controllers[c].internal_name))
|
||||||
|
|||||||
@@ -229,6 +229,8 @@ typedef struct {
|
|||||||
uint8_t maclocal[6]; /* configured MAC (local) address */
|
uint8_t maclocal[6]; /* configured MAC (local) address */
|
||||||
uint8_t eeprom[128]; /* for RTL8029AS */
|
uint8_t eeprom[128]; /* for RTL8029AS */
|
||||||
rom_t bios_rom;
|
rom_t bios_rom;
|
||||||
|
|
||||||
|
int card;
|
||||||
} nic_t;
|
} nic_t;
|
||||||
|
|
||||||
|
|
||||||
@@ -252,6 +254,36 @@ nelog(int lvl, const char *fmt, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
nic_interrupt(void *priv, int set)
|
||||||
|
{
|
||||||
|
nic_t *dev = (nic_t *) priv;
|
||||||
|
|
||||||
|
if (!PCI || strcmp(dev->name, "RTL8029AS"))
|
||||||
|
{
|
||||||
|
if (set)
|
||||||
|
{
|
||||||
|
picint(1 << dev->base_irq);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
picintc(1 << dev->base_irq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (set)
|
||||||
|
{
|
||||||
|
pci_set_irq(dev->card, PCI_INTA);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pci_clear_irq(dev->card, PCI_INTA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* reset - restore state to power-up, cancelling all i/o */
|
/* reset - restore state to power-up, cancelling all i/o */
|
||||||
static void
|
static void
|
||||||
nic_reset(void *priv)
|
nic_reset(void *priv)
|
||||||
@@ -317,8 +349,7 @@ nic_reset(void *priv)
|
|||||||
dev->ISR.reset = 1;
|
dev->ISR.reset = 1;
|
||||||
dev->DCR.longaddr = 1;
|
dev->DCR.longaddr = 1;
|
||||||
|
|
||||||
picint(1<<dev->base_irq);
|
nic_interrupt(dev, 0);
|
||||||
picintc(1<<dev->base_irq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -474,7 +505,7 @@ asic_read(nic_t *dev, uint32_t off, unsigned int len)
|
|||||||
if (dev->remote_bytes == 0) {
|
if (dev->remote_bytes == 0) {
|
||||||
dev->ISR.rdma_done = 1;
|
dev->ISR.rdma_done = 1;
|
||||||
if (dev->IMR.rdma_inte) {
|
if (dev->IMR.rdma_inte) {
|
||||||
picint(1 << dev->base_irq);
|
nic_interrupt(dev, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -534,7 +565,7 @@ asic_write(nic_t *dev, uint32_t off, uint32_t val, unsigned len)
|
|||||||
if (dev->remote_bytes == 0) {
|
if (dev->remote_bytes == 0) {
|
||||||
dev->ISR.rdma_done = 1;
|
dev->ISR.rdma_done = 1;
|
||||||
if (dev->IMR.rdma_inte) {
|
if (dev->IMR.rdma_inte) {
|
||||||
picint(1 << dev->base_irq);
|
nic_interrupt(dev, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -742,7 +773,7 @@ page0_write(nic_t *dev, uint32_t off, uint32_t val, unsigned len)
|
|||||||
(dev->IMR.tx_inte << 1) |
|
(dev->IMR.tx_inte << 1) |
|
||||||
(dev->IMR.rx_inte));
|
(dev->IMR.rx_inte));
|
||||||
if (val == 0x00) {
|
if (val == 0x00) {
|
||||||
picintc(1 << dev->base_irq);
|
nic_interrupt(dev, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -862,9 +893,9 @@ page0_write(nic_t *dev, uint32_t off, uint32_t val, unsigned len)
|
|||||||
(dev->ISR.pkt_tx << 1) |
|
(dev->ISR.pkt_tx << 1) |
|
||||||
(dev->ISR.pkt_rx));
|
(dev->ISR.pkt_rx));
|
||||||
if (((val & val2) & 0x7f) == 0) {
|
if (((val & val2) & 0x7f) == 0) {
|
||||||
picintc(1 << dev->base_irq);
|
nic_interrupt(dev, 0);
|
||||||
} else {
|
} else {
|
||||||
picint(1 << dev->base_irq);
|
nic_interrupt(dev, 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1227,9 +1258,9 @@ write_cr(nic_t *dev, uint32_t val)
|
|||||||
if (dev->CR.rdma_cmd == 0x01 && dev->CR.start && dev->remote_bytes == 0) {
|
if (dev->CR.rdma_cmd == 0x01 && dev->CR.start && dev->remote_bytes == 0) {
|
||||||
dev->ISR.rdma_done = 1;
|
dev->ISR.rdma_done = 1;
|
||||||
if (dev->IMR.rdma_inte) {
|
if (dev->IMR.rdma_inte) {
|
||||||
picint(1 << dev->base_irq);
|
nic_interrupt(dev, 1);
|
||||||
if (! dev->is_pci)
|
if (! dev->is_pci)
|
||||||
picintc(1 << dev->base_irq);
|
nic_interrupt(dev, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1625,18 +1656,8 @@ nic_pci_write(int func, int addr, uint8_t val, void *priv)
|
|||||||
|
|
||||||
case 0x3C: /* PCI_ILR */
|
case 0x3C: /* PCI_ILR */
|
||||||
if (val != 0xFF) {
|
if (val != 0xFF) {
|
||||||
#if 1
|
|
||||||
/*
|
|
||||||
* Commented out until an APIC controller is
|
|
||||||
* emulated for the PIIX3, otherwise the
|
|
||||||
* RTL-8029/AS will not get an IRQ on boards
|
|
||||||
* using the PIIX3.
|
|
||||||
*/
|
|
||||||
nelog(1, "%s: IRQ now: %i (IGNORED)\n", dev->name, val);
|
|
||||||
#else
|
|
||||||
nelog(1, "%s: IRQ now: %i\n", dev->name, val);
|
nelog(1, "%s: IRQ now: %i\n", dev->name, val);
|
||||||
dev->base_irq = val;
|
dev->base_irq = val;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
dev->pci_regs[addr] = dev->base_irq;
|
dev->pci_regs[addr] = dev->base_irq;
|
||||||
return;
|
return;
|
||||||
@@ -1685,7 +1706,7 @@ nic_tx(nic_t *dev, uint32_t val)
|
|||||||
|
|
||||||
/* Generate an interrupt if not masked */
|
/* Generate an interrupt if not masked */
|
||||||
if (dev->IMR.tx_inte)
|
if (dev->IMR.tx_inte)
|
||||||
picint(1 << dev->base_irq);
|
nic_interrupt(dev, 1);
|
||||||
dev->tx_timer_active = 0;
|
dev->tx_timer_active = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1821,7 +1842,7 @@ nic_rx(void *priv, uint8_t *buf, int io_len)
|
|||||||
dev->ISR.pkt_rx = 1;
|
dev->ISR.pkt_rx = 1;
|
||||||
|
|
||||||
if (dev->IMR.rx_inte)
|
if (dev->IMR.rx_inte)
|
||||||
picint(1 << dev->base_irq);
|
nic_interrupt(dev, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1972,7 +1993,7 @@ nic_init(int board)
|
|||||||
dev->eeprom[0x7D] = (PCI_VENDID>>8);
|
dev->eeprom[0x7D] = (PCI_VENDID>>8);
|
||||||
|
|
||||||
/* Make this device known to the PCI bus. */
|
/* Make this device known to the PCI bus. */
|
||||||
pci_add(nic_pci_read, nic_pci_write, dev);
|
dev->card = pci_add(nic_pci_read, nic_pci_write, dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up our BIA. */
|
/* Set up our BIA. */
|
||||||
|
|||||||
@@ -493,6 +493,7 @@ typedef struct {
|
|||||||
int Lock;
|
int Lock;
|
||||||
mem_mapping_t mmio_mapping;
|
mem_mapping_t mmio_mapping;
|
||||||
int chip;
|
int chip;
|
||||||
|
int Card;
|
||||||
} Buslogic_t;
|
} Buslogic_t;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
@@ -534,18 +535,46 @@ BuslogicLog(const char *format, ...)
|
|||||||
#define pclog BuslogicLog
|
#define pclog BuslogicLog
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
BuslogicInterrupt(Buslogic_t *bl, int set)
|
||||||
|
{
|
||||||
|
if (bl->chip != CHIP_BUSLOGIC_PCI)
|
||||||
|
{
|
||||||
|
if (set)
|
||||||
|
{
|
||||||
|
picint(1 << bl->Irq);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
picintc(1 << bl->Irq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (set)
|
||||||
|
{
|
||||||
|
pci_set_irq(bl->Card, PCI_INTA);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pci_clear_irq(bl->Card, PCI_INTA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
BuslogicClearInterrupt(Buslogic_t *bl)
|
BuslogicClearInterrupt(Buslogic_t *bl)
|
||||||
{
|
{
|
||||||
pclog("Buslogic: Lowering Interrupt 0x%02X\n", bl->Interrupt);
|
pclog("Buslogic: Lowering Interrupt 0x%02X\n", bl->Interrupt);
|
||||||
bl->Interrupt = 0;
|
bl->Interrupt = 0;
|
||||||
pclog("Lowering IRQ %i\n", bl->Irq);
|
pclog("Lowering IRQ %i\n", bl->Irq);
|
||||||
picintc(1 << bl->Irq);
|
BuslogicInterrupt(bl, 0);
|
||||||
if (bl->PendingInterrupt) {
|
if (bl->PendingInterrupt) {
|
||||||
bl->Interrupt = bl->PendingInterrupt;
|
bl->Interrupt = bl->PendingInterrupt;
|
||||||
pclog("Buslogic: Raising Interrupt 0x%02X (Pending)\n", bl->Interrupt);
|
pclog("Buslogic: Raising Interrupt 0x%02X (Pending)\n", bl->Interrupt);
|
||||||
if (bl->MailboxOutInterrupts || !(bl->Interrupt & INTR_MBOA)) {
|
if (bl->MailboxOutInterrupts || !(bl->Interrupt & INTR_MBOA)) {
|
||||||
if (bl->IrqEnabled) picint(1 << bl->Irq);
|
if (bl->IrqEnabled) BuslogicInterrupt(bl, 1);
|
||||||
}
|
}
|
||||||
bl->PendingInterrupt = 0;
|
bl->PendingInterrupt = 0;
|
||||||
}
|
}
|
||||||
@@ -635,7 +664,7 @@ BuslogicCommandComplete(Buslogic_t *bl)
|
|||||||
bl->Interrupt = (INTR_ANY | INTR_HACC);
|
bl->Interrupt = (INTR_ANY | INTR_HACC);
|
||||||
pclog("Raising IRQ %i\n", bl->Irq);
|
pclog("Raising IRQ %i\n", bl->Irq);
|
||||||
if (bl->IrqEnabled)
|
if (bl->IrqEnabled)
|
||||||
picint(1 << bl->Irq);
|
BuslogicInterrupt(bl, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
bl->Command = 0xFF;
|
bl->Command = 0xFF;
|
||||||
@@ -653,7 +682,7 @@ BuslogicRaiseInterrupt(Buslogic_t *bl, uint8_t Interrupt)
|
|||||||
bl->Interrupt = Interrupt;
|
bl->Interrupt = Interrupt;
|
||||||
pclog("Raising IRQ %i\n", bl->Irq);
|
pclog("Raising IRQ %i\n", bl->Irq);
|
||||||
if (bl->IrqEnabled)
|
if (bl->IrqEnabled)
|
||||||
picint(1 << bl->Irq);
|
BuslogicInterrupt(bl, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1339,7 +1368,7 @@ BuslogicWrite(uint16_t Port, uint8_t Val, void *p)
|
|||||||
else
|
else
|
||||||
bl->IrqEnabled = 1;
|
bl->IrqEnabled = 1;
|
||||||
pclog("Lowering IRQ %i\n", bl->Irq);
|
pclog("Lowering IRQ %i\n", bl->Irq);
|
||||||
picintc(1 << bl->Irq);
|
BuslogicInterrupt(bl, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x81:
|
case 0x81:
|
||||||
@@ -2186,18 +2215,13 @@ BuslogicPCIWrite(int func, int addr, uint8_t val, void *p)
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* Commented out until an APIC controller is emulated for the PIIX3,
|
|
||||||
* otherwise the BT-958 will not get an IRQ on boards using the PIIX3.
|
|
||||||
*/
|
|
||||||
case 0x3C:
|
case 0x3C:
|
||||||
buslogic_pci_regs[addr] = val;
|
buslogic_pci_regs[addr] = val;
|
||||||
if (val != 0xFF) {
|
if (val != 0xFF) {
|
||||||
buslogic_log("BusLogic IRQ now: %i\n", val);
|
BuslogicLog("BusLogic IRQ now: %i\n", val);
|
||||||
bl->Irq = val;
|
bl->Irq = val;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user