Skip to content

Commit 8df5412

Browse files
jannauherrnst
authored andcommitted
drm/asahi: Implement ASAHI_BIND_SINGLE_PAGE (mmu/pgtbl)
Signed-off-by: Asahi Lina <[email protected]>
1 parent 01d149c commit 8df5412

2 files changed

Lines changed: 40 additions & 13 deletions

File tree

drivers/gpu/drm/asahi/mmu.rs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ impl gpuvm::DriverGpuVm for VmInner {
229229

230230
let bo = ctx.vm_bo.as_ref().expect("step_map with no BO");
231231

232+
let one_page = op.flags().contains(gpuvm::GpuVaFlags::REPEAT);
233+
232234
let guard = bo.inner().sgt.lock();
233235
for range in guard.as_ref().expect("step_map with no SGT").iter() {
234236
// TODO: proper DMA address/length handling
@@ -252,18 +254,27 @@ impl gpuvm::DriverGpuVm for VmInner {
252254

253255
assert!(offset == 0);
254256

255-
len = len.min(left);
257+
if one_page {
258+
len = left;
259+
} else {
260+
len = len.min(left);
261+
}
256262

257263
mod_dev_dbg!(
258264
self.dev,
259-
"MMU: map: {:#x}:{:#x} -> {:#x}\n",
265+
"MMU: map: {:#x}:{:#x} -> {:#x} [OP={}]\n",
260266
addr,
261267
len,
262-
iova
268+
iova,
269+
one_page
263270
);
264271

265-
self.page_table
266-
.map_pages(iova..(iova + len as u64), addr as PhysicalAddr, ctx.prot)?;
272+
self.page_table.map_pages(
273+
iova..(iova + len as u64),
274+
addr as PhysicalAddr,
275+
ctx.prot,
276+
one_page,
277+
)?;
267278

268279
left -= len;
269280
iova += len as u64;
@@ -476,8 +487,12 @@ impl VmInner {
476487
iova
477488
);
478489

479-
self.page_table
480-
.map_pages(iova..(iova + len as u64), addr as PhysicalAddr, prot)?;
490+
self.page_table.map_pages(
491+
iova..(iova + len as u64),
492+
addr as PhysicalAddr,
493+
prot,
494+
false,
495+
)?;
481496

482497
iova += len as u64;
483498
left -= len;
@@ -1117,6 +1132,7 @@ impl Vm {
11171132
size: u64,
11181133
offset: u64,
11191134
prot: Prot,
1135+
single_page: bool,
11201136
) -> Result {
11211137
// Mapping needs a complete context
11221138
let mut ctx = StepContext {
@@ -1154,14 +1170,20 @@ impl Vm {
11541170
return Err(EINVAL);
11551171
}
11561172

1173+
let (flags, gem_range) = if single_page {
1174+
(gpuvm::GpuVaFlags::REPEAT, UAT_PGSZ as u32)
1175+
} else {
1176+
(gpuvm::GpuVaFlags::NONE, 0u32)
1177+
};
1178+
11571179
mod_dev_dbg!(
11581180
inner.dev,
11591181
"MMU: sm_map: {:#x} [{:#x}] -> {:#x}\n",
11601182
offset,
11611183
size,
11621184
addr
11631185
);
1164-
inner.sm_map(&mut ctx, addr, size, offset)
1186+
inner.sm_map(&mut ctx, addr, size, offset, gem_range, flags)
11651187
}
11661188

11671189
/// Add a direct MMIO mapping to this Vm at a free address.
@@ -1209,10 +1231,12 @@ impl Vm {
12091231
0,
12101232
)?;
12111233

1212-
let ret =
1213-
inner
1214-
.page_table
1215-
.map_pages(iova..(iova + size as u64), phys as PhysicalAddr, prot);
1234+
let ret = inner.page_table.map_pages(
1235+
iova..(iova + size as u64),
1236+
phys as PhysicalAddr,
1237+
prot,
1238+
false,
1239+
);
12161240
// Drop the exec_lock first, so that if map_node failed the
12171241
// KernelMappingInner destructur does not deadlock.
12181242
core::mem::drop(inner);

drivers/gpu/drm/asahi/pgtable.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ impl UatPageTable {
399399
iova_range: Range<u64>,
400400
mut phys: PhysicalAddr,
401401
prot: Prot,
402+
one_page: bool,
402403
) -> Result {
403404
mod_pr_debug!(
404405
"UATPageTable::map_pages: {:#x?} {:#x?} {:?}\n",
@@ -424,7 +425,9 @@ impl UatPageTable {
424425
);
425426
}
426427
pte.store(phys | prot.as_pte() | pte_bits, Ordering::Relaxed);
427-
phys += UAT_PGSZ as PhysicalAddr;
428+
if !one_page {
429+
phys += UAT_PGSZ as PhysicalAddr;
430+
}
428431
}
429432
})
430433
}

0 commit comments

Comments
 (0)