Skip to content

Commit 6ea52b6

Browse files
deborahbrouwerDarksonn
authored andcommitted
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>
1 parent 793e8f7 commit 6ea52b6

2 files changed

Lines changed: 17 additions & 23 deletions

File tree

drivers/gpu/drm/tyr/driver.rs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use kernel::device::Device;
88
use kernel::devres::Devres;
99
use kernel::drm;
1010
use kernel::drm::ioctl;
11+
use kernel::io::poll;
1112
use kernel::new_mutex;
1213
use kernel::of;
1314
use kernel::platform;
@@ -67,20 +68,13 @@ unsafe impl Sync for TyrData {}
6768
fn issue_soft_reset(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result {
6869
regs::GPU_CMD.write(dev, iomem, regs::GPU_CMD_SOFT_RESET)?;
6970

70-
// TODO: We cannot poll, as there is no support in Rust currently, so we
71-
// sleep. Change this when read_poll_timeout() is implemented in Rust.
72-
kernel::time::delay::fsleep(time::Delta::from_millis(100));
73-
74-
if regs::GPU_IRQ_RAWSTAT.read(dev, iomem)? & regs::GPU_IRQ_RAWSTAT_RESET_COMPLETED == 0 {
75-
dev_err!(dev, "GPU reset failed with errno\n");
76-
dev_err!(
77-
dev,
78-
"GPU_IRQ_RAWSTAT is {}\n",
79-
regs::GPU_IRQ_RAWSTAT.read(dev, iomem)?
80-
);
81-
82-
return Err(EIO);
83-
}
71+
poll::read_poll_timeout(
72+
|| regs::GPU_IRQ_RAWSTAT.read(dev, iomem),
73+
|status| *status & regs::GPU_IRQ_RAWSTAT_RESET_COMPLETED != 0,
74+
time::Delta::from_millis(1),
75+
time::Delta::from_millis(100),
76+
)
77+
.inspect_err(|_| dev_err!(dev, "GPU reset failed."))?;
8478

8579
Ok(())
8680
}

drivers/gpu/drm/tyr/gpu.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ use kernel::bits::genmask_u32;
66
use kernel::device::Bound;
77
use kernel::device::Device;
88
use kernel::devres::Devres;
9+
use kernel::io::poll;
910
use kernel::platform;
1011
use kernel::prelude::*;
11-
use kernel::time;
12+
use kernel::time::Delta;
1213
use kernel::transmute::AsBytes;
1314
use kernel::uapi;
1415

@@ -204,14 +205,13 @@ impl From<u32> for GpuId {
204205
pub(crate) fn l2_power_on(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result {
205206
regs::L2_PWRON_LO.write(dev, iomem, 1)?;
206207

207-
// TODO: We cannot poll, as there is no support in Rust currently, so we
208-
// sleep. Change this when read_poll_timeout() is implemented in Rust.
209-
kernel::time::delay::fsleep(time::Delta::from_millis(100));
210-
211-
if regs::L2_READY_LO.read(dev, iomem)? != 1 {
212-
dev_err!(dev, "Failed to power on the GPU\n");
213-
return Err(EIO);
214-
}
208+
poll::read_poll_timeout(
209+
|| regs::L2_READY_LO.read(dev, iomem),
210+
|status| *status == 1,
211+
Delta::from_millis(1),
212+
Delta::from_millis(100),
213+
)
214+
.inspect_err(|_| dev_err!(dev, "Failed to power on the GPU."))?;
215215

216216
Ok(())
217217
}

0 commit comments

Comments
 (0)