From 103d03b5906222c754fdefc050dac8964d7da7e2 Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Wed, 22 Jan 2025 08:57:05 +0100 Subject: [PATCH] fixup "hw: calibrate TSC via ACPI timer" (final cosmetic touches) --- repos/base-hw/src/bootstrap/spec/x86_64/platform.cc | 13 +++++-------- .../src/core/spec/x86_64/platform_support.cc | 2 +- repos/base-hw/src/include/hw/spec/x86_64/acpi.h | 8 ++++---- repos/base-hw/src/include/hw/spec/x86_64/pc_board.h | 2 +- repos/base-hw/src/include/hw/spec/x86_64/x86_64.h | 3 +-- 5 files changed, 12 insertions(+), 16 deletions(-) diff --git a/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc b/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc index 382457952c..3c8b657ee1 100644 --- a/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc +++ b/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc @@ -69,8 +69,7 @@ static Hw::Acpi_rsdp search_rsdp(addr_t area, addr_t area_size) static uint32_t calibrate_tsc_frequency(addr_t fadt_addr) { - const unsigned Tsc_fixed_value = 2400; - uint32_t default_freq = Tsc_fixed_value * 1000; + uint32_t const default_freq = 2'400'000; if (!fadt_addr) { warning("FADT not found, returning fixed TSC frequency of ", default_freq, "kHz"); @@ -81,16 +80,14 @@ static uint32_t calibrate_tsc_frequency(addr_t fadt_addr) Hw::Acpi_fadt fadt(reinterpret_cast(fadt_addr)); - uint32_t val = fadt.calibrate_freq_khz(sleep_ms, []() { - return Hw::Tsc::rdtsc(); - }); + uint32_t const freq = fadt.calibrate_freq_khz(sleep_ms, []() { return Hw::Tsc::rdtsc(); }); - if (!val) { + if (!freq) { warning("Unable to calibrate TSC, returning fixed TSC frequency of ", default_freq, "kHz"); return default_freq; } - return val; + return freq; } @@ -278,7 +275,7 @@ Bootstrap::Platform::Board::Board() cpus = !cpus ? 1 : max_cpus; } - info.tsc_frequency = calibrate_tsc_frequency(info.acpi_fadt); + info.tsc_freq_khz = calibrate_tsc_frequency(info.acpi_fadt); /* copy 16 bit boot code for AP CPUs and for ACPI resume */ addr_t ap_code_size = (addr_t)&_start - (addr_t)&_ap; diff --git a/repos/base-hw/src/core/spec/x86_64/platform_support.cc b/repos/base-hw/src/core/spec/x86_64/platform_support.cc index 56be9755c5..7778f15010 100644 --- a/repos/base-hw/src/core/spec/x86_64/platform_support.cc +++ b/repos/base-hw/src/core/spec/x86_64/platform_support.cc @@ -60,7 +60,7 @@ void Platform::_init_additional_platform_info(Xml_generator &xml) }); xml.node("tsc", [&] { xml.attribute("invariant", Hw::Tsc::invariant_tsc()); - xml.attribute("freq_khz", _boot_info().plat_info.tsc_frequency); + xml.attribute("freq_khz", _boot_info().plat_info.tsc_freq_khz); }); }); } diff --git a/repos/base-hw/src/include/hw/spec/x86_64/acpi.h b/repos/base-hw/src/include/hw/spec/x86_64/acpi.h index f55ac70bae..163f5da473 100644 --- a/repos/base-hw/src/include/hw/spec/x86_64/acpi.h +++ b/repos/base-hw/src/include/hw/spec/x86_64/acpi.h @@ -266,16 +266,16 @@ struct Hw::Acpi_fadt : Genode::Mmio<276> uint32_t calibrate_freq_khz(uint32_t sleep_ms, auto get_value_fn) { - unsigned const acpi_timer_freq = 3579545; + unsigned const acpi_timer_freq = 3'579'545; - uint32_t initial = read_pm_tmr(); + uint32_t const initial = read_pm_tmr(); if (!initial) return 0; - uint64_t t1 = get_value_fn(); + uint64_t const t1 = get_value_fn(); while ((read_pm_tmr() - initial) < (acpi_timer_freq * sleep_ms / 1000)) asm volatile ("pause":::"memory"); - uint64_t t2 = get_value_fn(); + uint64_t const t2 = get_value_fn(); return (uint32_t)((t2 - t1) / sleep_ms); } diff --git a/repos/base-hw/src/include/hw/spec/x86_64/pc_board.h b/repos/base-hw/src/include/hw/spec/x86_64/pc_board.h index 3e04eb8481..c018a922c3 100644 --- a/repos/base-hw/src/include/hw/spec/x86_64/pc_board.h +++ b/repos/base-hw/src/include/hw/spec/x86_64/pc_board.h @@ -44,7 +44,7 @@ struct Hw::Pc_board::Boot_info Framebuffer framebuffer { }; Genode::addr_t efi_system_table { 0 }; Genode::addr_t acpi_fadt { 0 }; - Genode::uint32_t tsc_frequency { 0 }; + Genode::uint32_t tsc_freq_khz { 0 }; Boot_info() {} Boot_info(Acpi_rsdp const &acpi_rsdp, diff --git a/repos/base-hw/src/include/hw/spec/x86_64/x86_64.h b/repos/base-hw/src/include/hw/spec/x86_64/x86_64.h index f5cec36543..c451fac22c 100644 --- a/repos/base-hw/src/include/hw/spec/x86_64/x86_64.h +++ b/repos/base-hw/src/include/hw/spec/x86_64/x86_64.h @@ -120,8 +120,7 @@ struct Hw::Tsc { using Cpu = Hw::X86_64_cpu; - Cpu::Cpuid_80000007_eax::access_t eax = - Cpu::Cpuid_80000007_eax::read(); + Cpu::Cpuid_80000007_eax::access_t eax = Cpu::Cpuid_80000007_eax::read(); return Cpu::Cpuid_80000007_eax::Invariant_tsc::get(eax); } };