xref: /rk3399_rockchip-uboot/arch/x86/cpu/coreboot/timestamp.c (revision 80af39842e64a44258ab5eb913659e29fc319903)
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 Bendebury void 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 Bendebury void 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 Bendebury void 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 Glass int 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