1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2017 Intel Corporation.
4 * Copyright 2019 Google LLC
6 * Modified from coreboot pmclib.c, pmc.c and pmutil.c
9 #define LOG_CATEGORY UCLASS_ACPI_PMC
13 #include <dt-structs.h>
18 #include <power/acpi_pmc.h>
20 #define GPIO_GPE_CFG 0x1050
22 /* Memory mapped IO registers behind PMC_BASE_ADDRESS */
24 #define GEN_PMCON1 0x1020
25 #define COLD_BOOT_STS BIT(27)
26 #define COLD_RESET_STS BIT(26)
27 #define WARM_RESET_STS BIT(25)
28 #define GLOBAL_RESET_STS BIT(24)
32 #define GEN_PMCON1_CLR1_BITS (COLD_BOOT_STS | COLD_RESET_STS | \
33 WARM_RESET_STS | GLOBAL_RESET_STS | \
35 #define GEN_PMCON2 0x1024
36 #define GEN_PMCON3 0x1028
38 /* Offset of TCO registers from ACPI base I/O address */
39 #define TCO_REG_OFFSET 0x60
41 #define DMISCI_STS BIT(9)
42 #define BOOT_STS BIT(18)
45 #define TCO_LOCK BIT(12)
51 CF9_GLB_RST = 1 << 20,
54 struct apl_pmc_platdata {
55 #if CONFIG_IS_ENABLED(OF_PLATDATA)
56 struct dtd_intel_apl_pmc dtplat;
61 static int apl_pmc_fill_power_state(struct udevice *dev)
63 struct acpi_pmc_upriv *upriv = dev_get_uclass_priv(dev);
65 upriv->tco1_sts = inw(upriv->acpi_base + TCO1_STS);
66 upriv->tco2_sts = inw(upriv->acpi_base + TCO2_STS);
68 upriv->prsts = readl(upriv->pmc_bar0 + PRSTS);
69 upriv->gen_pmcon1 = readl(upriv->pmc_bar0 + GEN_PMCON1);
70 upriv->gen_pmcon2 = readl(upriv->pmc_bar0 + GEN_PMCON2);
71 upriv->gen_pmcon3 = readl(upriv->pmc_bar0 + GEN_PMCON3);
76 static int apl_prev_sleep_state(struct udevice *dev, int prev_sleep_state)
78 struct acpi_pmc_upriv *upriv = dev_get_uclass_priv(dev);
80 /* WAK_STS bit will not be set when waking from G3 state */
81 if (!(upriv->pm1_sts & WAK_STS) &&
82 (upriv->gen_pmcon1 & COLD_BOOT_STS))
83 prev_sleep_state = ACPI_S5;
85 return prev_sleep_state;
88 static int apl_disable_tco(struct udevice *dev)
90 struct acpi_pmc_upriv *upriv = dev_get_uclass_priv(dev);
92 pmc_disable_tco_base(upriv->acpi_base + TCO_REG_OFFSET);
97 static int apl_global_reset_set_enable(struct udevice *dev, bool enable)
99 struct acpi_pmc_upriv *upriv = dev_get_uclass_priv(dev);
102 setbits_le32(upriv->pmc_bar0 + ETR, CF9_GLB_RST);
104 clrbits_le32(upriv->pmc_bar0 + ETR, CF9_GLB_RST);
109 int apl_pmc_ofdata_to_uc_platdata(struct udevice *dev)
111 struct acpi_pmc_upriv *upriv = dev_get_uclass_priv(dev);
112 struct apl_pmc_platdata *plat = dev_get_platdata(dev);
114 #if !CONFIG_IS_ENABLED(OF_PLATDATA)
119 ret = dev_read_u32_array(dev, "early-regs", base, ARRAY_SIZE(base));
121 return log_msg_ret("Missing/short early-regs", ret);
122 upriv->pmc_bar0 = (void *)base[0];
123 upriv->pmc_bar2 = (void *)base[2];
124 upriv->acpi_base = base[4];
126 /* Since PCI is not enabled, we must get the BDF manually */
127 plat->bdf = pci_get_devfn(dev);
129 return log_msg_ret("Cannot get PMC PCI address", plat->bdf);
131 /* Get the dwX values for pmc gpe settings */
132 size = dev_read_size(dev, "gpe0-dw");
134 return log_msg_ret("Cannot read gpe0-dm", size);
135 upriv->gpe0_count = size / sizeof(u32);
136 ret = dev_read_u32_array(dev, "gpe0-dw", upriv->gpe0_dw,
139 return log_msg_ret("Bad gpe0-dw", ret);
141 return pmc_ofdata_to_uc_platdata(dev);
143 struct dtd_intel_apl_pmc *dtplat = &plat->dtplat;
145 plat->bdf = pci_ofplat_get_devfn(dtplat->reg[0]);
146 upriv->pmc_bar0 = (void *)dtplat->early_regs[0];
147 upriv->pmc_bar2 = (void *)dtplat->early_regs[2];
148 upriv->acpi_base = dtplat->early_regs[4];
149 upriv->gpe0_dwx_mask = dtplat->gpe0_dwx_mask;
150 upriv->gpe0_dwx_shift_base = dtplat->gpe0_dwx_shift_base;
151 upriv->gpe0_sts_reg = dtplat->gpe0_sts;
152 upriv->gpe0_sts_reg += upriv->acpi_base;
153 upriv->gpe0_en_reg = dtplat->gpe0_en;
154 upriv->gpe0_en_reg += upriv->acpi_base;
155 upriv->gpe0_count = min((int)ARRAY_SIZE(dtplat->gpe0_dw), GPE0_REG_MAX);
156 memcpy(upriv->gpe0_dw, dtplat->gpe0_dw, sizeof(dtplat->gpe0_dw));
158 upriv->gpe_cfg = (u32 *)(upriv->pmc_bar0 + GPIO_GPE_CFG);
163 static int enable_pmcbar(struct udevice *dev)
165 struct acpi_pmc_upriv *upriv = dev_get_uclass_priv(dev);
166 struct apl_pmc_platdata *priv = dev_get_platdata(dev);
167 pci_dev_t pmc = priv->bdf;
170 * Set PMC base addresses and enable decoding. BARs 1 and 3 are 64-bit
173 pci_x86_write_config(pmc, PCI_BASE_ADDRESS_0, (ulong)upriv->pmc_bar0,
175 pci_x86_write_config(pmc, PCI_BASE_ADDRESS_1, 0, PCI_SIZE_32);
176 pci_x86_write_config(pmc, PCI_BASE_ADDRESS_2, (ulong)upriv->pmc_bar2,
178 pci_x86_write_config(pmc, PCI_BASE_ADDRESS_3, 0, PCI_SIZE_32);
179 pci_x86_write_config(pmc, PCI_BASE_ADDRESS_4, upriv->acpi_base,
181 pci_x86_write_config(pmc, PCI_COMMAND, PCI_COMMAND_IO |
182 PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER,
188 static int apl_pmc_probe(struct udevice *dev)
190 if (spl_phase() == PHASE_TPL)
191 return enable_pmcbar(dev);
196 static struct acpi_pmc_ops apl_pmc_ops = {
197 .init = apl_pmc_fill_power_state,
198 .prev_sleep_state = apl_prev_sleep_state,
199 .disable_tco = apl_disable_tco,
200 .global_reset_set_enable = apl_global_reset_set_enable,
203 static const struct udevice_id apl_pmc_ids[] = {
204 { .compatible = "intel,apl-pmc" },
208 U_BOOT_DRIVER(apl_pmc) = {
209 .name = "intel_apl_pmc",
210 .id = UCLASS_ACPI_PMC,
211 .of_match = apl_pmc_ids,
212 .ofdata_to_platdata = apl_pmc_ofdata_to_uc_platdata,
213 .probe = apl_pmc_probe,
215 .platdata_auto_alloc_size = sizeof(struct apl_pmc_platdata),