Skip to content

Commit de38e0a

Browse files
hoshinolinajannau
authored andcommitted
drm/asahi: queue: Plumb through objects XArray and add timestamp getter
Signed-off-by: Asahi Lina <lina@asahilina.net>
1 parent 9f46331 commit de38e0a

5 files changed

Lines changed: 42 additions & 4 deletions

File tree

drivers/gpu/drm/asahi/file.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1052,9 +1052,11 @@ impl File {
10521052
commands.push(unsafe { cmd.assume_init() }, GFP_KERNEL)?;
10531053
}
10541054

1055+
let objects = file.inner().objects();
1056+
10551057
let ret = queue
10561058
.lock()
1057-
.submit(id, in_syncs, out_syncs, result_buf, commands);
1059+
.submit(id, in_syncs, out_syncs, result_buf, commands, objects);
10581060

10591061
match ret {
10601062
Err(ERESTARTSYS) => Err(ERESTARTSYS),

drivers/gpu/drm/asahi/queue/common.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44
//!
55
//! Shared helpers used by the submission logic for multiple command types.
66
7+
use crate::file;
8+
use crate::fw::job::UserTimestamp;
79
use crate::fw::microseq;
810
use crate::fw::types::*;
911

1012
use kernel::io_buffer::IoBufferReader;
1113
use kernel::prelude::*;
1214
use kernel::uapi;
1315
use kernel::user_ptr::UserSlicePtr;
16+
use kernel::xarray;
1417

1518
use core::mem::MaybeUninit;
1619

@@ -56,3 +59,28 @@ pub(super) fn build_attachments(pointer: u64, count: u32) -> Result<microseq::At
5659

5760
Ok(attachments)
5861
}
62+
63+
pub(super) fn get_timestamp_object(
64+
objects: Pin<&xarray::XArray<KBox<file::Object>>>,
65+
handle: u32,
66+
offset: u32,
67+
) -> Result<Option<UserTimestamp>> {
68+
if handle == 0 {
69+
return Ok(None);
70+
}
71+
72+
let object = objects.get(handle.try_into()?).ok_or(ENOENT)?;
73+
74+
#[allow(irrefutable_let_patterns)]
75+
if let file::Object::TimestampBuffer(mapping) = object.borrow() {
76+
if (offset.checked_add(8).ok_or(EINVAL)?) as usize > mapping.size() {
77+
return Err(ERANGE);
78+
}
79+
Ok(Some(UserTimestamp {
80+
mapping: mapping.clone(),
81+
offset: offset as usize,
82+
}))
83+
} else {
84+
Err(EINVAL)
85+
}
86+
}

drivers/gpu/drm/asahi/queue/compute.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::alloc::Allocator;
1212
use crate::debug::*;
1313
use crate::fw::types::*;
1414
use crate::gpu::GpuManager;
15-
use crate::{fw, gpu, microseq};
15+
use crate::{file, fw, gpu, microseq};
1616
use crate::{inner_ptr, inner_weak_ptr};
1717
use core::mem::MaybeUninit;
1818
use core::sync::atomic::Ordering;
@@ -23,6 +23,7 @@ use kernel::prelude::*;
2323
use kernel::sync::Arc;
2424
use kernel::uapi;
2525
use kernel::user_ptr::UserSlicePtr;
26+
use kernel::xarray;
2627

2728
const DEBUG_CLASS: DebugFlags = DebugFlags::Compute;
2829

@@ -34,6 +35,7 @@ impl super::QueueInner::ver {
3435
job: &mut Job<super::QueueJob::ver>,
3536
cmd: &uapi::drm_asahi_command,
3637
result_writer: Option<super::ResultWriter>,
38+
objects: Pin<&xarray::XArray<KBox<file::Object>>>,
3739
id: u64,
3840
flush_stamps: bool,
3941
) -> Result {

drivers/gpu/drm/asahi/queue/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use kernel::{
1313
drm::sched,
1414
macros::versions,
1515
sync::{Arc, Mutex},
16-
uapi,
16+
uapi, xarray,
1717
};
1818

1919
use crate::alloc::Allocator;
@@ -43,6 +43,7 @@ pub(crate) trait Queue: Send + Sync {
4343
out_syncs: KVec<file::SyncItem>,
4444
result_buf: Option<gem::ObjectRef>,
4545
commands: KVec<uapi::drm_asahi_command>,
46+
objects: Pin<&xarray::XArray<KBox<file::Object>>>,
4647
) -> Result;
4748
}
4849

@@ -541,6 +542,7 @@ impl Queue for Queue::ver {
541542
out_syncs: KVec<file::SyncItem>,
542543
result_buf: Option<gem::ObjectRef>,
543544
commands: KVec<uapi::drm_asahi_command>,
545+
objects: Pin<&xarray::XArray<KBox<file::Object>>>,
544546
) -> Result {
545547
let dev = self.dev.data();
546548
let gpu = match dev
@@ -753,6 +755,7 @@ impl Queue for Queue::ver {
753755
&mut job,
754756
&cmd,
755757
result_writer,
758+
objects,
756759
id,
757760
last_render.unwrap() == i,
758761
)?;
@@ -774,6 +777,7 @@ impl Queue for Queue::ver {
774777
&mut job,
775778
&cmd,
776779
result_writer,
780+
objects,
777781
id,
778782
last_compute.unwrap() == i,
779783
)?;

drivers/gpu/drm/asahi/queue/render.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::fw::types::*;
1414
use crate::gpu::GpuManager;
1515
use crate::util::*;
1616
use crate::workqueue::WorkError;
17-
use crate::{buffer, fw, gpu, microseq, workqueue};
17+
use crate::{buffer, file, fw, gpu, microseq, workqueue};
1818
use crate::{inner_ptr, inner_weak_ptr};
1919
use core::mem::MaybeUninit;
2020
use core::sync::atomic::Ordering;
@@ -26,6 +26,7 @@ use kernel::prelude::*;
2626
use kernel::sync::Arc;
2727
use kernel::uapi;
2828
use kernel::user_ptr::UserSlicePtr;
29+
use kernel::xarray;
2930

3031
const DEBUG_CLASS: DebugFlags = DebugFlags::Render;
3132

@@ -222,6 +223,7 @@ impl super::QueueInner::ver {
222223
job: &mut Job<super::QueueJob::ver>,
223224
cmd: &uapi::drm_asahi_command,
224225
result_writer: Option<super::ResultWriter>,
226+
objects: Pin<&xarray::XArray<KBox<file::Object>>>,
225227
id: u64,
226228
flush_stamps: bool,
227229
) -> Result {

0 commit comments

Comments
 (0)