ALi M5123-related changes in chipset/ali1543.c.
This commit is contained in:
@@ -30,18 +30,15 @@
|
|||||||
#include <86box/apm.h>
|
#include <86box/apm.h>
|
||||||
#include <86box/dma.h>
|
#include <86box/dma.h>
|
||||||
#include <86box/ddma.h>
|
#include <86box/ddma.h>
|
||||||
#include <86box/fdd.h>
|
|
||||||
#include <86box/fdc.h>
|
|
||||||
#include <86box/hdc_ide.h>
|
#include <86box/hdc_ide.h>
|
||||||
#include <86box/hdc_ide_sff8038i.h>
|
#include <86box/hdc_ide_sff8038i.h>
|
||||||
#include <86box/keyboard.h>
|
#include <86box/keyboard.h>
|
||||||
#include <86box/lpt.h>
|
|
||||||
#include <86box/mem.h>
|
#include <86box/mem.h>
|
||||||
#include <86box/nvr.h>
|
#include <86box/nvr.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>
|
||||||
#include <86box/serial.h>
|
#include <86box/sio.h>
|
||||||
#include <86box/smbus.h>
|
#include <86box/smbus.h>
|
||||||
#include <86box/usb.h>
|
#include <86box/usb.h>
|
||||||
|
|
||||||
@@ -53,7 +50,6 @@
|
|||||||
typedef struct ali1543_t
|
typedef struct ali1543_t
|
||||||
{
|
{
|
||||||
uint8_t pci_conf[256], pmu_conf[256], usb_conf[256], ide_conf[256],
|
uint8_t pci_conf[256], pmu_conf[256], usb_conf[256], ide_conf[256],
|
||||||
sio_regs[256], device_regs[8][256], sio_index, in_configuration_mode,
|
|
||||||
pci_slot, ide_slot, usb_slot, pmu_slot, usb_dev_enable, ide_dev_enable,
|
pci_slot, ide_slot, usb_slot, pmu_slot, usb_dev_enable, ide_dev_enable,
|
||||||
pmu_dev_enable, type;
|
pmu_dev_enable, type;
|
||||||
int offset;
|
int offset;
|
||||||
@@ -61,10 +57,8 @@ typedef struct ali1543_t
|
|||||||
apm_t * apm;
|
apm_t * apm;
|
||||||
acpi_t * acpi;
|
acpi_t * acpi;
|
||||||
ddma_t * ddma;
|
ddma_t * ddma;
|
||||||
fdc_t * fdc_controller;
|
|
||||||
nvr_t * nvr;
|
nvr_t * nvr;
|
||||||
port_92_t * port_92;
|
port_92_t * port_92;
|
||||||
serial_t * uart[2];
|
|
||||||
sff8038i_t * ide_controller[2];
|
sff8038i_t * ide_controller[2];
|
||||||
smbus_ali7101_t * smbus;
|
smbus_ali7101_t * smbus;
|
||||||
usb_t * usb;
|
usb_t * usb;
|
||||||
@@ -1403,129 +1397,6 @@ ali7101_read(int func, int addr, void *priv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
ali1533_sio_fdc_handler(ali1543_t *dev)
|
|
||||||
{
|
|
||||||
fdc_remove(dev->fdc_controller);
|
|
||||||
|
|
||||||
if (dev->device_regs[0][0x30] & 1) {
|
|
||||||
ali1543_log("New FDC base address: %04X\n", dev->device_regs[0][0x61] | (dev->device_regs[0][0x60] << 8));
|
|
||||||
fdc_set_base(dev->fdc_controller, dev->device_regs[0][0x61] | (dev->device_regs[0][0x60] << 8));
|
|
||||||
fdc_set_irq(dev->fdc_controller, dev->device_regs[0][0x70] & 0xf);
|
|
||||||
fdc_set_dma_ch(dev->fdc_controller, dev->device_regs[0][0x74] & 0x07);
|
|
||||||
ali1543_log("M1543-SIO FDC: ADDR %04x IRQ %02x DMA %02x\n", dev->device_regs[0][0x61] | (dev->device_regs[0][0x60] << 8), dev->device_regs[0][0x70] & 0xf, dev->device_regs[0][0x74] & 0x07);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
ali1533_sio_uart_handler(int num, ali1543_t *dev)
|
|
||||||
{
|
|
||||||
serial_remove(dev->uart[num]);
|
|
||||||
|
|
||||||
if (dev->device_regs[num + 4][0x30] & 1) {
|
|
||||||
serial_setup(dev->uart[num], dev->device_regs[num + 4][0x61] | (dev->device_regs[num + 4][0x60] << 8), dev->device_regs[num + 4][0x70] & 0xf);
|
|
||||||
ali1543_log("M1543-SIO UART%d: ADDR %04x IRQ %02x\n", num, dev->device_regs[num + 4][0x61] | (dev->device_regs[num + 4][0x60] << 8), dev->device_regs[num + 4][0x70] & 0xf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ali1533_sio_lpt_handler(ali1543_t *dev)
|
|
||||||
{
|
|
||||||
lpt1_remove();
|
|
||||||
|
|
||||||
if (dev->device_regs[3][0x30] & 1) {
|
|
||||||
lpt1_init(dev->device_regs[3][0x61] | (dev->device_regs[3][0x60] << 8));
|
|
||||||
lpt1_irq(dev->device_regs[3][0x70] & 0xf);
|
|
||||||
ali1543_log("M1543-SIO LPT: ADDR %04x IRQ %02x\n", dev->device_regs[3][0x61] | (dev->device_regs[3][0x60] << 8), dev->device_regs[3][0x70] & 0xf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ali1533_sio_ldn(uint16_t ldn, ali1543_t *dev)
|
|
||||||
{
|
|
||||||
/* We don't include all LDN's */
|
|
||||||
switch (ldn) {
|
|
||||||
case 0: /* FDC */
|
|
||||||
ali1533_sio_fdc_handler(dev);
|
|
||||||
break;
|
|
||||||
case 3: /* LPT */
|
|
||||||
ali1533_sio_lpt_handler(dev);
|
|
||||||
break;
|
|
||||||
/* UART */
|
|
||||||
case 4: case 5:
|
|
||||||
ali1533_sio_uart_handler(ldn - 4, dev);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
ali1533_sio_write(uint16_t addr, uint8_t val, void *priv)
|
|
||||||
{
|
|
||||||
ali1543_t *dev = (ali1543_t *)priv;
|
|
||||||
|
|
||||||
switch (addr) {
|
|
||||||
case FDC_PRIMARY_ADDR:
|
|
||||||
dev->sio_index = val;
|
|
||||||
if (dev->sio_index == 0x51)
|
|
||||||
dev->in_configuration_mode = 1;
|
|
||||||
else if ((dev->sio_index == 0x23) && (dev->in_configuration_mode == 1))
|
|
||||||
dev->in_configuration_mode = 2;
|
|
||||||
else if (dev->sio_index == 0xbb)
|
|
||||||
dev->in_configuration_mode = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x3f1:
|
|
||||||
if (dev->in_configuration_mode == 2) {
|
|
||||||
switch (dev->sio_index) {
|
|
||||||
case 0x07:
|
|
||||||
dev->sio_regs[dev->sio_index] = val & 0x7;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x22:
|
|
||||||
dev->sio_regs[dev->sio_index] = val & 0x39;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x23:
|
|
||||||
dev->sio_regs[dev->sio_index] = val & 0x38;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if ((dev->sio_index < 0x30) || (dev->sio_index == 0x51) || (dev->sio_index == 0xbb))
|
|
||||||
dev->sio_regs[dev->sio_index] = val;
|
|
||||||
else if (dev->sio_regs[0x07] <= 7)
|
|
||||||
dev->device_regs[dev->sio_regs[0x07]][dev->sio_index] = val;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((!dev->in_configuration_mode) && (dev->sio_regs[0x07] <= 7) && (addr == FDC_PRIMARY_ADDR))
|
|
||||||
ali1533_sio_ldn(dev->sio_regs[0x07], dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static uint8_t
|
|
||||||
ali1533_sio_read(uint16_t addr, void *priv)
|
|
||||||
{
|
|
||||||
ali1543_t *dev = (ali1543_t *)priv;
|
|
||||||
uint8_t ret = 0xff;
|
|
||||||
|
|
||||||
if (addr == 0x03f1) {
|
|
||||||
if (dev->sio_index >= 0x30)
|
|
||||||
ret = dev->device_regs[dev->sio_regs[0x07]][dev->sio_index];
|
|
||||||
else
|
|
||||||
ret = dev->sio_regs[dev->sio_index];
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ali1543_reset(void *priv)
|
ali1543_reset(void *priv)
|
||||||
{
|
{
|
||||||
@@ -1619,44 +1490,6 @@ ali1543_reset(void *priv)
|
|||||||
ali1533_write(0, 0x75, 0x00, dev);
|
ali1533_write(0, 0x75, 0x00, dev);
|
||||||
ali1533_write(0, 0x76, 0x00, dev);
|
ali1533_write(0, 0x76, 0x00, dev);
|
||||||
|
|
||||||
/* M1543 Super I/O */
|
|
||||||
memset(dev->sio_regs, 0x00, sizeof(dev->sio_regs));
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
memset(dev->device_regs[i], 0x00, sizeof(dev->device_regs[i]));
|
|
||||||
|
|
||||||
dev->device_regs[0][0x60] = 0x03;
|
|
||||||
dev->device_regs[0][0x61] = 0xf0;
|
|
||||||
dev->device_regs[0][0x70] = 0x06;
|
|
||||||
dev->device_regs[0][0x74] = 0x02;
|
|
||||||
dev->device_regs[0][0xf0] = 0x08;
|
|
||||||
dev->device_regs[0][0xf2] = 0xff;
|
|
||||||
|
|
||||||
dev->device_regs[3][0x60] = 0x03;
|
|
||||||
dev->device_regs[3][0x61] = 0x78;
|
|
||||||
dev->device_regs[3][0x70] = 0x05;
|
|
||||||
dev->device_regs[3][0x74] = 0x04;
|
|
||||||
dev->device_regs[3][0xf0] = 0x0c;
|
|
||||||
dev->device_regs[3][0xf1] = 0x05;
|
|
||||||
|
|
||||||
dev->device_regs[4][0x60] = 0x03;
|
|
||||||
dev->device_regs[4][0x61] = 0xf8;
|
|
||||||
dev->device_regs[4][0x70] = 0x04;
|
|
||||||
dev->device_regs[4][0xf1] = 0x02;
|
|
||||||
dev->device_regs[4][0xf2] = 0x0c;
|
|
||||||
|
|
||||||
dev->device_regs[5][0x60] = 0x02;
|
|
||||||
dev->device_regs[5][0x61] = 0xf8;
|
|
||||||
dev->device_regs[5][0x70] = 0x03;
|
|
||||||
dev->device_regs[5][0xf1] = 0x02;
|
|
||||||
dev->device_regs[5][0xf2] = 0x0c;
|
|
||||||
|
|
||||||
dev->device_regs[7][0x70] = 0x01;
|
|
||||||
|
|
||||||
ali1533_sio_fdc_handler(dev);
|
|
||||||
ali1533_sio_uart_handler(0, dev);
|
|
||||||
ali1533_sio_uart_handler(1, dev);
|
|
||||||
ali1533_sio_lpt_handler(dev);
|
|
||||||
|
|
||||||
unmask_a20_in_smm = 1;
|
unmask_a20_in_smm = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1706,10 +1539,6 @@ ali1543_init(const device_t *info)
|
|||||||
/* DDMA */
|
/* DDMA */
|
||||||
dev->ddma = device_add(&ddma_device);
|
dev->ddma = device_add(&ddma_device);
|
||||||
|
|
||||||
/* Floppy Disk Controller */
|
|
||||||
// dev->fdc_controller = device_add(&fdc_at_smc_device);
|
|
||||||
dev->fdc_controller = NULL;
|
|
||||||
|
|
||||||
/* IDE Controllers */
|
/* IDE Controllers */
|
||||||
dev->ide_controller[0] = device_add_inst(&sff8038i_device, 1);
|
dev->ide_controller[0] = device_add_inst(&sff8038i_device, 1);
|
||||||
dev->ide_controller[1] = device_add_inst(&sff8038i_device, 2);
|
dev->ide_controller[1] = device_add_inst(&sff8038i_device, 2);
|
||||||
@@ -1717,19 +1546,15 @@ ali1543_init(const device_t *info)
|
|||||||
/* Port 92h */
|
/* Port 92h */
|
||||||
dev->port_92 = device_add(&port_92_pci_device);
|
dev->port_92 = device_add(&port_92_pci_device);
|
||||||
|
|
||||||
/* Serial NS16500 */
|
|
||||||
dev->uart[0] = device_add_inst(&ns16550_device, 1);
|
|
||||||
dev->uart[1] = device_add_inst(&ns16550_device, 2);
|
|
||||||
|
|
||||||
/* Standard SMBus */
|
/* Standard SMBus */
|
||||||
dev->smbus = device_add(&ali7101_smbus_device);
|
dev->smbus = device_add(&ali7101_smbus_device);
|
||||||
|
|
||||||
/* Super I/O Configuration Mechanism */
|
|
||||||
dev->in_configuration_mode = 0;
|
|
||||||
|
|
||||||
/* USB */
|
/* USB */
|
||||||
dev->usb = device_add(&usb_device);
|
dev->usb = device_add(&usb_device);
|
||||||
|
|
||||||
|
/* Super I/O chip */
|
||||||
|
device_add(&ali5123_device);
|
||||||
|
|
||||||
dev->type = info->local & 0xff;
|
dev->type = info->local & 0xff;
|
||||||
dev->offset = (info->local >> 8) & 0x7f;
|
dev->offset = (info->local >> 8) & 0x7f;
|
||||||
if (info->local & 0x8000)
|
if (info->local & 0x8000)
|
||||||
|
Reference in New Issue
Block a user