summaryrefslogtreecommitdiff
path: root/src/common/x64/cpu_detect.cpp
diff options
context:
space:
mode:
authorGravatar Marshall Mohror2022-07-06 12:42:01 -0500
committerGravatar Marshall Mohror2022-07-06 12:42:01 -0500
commitb2ad4dd189135be9a87af86619d6f5854525f7fa (patch)
treed290710b8975e063db7c38ef497e46cfdc71301f /src/common/x64/cpu_detect.cpp
parentMerge pull request #8486 from liushuyu/github-actions-verify (diff)
downloadyuzu-b2ad4dd189135be9a87af86619d6f5854525f7fa.tar.gz
yuzu-b2ad4dd189135be9a87af86619d6f5854525f7fa.tar.xz
yuzu-b2ad4dd189135be9a87af86619d6f5854525f7fa.zip
common/x64: Use TSC clock rate from CPUID when available
The current method used to estimate the TSC is fairly accurate - within a few kHz - but the exact value can be extracted from CPUID if available.
Diffstat (limited to 'src/common/x64/cpu_detect.cpp')
-rw-r--r--src/common/x64/cpu_detect.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp
index 322aa1f08..4230b2da6 100644
--- a/src/common/x64/cpu_detect.cpp
+++ b/src/common/x64/cpu_detect.cpp
@@ -161,6 +161,19 @@ static CPUCaps Detect() {
161 caps.invariant_tsc = Common::Bit<8>(cpu_id[3]); 161 caps.invariant_tsc = Common::Bit<8>(cpu_id[3]);
162 } 162 }
163 163
164 if (max_std_fn >= 0x15) {
165 __cpuid(cpu_id, 0x15);
166 caps.tsc_crystal_ratio_denominator = cpu_id[0];
167 caps.tsc_crystal_ratio_numerator = cpu_id[1];
168 caps.crystal_frequency = cpu_id[2];
169 // Some CPU models might not return a crystal frequency.
170 // The CPU model can be detected to use the values from turbostat
171 // https://github.com/torvalds/linux/blob/master/tools/power/x86/turbostat/turbostat.c#L5569
172 // but it's easier to just estimate the TSC tick rate for these cases.
173 caps.tsc_frequency = static_cast<u64>(caps.crystal_frequency) *
174 caps.tsc_crystal_ratio_numerator / caps.tsc_crystal_ratio_denominator;
175 }
176
164 if (max_std_fn >= 0x16) { 177 if (max_std_fn >= 0x16) {
165 __cpuid(cpu_id, 0x16); 178 __cpuid(cpu_id, 0x16);
166 caps.base_frequency = cpu_id[0]; 179 caps.base_frequency = cpu_id[0];