void soc_fill_power_state(struct chipset_power_state *ps) { uint16_t tcobase; uint8_t *pmc; tcobase = smbus_tco_regs(); ps->tco1_sts = inw(tcobase + TCO1_STS); ps->tco2_sts = inw(tcobase + TCO2_STS); printk(BIOS_DEBUG, "TCO_STS: %04x %04x\n", ps->tco1_sts, ps->tco2_sts); pmc = pmc_mmio_regs(); ps->gen_pmcon_a = read32(pmc + GEN_PMCON_A); ps->gen_pmcon_b = read32(pmc + GEN_PMCON_B); ps->gblrst_cause[0] = read32(pmc + GBLRST_CAUSE0); ps->gblrst_cause[1] = read32(pmc + GBLRST_CAUSE1); printk(BIOS_DEBUG, "GEN_PMCON: %08x %08x\n", ps->gen_pmcon_a, ps->gen_pmcon_b); printk(BIOS_DEBUG, "GBLRST_CAUSE: %08x %08x\n", ps->gblrst_cause[0], ps->gblrst_cause[1]); }
static void pmc_gpe_init(config_t *config) { uint8_t *pmc_regs; uint32_t gpio_cfg; uint32_t gpio_cfg_reg; const uint32_t gpio_cfg_mask = (GPE0_DWX_MASK << GPE0_DW0_SHIFT) | (GPE0_DWX_MASK << GPE0_DW1_SHIFT) | (GPE0_DWX_MASK << GPE0_DW2_SHIFT); pmc_regs = pmc_mmio_regs(); gpio_cfg = 0; /* Route the GPIOs to the GPE0 block. Determine that all values * are different, and if they aren't use the reset values. */ if (config->gpe0_dw0 == config->gpe0_dw1 || config->gpe0_dw1 == config->gpe0_dw2) { printk(BIOS_INFO, "PMC: Using default GPE route.\n"); gpio_cfg = read32(pmc_regs + GPIO_CFG); } else { gpio_cfg |= (uint32_t)config->gpe0_dw0 << GPE0_DW0_SHIFT; gpio_cfg |= (uint32_t)config->gpe0_dw1 << GPE0_DW1_SHIFT; gpio_cfg |= (uint32_t)config->gpe0_dw2 << GPE0_DW2_SHIFT; } gpio_cfg_reg = read32(pmc_regs + GPIO_CFG) & ~gpio_cfg_mask; gpio_cfg_reg |= gpio_cfg & gpio_cfg_mask; write32(pmc_regs + GPIO_CFG, gpio_cfg_reg); /* Set the routes in the GPIO communities as well. */ gpio_route_gpe(gpio_cfg_reg >> GPE0_DW0_SHIFT); /* Set GPE enables based on devictree. */ enable_all_gpe(config->gpe0_en_1, config->gpe0_en_2, config->gpe0_en_3, config->gpe0_en_4); }
static inline int deep_s3_enabled(void) { uint32_t deep_s3_pol; deep_s3_pol = read32(pmc_mmio_regs() + S3_PWRGATE_POL); return !!(deep_s3_pol & (S3DC_GATE_SUS | S3AC_GATE_SUS)); }
/* Fill power state structure from ACPI PM registers */ struct chipset_power_state *fill_power_state(void) { uint16_t tcobase; uint8_t *pmc; struct chipset_power_state *ps = car_get_var_ptr(&power_state); tcobase = pmc_tco_regs(); ps->pm1_sts = inw(ACPI_BASE_ADDRESS + PM1_STS); ps->pm1_en = inw(ACPI_BASE_ADDRESS + PM1_EN); ps->pm1_cnt = inl(ACPI_BASE_ADDRESS + PM1_CNT); ps->tco1_sts = inw(tcobase + TCO1_STS); ps->tco2_sts = inw(tcobase + TCO2_STS); ps->gpe0_sts[0] = inl(ACPI_BASE_ADDRESS + GPE0_STS(0)); ps->gpe0_sts[1] = inl(ACPI_BASE_ADDRESS + GPE0_STS(1)); ps->gpe0_sts[2] = inl(ACPI_BASE_ADDRESS + GPE0_STS(2)); ps->gpe0_sts[3] = inl(ACPI_BASE_ADDRESS + GPE0_STS(3)); ps->gpe0_en[0] = inl(ACPI_BASE_ADDRESS + GPE0_EN(0)); ps->gpe0_en[1] = inl(ACPI_BASE_ADDRESS + GPE0_EN(1)); ps->gpe0_en[2] = inl(ACPI_BASE_ADDRESS + GPE0_EN(2)); ps->gpe0_en[3] = inl(ACPI_BASE_ADDRESS + GPE0_EN(3)); ps->gen_pmcon_a = pci_read_config32(PCH_DEV_PMC, GEN_PMCON_A); ps->gen_pmcon_b = pci_read_config32(PCH_DEV_PMC, GEN_PMCON_B); pmc = pmc_mmio_regs(); ps->gblrst_cause[0] = read32(pmc + GBLRST_CAUSE0); ps->gblrst_cause[1] = read32(pmc + GBLRST_CAUSE1); ps->prev_sleep_state = prev_sleep_state(ps); dump_power_state(ps); return ps; }
/* Ignore LTR value for GBE devices */ static void ignore_gbe_ltr(void) { uint8_t reg8; uint8_t *pmcbase = pmc_mmio_regs(); reg8 = read8(pmcbase + LTR_IGN); reg8 |= IGN_GBE; write8(pmcbase + LTR_IGN, reg8); }
static void config_deep_sx(uint32_t deepsx_config) { uint32_t reg; uint8_t *pmcbase = pmc_mmio_regs(); reg = read32(pmcbase + DSX_CFG); reg &= ~DSX_CFG_MASK; reg |= deepsx_config; write32(pmcbase + DSX_CFG, reg); }
static void pmc_lock_smi(void) { uint8_t *pmcbase; uint8_t reg8; pmcbase = pmc_mmio_regs(); reg8 = read8(pmcbase + GEN_PMCON_B); reg8 |= SMI_LOCK; write8(pmcbase + GEN_PMCON_B, reg8); }
static void pmc_lock_abase(void) { uint8_t *pmcbase; uint32_t reg32; pmcbase = pmc_mmio_regs(); reg32 = read32(pmcbase + GEN_PMCON_B); reg32 |= (SLP_STR_POL_LOCK | ACPI_BASE_LOCK); write32(pmcbase + GEN_PMCON_B, reg32); }
static void pmc_lock_pmsync(void) { uint8_t *pmcbase; uint32_t pmsyncreg; pmcbase = pmc_mmio_regs(); pmsyncreg = read32(pmcbase + PMSYNC_TPR_CFG); pmsyncreg |= PCH2CPU_TPR_CFG_LOCK; write32(pmcbase + PMSYNC_TPR_CFG, pmsyncreg); }
static void config_deep_sX(uint32_t offset, uint32_t mask, int sx, int enable) { uint32_t reg; uint8_t *pmcbase = pmc_mmio_regs(); printk(BIOS_DEBUG, "%sabling Deep S%c\n", enable ? "En" : "Dis", sx + '0'); reg = read32(pmcbase + offset); if (enable) reg |= mask; else reg &= ~mask; write32(pmcbase + offset, reg); }
void soc_fill_power_state(struct chipset_power_state *ps) { uint8_t *pmc; ps->tco1_sts = tco_read_reg(TCO1_STS); ps->tco2_sts = tco_read_reg(TCO2_STS); printk(BIOS_DEBUG, "TCO_STS: %04x %04x\n", ps->tco1_sts, ps->tco2_sts); ps->gen_pmcon_a = pci_read_config32(PCH_DEV_PMC, GEN_PMCON_A); ps->gen_pmcon_b = pci_read_config32(PCH_DEV_PMC, GEN_PMCON_B); pmc = pmc_mmio_regs(); ps->gblrst_cause[0] = read32(pmc + GBLRST_CAUSE0); ps->gblrst_cause[1] = read32(pmc + GBLRST_CAUSE1); printk(BIOS_DEBUG, "GEN_PMCON: %08x %08x\n", ps->gen_pmcon_a, ps->gen_pmcon_b); printk(BIOS_DEBUG, "GBLRST_CAUSE: %08x %08x\n", ps->gblrst_cause[0], ps->gblrst_cause[1]); }
uintptr_t soc_read_pmc_base(void) { return (uintptr_t) (pmc_mmio_regs()); }