Skip to content

Commit eda45fa

Browse files
hoshinolinajannau
authored andcommitted
drm/asahi: mmu: Change step_remap() to new api
Fixes deadlock. Also fix missing TLB inval Signed-off-by: Asahi Lina <lina@asahilina.net>
1 parent b02a327 commit eda45fa

1 file changed

Lines changed: 14 additions & 2 deletions

File tree

drivers/gpu/drm/asahi/mmu.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,14 +341,14 @@ impl gpuvm::DriverGpuVm for VmInner {
341341
fn step_remap(
342342
self: &mut gpuvm::UpdatingGpuVm<'_, Self>,
343343
op: &mut gpuvm::OpReMap<Self>,
344+
vm_bo: &gpuvm::GpuVmBo<Self>,
344345
ctx: &mut Self::StepContext,
345346
) -> Result {
346347
let prev_gpuva = ctx.prev_va.take().expect("Multiple step_remap calls");
347348
let next_gpuva = ctx.next_va.take().expect("Multiple step_remap calls");
348349
let va = op.unmap().va().expect("No previous VA");
349350
let orig_addr = va.addr();
350351
let orig_range = va.range();
351-
let vm_bo = va.vm_bo();
352352

353353
// Only unmap the hole between prev/next, if they exist
354354
let unmap_start = if let Some(op) = op.prev_map() {
@@ -376,6 +376,18 @@ impl gpuvm::DriverGpuVm for VmInner {
376376

377377
self.unmap_pages(unmap_start, UAT_PGSZ, (unmap_range >> UAT_PGBIT) as usize)?;
378378

379+
if let Some(asid) = self.slot() {
380+
mem::tlbi_range(asid as u8, unmap_start as usize, unmap_range as usize);
381+
mod_dev_dbg!(
382+
self.dev,
383+
"MMU: flush range: asid={:#x} start={:#x} len={:#x}\n",
384+
asid,
385+
unmap_start,
386+
unmap_range,
387+
);
388+
mem::sync();
389+
}
390+
379391
if op.unmap().unmap_and_unlink_va().is_none() {
380392
dev_err!(self.dev.as_ref(), "step_unmap: could not unlink gpuva");
381393
}
@@ -1192,8 +1204,8 @@ impl Vm {
11921204
new_va: Some(gpuvm::GpuVa::<VmInner>::new(pin_init::default())?),
11931205
prev_va: Some(gpuvm::GpuVa::<VmInner>::new(pin_init::default())?),
11941206
next_va: Some(gpuvm::GpuVa::<VmInner>::new(pin_init::default())?),
1195-
vm_bo: None,
11961207
prot,
1208+
..Default::default()
11971209
};
11981210

11991211
let sgt = gem.owned_sg_table()?;

0 commit comments

Comments
 (0)