Implement undocumented PMCNTRL mirrors on VIA 596 (unconfirmed), 686 (confirmed) and PIIX4 (unconfirmed) ACPI
This commit is contained in:
46
src/acpi.c
46
src/acpi.c
@@ -1174,9 +1174,9 @@ acpi_reg_write_common(int size, uint16_t addr, uint8_t val, void *p)
|
|||||||
{
|
{
|
||||||
acpi_t *dev = (acpi_t *) p;
|
acpi_t *dev = (acpi_t *) p;
|
||||||
|
|
||||||
if (dev->vendor == VEN_ALI)
|
if (dev->vendor == VEN_ALI)
|
||||||
acpi_reg_write_ali(size, addr, val, p);
|
acpi_reg_write_ali(size, addr, val, p);
|
||||||
if (dev->vendor == VEN_VIA)
|
else if (dev->vendor == VEN_VIA)
|
||||||
acpi_reg_write_via(size, addr, val, p);
|
acpi_reg_write_via(size, addr, val, p);
|
||||||
else if (dev->vendor == VEN_VIA_596B)
|
else if (dev->vendor == VEN_VIA_596B)
|
||||||
acpi_reg_write_via_596b(size, addr, val, p);
|
acpi_reg_write_via_596b(size, addr, val, p);
|
||||||
@@ -1195,7 +1195,11 @@ acpi_aux_reg_read_common(int size, uint16_t addr, void *p)
|
|||||||
acpi_t *dev = (acpi_t *) p;
|
acpi_t *dev = (acpi_t *) p;
|
||||||
uint8_t ret = 0xff;
|
uint8_t ret = 0xff;
|
||||||
|
|
||||||
if (dev->vendor == VEN_SMC)
|
if (dev->vendor == VEN_VIA_596B)
|
||||||
|
ret = acpi_reg_read_via_596b(size, addr - (0xf0 - 0x04), p);
|
||||||
|
else if (dev->vendor == VEN_INTEL)
|
||||||
|
ret = acpi_reg_read_intel(size, addr - (0x40 - 0x04), p);
|
||||||
|
else if (dev->vendor == VEN_SMC)
|
||||||
ret = acpi_aux_reg_read_smc(size, addr, p);
|
ret = acpi_aux_reg_read_smc(size, addr, p);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -1207,7 +1211,11 @@ acpi_aux_reg_write_common(int size, uint16_t addr, uint8_t val, void *p)
|
|||||||
{
|
{
|
||||||
acpi_t *dev = (acpi_t *) p;
|
acpi_t *dev = (acpi_t *) p;
|
||||||
|
|
||||||
if (dev->vendor == VEN_SMC)
|
if (dev->vendor == VEN_VIA_596B)
|
||||||
|
acpi_reg_write_via_596b(size, addr - (0xf0 - 0x04), val, p);
|
||||||
|
else if (dev->vendor == VEN_INTEL)
|
||||||
|
acpi_reg_write_intel(size, addr - (0x40 - 0x04), val, p);
|
||||||
|
else if (dev->vendor == VEN_SMC)
|
||||||
acpi_aux_reg_write_smc(size, addr, val, p);
|
acpi_aux_reg_write_smc(size, addr, val, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1256,7 +1264,7 @@ acpi_reg_read(uint16_t addr, void *p)
|
|||||||
|
|
||||||
|
|
||||||
static uint32_t
|
static uint32_t
|
||||||
acpi_aux_read_readl(uint16_t addr, void *p)
|
acpi_aux_reg_readl(uint16_t addr, void *p)
|
||||||
{
|
{
|
||||||
uint32_t ret = 0x00000000;
|
uint32_t ret = 0x00000000;
|
||||||
|
|
||||||
@@ -1272,7 +1280,7 @@ acpi_aux_read_readl(uint16_t addr, void *p)
|
|||||||
|
|
||||||
|
|
||||||
static uint16_t
|
static uint16_t
|
||||||
acpi_aux_read_readw(uint16_t addr, void *p)
|
acpi_aux_reg_readw(uint16_t addr, void *p)
|
||||||
{
|
{
|
||||||
uint16_t ret = 0x0000;
|
uint16_t ret = 0x0000;
|
||||||
|
|
||||||
@@ -1286,7 +1294,7 @@ acpi_aux_read_readw(uint16_t addr, void *p)
|
|||||||
|
|
||||||
|
|
||||||
static uint8_t
|
static uint8_t
|
||||||
acpi_aux_read_read(uint16_t addr, void *p)
|
acpi_aux_reg_read(uint16_t addr, void *p)
|
||||||
{
|
{
|
||||||
uint8_t ret = 0x00;
|
uint8_t ret = 0x00;
|
||||||
|
|
||||||
@@ -1396,17 +1404,33 @@ acpi_update_io_mapping(acpi_t *dev, uint32_t base, int chipset_en)
|
|||||||
void
|
void
|
||||||
acpi_update_aux_io_mapping(acpi_t *dev, uint32_t base, int chipset_en)
|
acpi_update_aux_io_mapping(acpi_t *dev, uint32_t base, int chipset_en)
|
||||||
{
|
{
|
||||||
|
int size;
|
||||||
|
|
||||||
|
switch (dev->vendor) {
|
||||||
|
case VEN_INTEL:
|
||||||
|
case VEN_VIA_596B:
|
||||||
|
/* Undocumented mirror of PMCNTRL. */
|
||||||
|
size = 0x001;
|
||||||
|
break;
|
||||||
|
case VEN_SMC:
|
||||||
|
size = 0x008;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
size = 0x000;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (dev->aux_io_base != 0x0000) {
|
if (dev->aux_io_base != 0x0000) {
|
||||||
io_removehandler(dev->aux_io_base, 0x08,
|
io_removehandler(dev->aux_io_base, size,
|
||||||
acpi_aux_read_read, acpi_aux_read_readw, acpi_aux_read_readl,
|
acpi_aux_reg_read, acpi_aux_reg_readw, acpi_aux_reg_readl,
|
||||||
acpi_aux_reg_write, acpi_aux_reg_writew, acpi_aux_reg_writel, dev);
|
acpi_aux_reg_write, acpi_aux_reg_writew, acpi_aux_reg_writel, dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->aux_io_base = base;
|
dev->aux_io_base = base;
|
||||||
|
|
||||||
if (chipset_en && (dev->aux_io_base != 0x0000)) {
|
if (chipset_en && (dev->aux_io_base != 0x0000)) {
|
||||||
io_sethandler(dev->aux_io_base, 0x08,
|
io_sethandler(dev->aux_io_base, size,
|
||||||
acpi_aux_read_read, acpi_aux_read_readw, acpi_aux_read_readl,
|
acpi_aux_reg_read, acpi_aux_reg_readw, acpi_aux_reg_readl,
|
||||||
acpi_aux_reg_write, acpi_aux_reg_writew, acpi_aux_reg_writel, dev);
|
acpi_aux_reg_write, acpi_aux_reg_writew, acpi_aux_reg_writel, dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -813,11 +813,13 @@ piix_write(int func, int addr, uint8_t val, void *priv)
|
|||||||
fregs[0x40] = (val & 0xc0) | 1;
|
fregs[0x40] = (val & 0xc0) | 1;
|
||||||
dev->acpi_io_base = (dev->regs[3][0x41] << 8) | (dev->regs[3][0x40] & 0xc0);
|
dev->acpi_io_base = (dev->regs[3][0x41] << 8) | (dev->regs[3][0x40] & 0xc0);
|
||||||
acpi_update_io_mapping(dev->acpi, dev->acpi_io_base, (dev->regs[3][0x80] & 0x01));
|
acpi_update_io_mapping(dev->acpi, dev->acpi_io_base, (dev->regs[3][0x80] & 0x01));
|
||||||
|
acpi_update_aux_io_mapping(dev->acpi, dev->acpi_io_base + 0x40, (dev->regs[3][0x80] & 0x01));
|
||||||
break;
|
break;
|
||||||
case 0x41:
|
case 0x41:
|
||||||
fregs[0x41] = val;
|
fregs[0x41] = val;
|
||||||
dev->acpi_io_base = (dev->regs[3][0x41] << 8) | (dev->regs[3][0x40] & 0xc0);
|
dev->acpi_io_base = (dev->regs[3][0x41] << 8) | (dev->regs[3][0x40] & 0xc0);
|
||||||
acpi_update_io_mapping(dev->acpi, dev->acpi_io_base, (dev->regs[3][0x80] & 0x01));
|
acpi_update_io_mapping(dev->acpi, dev->acpi_io_base, (dev->regs[3][0x80] & 0x01));
|
||||||
|
acpi_update_aux_io_mapping(dev->acpi, dev->acpi_io_base + 0x40, (dev->regs[3][0x80] & 0x01));
|
||||||
break;
|
break;
|
||||||
case 0x44: case 0x45: case 0x46: case 0x47:
|
case 0x44: case 0x45: case 0x46: case 0x47:
|
||||||
case 0x48: case 0x49:
|
case 0x48: case 0x49:
|
||||||
@@ -844,10 +846,12 @@ piix_write(int func, int addr, uint8_t val, void *priv)
|
|||||||
break;
|
break;
|
||||||
case 0x4f: case 0x80: case 0xd2:
|
case 0x4f: case 0x80: case 0xd2:
|
||||||
fregs[addr] = val & 0x0f;
|
fregs[addr] = val & 0x0f;
|
||||||
if (addr == 0x80)
|
if (addr == 0x80) {
|
||||||
acpi_update_io_mapping(dev->acpi, dev->acpi_io_base, (dev->regs[3][0x80] & 0x01));
|
acpi_update_io_mapping(dev->acpi, dev->acpi_io_base, (dev->regs[3][0x80] & 0x01));
|
||||||
else if (addr == 0xd2)
|
acpi_update_aux_io_mapping(dev->acpi, dev->acpi_io_base + 0x40, (dev->regs[3][0x80] & 0x01));
|
||||||
|
} else if (addr == 0xd2) {
|
||||||
smbus_update_io_mapping(dev);
|
smbus_update_io_mapping(dev);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 0x50:
|
case 0x50:
|
||||||
fregs[addr] = val & 0x3f;
|
fregs[addr] = val & 0x3f;
|
||||||
|
@@ -1128,6 +1128,7 @@ pipc_write(int func, int addr, uint8_t val, void *priv)
|
|||||||
c -= 0x400;
|
c -= 0x400;
|
||||||
acpi_set_timer32(dev->acpi, dev->power_regs[0x41] & 0x08);
|
acpi_set_timer32(dev->acpi, dev->power_regs[0x41] & 0x08);
|
||||||
acpi_update_io_mapping(dev->acpi, c, dev->power_regs[0x41] & 0x80);
|
acpi_update_io_mapping(dev->acpi, c, dev->power_regs[0x41] & 0x80);
|
||||||
|
acpi_update_aux_io_mapping(dev->acpi, c + 0xf0, dev->power_regs[0x41] & 0x80);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x42:
|
case 0x42:
|
||||||
|
Reference in New Issue
Block a user