mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 15:12:13 +02:00
drm/tyr: use read_poll_timeout
The L2 power-on sequence and soft reset in Tyr previously relied on fixed sleeps followed by a single register check, since polling helpers were not available in Rust at the time. Now that read_poll_timeout() is available, poll the relevant registers until the hardware reports readiness or a timeout is reached. This avoids unnecessary delays on start-up. Signed-off-by: Deborah Brouwer <deborah.brouwer@collabora.com> Reviewed-by: Alice Ryhl <aliceryhl@google.com> Link: https://patch.msgid.link/20260119202645.362457-1-deborah.brouwer@collabora.com Signed-off-by: Alice Ryhl <aliceryhl@google.com>
This commit is contained in:
parent
793e8f7d52
commit
6ea52b6d8f
|
|
@ -8,6 +8,7 @@
|
|||
use kernel::devres::Devres;
|
||||
use kernel::drm;
|
||||
use kernel::drm::ioctl;
|
||||
use kernel::io::poll;
|
||||
use kernel::new_mutex;
|
||||
use kernel::of;
|
||||
use kernel::platform;
|
||||
|
|
@ -67,20 +68,13 @@ unsafe impl Sync for TyrData {}
|
|||
fn issue_soft_reset(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result {
|
||||
regs::GPU_CMD.write(dev, iomem, regs::GPU_CMD_SOFT_RESET)?;
|
||||
|
||||
// TODO: We cannot poll, as there is no support in Rust currently, so we
|
||||
// sleep. Change this when read_poll_timeout() is implemented in Rust.
|
||||
kernel::time::delay::fsleep(time::Delta::from_millis(100));
|
||||
|
||||
if regs::GPU_IRQ_RAWSTAT.read(dev, iomem)? & regs::GPU_IRQ_RAWSTAT_RESET_COMPLETED == 0 {
|
||||
dev_err!(dev, "GPU reset failed with errno\n");
|
||||
dev_err!(
|
||||
dev,
|
||||
"GPU_IRQ_RAWSTAT is {}\n",
|
||||
regs::GPU_IRQ_RAWSTAT.read(dev, iomem)?
|
||||
);
|
||||
|
||||
return Err(EIO);
|
||||
}
|
||||
poll::read_poll_timeout(
|
||||
|| regs::GPU_IRQ_RAWSTAT.read(dev, iomem),
|
||||
|status| *status & regs::GPU_IRQ_RAWSTAT_RESET_COMPLETED != 0,
|
||||
time::Delta::from_millis(1),
|
||||
time::Delta::from_millis(100),
|
||||
)
|
||||
.inspect_err(|_| dev_err!(dev, "GPU reset failed."))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,9 +6,10 @@
|
|||
use kernel::device::Bound;
|
||||
use kernel::device::Device;
|
||||
use kernel::devres::Devres;
|
||||
use kernel::io::poll;
|
||||
use kernel::platform;
|
||||
use kernel::prelude::*;
|
||||
use kernel::time;
|
||||
use kernel::time::Delta;
|
||||
use kernel::transmute::AsBytes;
|
||||
use kernel::uapi;
|
||||
|
||||
|
|
@ -204,14 +205,13 @@ fn from(value: u32) -> Self {
|
|||
pub(crate) fn l2_power_on(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result {
|
||||
regs::L2_PWRON_LO.write(dev, iomem, 1)?;
|
||||
|
||||
// TODO: We cannot poll, as there is no support in Rust currently, so we
|
||||
// sleep. Change this when read_poll_timeout() is implemented in Rust.
|
||||
kernel::time::delay::fsleep(time::Delta::from_millis(100));
|
||||
|
||||
if regs::L2_READY_LO.read(dev, iomem)? != 1 {
|
||||
dev_err!(dev, "Failed to power on the GPU\n");
|
||||
return Err(EIO);
|
||||
}
|
||||
poll::read_poll_timeout(
|
||||
|| regs::L2_READY_LO.read(dev, iomem),
|
||||
|status| *status == 1,
|
||||
Delta::from_millis(1),
|
||||
Delta::from_millis(100),
|
||||
)
|
||||
.inspect_err(|_| dev_err!(dev, "Failed to power on the GPU."))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user