Subrata Banik has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/32667
Change subject: {arch, console, drivers, include, lib, soc}: Add new features in postcar ......................................................................
{arch, console, drivers, include, lib, soc}: Add new features in postcar
1. Able to create ACPI table 2. Cache located in BSS in postcar as well 3. Load payload from postcar 4. Specific soc/pch related programming 5. mutable devicetree structure in postcar 6. Make postcar stage as !__SIMPLE_DEVICE__ 7. Now postcar has heap.
Change-Id: Ibf160033362920f737385c792d964d47b3f82bd7 Signed-off-by: Subrata Banik subrata.banik@intel.com --- M src/arch/x86/include/arch/acpi.h M src/console/post.c M src/drivers/uart/uart8250io.c M src/drivers/uart/uart8250mem.c M src/include/memlayout.h M src/include/rules.h M src/include/stddef.h M src/lib/bootmode.c M src/lib/imd_cbmem.c M src/lib/memrange.c M src/lib/prog_loaders.c M src/lib/program.ld M src/lib/timestamp.c M src/soc/intel/common/block/fast_spi/fast_spi.c M src/soc/intel/common/block/i2c/i2c.c M src/soc/intel/common/block/systemagent/systemagent_early.c 16 files changed, 52 insertions(+), 17 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/67/32667/1
diff --git a/src/arch/x86/include/arch/acpi.h b/src/arch/x86/include/arch/acpi.h index 79feaad..9258206 100644 --- a/src/arch/x86/include/arch/acpi.h +++ b/src/arch/x86/include/arch/acpi.h @@ -838,7 +838,9 @@ unsigned long (*acpi_fill_ivrs)(acpi_ivrs_t *ivrs_struct, unsigned long current));
-#if ENV_RAMSTAGE && !defined(__SIMPLE_DEVICE__) +#if (CONFIG(SKIP_RAMSTAGE) ? ((ENV_RAMSTAGE || ENV_POSTCAR) && \ + !defined(__SIMPLE_DEVICE__)) : (ENV_RAMSTAGE && \ + !defined(__SIMPLE_DEVICE__))) void acpi_create_hpet(acpi_hpet_t *hpet); unsigned long acpi_write_hpet(struct device *device, unsigned long start, acpi_rsdp_t *rsdp); diff --git a/src/console/post.c b/src/console/post.c index 236aa8c..6832151 100644 --- a/src/console/post.c +++ b/src/console/post.c @@ -44,7 +44,7 @@
DECLARE_SPIN_LOCK(cmos_post_lock)
-#if ENV_RAMSTAGE +#if (CONFIG(SKIP_RAMSTAGE) ? (ENV_RAMSTAGE || ENV_POSTCAR) : ENV_RAMSTAGE) void cmos_post_log(void) { u8 code = 0; @@ -125,7 +125,7 @@ post_log_extra(0); } #endif /* CONFIG_CMOS_POST_EXTRA */ -#endif /* ENV_RAMSTAGE */ +#endif /* ENV_RAMSTAGE (or ENV_POSTCAR) if SKIP_RAMSTAGE is enable */
static void cmos_post_code(u8 value) { diff --git a/src/drivers/uart/uart8250io.c b/src/drivers/uart/uart8250io.c index 62671e2..e536ab8 100644 --- a/src/drivers/uart/uart8250io.c +++ b/src/drivers/uart/uart8250io.c @@ -124,7 +124,7 @@ uart8250_tx_flush(uart_platform_base(idx)); }
-#if ENV_RAMSTAGE +#if (CONFIG(SKIP_RAMSTAGE) ? (ENV_RAMSTAGE || ENV_POSTCAR) : ENV_RAMSTAGE) void uart_fill_lb(void *data) { struct lb_serial serial; diff --git a/src/drivers/uart/uart8250mem.c b/src/drivers/uart/uart8250mem.c index c3dff6a..d2a45ba 100644 --- a/src/drivers/uart/uart8250mem.c +++ b/src/drivers/uart/uart8250mem.c @@ -147,7 +147,7 @@ uart8250_mem_tx_flush(base); }
-#if ENV_RAMSTAGE +#if (CONFIG(SKIP_RAMSTAGE) ? (ENV_RAMSTAGE || ENV_POSTCAR) : ENV_RAMSTAGE) void uart_fill_lb(void *data) { struct lb_serial serial; diff --git a/src/include/memlayout.h b/src/include/memlayout.h index 273a80d..98bfdfe 100644 --- a/src/include/memlayout.h +++ b/src/include/memlayout.h @@ -39,10 +39,17 @@ #define ARCH_STAGE_HAS_BSS_SECTION 1 #endif
-/* Default is that currently ramstage, smm, and rmodules have a heap. */ + #ifndef ARCH_STAGE_HAS_HEAP_SECTION +#if CONFIG(SKIP_RAMSTAGE) +/* Default is that currently postcar, ramstage, smm, and rmodules have a heap. */ +#define ARCH_STAGE_HAS_HEAP_SECTION (ENV_RAMSTAGE || ENV_SMM || ENV_RMODULE || \ + ENV_POSTCAR) +#else +/* Default is that currently ramstage, smm, and rmodules have a heap. */ #define ARCH_STAGE_HAS_HEAP_SECTION (ENV_RAMSTAGE || ENV_SMM || ENV_RMODULE) #endif +#endif
#define STR(x) #x
diff --git a/src/include/rules.h b/src/include/rules.h index ea8335f..47a98ee 100644 --- a/src/include/rules.h +++ b/src/include/rules.h @@ -268,7 +268,8 @@ * be built with simple device model. */
-#if (defined(__PRE_RAM__) || ENV_SMM || ENV_POSTCAR) +#if (CONFIG(SKIP_RAMSTAGE) ? (ENV_X86 && (defined(__PRE_RAM__) || ENV_SMM)) \ + : (defined(__PRE_RAM__) || ENV_SMM || ENV_POSTCAR)) #define __SIMPLE_DEVICE__ #endif
diff --git a/src/include/stddef.h b/src/include/stddef.h index 993d5f0..c9fdb67 100644 --- a/src/include/stddef.h +++ b/src/include/stddef.h @@ -21,9 +21,10 @@
#define NULL ((void *)0)
-/* The devicetree data structures are only mutable in ramstage. All other - stages have a constant devicetree. */ -#if !ENV_RAMSTAGE +/* The devicetree data structures are only mutable in postcar + (if CONFIG_SKIP_RAMSTAGE) and ramstage. All other stages have a constant + devicetree. */ +#if (CONFIG(SKIP_RAMSTAGE) ? (!ENV_RAMSTAGE && !ENV_POSTCAR) : !ENV_RAMSTAGE) #define DEVTREE_EARLY 1 #else #define DEVTREE_EARLY 0 diff --git a/src/lib/bootmode.c b/src/lib/bootmode.c index 18f6d5d..faafd2d 100644 --- a/src/lib/bootmode.c +++ b/src/lib/bootmode.c @@ -17,7 +17,7 @@ #include <bootmode.h> #include <vendorcode/google/chromeos/chromeos.h>
-#if ENV_RAMSTAGE +#if (CONFIG(SKIP_RAMSTAGE) ? (ENV_RAMSTAGE || ENV_POSTCAR) : ENV_RAMSTAGE) static int gfx_init_done = -1;
int gfx_get_init_done(void) diff --git a/src/lib/imd_cbmem.c b/src/lib/imd_cbmem.c index 1a67ad5..374767b 100644 --- a/src/lib/imd_cbmem.c +++ b/src/lib/imd_cbmem.c @@ -307,8 +307,10 @@ imd_region_used(cbmem_get_imd(), baseptr, size); }
-#if ENV_RAMSTAGE || (CONFIG(EARLY_CBMEM_LIST) \ - && (ENV_POSTCAR || ENV_ROMSTAGE)) +#if (CONFIG(SKIP_RAMSTAGE) ? (ENV_RAMSTAGE || ENV_POSTCAR || \ + (IS_ENABLED(CONFIG_EARLY_CBMEM_LIST) && (ENV_ROMSTAGE))) \ + : (ENV_RAMSTAGE || (CONFIG(EARLY_CBMEM_LIST) \ + && (ENV_POSTCAR || ENV_ROMSTAGE)))) /* * -fdata-sections doesn't work so well on read only strings. They all * get put in the same section even though those strings may never be diff --git a/src/lib/memrange.c b/src/lib/memrange.c index 96d7524..62706c9 100644 --- a/src/lib/memrange.c +++ b/src/lib/memrange.c @@ -47,7 +47,11 @@ range_entry_unlink(&ranges->free_list, r); return r; } +#if CONFIG(SKIP_RAMSTAGE) + if (ENV_RAMSTAGE || ENV_POSTCAR) +#else if (ENV_RAMSTAGE) +#endif return malloc(sizeof(struct range_entry)); return NULL; } diff --git a/src/lib/prog_loaders.c b/src/lib/prog_loaders.c index 3b77712..ed69b37 100644 --- a/src/lib/prog_loaders.c +++ b/src/lib/prog_loaders.c @@ -165,7 +165,8 @@ die("Ramstage was not loaded!\n"); }
-#ifdef __RAMSTAGE__ // gc-sections should take care of this +#if (CONFIG(SKIP_RAMSTAGE) ? (defined(__RAMSTAGE__) || defined(__POSTCAR__)) \ + : defined(__RAMSTAGE__)) // gc-sections should take care of this
static struct prog global_payload = PROG_INIT(PROG_PAYLOAD, CONFIG_CBFS_PREFIX "/payload"); diff --git a/src/lib/program.ld b/src/lib/program.ld index 851aa75..ad65494 100644 --- a/src/lib/program.ld +++ b/src/lib/program.ld @@ -55,7 +55,7 @@ KEEP(*(.rsbe_init)); _ersbe_init_begin = .;
-#if ENV_RAMSTAGE +#if (CONFIG(SKIP_RAMSTAGE) ? (ENV_RAMSTAGE || ENV_POSTCAR) : ENV_RAMSTAGE) . = ALIGN(ARCH_POINTER_ALIGN_SIZE); _pci_drivers = .; KEEP(*(.rodata.pci_driver)); diff --git a/src/lib/timestamp.c b/src/lib/timestamp.c index b6330fa..7eaf078 100644 --- a/src/lib/timestamp.c +++ b/src/lib/timestamp.c @@ -47,8 +47,13 @@ #define USE_TIMESTAMP_REGION 0 #endif
+#if CONFIG(SKIP_RAMSTAGE) +/* The cache location will sit in BSS when in ramstage and postcar. */ +#define TIMESTAMP_CACHE_IN_BSS (ENV_RAMSTAGE || ENV_POSTCAR) +#else /* The cache location will sit in BSS when in ramstage. */ #define TIMESTAMP_CACHE_IN_BSS ENV_RAMSTAGE +#endif
#define HAS_CBMEM (ENV_ROMSTAGE || ENV_RAMSTAGE || ENV_POSTCAR)
@@ -299,8 +304,13 @@ if (ts_cbmem_table->base_time == 0) ts_cbmem_table->base_time = ts_cache_table->base_time;
+#if CONFIG(SKIP_RAMSTAGE) + /* Seed the timestamp tick frequency in ramstage and postcar. */ + if (ENV_RAMSTAGE || ENV_POSTCAR) +#else /* Seed the timestamp tick frequency in ramstage. */ if (ENV_RAMSTAGE) +#endif ts_cbmem_table->tick_freq_mhz = timestamp_tick_freq_mhz();
/* Cache no longer required. */ @@ -350,6 +360,9 @@ }
ROMSTAGE_CBMEM_INIT_HOOK(timestamp_sync_cache_to_cbmem) +#if CONFIG(SKIP_RAMSTAGE) +POSTCAR_CBMEM_INIT_HOOK(timestamp_sync_cache_to_cbmem) +#endif RAMSTAGE_CBMEM_INIT_HOOK(timestamp_sync_cache_to_cbmem)
/* Provide default timestamp implementation using monotonic timer. */ diff --git a/src/soc/intel/common/block/fast_spi/fast_spi.c b/src/soc/intel/common/block/fast_spi/fast_spi.c index 455b13c..dbec4e9 100644 --- a/src/soc/intel/common/block/fast_spi/fast_spi.c +++ b/src/soc/intel/common/block/fast_spi/fast_spi.c @@ -250,7 +250,11 @@ bios_size = ALIGN_UP(bios_size, alignment); base = 4ULL*GiB - bios_size;
+#if CONFIG(SKIP_RAMSTAGE) + if (ENV_RAMSTAGE || ENV_POSTCAR) { +#else if (ENV_RAMSTAGE) { +#endif mtrr_use_temp_range(base, bios_size, type); } else { int mtrr = get_free_var_mtrr(); diff --git a/src/soc/intel/common/block/i2c/i2c.c b/src/soc/intel/common/block/i2c/i2c.c index a99dfea..1a26802 100644 --- a/src/soc/intel/common/block/i2c/i2c.c +++ b/src/soc/intel/common/block/i2c/i2c.c @@ -47,7 +47,7 @@ return EARLY_I2C_BASE(bus); }
-#if !ENV_RAMSTAGE +#if (CONFIG(SKIP_RAMSTAGE) ? (!ENV_RAMSTAGE && !ENV_POSTCAR) : !ENV_RAMSTAGE) static int lpss_i2c_early_init_bus(unsigned int bus) { const struct dw_i2c_bus_config *config; diff --git a/src/soc/intel/common/block/systemagent/systemagent_early.c b/src/soc/intel/common/block/systemagent/systemagent_early.c index 61f14a9..5c6b261 100644 --- a/src/soc/intel/common/block/systemagent/systemagent_early.c +++ b/src/soc/intel/common/block/systemagent/systemagent_early.c @@ -24,7 +24,7 @@
#include "systemagent_def.h"
-#if !ENV_RAMSTAGE +#if (CONFIG(SKIP_RAMSTAGE) ? (!ENV_RAMSTAGE && !ENV_POSTCAR) : !ENV_RAMSTAGE) void bootblock_systemagent_early_init(void) { uint32_t reg;