[coreboot-gerrit] New patch to review for coreboot: 141775d resource: Refactor IORESOURCE flags use
Kyösti Mälkki (kyosti.malkki@gmail.com)
gerrit at coreboot.org
Tue Mar 24 05:29:51 CET 2015
Kyösti Mälkki (kyosti.malkki at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8891
-gerrit
commit 141775d439ddf2f27933e6c94a1da894ad471560
Author: Kyösti Mälkki <kyosti.malkki at gmail.com>
Date: Sat Mar 21 19:55:23 2015 +0200
resource: Refactor IORESOURCE flags use
The type of a resource is really an enumeration but our implementation
is as a bitmask. Compare all relevant bits and remove the shadowed
declarations of IORESOURCE bits.
Change-Id: I7f605d72ea702eb4fa6019ca1297f98d240c4f1a
Signed-off-by: Kyösti Mälkki <kyosti.malkki at gmail.com>
---
src/device/device.c | 79 +++++++++++++++++++++++++++--------------------------
1 file changed, 40 insertions(+), 39 deletions(-)
diff --git a/src/device/device.c b/src/device/device.c
index c6b3f59..dc53d62 100644
--- a/src/device/device.c
+++ b/src/device/device.c
@@ -612,20 +612,35 @@ static void allocate_resources(struct bus *bus, struct resource *bridge,
}
#if CONFIG_PCI_64BIT_PREF_MEM
-#define MEM_MASK (IORESOURCE_PREFETCH | IORESOURCE_MEM)
+#define IORESOURCE_TYPE (IORESOURCE_IO | IORESOURCE_MEM | IORESOURCE_PREFETCH)
#else
-#define MEM_MASK (IORESOURCE_MEM)
+#define IORESOURCE_TYPE (IORESOURCE_IO | IORESOURCE_MEM)
#endif
-#define IO_MASK (IORESOURCE_IO)
-#define PREF_TYPE (IORESOURCE_PREFETCH | IORESOURCE_MEM)
-#define MEM_TYPE (IORESOURCE_MEM)
-#define IO_TYPE (IORESOURCE_IO)
+static int resource_is(struct resource *res, u32 type)
+{
+ return (res->flags & IORESOURCE_TYPE) == type;
+}
struct constraints {
struct resource pref, io, mem;
};
+static struct resource * resource_limit(struct constraints *limits, struct resource *res)
+{
+ struct resource *lim = NULL;
+
+ /* PREFETCH, MEM, or I/O - skip any others. */
+ if (resource_is(res, IORESOURCE_MEM))
+ lim = &limits->mem;
+ else if (resource_is(res, IORESOURCE_IO))
+ lim = &limits->io;
+ else if (resource_is(res, IORESOURCE_MEM | IORESOURCE_PREFETCH))
+ lim = &limits->pref;
+
+ return lim;
+}
+
static void constrain_resources(struct device *dev, struct constraints* limits)
{
struct device *child;
@@ -644,14 +659,8 @@ static void constrain_resources(struct device *dev, struct constraints* limits)
continue;
}
- /* PREFETCH, MEM, or I/O - skip any others. */
- if ((res->flags & MEM_MASK) == PREF_TYPE)
- lim = &limits->pref;
- else if ((res->flags & MEM_MASK) == MEM_TYPE)
- lim = &limits->mem;
- else if ((res->flags & IO_MASK) == IO_TYPE)
- lim = &limits->io;
- else
+ lim = resource_limit(limits, res);
+ if (!lim)
continue;
/*
@@ -692,6 +701,7 @@ static void avoid_fixed_resources(struct device *dev)
{
struct constraints limits;
struct resource *res;
+ struct resource *lim;
printk(BIOS_SPEW, "%s: %s\n", __func__, dev_path(dev));
@@ -708,15 +718,14 @@ static void avoid_fixed_resources(struct device *dev)
if ((res->flags & IORESOURCE_FIXED))
continue;
- if ((res->flags & MEM_MASK) == PREF_TYPE &&
- (res->limit < limits.pref.limit))
- limits.pref.limit = res->limit;
- if ((res->flags & MEM_MASK) == MEM_TYPE &&
- (res->limit < limits.mem.limit))
- limits.mem.limit = res->limit;
- if ((res->flags & IO_MASK) == IO_TYPE &&
- (res->limit < limits.io.limit))
- limits.io.limit = res->limit;
+ lim = resource_limit(&limits, res);
+ if (!lim)
+ continue;
+
+ if (res->base > lim->base)
+ lim->base = res->base;
+ if (res->limit < lim->limit)
+ lim->limit = res->limit;
printk(BIOS_SPEW, "%s:@%s %02lx base %08llx limit %08llx\n",
__func__, dev_path(dev), res->index, res->base, res->limit);
@@ -727,19 +736,11 @@ static void avoid_fixed_resources(struct device *dev)
/* Update dev's resources with new limits. */
for (res = dev->resource_list; res; res = res->next) {
- struct resource *lim;
-
if ((res->flags & IORESOURCE_FIXED))
continue;
- /* PREFETCH, MEM, or I/O - skip any others. */
- if ((res->flags & MEM_MASK) == PREF_TYPE)
- lim = &limits.pref;
- else if ((res->flags & MEM_MASK) == MEM_TYPE)
- lim = &limits.mem;
- else if ((res->flags & IO_MASK) == IO_TYPE)
- lim = &limits.io;
- else
+ lim = resource_limit(&limits, res);
+ if (!lim)
continue;
/* Is the resource outside the limits? */
@@ -1042,17 +1043,17 @@ void dev_configure(void)
continue;
if (res->flags & IORESOURCE_PREFETCH) {
compute_resources(child->link_list,
- res, MEM_MASK, PREF_TYPE);
+ res, IORESOURCE_TYPE, (IORESOURCE_PREFETCH | IORESOURCE_MEM));
continue;
}
if (res->flags & IORESOURCE_MEM) {
compute_resources(child->link_list,
- res, MEM_MASK, MEM_TYPE);
+ res, IORESOURCE_TYPE, IORESOURCE_MEM);
continue;
}
if (res->flags & IORESOURCE_IO) {
compute_resources(child->link_list,
- res, IO_MASK, IO_TYPE);
+ res, IORESOURCE_TYPE, IORESOURCE_IO);
continue;
}
}
@@ -1074,17 +1075,17 @@ void dev_configure(void)
continue;
if (res->flags & IORESOURCE_PREFETCH) {
allocate_resources(child->link_list,
- res, MEM_MASK, PREF_TYPE);
+ res, IORESOURCE_TYPE, (IORESOURCE_PREFETCH | IORESOURCE_MEM));
continue;
}
if (res->flags & IORESOURCE_MEM) {
allocate_resources(child->link_list,
- res, MEM_MASK, MEM_TYPE);
+ res, IORESOURCE_TYPE, IORESOURCE_MEM);
continue;
}
if (res->flags & IORESOURCE_IO) {
allocate_resources(child->link_list,
- res, IO_MASK, IO_TYPE);
+ res, IORESOURCE_TYPE, IORESOURCE_IO);
continue;
}
}
More information about the coreboot-gerrit
mailing list