Implemented DDMA for the VIA southbridges that support it, closes #1613.
This commit is contained in:
@@ -37,6 +37,7 @@
|
|||||||
#include <86box/timer.h>
|
#include <86box/timer.h>
|
||||||
#include <86box/nvr.h>
|
#include <86box/nvr.h>
|
||||||
#include <86box/acpi.h>
|
#include <86box/acpi.h>
|
||||||
|
#include <86box/ddma.h>
|
||||||
#include <86box/pci.h>
|
#include <86box/pci.h>
|
||||||
#include <86box/pic.h>
|
#include <86box/pic.h>
|
||||||
#include <86box/port_92.h>
|
#include <86box/port_92.h>
|
||||||
@@ -79,6 +80,7 @@ typedef struct
|
|||||||
sff8038i_t *bm[2];
|
sff8038i_t *bm[2];
|
||||||
nvr_t *nvr;
|
nvr_t *nvr;
|
||||||
int nvr_enabled, slot;
|
int nvr_enabled, slot;
|
||||||
|
ddma_t *ddma;
|
||||||
smbus_piix4_t *smbus;
|
smbus_piix4_t *smbus;
|
||||||
usb_t *usb[2];
|
usb_t *usb[2];
|
||||||
acpi_t *acpi;
|
acpi_t *acpi;
|
||||||
@@ -708,6 +710,19 @@ usb_update_io_mapping(pipc_t *dev, int func)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
pipc_ddma_update(pipc_t *dev, int addr)
|
||||||
|
{
|
||||||
|
uint32_t base;
|
||||||
|
|
||||||
|
if (dev->local >= VIA_PIPC_8231)
|
||||||
|
return;
|
||||||
|
|
||||||
|
base = (dev->pci_isa_regs[addr] & 0xf0) | (((uint32_t) dev->pci_isa_regs[addr | 0x01]) << 8);
|
||||||
|
ddma_update_io_mapping(dev->ddma, (addr & 0x0e) >> 1, (dev->pci_isa_regs[addr] & 0xf0), dev->pci_isa_regs[addr | 0x01], (dev->pci_isa_regs[addr] & 0x08) && (base != 0x0000));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pipc_write(int func, int addr, uint8_t val, void *priv)
|
pipc_write(int func, int addr, uint8_t val, void *priv)
|
||||||
{
|
{
|
||||||
@@ -854,19 +869,13 @@ pipc_write(int func, int addr, uint8_t val, void *priv)
|
|||||||
|
|
||||||
case 0x60: case 0x62: case 0x64: case 0x66:
|
case 0x60: case 0x62: case 0x64: case 0x66:
|
||||||
case 0x6a: case 0x6c: case 0x6e:
|
case 0x6a: case 0x6c: case 0x6e:
|
||||||
c = (addr & 0x0e) >> 1;
|
dev->pci_isa_regs[addr] = val & 0xf8;
|
||||||
dma[c].ab = (dma[c].ab & 0xffffff0f) | (val & 0xf0);
|
pipc_ddma_update(dev, addr);
|
||||||
dma[c].ac = (dma[c].ac & 0xffffff0f) | (val & 0xf0);
|
|
||||||
if (val & 0x08)
|
|
||||||
dma_e |= (1 << c);
|
|
||||||
else
|
|
||||||
dma_e &= ~(1 << c);
|
|
||||||
break;
|
break;
|
||||||
case 0x61: case 0x63: case 0x65: case 0x67:
|
case 0x61: case 0x63: case 0x65: case 0x67:
|
||||||
case 0x6b: case 0x6d: case 0x6f:
|
case 0x6b: case 0x6d: case 0x6f:
|
||||||
c = (addr & 0x0e) >> 1;
|
dev->pci_isa_regs[addr] = val;
|
||||||
dma[c].ab = (dma[c].ab & 0xffff00ff) | (val << 8);
|
pipc_ddma_update(dev, addr & 0xfe);
|
||||||
dma[c].ac = (dma[c].ac & 0xffff00ff) | (val << 8);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x70: case 0x71: case 0x72: case 0x73:
|
case 0x70: case 0x71: case 0x72: case 0x73:
|
||||||
@@ -1353,6 +1362,9 @@ pipc_init(const device_t *info)
|
|||||||
pci_enable_mirq(2);
|
pci_enable_mirq(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dev->local < VIA_PIPC_8231)
|
||||||
|
dev->ddma = device_add(&ddma_device);
|
||||||
|
|
||||||
if (dev->acpi) {
|
if (dev->acpi) {
|
||||||
acpi_set_slot(dev->acpi, dev->slot);
|
acpi_set_slot(dev->acpi, dev->slot);
|
||||||
acpi_set_nvr(dev->acpi, dev->nvr);
|
acpi_set_nvr(dev->acpi, dev->nvr);
|
||||||
|
|||||||
Reference in New Issue
Block a user