mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
gpu: nova-core: add helper function to wait on condition
While programming the hardware, we frequently need to busy-wait until a condition (like a given bit of a register to switch value) happens. Add a basic `wait_on` helper function to wait on such conditions expressed as a closure, with a timeout argument. This is temporary as we will switch to `read_poll_timeout` [1] once it is available. Link: https://lore.kernel.org/lkml/20250220070611.214262-8-fujita.tomonori@gmail.com/ [1] Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Link: https://lore.kernel.org/r/20250619-nova-frts-v6-11-ecf41ef99252@nvidia.com Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
parent
94a0872143
commit
a03c9bd953
|
|
@ -1,5 +1,10 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
use core::time::Duration;
|
||||
|
||||
use kernel::prelude::*;
|
||||
use kernel::time::Instant;
|
||||
|
||||
pub(crate) const fn to_lowercase_bytes<const N: usize>(s: &str) -> [u8; N] {
|
||||
let src = s.as_bytes();
|
||||
let mut dst = [0; N];
|
||||
|
|
@ -19,3 +24,27 @@ pub(crate) const fn const_bytes_to_str(bytes: &[u8]) -> &str {
|
|||
Err(_) => kernel::build_error!("Bytes are not valid UTF-8."),
|
||||
}
|
||||
}
|
||||
|
||||
/// Wait until `cond` is true or `timeout` elapsed.
|
||||
///
|
||||
/// When `cond` evaluates to `Some`, its return value is returned.
|
||||
///
|
||||
/// `Err(ETIMEDOUT)` is returned if `timeout` has been reached without `cond` evaluating to
|
||||
/// `Some`.
|
||||
///
|
||||
/// TODO: replace with `read_poll_timeout` once it is available.
|
||||
/// (https://lore.kernel.org/lkml/20250220070611.214262-8-fujita.tomonori@gmail.com/)
|
||||
#[expect(dead_code)]
|
||||
pub(crate) fn wait_on<R, F: Fn() -> Option<R>>(timeout: Duration, cond: F) -> Result<R> {
|
||||
let start_time = Instant::now();
|
||||
|
||||
loop {
|
||||
if let Some(ret) = cond() {
|
||||
return Ok(ret);
|
||||
}
|
||||
|
||||
if start_time.elapsed().as_nanos() > timeout.as_nanos() as i64 {
|
||||
return Err(ETIMEDOUT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user