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];
|
uint8_t localbus_regs[256];
|
||||||
|
|
||||||
/* PCI */
|
/* PCI */
|
||||||
uint8_t pci_conf[2][256];
|
uint8_t pci_conf[3][256];
|
||||||
} stpc_t;
|
} stpc_t;
|
||||||
|
|
||||||
|
|
||||||
@@ -206,22 +206,15 @@ stpc_nb_write(int func, int addr, uint8_t val, void *priv)
|
|||||||
|
|
||||||
switch (addr) {
|
switch (addr) {
|
||||||
case 0x00: case 0x01: case 0x02: case 0x03:
|
case 0x00: case 0x01: case 0x02: case 0x03:
|
||||||
case 0x04: case 0x08: case 0x09: case 0x0a:
|
case 0x04: case 0x06: case 0x07: case 0x08:
|
||||||
case 0x0b: case 0x0e: case 0x54:
|
case 0x09: case 0x0a: case 0x0b: case 0x0e:
|
||||||
|
case 0x51: case 0x53: case 0x54:
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case 0x05:
|
case 0x05:
|
||||||
val &= 0x01;
|
val &= 0x01;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x06:
|
|
||||||
val = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x07:
|
|
||||||
val = 0x02;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x50:
|
case 0x50:
|
||||||
val &= 0x1f;
|
val &= 0x1f;
|
||||||
break;
|
break;
|
||||||
@@ -261,30 +254,20 @@ stpc_sb_write(int func, int addr, uint8_t val, void *priv)
|
|||||||
if (func > 0)
|
if (func > 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch(addr) {
|
switch (addr) {
|
||||||
case 0x00: case 0x01: case 0x02: case 0x03:
|
case 0x00: case 0x01: case 0x02: case 0x03:
|
||||||
case 0x04: case 0x08: case 0x09: case 0x0a:
|
case 0x04: case 0x06: case 0x07: case 0x08:
|
||||||
case 0x0b: case 0x0e: case 0x54:
|
case 0x09: case 0x0a: case 0x0b: case 0x0e:
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case 0x05:
|
case 0x05:
|
||||||
val &= 0x01;
|
val &= 0x01;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x06:
|
|
||||||
val = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x07:
|
|
||||||
val = 0x02;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->pci_conf[1][addr] = val;
|
dev->pci_conf[1][addr] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: IDE and USB OHCI devices */
|
|
||||||
|
|
||||||
static uint8_t
|
static uint8_t
|
||||||
stpc_sb_read(int func, int addr, void *priv)
|
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
|
static void
|
||||||
stpc_remap_host(stpc_t *dev, uint16_t host_base)
|
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));
|
memset(dev, 0, sizeof(stpc_t));
|
||||||
|
|
||||||
/* Northbridge */
|
/* Northbridge */
|
||||||
dev->pci_conf[0][0x00] = 0x4A;
|
dev->pci_conf[0][0x00] = 0x4a;
|
||||||
dev->pci_conf[0][0x01] = 0x10;
|
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][0x03] = 0x02;
|
||||||
|
|
||||||
dev->pci_conf[0][0x04] = 0x07;
|
dev->pci_conf[0][0x04] = 0x07;
|
||||||
@@ -443,12 +468,12 @@ stpc_setup(stpc_t *dev)
|
|||||||
dev->pci_conf[0][0x0b] = 0x06;
|
dev->pci_conf[0][0x0b] = 0x06;
|
||||||
|
|
||||||
/* Southbridge */
|
/* Southbridge */
|
||||||
dev->pci_conf[1][0x00] = 0x4A;
|
dev->pci_conf[1][0x00] = 0x4a;
|
||||||
dev->pci_conf[1][0x01] = 0x10;
|
dev->pci_conf[1][0x01] = 0x10;
|
||||||
dev->pci_conf[1][0x02] = 0x10;
|
dev->pci_conf[1][0x02] = 0x10;
|
||||||
dev->pci_conf[1][0x03] = 0x02;
|
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][0x06] = 0x80;
|
||||||
dev->pci_conf[1][0x07] = 0x02;
|
dev->pci_conf[1][0x07] = 0x02;
|
||||||
@@ -459,6 +484,33 @@ stpc_setup(stpc_t *dev)
|
|||||||
dev->pci_conf[1][0x0e] = 0x40;
|
dev->pci_conf[1][0x0e] = 0x40;
|
||||||
|
|
||||||
/* IDE */
|
/* 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 */
|
/* 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(0x0B, stpc_nb_read, stpc_nb_write, dev);
|
||||||
pci_add_card(0x0C, stpc_sb_read, stpc_sb_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 */
|
/* USB (Atlas only) = 0x0E */
|
||||||
|
|
||||||
stpc_setup(dev);
|
stpc_setup(dev);
|
||||||
|
@@ -635,6 +635,7 @@ machine_at_arb1479_init(const machine_t *model)
|
|||||||
device_add(&w83977f_device);
|
device_add(&w83977f_device);
|
||||||
device_add(&keyboard_ps2_ami_pci_device);
|
device_add(&keyboard_ps2_ami_pci_device);
|
||||||
device_add(&stpc_consumer2_device);
|
device_add(&stpc_consumer2_device);
|
||||||
|
device_add(&ide_pci_2ch_device);
|
||||||
device_add(&sst_flash_29ee020_device);
|
device_add(&sst_flash_29ee020_device);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -663,6 +664,7 @@ machine_at_pcm9340_init(const machine_t *model)
|
|||||||
device_add(&w83977f_device);
|
device_add(&w83977f_device);
|
||||||
device_add(&keyboard_ps2_ami_pci_device);
|
device_add(&keyboard_ps2_ami_pci_device);
|
||||||
device_add(&stpc_elite_device);
|
device_add(&stpc_elite_device);
|
||||||
|
device_add(&ide_pci_device);
|
||||||
device_add(&sst_flash_39sf020_device);
|
device_add(&sst_flash_39sf020_device);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -688,6 +690,7 @@ machine_at_pcm5330_init(const machine_t *model)
|
|||||||
device_add(&w83977f_device);
|
device_add(&w83977f_device);
|
||||||
device_add(&keyboard_ps2_ami_pci_device);
|
device_add(&keyboard_ps2_ami_pci_device);
|
||||||
device_add(&stpc_atlas_device);
|
device_add(&stpc_atlas_device);
|
||||||
|
device_add(&ide_pci_device);
|
||||||
device_add(&sst_flash_29ee020_device);
|
device_add(&sst_flash_29ee020_device);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user