allocator_v4: Fix top-level allocations w/o IORESOURCE_ABOVE_4G
When moving the code to allocate at the top level in commit 9260ea60bf
(allocator_v4: Use memranges only for toplevel), a call to restrict the
limit of the resource was dropped. Probably by accident in one of the
earliest rebases. Without this call to effective_limit(), 64-bit resour-
ces at the top level, i.e. PCI bus 0, were always placed above 4G. Even
when this was not requested with the IORESOURCE_ABOVE_4G flag.
Tested on kontron/ktqm77 where the issue could be reproduced with
x86_64. Without the fix, boot hangs when trying to access the GMA
MMIO registers of PCI 00:02.0, which were placed above 4G.
Change-Id: Ied3a0695ef5e91f092bf2d442c1c482057643483
Signed-off-by: Nico Huber <nico.h@gmx.de>
Found-by: 9elements QA
Reviewed-on: https://review.coreboot.org/c/coreboot/+/76090
Reviewed-by: Felix Singer <service+coreboot-gerrit@felixsinger.de>
Reviewed-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-by: Eric Lai <eric_lai@quanta.corp-partner.google.com>
Reviewed-by: Paul Menzel <paulepanter@mailbox.org>
Reviewed-by: Lean Sheng Tan <sheng.tan@9elements.com>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
f31ab7a497
commit
0754e00ace
|
@ -401,8 +401,8 @@ static void allocate_toplevel_resources(const struct device *const domain,
|
||||||
if (!res->size)
|
if (!res->size)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!memranges_steal(&ranges, res->limit, res->size, res->align, type, &base,
|
if (!memranges_steal(&ranges, effective_limit(res), res->size, res->align,
|
||||||
CONFIG(RESOURCE_ALLOCATION_TOP_DOWN))) {
|
type, &base, CONFIG(RESOURCE_ALLOCATION_TOP_DOWN))) {
|
||||||
printk(BIOS_ERR, "Resource didn't fit!!!\n");
|
printk(BIOS_ERR, "Resource didn't fit!!!\n");
|
||||||
print_failed_res(dev, res);
|
print_failed_res(dev, res);
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Reference in New Issue