aboutsummaryrefslogtreecommitdiff
path: root/src/ec/google/chromeec/ec_lpc.c
diff options
context:
space:
mode:
authorAlexandru Gagniuc <alexandrux.gagniuc@intel.com>2016-03-30 14:38:44 -0700
committerMartin Roth <martinroth@google.com>2016-05-06 18:59:00 +0200
commit851ef96f4e44888095d4f4f435fa68d44dbe2240 (patch)
tree38fec3230bbef2d1d991a88278e339eb0b59b4b1 /src/ec/google/chromeec/ec_lpc.c
parent3aa34a8167c0e0f0ecdb823b5ab1de5c3b171f06 (diff)
ec/google/chromeec/ec_lpc: Declare used IO ports as a resource
Chrome EC uses IO ports 0x800 -> 0x9ff to communicate over LPC; however, those ports were not declared as a resource. This had two major downsides: * It allowed the allocator to assign said ports to other devices * It required manually open up an IO window in the LPC bridge. The LPC bridge on many chromeec boards had to be painstakingly adjusted to meet these constraints. The advantage of declaring the resources upfront is that the lpc bridge can now scan its child resources and automatically open up IO windows, as requested by its LPC children devices. Change-Id: I35c4e48dddb7300674d7a9858b590c1f20e3b0e3 Signed-off-by: Alexandru Gagniuc <alexandrux.gagniuc@intel.com> Reviewed-on: https://review.coreboot.org/14585 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Tested-by: build bot (Jenkins)
Diffstat (limited to 'src/ec/google/chromeec/ec_lpc.c')
-rw-r--r--src/ec/google/chromeec/ec_lpc.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/ec/google/chromeec/ec_lpc.c b/src/ec/google/chromeec/ec_lpc.c
index 021735ec6b..f9d0f8bfc7 100644
--- a/src/ec/google/chromeec/ec_lpc.c
+++ b/src/ec/google/chromeec/ec_lpc.c
@@ -14,6 +14,7 @@
*/
#include <arch/io.h>
+#include <assert.h>
#include <console/console.h>
#include <delay.h>
#include <device/pnp.h>
@@ -407,9 +408,35 @@ static void lpc_ec_init(struct device *dev)
google_chromeec_init();
}
+/*
+ * Declare the IO ports that we are using:
+ *
+ * All ECs (not explicitly declared):
+ * 0x60/0x64, 0x62/0x66, 0x80, 0x200->0x207
+ *
+ * mec1322: 0x800->0x807
+ * All others: 0x800->0x9ff
+ *
+ * EC_GOOGLE_CHROMEEC_ACPI_MEMMAP is only used for MEC ECs.
+ */
static void lpc_ec_read_resources(struct device *dev)
{
- /* Nothing, but this function avoids an error on serial console. */
+ unsigned int idx = 0;
+ struct resource * res;
+
+
+ res = new_resource(dev, idx++);
+ if (IS_ENABLED(CONFIG_EC_GOOGLE_CHROMEEC_MEC)) {
+ res->base = MEC_EMI_BASE;
+ res->size = MEC_EMI_SIZE;
+ } else {
+ res->base = EC_HOST_CMD_REGION0;
+ res->size = 2 * EC_HOST_CMD_REGION_SIZE;
+ /* Make sure MEMMAP region follows host cmd region. */
+ assert(res->base + res->size == EC_LPC_ADDR_MEMMAP);
+ res->size += EC_MEMMAP_SIZE;
+ }
+ res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED | IORESOURCE_FIXED;
}
static void lpc_ec_enable_resources(struct device *dev)