summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2015-08-30 21:19:55 -0500
committerAaron Durbin <adurbin@chromium.org>2015-08-31 13:55:28 +0000
commitc49014e7507b02c5f5ca249e7ab86a65394d12b0 (patch)
tree537a90aaf5ecdbd57532305bf02545f692f40e55 /src
parent60391b65fdaca3a365cb16d891f0541c74e866b4 (diff)
downloadcoreboot-c49014e7507b02c5f5ca249e7ab86a65394d12b0.tar.xz
timestamp: add tick frequency to exported table
Add the timestamp tick frequency within the timestamp table so the cbmem utility doesn't try to figure it out on its own. Those paths still exist for x86 systems which don't provide tsc_freq_mhz(). All other non-x86 systems use the monotonic timer which has a 1us granularity or 1MHz. One of the main reasons is that Linux is reporting /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq as the true turbo frequency on turbo enables machines. This change also fixes the p-state values honored in cpufreq for turbo machines in that turbo p-pstates were reported as 100MHz greater than nominal. BUG=chrome-os-partner:44669 BRANCH=firmware-strago-7287.B TEST=Built and booted on glados. Confirmed table frequency honored. Change-Id: I763fe2d9a7b01d0ef5556e5abff36032062f5801 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/11470 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86/timestamp.c13
-rw-r--r--src/include/cpu/x86/tsc.h3
-rw-r--r--src/include/timestamp.h5
-rw-r--r--src/lib/timestamp.c10
4 files changed, 28 insertions, 3 deletions
diff --git a/src/arch/x86/timestamp.c b/src/arch/x86/timestamp.c
index 9df505a570..d308146070 100644
--- a/src/arch/x86/timestamp.c
+++ b/src/arch/x86/timestamp.c
@@ -24,3 +24,16 @@ uint64_t timestamp_get(void)
{
return rdtscll();
}
+
+unsigned long __attribute__((weak)) tsc_freq_mhz(void)
+{
+ /* Default to not knowing TSC frequency. cbmem will have to fallback
+ * on trying to determine it in userspace. */
+ return 0;
+}
+
+int timestamp_tick_freq_mhz(void)
+{
+ /* Chipsets that have a constant TSC provide this value correctly. */
+ return tsc_freq_mhz();
+}
diff --git a/src/include/cpu/x86/tsc.h b/src/include/cpu/x86/tsc.h
index 71d253ba7f..5cf4644328 100644
--- a/src/include/cpu/x86/tsc.h
+++ b/src/include/cpu/x86/tsc.h
@@ -60,8 +60,7 @@ static inline uint64_t tsc_to_uint64(tsc_t tstamp)
}
#endif
-#if CONFIG_TSC_CONSTANT_RATE
+/* Provided by CPU/chipset code for the TSC rate in MHz. */
unsigned long tsc_freq_mhz(void);
-#endif
#endif /* CPU_X86_TSC_H */
diff --git a/src/include/timestamp.h b/src/include/timestamp.h
index 54d69ce132..be33b0ad42 100644
--- a/src/include/timestamp.h
+++ b/src/include/timestamp.h
@@ -29,7 +29,8 @@ struct timestamp_entry {
struct timestamp_table {
uint64_t base_time;
- uint32_t max_entries;
+ uint16_t max_entries;
+ uint16_t tick_freq_mhz;
uint32_t num_entries;
struct timestamp_entry entries[0]; /* Variable number of entries */
} __attribute__((packed));
@@ -114,5 +115,7 @@ void timestamp_add_now(enum timestamp_id id);
/* Implemented by the architecture code */
uint64_t timestamp_get(void);
uint64_t get_initial_timestamp(void);
+/* Returns timestamp tick frequency in MHz. */
+int timestamp_tick_freq_mhz(void);
#endif
diff --git a/src/lib/timestamp.c b/src/lib/timestamp.c
index ca25093423..21b3d29a53 100644
--- a/src/lib/timestamp.c
+++ b/src/lib/timestamp.c
@@ -278,6 +278,10 @@ static void timestamp_sync_cache_to_cbmem(int is_recovery)
if (ts_cbmem_table->base_time == 0)
ts_cbmem_table->base_time = ts_cache_table->base_time;
+ /* Seed the timestamp tick frequency in ramstage. */
+ if (ENV_RAMSTAGE)
+ ts_cbmem_table->tick_freq_mhz = timestamp_tick_freq_mhz();
+
/* Cache no longer required. */
ts_cache_table->num_entries = 0;
ts_cache->cache_state = TIMESTAMP_CACHE_NOT_NEEDED;
@@ -299,3 +303,9 @@ uint64_t __attribute__((weak)) timestamp_get(void)
return mono_time_diff_microseconds(&t1, &t2);
}
+
+/* Like timestamp_get() above this matches up with microsecond granularity. */
+int __attribute__((weak)) timestamp_tick_freq_mhz(void)
+{
+ return 1;
+}