/* * Copyright (c) 2023, Sönke Holz * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include namespace Kernel { static u32 s_timebase_frequency = 0; void microseconds_delay(u32 microseconds) { VERIFY(s_timebase_frequency != 0); u64 const start = RISCV64::CSR::read(RISCV64::CSR::Address::TIME); u64 const delta = (static_cast(microseconds) * s_timebase_frequency) / 1'000'000ull; while ((RISCV64::CSR::read(RISCV64::CSR::Address::TIME) - start) < delta) Processor::pause(); } void init_delay_loop() { s_timebase_frequency = DeviceTree::get().resolve_property("/cpus/timebase-frequency"sv).value().as(); } }