diff options
Diffstat (limited to 'src/soc/intel/baytrail/romstage/pmc.c')
-rw-r--r-- | src/soc/intel/baytrail/romstage/pmc.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/soc/intel/baytrail/romstage/pmc.c b/src/soc/intel/baytrail/romstage/pmc.c index e689ccd527..49a80111f5 100644 --- a/src/soc/intel/baytrail/romstage/pmc.c +++ b/src/soc/intel/baytrail/romstage/pmc.c @@ -33,3 +33,23 @@ void tco_disable(void) reg |= TCO_TMR_HALT; outl(reg, ACPI_BASE_ADDRESS + TCO1_CNT); } + +/* This sequence signals the PUNIT to start running. */ +void punit_init(void) +{ + uint32_t reg; + + /* Write bits 17:16 of SB_BIOS_CONFIG in the PUNIT. */ + reg = SB_BIOS_CONFIG_PERF_MODE | SB_BIOS_CONFIG_PDM_MODE; + pci_write_config32(IOSF_PCI_DEV, MDR_REG, reg); + reg = IOSF_OPCODE(IOSF_OP_WRITE_PMC) | IOSF_PORT(IOSF_PORT_PMC) | + IOSF_REG(SB_BIOS_CONFIG) | IOSF_BYTE_EN_2; + pci_write_config32(IOSF_PCI_DEV, MCR_REG, reg); + + /* Write bits 1:0 of BIOS_RESET_CPL in the PUNIT. */ + reg = BIOS_RESET_CPL_ALL_DONE | BIOS_RESET_CPL_RESET_DONE; + pci_write_config32(IOSF_PCI_DEV, MDR_REG, reg); + reg = IOSF_OPCODE(IOSF_OP_WRITE_PMC) | IOSF_PORT(IOSF_PORT_PMC) | + IOSF_REG(BIOS_RESET_CPL) | IOSF_BYTE_EN_0; + pci_write_config32(IOSF_PCI_DEV, MCR_REG, reg); +} |