Furquan Shaikh has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/41418 )
Change subject: memrange: Add helper for stealing memory from the last range in the list
......................................................................
memrange: Add helper for stealing memory from the last range in the list
This change adds a helper fucntion memranges_steal_last() that allows
the caller to request memory to be stolen from the last range in the
list. Memory is stolen from the start of the last range and matches
the constraints (limit, align, tag, size) provided by the caller.
The current helper functin memranges_steal() defaults to always
returning stolen memory from the first available range in the list.
Additionally, this change updates the internal function
memranges_find_entry() to handle stealing from first and last entries
as requested by the caller.
Change-Id: I70c07e587597b44306857f0e52eb47b330ca3b1b
Signed-off-by: Furquan Shaikh <furquan(a)google.com>
---
M src/include/memrange.h
M src/lib/memrange.c
2 files changed, 59 insertions(+), 9 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/18/41418/1
diff --git a/src/include/memrange.h b/src/include/memrange.h
index 2b8c00e..4b64e1a 100644
--- a/src/include/memrange.h
+++ b/src/include/memrange.h
@@ -160,7 +160,8 @@
struct range_entry *memranges_next_entry(struct memranges *ranges,
const struct range_entry *r);
-/* Steals memory from the available list in given ranges as per the constraints:
+/* Steals memory from the first available entry in the list of given ranges as per the
+ * constraints:
* limit = Upper bound for the memory range to steal (Inclusive).
* size = Requested size for the stolen memory.
* align = Required alignment(log 2) for the starting address of the stolen memory.
@@ -172,4 +173,18 @@
bool memranges_steal(struct memranges *ranges, resource_t limit, resource_t size,
unsigned char align, unsigned long tag, resource_t *stolen_base);
+
+/* Steals memory from the last available entry in the list of given ranges as per the
+ * constraints:
+ * limit = Upper bound for the memory range to steal (Inclusive).
+ * size = Requested size for the stolen memory.
+ * align = Required alignment(log 2) for the starting address of the stolen memory.
+ * tag = Use a range that matches the given tag.
+ *
+ * If the constraints can be satisfied, this function creates a hole in the memrange,
+ * writes the base address of that hole to stolen_base and returns true. Otherwise it returns
+ * false. */
+bool memranges_steal_last(struct memranges *ranges, resource_t limit, resource_t size,
+ unsigned char align, unsigned long tag, resource_t *stolen_base);
+
#endif /* MEMRANGE_H_ */
diff --git a/src/lib/memrange.c b/src/lib/memrange.c
index 39f502c..4b13b00 100644
--- a/src/lib/memrange.c
+++ b/src/lib/memrange.c
@@ -376,17 +376,27 @@
return r->next;
}
+enum {
+ STEAL_FIRST_AVAILABLE,
+ STEAL_LAST_AVAILABLE,
+}
+
/* Find a range entry that satisfies the given constraints to fit a hole that matches the
- * required alignment, is big enough, does not exceed the limit and has a matching tag. */
+ * required alignment, is big enough, does not exceed the limit and has a matching tag.
+ * Depending upon the value of "steal_from", this function either returns the first range entry
+ * that satisfies the constraints (STEAL_FIRST_AVAILABLE) or the last range entry that
+ * satisfies the constrains (STEAL_LAST_AVAILABLE). */
static const struct range_entry *memranges_find_entry(struct memranges *ranges,
resource_t limit, resource_t size,
- unsigned char align, unsigned long tag)
+ unsigned char align, unsigned long tag,
+ int steal_from)
{
const struct range_entry *r;
+ const struct range_entry *last_entry = NULL;
resource_t base, end;
if (size == 0)
- return NULL;
+ return false;
memranges_each_entry(r, ranges) {
@@ -407,17 +417,27 @@
if (end > limit)
break;
- return r;
+ last_entry = r;
+
+ /*
+ * If caller wants to steal from the first available range, then break and
+ * return the found entry.
+ */
+ if (steal_from == STEAL_FIRST_AVAILABLE)
+ break;
}
- return NULL;
+ return last_entry;
}
-bool memranges_steal(struct memranges *ranges, resource_t limit, resource_t size,
- unsigned char align, unsigned long tag, resource_t *stolen_base)
+static bool __memranges_steal(struct memranges *ranges, resource_t limit, resource_t size,
+ unsigned char align, unsigned long tag, resource_t *stolen_base,
+ int steal_from)
{
resource_t base;
- const struct range_entry *r = memranges_find_entry(ranges, limit, size, align, tag);
+ const struct range_entry *r;
+
+ r = memranges_find_entry(ranges, limit, size, align, tag, steal_from);
if (r == NULL)
return false;
@@ -428,4 +448,19 @@
*stolen_base = base;
return true;
+
+}
+
+bool memranges_steal(struct memranges *ranges, resource_t limit, resource_t size,
+ unsigned char align, unsigned long tag, resource_t *stolen_base)
+{
+ return __memranges_steal(ranges, limit, size, align, tag, stolen_base,
+ STEAL_FIRST_AVAILABLE);
+}
+
+bool memranges_steal_last(struct memranges *ranges, resource_t limit, resource_t size,
+ unsigned char align, unsigned long tag, resource_t *stolen_base)
+{
+ return __memranges_steal(ranges, limit, size, align, tag, stolen_base,
+ STEAL_LAST_AVAILABLE);
}
--
To view, visit https://review.coreboot.org/c/coreboot/+/41418
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I70c07e587597b44306857f0e52eb47b330ca3b1b
Gerrit-Change-Number: 41418
Gerrit-PatchSet: 1
Gerrit-Owner: Furquan Shaikh <furquan(a)google.com>
Gerrit-MessageType: newchange
Furquan Shaikh has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/41419 )
Change subject: device: Allocate memory in top-down fashion for child resources
......................................................................
device: Allocate memory in top-down fashion for child resources
This change updates the resource allocator to allocate resources for
children in a top-down fashion in the address space by using
memranges_steal_last() to get the last range that can satisy the
resource request.
This is done to maintain consistency with the old resource
allocator. There are some AMD chipsets in the tree that do not really
work well with the dynamic resource assignment since their resources are
not all defined correctly before the allocator runs.
Change-Id: If631b0d1fed445723ef506a2c7671faee0326d37
Signed-off-by: Furquan Shaikh <furquan(a)google.com>
---
M src/device/device.c
1 file changed, 8 insertions(+), 2 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/19/41419/1
diff --git a/src/device/device.c b/src/device/device.c
index d3102bb..b3f3a6e 100644
--- a/src/device/device.c
+++ b/src/device/device.c
@@ -839,8 +839,14 @@
continue;
}
- if (memranges_steal(ranges, resource->limit, resource->size, resource->align,
- type_match, &resource->base) == false) {
+ /*
+ * Steal memory from the last available range in the list so that the allocation
+ * happens in top-down fashion in the address space. This is done to maintain
+ * consistency with old resource allocator.
+ */
+ if (memranges_steal_last(ranges, resource->limit, resource->size,
+ resource->align, type_match,
+ &resource->base) == false) {
printk(BIOS_ERR, "ERROR: Resource didn't fit!!! ");
printk(BIOS_SPEW, "%s %02lx * size: 0x%llx limit: %llx %s\n",
dev_path(dev), resource->index,
--
To view, visit https://review.coreboot.org/c/coreboot/+/41419
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: If631b0d1fed445723ef506a2c7671faee0326d37
Gerrit-Change-Number: 41419
Gerrit-PatchSet: 1
Gerrit-Owner: Furquan Shaikh <furquan(a)google.com>
Gerrit-MessageType: newchange
Name of user not set #1002959 has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/41689 )
Change subject: added a new fmap for the qemu-q35 emulation that contains only a read-only section
......................................................................
added a new fmap for the qemu-q35 emulation
that contains only a read-only section
Change-Id: Ie7c977ab3513be974e1e2ab39f6e05f068121df8
Signed-off-by: A. Bach <zeit(a)manchmal-nie.de>
---
A src/mainboard/emulation/qemu-q35/vboot-ro-16M.fmd
1 file changed, 14 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/89/41689/1
diff --git a/src/mainboard/emulation/qemu-q35/vboot-ro-16M.fmd b/src/mainboard/emulation/qemu-q35/vboot-ro-16M.fmd
new file mode 100644
index 0000000..4d4fcd6
--- /dev/null
+++ b/src/mainboard/emulation/qemu-q35/vboot-ro-16M.fmd
@@ -0,0 +1,14 @@
+FLASH@0xff000000 0x1000000 {
+ SI_BIOS 0x1000000 {
+ RW_VPD(PRESERVE) 0x1000
+
+ WP_RO {
+ FMAP 0x800
+ RO_FRID 0x40
+ RO_PADDING 0x7c0
+ RO_VPD(PRESERVE) 0x1000
+ GBB 0x1e000
+ COREBOOT(CBFS)
+ }
+ }
+}
--
To view, visit https://review.coreboot.org/c/coreboot/+/41689
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: Ie7c977ab3513be974e1e2ab39f6e05f068121df8
Gerrit-Change-Number: 41689
Gerrit-PatchSet: 1
Gerrit-Owner: Name of user not set #1002959
Gerrit-MessageType: newchange