aboutsummaryrefslogtreecommitdiff
path: root/src/soc/intel/apollolake/pmc.c
diff options
context:
space:
mode:
authorAlexandru Gagniuc <alexandrux.gagniuc@intel.com>2016-05-18 14:41:48 -0700
committerMartin Roth <martinroth@google.com>2016-06-04 23:46:44 +0200
commita942bd49525706f88abe3558b17611ef64738072 (patch)
tree790f91559c5388e7faa20f48fa53493bb160ad9f /src/soc/intel/apollolake/pmc.c
parent68e1dcfdd940db05c282c601b58dd86f97b44767 (diff)
soc/apollolake/pmc: Store the ACPI bar during set_resources stage
Because the resource for the ACPI BAR is fixed, pci_dev_set_resources does not store it to the device. This means we need to do part of the dance to get the ACPI IO region to work after coreboot. Of course, this BAR can be destroyed later by the OS probing it, but at least we try to get it working out of coreboot. Change-Id: Ibff18d30936f94d4f149a89313254531365f43e6 Signed-off-by: Alexandru Gagniuc <alexandrux.gagniuc@intel.com> Reviewed-on: https://review.coreboot.org/15048 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Diffstat (limited to 'src/soc/intel/apollolake/pmc.c')
-rw-r--r--src/soc/intel/apollolake/pmc.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/soc/intel/apollolake/pmc.c b/src/soc/intel/apollolake/pmc.c
index 8cf9843924..c88e14c4c0 100644
--- a/src/soc/intel/apollolake/pmc.c
+++ b/src/soc/intel/apollolake/pmc.c
@@ -38,9 +38,29 @@ static void read_resources(device_t dev)
res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
}
+/*
+ * Part 2:
+ * Resources are assigned, and no other device was given an IO resource to
+ * overlap with our ACPI BAR. But because the resource is FIXED,
+ * pci_dev_set_resources() will not store it for us. We need to do that
+ * explicitly.
+ */
+static void set_resources(device_t dev)
+{
+ struct resource *res;
+
+ pci_dev_set_resources(dev);
+
+ res = find_resource(dev, PCI_BASE_ADDRESS_4);
+ pci_write_config32(dev, res->index, res->base);
+ dev->command |= PCI_COMMAND_IO;
+ res->flags |= IORESOURCE_STORED;
+ report_resource_stored(dev, res, " ACPI BAR");
+}
+
static const struct device_operations device_ops = {
.read_resources = read_resources,
- .set_resources = pci_dev_set_resources,
+ .set_resources = set_resources,
.enable_resources = pci_dev_enable_resources,
};