mirror of
https://github.com/mmueller41/genode.git
synced 2026-01-21 12:32:56 +01:00
fixup "hw: calibrate TSC via ACPI timer" (final cosmetic touches)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user