diff options
author | Furquan Shaikh <furquan@google.com> | 2014-11-08 17:34:27 -0800 |
---|---|---|
committer | Aaron Durbin <adurbin@chromium.org> | 2015-04-10 16:48:30 +0200 |
commit | efb546dfeb5dfe13ad4d4d0e8db577be9b4069b8 (patch) | |
tree | 1f99bf920e658835b54a9f1b81e8ad90ad03a8d4 /src | |
parent | aed887f3cb9cf400d67d9250991382cdd8d9a531 (diff) | |
download | coreboot-efb546dfeb5dfe13ad4d4d0e8db577be9b4069b8.tar.xz |
ramoops: Add support for passing ramoops region through cb tables.
CQ-DEPEND=CL:228856
BUG=chrome-os-partner:33676
BRANCH=None
TEST=ramoops buffer verified on ryu.
Original-Change-Id: I29584f89ded0c22c4f255a40951a179b54761053
Original-Signed-off-by: Furquan Shaikh <furquan@google.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/228744
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Original-Commit-Queue: Furquan Shaikh <furquan@chromium.org>
Original-Tested-by: Furquan Shaikh <furquan@chromium.org>
(cherry picked from commit e8b2c8b75c51160df177edc14c90e5bd3836e931)
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Change-Id: I5fdeb59056945a602584584edce9c782151ca8ea
Reviewed-on: http://review.coreboot.org/9442
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/include/boot/coreboot_tables.h | 3 | ||||
-rw-r--r-- | src/lib/coreboot_table.c | 4 | ||||
-rw-r--r-- | src/vendorcode/google/chromeos/Kconfig | 5 | ||||
-rw-r--r-- | src/vendorcode/google/chromeos/ramoops.c | 33 |
4 files changed, 44 insertions, 1 deletions
diff --git a/src/include/boot/coreboot_tables.h b/src/include/boot/coreboot_tables.h index 56394733ce..a3cf2bd761 100644 --- a/src/include/boot/coreboot_tables.h +++ b/src/include/boot/coreboot_tables.h @@ -227,6 +227,7 @@ struct lb_gpios { #define LB_TAG_VBNV 0x0019 #define LB_TAB_VBOOT_HANDOFF 0x0020 #define LB_TAB_DMA 0x0022 +#define LB_TAG_RAM_OOPS 0x0023 struct lb_range { uint32_t tag; uint32_t size; @@ -235,6 +236,8 @@ struct lb_range { uint32_t range_size; }; +void lb_ramoops(struct lb_header *header); + #define LB_TAG_TIMESTAMPS 0x0016 #define LB_TAG_CBMEM_CONSOLE 0x0017 #define LB_TAG_MRC_CACHE 0x0018 diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c index 332bed172a..afb6743876 100644 --- a/src/lib/coreboot_table.c +++ b/src/lib/coreboot_table.c @@ -473,6 +473,10 @@ unsigned long write_coreboot_table( /* Add board-specific table entries, if any. */ lb_board(head); +#if IS_ENABLED(CONFIG_CHROMEOS_RAMOOPS) + lb_ramoops(head); +#endif + /* Remember where my valid memory ranges are */ return lb_table_fini(head); } diff --git a/src/vendorcode/google/chromeos/Kconfig b/src/vendorcode/google/chromeos/Kconfig index a0ab55d596..29252a66b3 100644 --- a/src/vendorcode/google/chromeos/Kconfig +++ b/src/vendorcode/google/chromeos/Kconfig @@ -76,6 +76,11 @@ config CHROMEOS_RAMOOPS_DYNAMIC default n depends on CHROMEOS_RAMOOPS && HAVE_ACPI_TABLES +config CHROMEOS_RAMOOPS_NON_ACPI + bool "Allocate RAM oops buffer in cbmem passed through cb tables to payload" + default n + depends on CHROMEOS_RAMOOPS && !HAVE_ACPI_TABLES + config CHROMEOS_RAMOOPS_RAM_START hex "Physical address of preserved RAM" default 0x00f00000 diff --git a/src/vendorcode/google/chromeos/ramoops.c b/src/vendorcode/google/chromeos/ramoops.c index f7177e5397..07649c975c 100644 --- a/src/vendorcode/google/chromeos/ramoops.c +++ b/src/vendorcode/google/chromeos/ramoops.c @@ -20,6 +20,7 @@ #include <stddef.h> #include <stdint.h> +#include <boot/coreboot_tables.h> #include <bootstate.h> #include <console/console.h> #include <cbmem.h> @@ -99,4 +100,34 @@ void chromeos_ram_oops_init(chromeos_acpi_t *chromeos) reserve_ram_oops_dynamic(chromeos); } -#endif /* CONFIG_HAVE_ACPI_TABLES */ +#elif IS_ENABLED(CONFIG_CHROMEOS_RAMOOPS_NON_ACPI) + +static void ramoops_alloc(void *arg) +{ + const size_t size = CONFIG_CHROMEOS_RAMOOPS_RAM_SIZE; + + if (size == 0) + return; + + if (cbmem_add(CBMEM_ID_RAM_OOPS, size) == NULL) + printk(BIOS_ERR, "Could not allocate RAMOOPS buffer\n"); +} + +BOOT_STATE_INIT_ENTRY(BS_WRITE_TABLES, BS_ON_ENTRY, ramoops_alloc, NULL); + +#endif + +void lb_ramoops(struct lb_header *header) +{ + void *buffer = cbmem_find(CBMEM_ID_RAM_OOPS); + + if (buffer == NULL) + return; + + struct lb_range *ramoops; + ramoops = (struct lb_range *)lb_new_record(header); + ramoops->tag = LB_TAG_RAM_OOPS; + ramoops->size = sizeof(*ramoops); + ramoops->range_start = (uintptr_t)buffer; + ramoops->range_size = CONFIG_CHROMEOS_RAMOOPS_RAM_SIZE; +} |