fixup "hw: calibrate TSC via ACPI timer" (final cosmetic touches)

This commit is contained in:
Christian Helmuth
2025-01-22 08:57:05 +01:00
parent 5def882001
commit 103d03b590
5 changed files with 12 additions and 16 deletions

View File

@@ -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<Hw::Acpi_generic *>(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;

View File

@@ -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);
});
});
}

View File

@@ -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);
}

View File

@@ -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,

View File

@@ -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);
}
};