Implement STPC IDE

Note that only the AR-B1479 has two IDE channels available on the board.
This commit is contained in:
RichardG867
2020-07-06 20:24:24 -03:00
parent 8536f93dfc
commit 1ed6143f02
2 changed files with 84 additions and 29 deletions

View File

@@ -49,7 +49,7 @@ typedef struct stpc_t
uint8_t localbus_regs[256];
/* PCI */
uint8_t pci_conf[2][256];
uint8_t pci_conf[3][256];
} stpc_t;
@@ -206,22 +206,15 @@ stpc_nb_write(int func, int addr, uint8_t val, void *priv)
switch (addr) {
case 0x00: case 0x01: case 0x02: case 0x03:
case 0x04: case 0x08: case 0x09: case 0x0a:
case 0x0b: case 0x0e: case 0x54:
case 0x04: case 0x06: case 0x07: case 0x08:
case 0x09: case 0x0a: case 0x0b: case 0x0e:
case 0x51: case 0x53: case 0x54:
return;
case 0x05:
val &= 0x01;
break;
case 0x06:
val = 0;
break;
case 0x07:
val = 0x02;
break;
case 0x50:
val &= 0x1f;
break;
@@ -261,30 +254,20 @@ stpc_sb_write(int func, int addr, uint8_t val, void *priv)
if (func > 0)
return;
switch(addr) {
switch (addr) {
case 0x00: case 0x01: case 0x02: case 0x03:
case 0x04: case 0x08: case 0x09: case 0x0a:
case 0x0b: case 0x0e: case 0x54:
case 0x04: case 0x06: case 0x07: case 0x08:
case 0x09: case 0x0a: case 0x0b: case 0x0e:
return;
case 0x05:
val &= 0x01;
break;
case 0x06:
val = 0;
break;
case 0x07:
val = 0x02;
break;
}
dev->pci_conf[1][addr] = val;
}
/* TODO: IDE and USB OHCI devices */
static uint8_t
stpc_sb_read(int func, int addr, void *priv)
{
@@ -301,6 +284,48 @@ stpc_sb_read(int func, int addr, void *priv)
}
static void
stpc_ide_write(int func, int addr, uint8_t val, void *priv)
{
stpc_t *dev = (stpc_t *) priv;
stpc_log("STPC: ide_write(%d, %02x, %02x)\n", func, addr, val);
if (func > 0)
return;
switch (addr) {
case 0x00: case 0x01: case 0x02: case 0x03:
case 0x04: case 0x06: case 0x07: case 0x08:
case 0x09: case 0x0a: case 0x0b: case 0x0e:
return;
case 0x05:
val &= 0x01;
break;
}
dev->pci_conf[2][addr] = val;
}
static uint8_t
stpc_ide_read(int func, int addr, void *priv)
{
stpc_t *dev = (stpc_t *) priv;
uint8_t ret;
if (func > 0)
ret = 0xff;
else
ret = dev->pci_conf[2][addr];
stpc_log("STPC: ide_read(%d, %02x) = %02x\n", func, addr, ret);
return ret;
}
/* TODO: IDE and USB OHCI devices */
static void
stpc_remap_host(stpc_t *dev, uint16_t host_base)
{
@@ -430,9 +455,9 @@ stpc_setup(stpc_t *dev)
memset(dev, 0, sizeof(stpc_t));
/* Northbridge */
dev->pci_conf[0][0x00] = 0x4A;
dev->pci_conf[0][0x00] = 0x4a;
dev->pci_conf[0][0x01] = 0x10;
dev->pci_conf[0][0x02] = 0x0A;
dev->pci_conf[0][0x02] = 0x0a;
dev->pci_conf[0][0x03] = 0x02;
dev->pci_conf[0][0x04] = 0x07;
@@ -443,12 +468,12 @@ stpc_setup(stpc_t *dev)
dev->pci_conf[0][0x0b] = 0x06;
/* Southbridge */
dev->pci_conf[1][0x00] = 0x4A;
dev->pci_conf[1][0x00] = 0x4a;
dev->pci_conf[1][0x01] = 0x10;
dev->pci_conf[1][0x02] = 0x10;
dev->pci_conf[1][0x03] = 0x02;
dev->pci_conf[1][0x04] = 0x07;
dev->pci_conf[1][0x04] = 0x0f;
dev->pci_conf[1][0x06] = 0x80;
dev->pci_conf[1][0x07] = 0x02;
@@ -459,6 +484,33 @@ stpc_setup(stpc_t *dev)
dev->pci_conf[1][0x0e] = 0x40;
/* IDE */
dev->pci_conf[2][0x00] = 0x4A;
dev->pci_conf[2][0x01] = 0x10;
dev->pci_conf[2][0x02] = 0x10;
dev->pci_conf[2][0x03] = 0x02;
dev->pci_conf[2][0x06] = 0x80;
dev->pci_conf[2][0x07] = 0x02;
dev->pci_conf[2][0x09] = 0x8a;
dev->pci_conf[2][0x0a] = 0x01;
dev->pci_conf[2][0x0b] = 0x01;
dev->pci_conf[2][0x0e] = 0x40;
dev->pci_conf[2][0x10] = 0x01;
dev->pci_conf[2][0x14] = 0x01;
dev->pci_conf[2][0x18] = 0x01;
dev->pci_conf[2][0x1c] = 0x01;
dev->pci_conf[2][0x40] = 0x60;
dev->pci_conf[2][0x41] = 0x97;
dev->pci_conf[2][0x42] = 0x60;
dev->pci_conf[2][0x43] = 0x97;
dev->pci_conf[2][0x44] = 0x60;
dev->pci_conf[2][0x45] = 0x97;
dev->pci_conf[2][0x46] = 0x60;
dev->pci_conf[2][0x47] = 0x97;
/* USB */
}
@@ -484,7 +536,7 @@ stpc_init(const device_t *info)
pci_add_card(0x0B, stpc_nb_read, stpc_nb_write, dev);
pci_add_card(0x0C, stpc_sb_read, stpc_sb_write, dev);
/* IDE = 0x0D */
pci_add_card(0x0D, stpc_ide_read, stpc_ide_write, dev);
/* USB (Atlas only) = 0x0E */
stpc_setup(dev);

View File

@@ -635,6 +635,7 @@ machine_at_arb1479_init(const machine_t *model)
device_add(&w83977f_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&stpc_consumer2_device);
device_add(&ide_pci_2ch_device);
device_add(&sst_flash_29ee020_device);
return ret;
@@ -663,6 +664,7 @@ machine_at_pcm9340_init(const machine_t *model)
device_add(&w83977f_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&stpc_elite_device);
device_add(&ide_pci_device);
device_add(&sst_flash_39sf020_device);
return ret;
@@ -688,6 +690,7 @@ machine_at_pcm5330_init(const machine_t *model)
device_add(&w83977f_device);
device_add(&keyboard_ps2_ami_pci_device);
device_add(&stpc_atlas_device);
device_add(&ide_pci_device);
device_add(&sst_flash_29ee020_device);
return ret;