16dbe0cceSVadim Bendebury /* 26dbe0cceSVadim Bendebury * This file is part of the coreboot project. 36dbe0cceSVadim Bendebury * 46dbe0cceSVadim Bendebury * Copyright (C) 2011 The ChromiumOS Authors. All rights reserved. 56dbe0cceSVadim Bendebury * 6*5c564b0dSBin Meng * SPDX-License-Identifier: GPL-2.0+ 76dbe0cceSVadim Bendebury */ 86dbe0cceSVadim Bendebury 96dbe0cceSVadim Bendebury #include <common.h> 106dbe0cceSVadim Bendebury #include <asm/arch/timestamp.h> 116dbe0cceSVadim Bendebury #include <asm/arch/sysinfo.h> 126dbe0cceSVadim Bendebury #include <linux/compiler.h> 136dbe0cceSVadim Bendebury 146dbe0cceSVadim Bendebury struct timestamp_entry { 156dbe0cceSVadim Bendebury uint32_t entry_id; 166dbe0cceSVadim Bendebury uint64_t entry_stamp; 176dbe0cceSVadim Bendebury } __packed; 186dbe0cceSVadim Bendebury 196dbe0cceSVadim Bendebury struct timestamp_table { 206dbe0cceSVadim Bendebury uint64_t base_time; 216dbe0cceSVadim Bendebury uint32_t max_entries; 226dbe0cceSVadim Bendebury uint32_t num_entries; 236dbe0cceSVadim Bendebury struct timestamp_entry entries[0]; /* Variable number of entries */ 246dbe0cceSVadim Bendebury } __packed; 256dbe0cceSVadim Bendebury 266dbe0cceSVadim Bendebury static struct timestamp_table *ts_table __attribute__((section(".data"))); 276dbe0cceSVadim Bendebury timestamp_init(void)286dbe0cceSVadim Bendeburyvoid timestamp_init(void) 296dbe0cceSVadim Bendebury { 306dbe0cceSVadim Bendebury timestamp_add_now(TS_U_BOOT_INITTED); 316dbe0cceSVadim Bendebury } 326dbe0cceSVadim Bendebury timestamp_add(enum timestamp_id id,uint64_t ts_time)336dbe0cceSVadim Bendeburyvoid timestamp_add(enum timestamp_id id, uint64_t ts_time) 346dbe0cceSVadim Bendebury { 356dbe0cceSVadim Bendebury struct timestamp_entry *tse; 366dbe0cceSVadim Bendebury 376dbe0cceSVadim Bendebury if (!ts_table || (ts_table->num_entries == ts_table->max_entries)) 386dbe0cceSVadim Bendebury return; 396dbe0cceSVadim Bendebury 406dbe0cceSVadim Bendebury tse = &ts_table->entries[ts_table->num_entries++]; 416dbe0cceSVadim Bendebury tse->entry_id = id; 426dbe0cceSVadim Bendebury tse->entry_stamp = ts_time - ts_table->base_time; 436dbe0cceSVadim Bendebury } 446dbe0cceSVadim Bendebury timestamp_add_now(enum timestamp_id id)456dbe0cceSVadim Bendeburyvoid timestamp_add_now(enum timestamp_id id) 466dbe0cceSVadim Bendebury { 476dbe0cceSVadim Bendebury timestamp_add(id, rdtsc()); 486dbe0cceSVadim Bendebury } 495397d805SSimon Glass timestamp_add_to_bootstage(void)505397d805SSimon Glassint timestamp_add_to_bootstage(void) 515397d805SSimon Glass { 525397d805SSimon Glass uint i; 535397d805SSimon Glass 545397d805SSimon Glass if (!ts_table) 555397d805SSimon Glass return -1; 565397d805SSimon Glass 575397d805SSimon Glass for (i = 0; i < ts_table->num_entries; i++) { 585397d805SSimon Glass struct timestamp_entry *tse = &ts_table->entries[i]; 595397d805SSimon Glass const char *name = NULL; 605397d805SSimon Glass 615397d805SSimon Glass switch (tse->entry_id) { 625397d805SSimon Glass case TS_START_ROMSTAGE: 635397d805SSimon Glass name = "start-romstage"; 645397d805SSimon Glass break; 655397d805SSimon Glass case TS_BEFORE_INITRAM: 665397d805SSimon Glass name = "before-initram"; 675397d805SSimon Glass break; 685397d805SSimon Glass case TS_DEVICE_INITIALIZE: 695397d805SSimon Glass name = "device-initialize"; 705397d805SSimon Glass break; 715397d805SSimon Glass case TS_DEVICE_DONE: 725397d805SSimon Glass name = "device-done"; 735397d805SSimon Glass break; 745397d805SSimon Glass case TS_SELFBOOT_JUMP: 755397d805SSimon Glass name = "selfboot-jump"; 765397d805SSimon Glass break; 775397d805SSimon Glass } 785397d805SSimon Glass if (name) { 795397d805SSimon Glass bootstage_add_record(0, name, BOOTSTAGEF_ALLOC, 805397d805SSimon Glass tse->entry_stamp / 815397d805SSimon Glass get_tbclk_mhz()); 825397d805SSimon Glass } 835397d805SSimon Glass } 845397d805SSimon Glass 855397d805SSimon Glass return 0; 865397d805SSimon Glass } 87