Add basic APM functionality for PIIX/PIIX3 and i430FX, i430VX, i430HX
and i440FX chipsets.
This commit is contained in:
parent
93756d3f01
commit
38cee364d3
7 changed files with 233 additions and 8 deletions
38
src/i440fx.c
38
src/i440fx.c
|
|
@ -106,6 +106,30 @@ void i440fx_write(int func, int addr, uint8_t val, void *priv)
|
|||
i440fx_map(0xec000, 0x04000, val >> 4);
|
||||
pclog("i440fx_write : PAM6 write %02X\n", val);
|
||||
break;
|
||||
|
||||
case 0x72: /*SMRAM*/
|
||||
pclog("Write SMRAM %02x\n", val);
|
||||
val = (val & 0x78) | 2; /*SMRAM always at A0000-BFFFF*/
|
||||
val |= (card_i440fx[0x72] & 0x10); /*D_LCK can not be cleared by software*/
|
||||
if (val & 0x10) /*D_LCK locks D_OPEN and G_SMRAME*/
|
||||
{
|
||||
val &= ~0x48; /*D_OPEN is forced to 0, G_SMRAME is read only*/
|
||||
val |= (card_i440fx[0x72] & 0x08);
|
||||
}
|
||||
if ((card_i440fx[0x72] ^ val) & 0x40)
|
||||
{
|
||||
if (val & 0x40) /*SMRAM enabled*/
|
||||
{
|
||||
pclog("Enable SMRAM\n");
|
||||
mem_set_mem_state(0xa0000, 0x20000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
|
||||
}
|
||||
else
|
||||
{
|
||||
pclog("Disable SMRAM\n");
|
||||
mem_set_mem_state(0xa0000, 0x20000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
card_i440fx[addr] = val;
|
||||
|
|
@ -119,6 +143,17 @@ uint8_t i440fx_read(int func, int addr, void *priv)
|
|||
return card_i440fx[addr];
|
||||
}
|
||||
|
||||
static void i440fx_smram_enable(void)
|
||||
{
|
||||
if (card_i440fx[0x72] & 8)
|
||||
mem_set_mem_state(0xa0000, 0x20000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
|
||||
}
|
||||
static void i440fx_smram_disable(void)
|
||||
{
|
||||
if (card_i440fx[0x72] & 8)
|
||||
mem_set_mem_state(0xa0000, 0x20000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
|
||||
}
|
||||
|
||||
void i440fx_init()
|
||||
{
|
||||
pci_add_specific(0, i440fx_read, i440fx_write, NULL);
|
||||
|
|
@ -137,6 +172,9 @@ void i440fx_init()
|
|||
card_i440fx[0x60] = card_i440fx[0x61] = card_i440fx[0x62] = card_i440fx[0x63] = card_i440fx[0x64] = 0x01;
|
||||
card_i440fx[0x71] = 0x10;
|
||||
card_i440fx[0x72] = 0x02;
|
||||
|
||||
smram_enable = i440fx_smram_enable;
|
||||
smram_disable = i440fx_smram_disable;
|
||||
}
|
||||
|
||||
void i440fx_reset()
|
||||
|
|
|
|||
Loading…
Reference in a new issue