Implement STPC IDE
Note that only the AR-B1479 has two IDE channels available on the board.
This commit is contained in:
@@ -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);
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user