Patrick Rudolph has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/33934
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
lib: Rewrite qemu-armv7 ramdetect
* Move armv7 RAM dection to a common place * Enable it for all emulated platforms * Use 32bit probe values and restore memory even on failure * Use the new logic on the following boards: ** qemu-armv7 ** qemu-riscv
Tested on qemu-system-riscv: Fixes kernel panic due to wrong memory limits reported.
Change-Id: I37386c6a95bfc3b7b25aeae32c6e14cff9913513 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- A src/include/ramdetect.h M src/lib/Makefile.inc A src/lib/ramdetect.c M src/mainboard/emulation/qemu-armv7/Kconfig M src/mainboard/emulation/qemu-armv7/cbmem.c M src/mainboard/emulation/qemu-armv7/mainboard.c M src/mainboard/emulation/qemu-riscv/mainboard.c M src/soc/ucb/riscv/cbmem.c 8 files changed, 115 insertions(+), 58 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/34/33934/1
diff --git a/src/include/ramdetect.h b/src/include/ramdetect.h new file mode 100644 index 0000000..b63cdf1 --- /dev/null +++ b/src/include/ramdetect.h @@ -0,0 +1,22 @@ +/* + * This file is part of the coreboot project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* + * Probe an area if it's read/writable. + * Primary use case is the detection of DRAM amount on emulators. + * + * @param dram_start Physical address of DRAM start + * @param probe_size Maximum size in MiB to probe for + * @return The detected DRAM size in MiB + */ +size_t probe_ramsize(const uintptr_t dram_start, const size_t probe_size); diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc index 16d5c64..a006182 100644 --- a/src/lib/Makefile.inc +++ b/src/lib/Makefile.inc @@ -67,6 +67,7 @@ verstage-$(CONFIG_GENERIC_UDELAY) += timer.c verstage-$(CONFIG_GENERIC_GPIO_LIB) += gpio.c
+romstage-$(CONFIG_VENDOR_EMULATION) += ramdetect.c romstage-y += prog_loaders.c romstage-y += prog_ops.c romstage-y += memchr.c @@ -109,6 +110,7 @@
romstage-$(CONFIG_GENERIC_UDELAY) += timer.c
+ramstage-$(CONFIG_VENDOR_EMULATION) += ramdetect.c ramstage-y += prog_loaders.c ramstage-y += prog_ops.c ramstage-y += hardwaremain.c @@ -159,6 +161,7 @@ ramstage-y += imd_cbmem.c ramstage-y += imd.c
+postcar-$(CONFIG_VENDOR_EMULATION) += ramdetect.c postcar-y += cbmem_common.c postcar-$(CONFIG_CONSOLE_CBMEM) += cbmem_console.c postcar-y += imd_cbmem.c diff --git a/src/lib/ramdetect.c b/src/lib/ramdetect.c new file mode 100644 index 0000000..1cdb378 --- /dev/null +++ b/src/lib/ramdetect.c @@ -0,0 +1,77 @@ +/* + * This file is part of the coreboot project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <stddef.h> +#include <symbols.h> +#include <device/mmio.h> +#include <ramdetect.h> +#include <console/console.h> + +#define PATTERN1 0x55aa55aa +#define PATTERN2 0x12345678 + +#define OVERLAP(a, b, s, e) ((b) > (a) && (a) < (e)) + +static int probe_mb(const uintptr_t dram_start, const uintptr_t mib) +{ + uintptr_t addr = dram_start + (mib * MiB) - sizeof(uint32_t); + void *ptr = (void *) addr; + int ret = 0; + + /* Don't accidentally clobering oneself. */ + if (OVERLAP(addr, addr + sizeof(uint32_t), (uintptr_t)_program, (uintptr_t) _eprogram)) + return 1; + + uint32_t old = read32(ptr); + + write32(ptr, PATTERN1); + if (read32(ptr) != PATTERN1) + goto out; + write32(ptr, PATTERN2); + if (read32(ptr) != PATTERN2) + goto out; + ret = 1; +out: + write32(ptr, old); + return ret; +} + +/* Probe an area if it's read/writable. */ +size_t probe_ramsize(const uintptr_t dram_start, const size_t probe_size) +{ + int i; + int msb = 1; + size_t discovered = 0; + + static size_t saved_result; + if (saved_result) + return saved_result; + + /* Find the MSB + 1. */ + size_t tmp = probe_size; + while (tmp >>= 1) + msb++; + + /* Limit search to accessible address space */ + if (msb > (sizeof(size_t) * 8 - 20)) + msb = sizeof(size_t) * 8 - 20; + + /* Compact binary search. */ + for (i = msb; i >= 0; i--) + if (probe_mb(dram_start, (discovered | (1 << i)))) + discovered |= (1 << i); + + saved_result = discovered; + printk(BIOS_DEBUG, "RAMDETECT: Found %zu MiB RAM\n", discovered); + return discovered; +} diff --git a/src/mainboard/emulation/qemu-armv7/Kconfig b/src/mainboard/emulation/qemu-armv7/Kconfig index 0bb5f3a..75cede9 100644 --- a/src/mainboard/emulation/qemu-armv7/Kconfig +++ b/src/mainboard/emulation/qemu-armv7/Kconfig @@ -52,4 +52,8 @@ string default "ARM Ltd."
+config DRAM_SIZE_MB + int + default 1024 + endif # BOARD_EMULATION_QEMU_ARMV7 diff --git a/src/mainboard/emulation/qemu-armv7/cbmem.c b/src/mainboard/emulation/qemu-armv7/cbmem.c index 927bd42..09ba289 100644 --- a/src/mainboard/emulation/qemu-armv7/cbmem.c +++ b/src/mainboard/emulation/qemu-armv7/cbmem.c @@ -11,55 +11,10 @@ * GNU General Public License for more details. */
-#include <stddef.h> #include <cbmem.h> -#include <symbols.h> -#include <device/mmio.h> -#include "mainboard.h" - -#define PATTERN1 0x55 -#define PATTERN2 0xaa - -/* Returns 1 if mebibyte mb is present and 0 otherwise. */ -static int probe_mb(int mb) -{ - char *ptr = (char *) 0x60000000 + (mb << 20) + 0xfffff; - char old; - if (ptr < (char *) &_eprogram) { - /* Don't probe below _end to avoid accidentally clobering - oneself. */ - return 1; - } - - old = read8(ptr); - write8(ptr, PATTERN1); - if (read8(ptr) != PATTERN1) - return 0; - write8(ptr, PATTERN2); - if (read8(ptr) != PATTERN2) - return 0; - write8(ptr, old); - return 1; -} - -int probe_ramsize(void) -{ - int i; - int discovered = 0; - static int saved_result; - if (saved_result) - return saved_result; - /* Compact binary search. */ - /* 1 GiB is the largest supported RAM by this machine. */ - for (i = 9; i >= 0; i--) - if (probe_mb(discovered | (1 << i))) - discovered |= (1 << i); - discovered++; - saved_result = discovered; - return discovered; -} +#include <ramdetect.h>
void *cbmem_top(void) { - return _dram + (probe_ramsize() << 20); + return _dram + (probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB) << 20); } diff --git a/src/mainboard/emulation/qemu-armv7/mainboard.c b/src/mainboard/emulation/qemu-armv7/mainboard.c index cc14dd8..c04645d 100644 --- a/src/mainboard/emulation/qemu-armv7/mainboard.c +++ b/src/mainboard/emulation/qemu-armv7/mainboard.c @@ -57,7 +57,7 @@ halt(); }
- discovered = probe_ramsize(); + discovered = probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB); printk(BIOS_DEBUG, "%d MiB of RAM discovered\n", discovered); ram_resource(dev, 0, 0x60000000 >> 10, discovered << 10); cbmem_recovery(0); diff --git a/src/mainboard/emulation/qemu-riscv/mainboard.c b/src/mainboard/emulation/qemu-riscv/mainboard.c index 4b428aa..66ba56ed 100644 --- a/src/mainboard/emulation/qemu-riscv/mainboard.c +++ b/src/mainboard/emulation/qemu-riscv/mainboard.c @@ -17,6 +17,7 @@ #include <device/device.h> #include <cbmem.h> #include <symbols.h> +#include <ramdetect.h>
static void mainboard_enable(struct device *dev) { @@ -25,7 +26,8 @@ die("No dev0; die\n"); }
- ram_resource(dev, 0, (uintptr_t)_dram / KiB, CONFIG_DRAM_SIZE_MB * KiB); + ram_resource(dev, 0, (uintptr_t)_dram / KiB, + probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB) << 10); cbmem_recovery(0); }
diff --git a/src/soc/ucb/riscv/cbmem.c b/src/soc/ucb/riscv/cbmem.c index 2ee400a..1a1d86b 100644 --- a/src/soc/ucb/riscv/cbmem.c +++ b/src/soc/ucb/riscv/cbmem.c @@ -12,16 +12,10 @@ */
#include <cbmem.h> +#include <symbols.h> +#include <ramdetect.h>
void *cbmem_top(void) { - uintptr_t base; - size_t size; - - /* Use dummy values until we can query the memory size again */ - //query_mem(configstring(), &base, &size); - base = 0x80000000; - size = 128 * MiB; - - return (void *)(base + size); + return _dram + (probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB) << 20); }
Paul Menzel has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 1:
(3 comments)
https://review.coreboot.org/#/c/33934/1/src/lib/ramdetect.c File src/lib/ramdetect.c:
https://review.coreboot.org/#/c/33934/1/src/lib/ramdetect.c@25 PS1, Line 25: int Use CB_SUCCESS and friend?
https://review.coreboot.org/#/c/33934/1/src/lib/ramdetect.c@31 PS1, Line 31: clobering clober
https://review.coreboot.org/#/c/33934/1/src/lib/ramdetect.c@66 PS1, Line 66: if (msb > (sizeof(size_t) * 8 - 20)) Can you add a comment, why multiply by 8 and subtract 20?
Hello ron minnich, Asami Doi, Philipp Deppenwiese, build bot (Jenkins), Philipp Hug, Xiang Wang,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/33934
to look at the new patch set (#2).
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
lib: Rewrite qemu-armv7 ramdetect
* Move armv7 RAM dection to a common place * Enable it for all emulated platforms * Use 32bit probe values and restore memory even on failure * Use the new logic on the following boards: ** qemu-armv7 ** qemu-riscv
Tested on qemu-system-riscv: Fixes kernel panic due to wrong memory limits reported.
Change-Id: I37386c6a95bfc3b7b25aeae32c6e14cff9913513 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- A src/include/ramdetect.h M src/lib/Makefile.inc A src/lib/ramdetect.c M src/mainboard/emulation/qemu-armv7/Kconfig M src/mainboard/emulation/qemu-armv7/cbmem.c M src/mainboard/emulation/qemu-armv7/mainboard.c M src/mainboard/emulation/qemu-riscv/mainboard.c M src/soc/ucb/riscv/cbmem.c 8 files changed, 115 insertions(+), 57 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/34/33934/2
Patrick Rudolph has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 2:
(3 comments)
https://review.coreboot.org/#/c/33934/1/src/lib/ramdetect.c File src/lib/ramdetect.c:
https://review.coreboot.org/#/c/33934/1/src/lib/ramdetect.c@25 PS1, Line 25: int
Use CB_SUCCESS and friend?
no as result is used in arithmethics
https://review.coreboot.org/#/c/33934/1/src/lib/ramdetect.c@31 PS1, Line 31: clobering
clober
Done
https://review.coreboot.org/#/c/33934/1/src/lib/ramdetect.c@66 PS1, Line 66: if (msb > (sizeof(size_t) * 8 - 20))
Can you add a comment, why multiply by 8 and subtract 20?
Done
Hello ron minnich, Asami Doi, Philipp Deppenwiese, build bot (Jenkins), Philipp Hug, Xiang Wang,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/33934
to look at the new patch set (#3).
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
lib: Rewrite qemu-armv7 ramdetect
* Move armv7 RAM dection to a common place * Enable it for all emulated platforms * Use 32bit probe values and restore memory even on failure * Use the new logic on the following boards: ** qemu-armv7 ** qemu-riscv
Tested on qemu-system-riscv: Fixes kernel panic due to wrong memory limits reported.
Change-Id: I37386c6a95bfc3b7b25aeae32c6e14cff9913513 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- A src/include/ramdetect.h M src/lib/Makefile.inc A src/lib/ramdetect.c M src/mainboard/emulation/qemu-armv7/Kconfig M src/mainboard/emulation/qemu-armv7/cbmem.c M src/mainboard/emulation/qemu-armv7/mainboard.c D src/mainboard/emulation/qemu-armv7/mainboard.h M src/mainboard/emulation/qemu-riscv/mainboard.c M src/soc/ucb/riscv/cbmem.c 9 files changed, 117 insertions(+), 81 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/34/33934/3
Paul Menzel has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 3: Code-Review+1
Philipp Hug has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 3:
(1 comment)
Thanks
https://review.coreboot.org/#/c/33934/3/src/mainboard/emulation/qemu-armv7/K... File src/mainboard/emulation/qemu-armv7/Kconfig:
https://review.coreboot.org/#/c/33934/3/src/mainboard/emulation/qemu-armv7/K... PS3, Line 55: config DRAM_SIZE_MB Why do you introduce a configuration for RAM size? Shouldn't this be detected automatically?
Maybe also add a TODO to get the RAM size from the fdt?
Patrick Rudolph has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 3:
(1 comment)
https://review.coreboot.org/#/c/33934/3/src/mainboard/emulation/qemu-armv7/K... File src/mainboard/emulation/qemu-armv7/Kconfig:
https://review.coreboot.org/#/c/33934/3/src/mainboard/emulation/qemu-armv7/K... PS3, Line 55: config DRAM_SIZE_MB
Why do you introduce a configuration for RAM size? […]
well kind of, it was used on other emulation boards already. It gives the maximum DRAM size while automatically detecting the DRAM size. Previously that constant was stored in the code.
Nico Huber has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 3:
Just wondering, doesn't qemu-armv7 have the same `fw_cfg` interface as the x86 ones? Then we could just use the reported memory regions?
Patrick Rudolph has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 3:
Patch Set 3:
Just wondering, doesn't qemu-armv7 have the same `fw_cfg` interface as the x86 ones? Then we could just use the reported memory regions?
yes, on armv7 it exists and is memory mapped. However on other architectures it does not exist. I like to use this code as fallback. Other methods like MMIO fw_cfg and FDT should be preferred, but right now they aren't implemented.
Patrick Rudolph has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 3:
(1 comment)
https://review.coreboot.org/c/coreboot/+/33934/3/src/mainboard/emulation/qem... File src/mainboard/emulation/qemu-armv7/Kconfig:
https://review.coreboot.org/c/coreboot/+/33934/3/src/mainboard/emulation/qem... PS3, Line 55: config DRAM_SIZE_MB
well kind of, it was used on other emulation boards already. […]
Done
Patrick Rudolph has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 3:
(1 comment)
https://review.coreboot.org/c/coreboot/+/33934/3/src/mainboard/emulation/qem... File src/mainboard/emulation/qemu-armv7/Kconfig:
https://review.coreboot.org/c/coreboot/+/33934/3/src/mainboard/emulation/qem... PS3, Line 55: config DRAM_SIZE_MB
Done
Done
HAOUAS Elyes has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 3: Code-Review+1
(1 comment)
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c File src/lib/ramdetect.c:
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@14 PS3, Line 14: stddef.h <types.h> as we also need stdint
Angel Pons has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 3:
(9 comments)
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c File src/lib/ramdetect.c:
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@23 PS3, Line 23: #define OVERLAP(a, b, s, e) ((b) > (a) && (a) < (e)) Um, how does this work? I think the first comparison is wrong, but I am not sure.
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@37 PS3, Line 37: write32(ptr, PATTERN1); : if (read32(ptr) != PATTERN1) : goto out; : write32(ptr, PATTERN2); : if (read32(ptr) != PATTERN2) : goto out; Maybe write this as a loop, and put the patterns in an array? This would also allow removing the "ret" variable.
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@52 PS3, Line 52: int i; : int msb = 1; Shouldn't these be unsigned?
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@61 PS3, Line 61: size_t tmp = probe_size; : while (tmp >>= 1) : msb++; Wouldn't this work as well?
msb = 0;
/* other code */
do { msb++; } while (probe_size >> msb)
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@66 PS3, Line 66: if (msb > (sizeof(size_t) * 8 - 20)) /* subtract 20 as probe_size is in MiB */ : msb = sizeof(size_t) * 8 - 20; #define MAX_ADDRESSABLE_SPACE (sizeof(size_t) * 8 - 20)
/* other code */
msb = MIN(msb, MAX_ADDRESSABLE_SPACE);
(macro name is an example)
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@70 PS3, Line 70: for (i = msb; i >= 0; i--) If using unsigned for i and msb, this loop might need to be rewritten. This may work:
i = msb + 1; do { i--; if (probe_mb(dram_start, (discovered | (1 << i)))) discovered |= (1 << i); } while (i > 0)
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@71 PS3, Line 71: 1 << i If using unsigned values, this should be: '(1U << i)' Maybe 1UL or 1ULL if the unsigned type is larger.
https://review.coreboot.org/c/coreboot/+/33934/3/src/mainboard/emulation/qem... File src/mainboard/emulation/qemu-riscv/mainboard.c:
https://review.coreboot.org/c/coreboot/+/33934/3/src/mainboard/emulation/qem... PS3, Line 30: << 10 * KiB ?
https://review.coreboot.org/c/coreboot/+/33934/3/src/soc/ucb/riscv/cbmem.c File src/soc/ucb/riscv/cbmem.c:
https://review.coreboot.org/c/coreboot/+/33934/3/src/soc/ucb/riscv/cbmem.c@2... PS3, Line 20: << 20 * MiB ?
Hello ron minnich, HAOUAS Elyes, Asami Doi, Angel Pons, Julius Werner, Paul Menzel, Philipp Deppenwiese, build bot (Jenkins), Philipp Hug, Xiang Wang,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/33934
to look at the new patch set (#4).
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
lib: Rewrite qemu-armv7 ramdetect
* Move armv7 RAM dection to a common place * Enable it for all emulated platforms * Use 32bit probe values and restore memory even on failure * Use the new logic on the following boards: ** qemu-armv7 ** qemu-riscv
Tested on qemu-system-riscv: Fixes kernel panic due to wrong memory limits reported.
Change-Id: I37386c6a95bfc3b7b25aeae32c6e14cff9913513 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- A src/include/ramdetect.h M src/lib/Makefile.inc A src/lib/ramdetect.c M src/mainboard/emulation/qemu-armv7/Kconfig M src/mainboard/emulation/qemu-armv7/cbmem.c M src/mainboard/emulation/qemu-armv7/mainboard.c D src/mainboard/emulation/qemu-armv7/mainboard.h M src/mainboard/emulation/qemu-riscv/mainboard.c M src/soc/ucb/riscv/cbmem.c 9 files changed, 123 insertions(+), 81 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/34/33934/4
Hello Asami Doi, Angel Pons, Julius Werner, Paul Menzel, build bot (Jenkins), Patrick Georgi, Philipp Hug, Xiang Wang, ron minnich, HAOUAS Elyes, Jonathan Neuschäfer, Philipp Deppenwiese, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/33934
to look at the new patch set (#5).
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
lib: Rewrite qemu-armv7 ramdetect
* Move armv7 RAM dection to a common place * Enable it for all emulated platforms * Use 32bit probe values and restore memory even on failure * Use the new logic on the following boards: ** qemu-armv7 ** qemu-riscv
Tested on qemu-system-riscv: Fixes kernel panic due to wrong memory limits reported.
Change-Id: I37386c6a95bfc3b7b25aeae32c6e14cff9913513 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- A src/include/ramdetect.h M src/lib/Makefile.inc A src/lib/ramdetect.c M src/mainboard/emulation/qemu-armv7/Kconfig M src/mainboard/emulation/qemu-armv7/cbmem.c M src/mainboard/emulation/qemu-armv7/mainboard.c D src/mainboard/emulation/qemu-armv7/mainboard.h M src/mainboard/emulation/qemu-riscv/mainboard.c M src/soc/ucb/riscv/cbmem.c 9 files changed, 123 insertions(+), 81 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/34/33934/5
Patrick Rudolph has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 5:
(10 comments)
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c File src/lib/ramdetect.c:
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@14 PS3, Line 14: stddef.h
<types.h> […]
Done
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@23 PS3, Line 23: #define OVERLAP(a, b, s, e) ((b) > (a) && (a) < (e))
Um, how does this work? I think the first comparison is wrong, but I am not sure.
Done
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@37 PS3, Line 37: write32(ptr, PATTERN1); : if (read32(ptr) != PATTERN1) : goto out; : write32(ptr, PATTERN2); : if (read32(ptr) != PATTERN2) : goto out;
Maybe write this as a loop, and put the patterns in an array? This would also allow removing the "re […]
Done
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@52 PS3, Line 52: int i; : int msb = 1;
Shouldn't these be unsigned?
Done
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@61 PS3, Line 61: size_t tmp = probe_size; : while (tmp >>= 1) : msb++;
Wouldn't this work as well? […]
Done
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@66 PS3, Line 66: if (msb > (sizeof(size_t) * 8 - 20)) /* subtract 20 as probe_size is in MiB */ : msb = sizeof(size_t) * 8 - 20;
#define MAX_ADDRESSABLE_SPACE (sizeof(size_t) * 8 - 20) […]
Done
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@70 PS3, Line 70: for (i = msb; i >= 0; i--)
If using unsigned for i and msb, this loop might need to be rewritten. This may work: […]
using signed integer. Prevent an overflow by subtracting 1 in MAX_ADDRESSABLE_SPACE.
https://review.coreboot.org/c/coreboot/+/33934/3/src/lib/ramdetect.c@71 PS3, Line 71: 1 << i
If using unsigned values, this should be: '(1U << i)' […]
Done
https://review.coreboot.org/c/coreboot/+/33934/3/src/mainboard/emulation/qem... File src/mainboard/emulation/qemu-riscv/mainboard.c:
https://review.coreboot.org/c/coreboot/+/33934/3/src/mainboard/emulation/qem... PS3, Line 30: << 10
- KiB ?
Done
https://review.coreboot.org/c/coreboot/+/33934/3/src/soc/ucb/riscv/cbmem.c File src/soc/ucb/riscv/cbmem.c:
https://review.coreboot.org/c/coreboot/+/33934/3/src/soc/ucb/riscv/cbmem.c@2... PS3, Line 20: << 20
- MiB ?
Done
HAOUAS Elyes has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 5: Code-Review+1
(2 comments)
https://review.coreboot.org/c/coreboot/+/33934/5/src/mainboard/emulation/qem... File src/mainboard/emulation/qemu-armv7/cbmem.c:
https://review.coreboot.org/c/coreboot/+/33934/5/src/mainboard/emulation/qem... PS5, Line 20: return _dram + : (probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB) * MiB); length less than 96 I think. one line ?
https://review.coreboot.org/c/coreboot/+/33934/5/src/soc/ucb/riscv/cbmem.c File src/soc/ucb/riscv/cbmem.c:
https://review.coreboot.org/c/coreboot/+/33934/5/src/soc/ucb/riscv/cbmem.c@2... PS5, Line 20: return _dram + : (probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB) * MiB); one line?
Hello Asami Doi, Angel Pons, Julius Werner, Paul Menzel, build bot (Jenkins), Patrick Georgi, Philipp Hug, Xiang Wang, ron minnich, HAOUAS Elyes, Jonathan Neuschäfer, Philipp Deppenwiese, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/33934
to look at the new patch set (#6).
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
lib: Rewrite qemu-armv7 ramdetect
* Move armv7 RAM dection to a common place * Enable it for all emulated platforms * Use 32bit probe values and restore memory even on failure * Use the new logic on the following boards: ** qemu-armv7 ** qemu-riscv
Tested on qemu-system-riscv: Fixes kernel panic due to wrong memory limits reported.
Change-Id: I37386c6a95bfc3b7b25aeae32c6e14cff9913513 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- A src/include/ramdetect.h M src/lib/Makefile.inc A src/lib/ramdetect.c M src/mainboard/emulation/qemu-armv7/Kconfig M src/mainboard/emulation/qemu-armv7/cbmem.c M src/mainboard/emulation/qemu-armv7/mainboard.c D src/mainboard/emulation/qemu-armv7/mainboard.h M src/mainboard/emulation/qemu-riscv/mainboard.c M src/soc/ucb/riscv/cbmem.c 9 files changed, 121 insertions(+), 81 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/34/33934/6
Patrick Rudolph has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 6:
(2 comments)
https://review.coreboot.org/c/coreboot/+/33934/5/src/mainboard/emulation/qem... File src/mainboard/emulation/qemu-armv7/cbmem.c:
https://review.coreboot.org/c/coreboot/+/33934/5/src/mainboard/emulation/qem... PS5, Line 20: return _dram + : (probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB) * MiB);
length less than 96 I think. […]
Done
https://review.coreboot.org/c/coreboot/+/33934/5/src/soc/ucb/riscv/cbmem.c File src/soc/ucb/riscv/cbmem.c:
https://review.coreboot.org/c/coreboot/+/33934/5/src/soc/ucb/riscv/cbmem.c@2... PS5, Line 20: return _dram + : (probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB) * MiB);
one line?
Done
Angel Pons has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 6: Code-Review+2
(2 comments)
Other than two small things, LGTM
https://review.coreboot.org/c/coreboot/+/33934/6/src/lib/ramdetect.c File src/lib/ramdetect.c:
https://review.coreboot.org/c/coreboot/+/33934/6/src/lib/ramdetect.c@22 PS6, Line 22: mib Minor: I'd suggest using a different name to avoid confusion with the 'MiB' constant
https://review.coreboot.org/c/coreboot/+/33934/6/src/lib/ramdetect.c@30 PS6, Line 30: int This could be an unsigned type, e.g. size_t?
Avoids having several signed/unsigned comparisons, since ARRAY_SIZE returns size_t
Hello Asami Doi, Angel Pons, Julius Werner, Paul Menzel, build bot (Jenkins), Patrick Georgi, Philipp Hug, Xiang Wang, ron minnich, HAOUAS Elyes, Jonathan Neuschäfer, Philipp Deppenwiese, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/33934
to look at the new patch set (#7).
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
lib: Rewrite qemu-armv7 ramdetect
* Move armv7 RAM dection to a common place * Enable it for all emulated platforms * Use 32bit probe values and restore memory even on failure * Use the new logic on the following boards: ** qemu-armv7 ** qemu-riscv
Tested on qemu-system-riscv: Fixes kernel panic due to wrong memory limits reported.
Change-Id: I37386c6a95bfc3b7b25aeae32c6e14cff9913513 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- A src/include/ramdetect.h M src/lib/Makefile.inc A src/lib/ramdetect.c M src/mainboard/emulation/qemu-armv7/Kconfig M src/mainboard/emulation/qemu-armv7/cbmem.c M src/mainboard/emulation/qemu-armv7/mainboard.c D src/mainboard/emulation/qemu-armv7/mainboard.h M src/mainboard/emulation/qemu-riscv/mainboard.c M src/soc/ucb/riscv/cbmem.c 9 files changed, 120 insertions(+), 81 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/34/33934/7
Patrick Rudolph has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 7:
(2 comments)
https://review.coreboot.org/c/coreboot/+/33934/6/src/lib/ramdetect.c File src/lib/ramdetect.c:
https://review.coreboot.org/c/coreboot/+/33934/6/src/lib/ramdetect.c@22 PS6, Line 22: mib
Minor: I'd suggest using a different name to avoid confusion with the 'MiB' constant
Done
https://review.coreboot.org/c/coreboot/+/33934/6/src/lib/ramdetect.c@30 PS6, Line 30: int
This could be an unsigned type, e.g. size_t? […]
Done
Angel Pons has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
Patch Set 7: Code-Review+2
(1 comment)
https://review.coreboot.org/c/coreboot/+/33934/1/src/lib/ramdetect.c File src/lib/ramdetect.c:
https://review.coreboot.org/c/coreboot/+/33934/1/src/lib/ramdetect.c@25 PS1, Line 25: int
no as result is used in arithmethics
Done
Patrick Rudolph has submitted this change and it was merged. ( https://review.coreboot.org/c/coreboot/+/33934 )
Change subject: lib: Rewrite qemu-armv7 ramdetect ......................................................................
lib: Rewrite qemu-armv7 ramdetect
* Move armv7 RAM dection to a common place * Enable it for all emulated platforms * Use 32bit probe values and restore memory even on failure * Use the new logic on the following boards: ** qemu-armv7 ** qemu-riscv
Tested on qemu-system-riscv: Fixes kernel panic due to wrong memory limits reported.
Change-Id: I37386c6a95bfc3b7b25aeae32c6e14cff9913513 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com Reviewed-on: https://review.coreboot.org/c/coreboot/+/33934 Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Angel Pons th3fanbus@gmail.com --- A src/include/ramdetect.h M src/lib/Makefile.inc A src/lib/ramdetect.c M src/mainboard/emulation/qemu-armv7/Kconfig M src/mainboard/emulation/qemu-armv7/cbmem.c M src/mainboard/emulation/qemu-armv7/mainboard.c D src/mainboard/emulation/qemu-armv7/mainboard.h M src/mainboard/emulation/qemu-riscv/mainboard.c M src/soc/ucb/riscv/cbmem.c 9 files changed, 120 insertions(+), 81 deletions(-)
Approvals: build bot (Jenkins): Verified Angel Pons: Looks good to me, approved
diff --git a/src/include/ramdetect.h b/src/include/ramdetect.h new file mode 100644 index 0000000..b63cdf1 --- /dev/null +++ b/src/include/ramdetect.h @@ -0,0 +1,22 @@ +/* + * This file is part of the coreboot project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* + * Probe an area if it's read/writable. + * Primary use case is the detection of DRAM amount on emulators. + * + * @param dram_start Physical address of DRAM start + * @param probe_size Maximum size in MiB to probe for + * @return The detected DRAM size in MiB + */ +size_t probe_ramsize(const uintptr_t dram_start, const size_t probe_size); diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc index 7492b16..9deb5bf 100644 --- a/src/lib/Makefile.inc +++ b/src/lib/Makefile.inc @@ -65,6 +65,7 @@ verstage-$(CONFIG_GENERIC_UDELAY) += timer.c verstage-$(CONFIG_GENERIC_GPIO_LIB) += gpio.c
+romstage-$(CONFIG_VENDOR_EMULATION) += ramdetect.c romstage-y += prog_loaders.c romstage-y += prog_ops.c romstage-y += memchr.c @@ -105,6 +106,7 @@
romstage-$(CONFIG_GENERIC_UDELAY) += timer.c
+ramstage-$(CONFIG_VENDOR_EMULATION) += ramdetect.c ramstage-y += prog_loaders.c ramstage-y += prog_ops.c ramstage-y += hardwaremain.c @@ -155,6 +157,7 @@ ramstage-y += imd_cbmem.c ramstage-y += imd.c
+postcar-$(CONFIG_VENDOR_EMULATION) += ramdetect.c postcar-y += cbmem_common.c postcar-$(CONFIG_CONSOLE_CBMEM) += cbmem_console.c postcar-y += imd_cbmem.c diff --git a/src/lib/ramdetect.c b/src/lib/ramdetect.c new file mode 100644 index 0000000..5416a58 --- /dev/null +++ b/src/lib/ramdetect.c @@ -0,0 +1,78 @@ +/* + * This file is part of the coreboot project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <types.h> +#include <symbols.h> +#include <device/mmio.h> +#include <ramdetect.h> +#include <console/console.h> + +#define OVERLAP(a, b, s, e) ((b) > (s) && (a) < (e)) + +static int probe_mb(const uintptr_t dram_start, const uintptr_t size) +{ + uintptr_t addr = dram_start + (size * MiB) - sizeof(uint32_t); + static const uint32_t patterns[] = { + 0x55aa55aa, + 0x12345678 + }; + void *ptr = (void *) addr; + size_t i; + + /* Don't accidentally clober oneself. */ + if (OVERLAP(addr, addr + sizeof(uint32_t), (uintptr_t)_program, (uintptr_t) _eprogram)) + return 1; + + uint32_t old = read32(ptr); + for (i = 0; i < ARRAY_SIZE(patterns); i++) { + write32(ptr, patterns[i]); + if (read32(ptr) != patterns[i]) + break; + } + + write32(ptr, old); + return i == ARRAY_SIZE(patterns); +} + +/* - 20 as probe_size is in MiB, - 1 as i is signed */ +#define MAX_ADDRESSABLE_SPACE (sizeof(size_t) * 8 - 20 - 1) + +/* Probe an area if it's read/writable. */ +size_t probe_ramsize(const uintptr_t dram_start, const size_t probe_size) +{ + ssize_t i; + size_t msb = 0; + size_t discovered = 0; + + static size_t saved_result; + if (saved_result) + return saved_result; + + /* Find the MSB + 1. */ + size_t tmp = probe_size; + do { + msb++; + } while (tmp >>= 1); + + /* Limit search to accessible address space */ + msb = MIN(msb, MAX_ADDRESSABLE_SPACE); + + /* Compact binary search. */ + for (i = msb; i >= 0; i--) + if (probe_mb(dram_start, (discovered | (1ULL << i)))) + discovered |= (1ULL << i); + + saved_result = discovered; + printk(BIOS_DEBUG, "RAMDETECT: Found %zu MiB RAM\n", discovered); + return discovered; +} diff --git a/src/mainboard/emulation/qemu-armv7/Kconfig b/src/mainboard/emulation/qemu-armv7/Kconfig index fc770cf..73b2d5d 100644 --- a/src/mainboard/emulation/qemu-armv7/Kconfig +++ b/src/mainboard/emulation/qemu-armv7/Kconfig @@ -53,4 +53,8 @@ string default "ARM Ltd."
+config DRAM_SIZE_MB + int + default 1024 + endif # BOARD_EMULATION_QEMU_ARMV7 diff --git a/src/mainboard/emulation/qemu-armv7/cbmem.c b/src/mainboard/emulation/qemu-armv7/cbmem.c index 927bd42..542e08d 100644 --- a/src/mainboard/emulation/qemu-armv7/cbmem.c +++ b/src/mainboard/emulation/qemu-armv7/cbmem.c @@ -11,55 +11,11 @@ * GNU General Public License for more details. */
-#include <stddef.h> #include <cbmem.h> #include <symbols.h> -#include <device/mmio.h> -#include "mainboard.h" - -#define PATTERN1 0x55 -#define PATTERN2 0xaa - -/* Returns 1 if mebibyte mb is present and 0 otherwise. */ -static int probe_mb(int mb) -{ - char *ptr = (char *) 0x60000000 + (mb << 20) + 0xfffff; - char old; - if (ptr < (char *) &_eprogram) { - /* Don't probe below _end to avoid accidentally clobering - oneself. */ - return 1; - } - - old = read8(ptr); - write8(ptr, PATTERN1); - if (read8(ptr) != PATTERN1) - return 0; - write8(ptr, PATTERN2); - if (read8(ptr) != PATTERN2) - return 0; - write8(ptr, old); - return 1; -} - -int probe_ramsize(void) -{ - int i; - int discovered = 0; - static int saved_result; - if (saved_result) - return saved_result; - /* Compact binary search. */ - /* 1 GiB is the largest supported RAM by this machine. */ - for (i = 9; i >= 0; i--) - if (probe_mb(discovered | (1 << i))) - discovered |= (1 << i); - discovered++; - saved_result = discovered; - return discovered; -} +#include <ramdetect.h>
void *cbmem_top(void) { - return _dram + (probe_ramsize() << 20); + return _dram + (probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB) * MiB); } diff --git a/src/mainboard/emulation/qemu-armv7/mainboard.c b/src/mainboard/emulation/qemu-armv7/mainboard.c index cc14dd8..338cff9 100644 --- a/src/mainboard/emulation/qemu-armv7/mainboard.c +++ b/src/mainboard/emulation/qemu-armv7/mainboard.c @@ -18,9 +18,10 @@ #include <device/device.h> #include <cbmem.h> #include <halt.h> -#include "mainboard.h" #include <edid.h> #include <device/mmio.h> +#include <ramdetect.h> +#include <symbols.h>
static void init_gfx(void) { @@ -57,7 +58,7 @@ halt(); }
- discovered = probe_ramsize(); + discovered = probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB); printk(BIOS_DEBUG, "%d MiB of RAM discovered\n", discovered); ram_resource(dev, 0, 0x60000000 >> 10, discovered << 10); cbmem_recovery(0); diff --git a/src/mainboard/emulation/qemu-armv7/mainboard.h b/src/mainboard/emulation/qemu-armv7/mainboard.h deleted file mode 100644 index 87fa3be..0000000 --- a/src/mainboard/emulation/qemu-armv7/mainboard.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * This file is part of the coreboot project. - * - * Copyright (C) 2016 Vladimir Serbinenko phcoder@gmail.com - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 or, at your option, any later - * version of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef QEMU_ARMV7_MAINBOARD_H -#define QEMU_ARMV7_MAINBOARD_H - -/* Returns RAM size in mebibytes. */ -int probe_ramsize(void); - -#endif diff --git a/src/mainboard/emulation/qemu-riscv/mainboard.c b/src/mainboard/emulation/qemu-riscv/mainboard.c index 4b428aa..02356aa 100644 --- a/src/mainboard/emulation/qemu-riscv/mainboard.c +++ b/src/mainboard/emulation/qemu-riscv/mainboard.c @@ -17,15 +17,19 @@ #include <device/device.h> #include <cbmem.h> #include <symbols.h> +#include <ramdetect.h>
static void mainboard_enable(struct device *dev) { + size_t dram_mb_detected;
if (!dev) { die("No dev0; die\n"); }
- ram_resource(dev, 0, (uintptr_t)_dram / KiB, CONFIG_DRAM_SIZE_MB * KiB); + dram_mb_detected = probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB); + ram_resource(dev, 0, (uintptr_t)_dram / KiB, dram_mb_detected / KiB); + cbmem_recovery(0); }
diff --git a/src/soc/ucb/riscv/cbmem.c b/src/soc/ucb/riscv/cbmem.c index 2ee400a..542e08d 100644 --- a/src/soc/ucb/riscv/cbmem.c +++ b/src/soc/ucb/riscv/cbmem.c @@ -12,16 +12,10 @@ */
#include <cbmem.h> +#include <symbols.h> +#include <ramdetect.h>
void *cbmem_top(void) { - uintptr_t base; - size_t size; - - /* Use dummy values until we can query the memory size again */ - //query_mem(configstring(), &base, &size); - base = 0x80000000; - size = 128 * MiB; - - return (void *)(base + size); + return _dram + (probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB) * MiB); }