Skip to content

Commit 8a7727c

Browse files
hoshinolinajannau
authored andcommitted
drm/asahi: queue/render,compute: Handle cmdbuf size mismatches
This allows extending the render/compute cmdbufs at the end. Signed-off-by: Asahi Lina <lina@asahilina.net>
1 parent 80c1411 commit 8a7727c

2 files changed

Lines changed: 10 additions & 34 deletions

File tree

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

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ use crate::fw::types::*;
1414
use crate::gpu::GpuManager;
1515
use crate::{file, fw, gpu, microseq};
1616
use crate::{inner_ptr, inner_weak_ptr};
17-
use core::mem::MaybeUninit;
1817
use core::sync::atomic::Ordering;
1918
use kernel::dma_fence::RawDmaFence;
2019
use kernel::drm::sched::Job;
@@ -57,31 +56,20 @@ impl super::QueueInner::ver {
5756

5857
mod_dev_dbg!(self.dev, "[Submission {}] Compute!\n", id);
5958

60-
if cmd.cmd_buffer_size as usize != core::mem::size_of::<uapi::drm_asahi_cmd_compute>() {
61-
cls_pr_debug!(
62-
Errors,
63-
"Invalid compute command size ({:#x})\n",
64-
cmd.cmd_buffer_size
65-
);
66-
return Err(EINVAL);
67-
}
68-
59+
let cmdbuf_read_size =
60+
(cmd.cmd_buffer_size as usize).min(core::mem::size_of::<uapi::drm_asahi_cmd_compute>());
6961
let mut cmdbuf_reader = unsafe {
7062
UserSlicePtr::new(
7163
cmd.cmd_buffer as usize as *mut _,
72-
core::mem::size_of::<uapi::drm_asahi_cmd_compute>(),
64+
cmd.cmd_buffer_size as usize,
7365
)
7466
.reader()
7567
};
7668

77-
let mut cmdbuf: MaybeUninit<uapi::drm_asahi_cmd_compute> = MaybeUninit::uninit();
69+
let mut cmdbuf: uapi::drm_asahi_cmd_compute = Default::default();
7870
unsafe {
79-
cmdbuf_reader.read_raw(
80-
cmdbuf.as_mut_ptr() as *mut u8,
81-
core::mem::size_of::<uapi::drm_asahi_cmd_compute>(),
82-
)?;
71+
cmdbuf_reader.read_raw(&mut cmdbuf as *mut _ as *mut u8, cmdbuf_read_size)?;
8372
}
84-
let cmdbuf = unsafe { cmdbuf.assume_init() };
8573

8674
if cmdbuf.flags & !(uapi::ASAHI_COMPUTE_NO_PREEMPTION as u64) != 0 {
8775
return Err(EINVAL);

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

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use crate::util::*;
1616
use crate::workqueue::WorkError;
1717
use crate::{buffer, file, fw, gpu, microseq, workqueue};
1818
use crate::{inner_ptr, inner_weak_ptr};
19-
use core::mem::MaybeUninit;
2019
use core::sync::atomic::Ordering;
2120
use kernel::dma_fence::RawDmaFence;
2221
use kernel::drm::sched::Job;
@@ -234,31 +233,20 @@ impl super::QueueInner::ver {
234233

235234
mod_dev_dbg!(self.dev, "[Submission {}] Render!\n", id);
236235

237-
if cmd.cmd_buffer_size as usize != core::mem::size_of::<uapi::drm_asahi_cmd_render>() {
238-
cls_pr_debug!(
239-
Errors,
240-
"Invalid render command size ({:#x})\n",
241-
cmd.cmd_buffer_size
242-
);
243-
return Err(EINVAL);
244-
}
245-
236+
let cmdbuf_read_size =
237+
(cmd.cmd_buffer_size as usize).min(core::mem::size_of::<uapi::drm_asahi_cmd_render>());
246238
let mut cmdbuf_reader = unsafe {
247239
UserSlicePtr::new(
248240
cmd.cmd_buffer as usize as *mut _,
249-
core::mem::size_of::<uapi::drm_asahi_cmd_render>(),
241+
cmd.cmd_buffer_size as usize,
250242
)
251243
.reader()
252244
};
253245

254-
let mut cmdbuf: MaybeUninit<uapi::drm_asahi_cmd_render> = MaybeUninit::uninit();
246+
let mut cmdbuf: uapi::drm_asahi_cmd_render = Default::default();
255247
unsafe {
256-
cmdbuf_reader.read_raw(
257-
cmdbuf.as_mut_ptr() as *mut u8,
258-
core::mem::size_of::<uapi::drm_asahi_cmd_render>(),
259-
)?;
248+
cmdbuf_reader.read_raw(&mut cmdbuf as *mut _ as *mut u8, cmdbuf_read_size)?;
260249
}
261-
let cmdbuf = unsafe { cmdbuf.assume_init() };
262250

263251
if cmdbuf.flags
264252
& !(uapi::ASAHI_RENDER_NO_CLEAR_PIPELINE_TEXTURES

0 commit comments

Comments
 (0)