All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 5/8] x86: slimbootloader: Set TSC information for timer driver
@ 2019-06-25 23:20 Park, Aiden
  0 siblings, 0 replies; only message in thread
From: Park, Aiden @ 2019-06-25 23:20 UTC (permalink / raw)
  To: u-boot

- Get TSC frequency from performance info hob
- Set tsc_base and clock_rate for timer driver

Signed-off-by: Aiden Park <aiden.park@intel.com>
---
 arch/x86/cpu/slimbootloader/slimbootloader.c  | 31 +++++++++++++++++++
 .../asm/arch-slimbootloader/slimbootloader.h  | 26 ++++++++++++++++
 2 files changed, 57 insertions(+)

diff --git a/arch/x86/cpu/slimbootloader/slimbootloader.c b/arch/x86/cpu/slimbootloader/slimbootloader.c
index 9f3a61ec61..e2bab99461 100644
--- a/arch/x86/cpu/slimbootloader/slimbootloader.c
+++ b/arch/x86/cpu/slimbootloader/slimbootloader.c
@@ -4,9 +4,40 @@
  */
 
 #include <common.h>
+#include <asm/arch/slimbootloader.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/**
+ * This sets tsc_base and clock_rate for early_timer and tsc_timer.
+ * The performance info guid hob has all performance timestamp data, but
+ * the only tsc frequency info is used for the timer driver for now.
+ */
+static void tsc_init(void)
+{
+	struct performance_info *data = NULL;
+	const struct efi_guid guid = LOADER_PERFORMANCE_INFO_GUID;
+
+	gd->arch.tsc_base = rdtsc();
+	debug("tsc_base=0x%llx\n", gd->arch.tsc_base);
+
+	data = (struct performance_info *)
+		get_next_guid_hob_data(&guid, gd->arch.hob_list);
+
+	if (!data) {
+		debug("performance info hob not found\n");
+		return;
+	}
+
+	/* frequency is in KHz, so to Hz */
+	gd->arch.clock_rate = data->frequency * 1000;
+	debug("freq=0x%lx\n", gd->arch.clock_rate);
+}
 
 int arch_cpu_init(void)
 {
+	tsc_init();
+
 	return x86_cpu_init_f();
 }
 
diff --git a/arch/x86/include/asm/arch-slimbootloader/slimbootloader.h b/arch/x86/include/asm/arch-slimbootloader/slimbootloader.h
index b05e527148..0b908f7c3e 100644
--- a/arch/x86/include/asm/arch-slimbootloader/slimbootloader.h
+++ b/arch/x86/include/asm/arch-slimbootloader/slimbootloader.h
@@ -22,6 +22,12 @@
 	{ 0xbb, 0x98, 0x95, 0x8d, 0x62, 0xde, 0x87, 0xf1 } \
 	}
 
+#define LOADER_PERFORMANCE_INFO_GUID \
+	{ \
+	0x868204be, 0x23d0, 0x4ff9, \
+	{ 0xac, 0x34, 0xb9, 0x95, 0xac, 0x04, 0xb1, 0xb9 } \
+	}
+
 /**
  * A single entry of memory map information
  *
@@ -81,6 +87,26 @@ struct serial_port_info {
 	u32     rsvd1;
 } __packed;
 
+/**
+ * This includes timestamp data which has been collected
+ * in Slim Bootloader stages.
+ *
+ * @rev   : revision of performance_info structure. currently 1.
+ * @rsvd  : padding for alignment
+ * @count : the number of collected timestamp data
+ * @flags : only used in Slim Bootloader
+ * @frequency: tsc frequency in KHz
+ * @timestamp: the array of timestamp data which has 64-bit tsc value
+ */
+struct performance_info {
+	u8      rev;
+	u8      rsvd[3];
+	u16     count;
+	u16     flags;
+	u32     frequency;
+	u64     timestamp[0];
+} __packed;
+
 /**
  * This returns a pointer to hob data buffer if the given guid hob is found.
  *
-- 
2.20.1

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2019-06-25 23:20 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-25 23:20 [U-Boot] [PATCH v2 5/8] x86: slimbootloader: Set TSC information for timer driver Park, Aiden

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.