4fbac46524
Squashed and adjusted two changes from chromium.git. Covers CBMEM init for ROMTAGE and RAMSTAGE. cbmem: Unify random on-CBMEM-init tasks under common CBMEM_INIT_HOOK() API There are several use cases for performing a certain task when CBMEM is first set up (usually to migrate some data into it that was previously kept in BSS/SRAM/hammerspace), and unfortunately we handle each of them differently: timestamp migration is called explicitly from cbmem_initialize(), certain x86-chipset-specific tasks use the CAR_MIGRATION() macro to register a hook, and the CBMEM console is migrated through a direct call from romstage (on non-x86 and SandyBridge boards). This patch decouples the CAR_MIGRATION() hook mechanism from cache-as-RAM and rechristens it to CBMEM_INIT_HOOK(), which is a clearer description of what it really does. All of the above use cases are ported to this new, consistent model, allowing us to have one less line of boilerplate in non-CAR romstages. BRANCH=None BUG=None TEST=Built and booted on Nyan_Blaze and Falco with and without CONFIG_CBMEM_CONSOLE. Confirmed that 'cbmem -c' shows the full log after boot (and the resume log after S3 resume on Falco). Compiled for Parrot, Stout and Lumpy. Original-Change-Id: I1681b372664f5a1f15c3733cbd32b9b11f55f8ea Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/232612 Reviewed-by: Aaron Durbin <adurbin@chromium.org> cbmem: Extend hooks to ramstage, fix timestamp synching Commit 7dd5bbd71 (cbmem: Unify random on-CBMEM-init tasks under common CBMEM_INIT_HOOK() API) inadvertently broke ramstage timestamps since timestamp_sync() was no longer called there. Oops. This patch fixes the issue by extending the CBMEM_INIT_HOOK() mechanism to the cbmem_initialize() call in ramstage. The macro is split into explicit ROMSTAGE_/RAMSTAGE_ versions to make the behavior as clear as possible and prevent surprises (although just using a single macro and relying on the Makefiles to link an object into all appropriate stages would also work). This allows us to get rid of the explicit cbmemc_reinit() in ramstage (which I somehow accounted for in the last patch without realizing that timestamps work exactly the same way...), and replace the older and less flexible cbmem_arch_init() mechanism. Also added a size assertion for the pre-RAM CBMEM console to memlayout that could prevent a very unlikely buffer overflow I just noticed. BRANCH=None BUG=None TEST=Booted on Pinky and Falco, confirmed that ramstage timestamps once again show up. Compile-tested for Rambi and Samus. Original-Change-Id: If907266c3f20dc3d599b5c968ea5b39fe5c00e9c Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/233533 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Change-Id: I1be89bafacfe85cba63426e2d91f5d8d4caa1800 Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Signed-off-by: Marc Jones <marc.jones@se-eng.com> Reviewed-on: http://review.coreboot.org/7878 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin <adurbin@chromium.org>
105 lines
2.9 KiB
C
105 lines
2.9 KiB
C
/*
|
|
* This file is part of the coreboot project.
|
|
*
|
|
* Copyright (C) 2011 The ChromiumOS Authors. All rights reserved.
|
|
*
|
|
* 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.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc.
|
|
*/
|
|
|
|
#ifndef __TIMESTAMP_H__
|
|
#define __TIMESTAMP_H__
|
|
|
|
#include <stdint.h>
|
|
|
|
struct timestamp_entry {
|
|
uint32_t entry_id;
|
|
uint64_t entry_stamp;
|
|
} __attribute__((packed));
|
|
|
|
struct timestamp_table {
|
|
uint64_t base_time;
|
|
uint32_t max_entries;
|
|
uint32_t num_entries;
|
|
struct timestamp_entry entries[0]; /* Variable number of entries */
|
|
} __attribute__((packed));
|
|
|
|
enum timestamp_id {
|
|
TS_START_ROMSTAGE = 1,
|
|
TS_BEFORE_INITRAM = 2,
|
|
TS_AFTER_INITRAM = 3,
|
|
TS_END_ROMSTAGE = 4,
|
|
TS_START_VBOOT = 5,
|
|
TS_END_VBOOT = 6,
|
|
TS_START_COPYRAM = 8,
|
|
TS_END_COPYRAM = 9,
|
|
TS_START_RAMSTAGE = 10,
|
|
TS_START_BOOTBLOCK = 11,
|
|
TS_END_BOOTBLOCK = 12,
|
|
TS_START_COPYROM = 13,
|
|
TS_END_COPYROM = 14,
|
|
TS_START_ULZMA = 15,
|
|
TS_END_ULZMA = 16,
|
|
TS_DEVICE_ENUMERATE = 30,
|
|
TS_DEVICE_CONFIGURE = 40,
|
|
TS_DEVICE_ENABLE = 50,
|
|
TS_DEVICE_INITIALIZE = 60,
|
|
TS_DEVICE_DONE = 70,
|
|
TS_CBMEM_POST = 75,
|
|
TS_WRITE_TABLES = 80,
|
|
TS_LOAD_PAYLOAD = 90,
|
|
TS_ACPI_WAKE_JUMP = 98,
|
|
TS_SELFBOOT_JUMP = 99,
|
|
|
|
/* 500+ reserved for vendorcode extensions (500-600: google/chromeos) */
|
|
TS_START_COPYVER = 501,
|
|
TS_END_COPYVER = 502,
|
|
TS_START_TPMINIT = 503,
|
|
TS_END_TPMINIT = 504,
|
|
TS_START_VERIFY_SLOT = 505,
|
|
TS_END_VERIFY_SLOT = 506,
|
|
TS_START_HASH_BODY = 507,
|
|
TS_DONE_LOADING = 508,
|
|
TS_DONE_HASHING = 509,
|
|
TS_END_HASH_BODY = 510,
|
|
|
|
/* 950+ reserved for vendorcode extensions (950-999: intel/fsp) */
|
|
TS_FSP_MEMORY_INIT_START = 950,
|
|
TS_FSP_MEMORY_INIT_END = 951,
|
|
TS_FSP_TEMP_RAM_EXIT_START = 952,
|
|
TS_FSP_TEMP_RAM_EXIT_END = 953,
|
|
TS_FSP_SILICON_INIT_START = 954,
|
|
TS_FSP_SILICON_INIT_END = 955,
|
|
TS_FSP_BEFORE_ENUMERATE = 956,
|
|
TS_FSP_AFTER_ENUMERATE = 957,
|
|
TS_FSP_BEFORE_FINALIZE = 958,
|
|
TS_FSP_AFTER_FINALIZE = 959,
|
|
|
|
/* 1000+ reserved for payloads (1000-1200: ChromeOS depthcharge) */
|
|
};
|
|
|
|
#if CONFIG_COLLECT_TIMESTAMPS && (CONFIG_EARLY_CBMEM_INIT || !defined(__PRE_RAM__))
|
|
void timestamp_init(uint64_t base);
|
|
void timestamp_add(enum timestamp_id id, uint64_t ts_time);
|
|
void timestamp_add_now(enum timestamp_id id);
|
|
#else
|
|
#define timestamp_init(base)
|
|
#define timestamp_add(id, time)
|
|
#define timestamp_add_now(id)
|
|
#endif
|
|
|
|
/* Implemented by the architecture code */
|
|
uint64_t timestamp_get(void);
|
|
uint64_t get_initial_timestamp(void);
|
|
|
|
#endif
|