Skip to content

Commit 10d7883

Browse files
hoshinolinajannau
authored andcommitted
drm/asahi: mmu: Convert to using Range
Signed-off-by: Asahi Lina <lina@asahilina.net>
1 parent 13a6204 commit 10d7883

1 file changed

Lines changed: 17 additions & 20 deletions

File tree

drivers/gpu/drm/asahi/mmu.rs

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
1313
use core::fmt::Debug;
1414
use core::mem::size_of;
15+
use core::ops::Range;
1516
use core::ptr::NonNull;
1617
use core::sync::atomic::{fence, AtomicU32, AtomicU64, AtomicU8, Ordering};
1718
use core::time::Duration;
@@ -34,7 +35,7 @@ use kernel::{
3435

3536
use crate::debug::*;
3637
use crate::no_debug;
37-
use crate::{driver, fw, gem, hw, mem, slotalloc};
38+
use crate::{driver, fw, gem, hw, mem, slotalloc, util::RangeExt};
3839

3940
const DEBUG_CLASS: DebugFlags = DebugFlags::Mmu;
4041

@@ -69,12 +70,17 @@ pub(crate) const UAT_IAS_KERN: usize = 36;
6970
pub(crate) const IOVA_USER_BASE: u64 = UAT_PGSZ as u64;
7071
/// Lower/user top VA
7172
pub(crate) const IOVA_USER_TOP: u64 = 1 << (UAT_IAS as u64);
73+
/// Lower/user VA range
74+
pub(crate) const IOVA_USER_RANGE: Range<u64> = IOVA_USER_BASE..IOVA_USER_TOP;
75+
7276
/// Upper/kernel base VA
7377
// const IOVA_TTBR1_BASE: usize = 0xffffff8000000000;
7478
/// Driver-managed kernel base VA
7579
const IOVA_KERN_BASE: u64 = 0xffffffa000000000;
7680
/// Driver-managed kernel top VA
7781
const IOVA_KERN_TOP: u64 = 0xffffffb000000000;
82+
/// Lower/user VA range
83+
const IOVA_KERN_RANGE: Range<u64> = IOVA_KERN_BASE..IOVA_KERN_TOP;
7884

7985
const TTBR_VALID: u64 = 0x1; // BIT(0)
8086
const TTBR_ASID_SHIFT: usize = 48;
@@ -178,8 +184,7 @@ const PAGETABLES_SIZE: usize = UAT_PGSZ;
178184
struct VmInner {
179185
dev: driver::AsahiDevRef,
180186
is_kernel: bool,
181-
min_va: u64,
182-
max_va: u64,
187+
va_range: Range<u64>,
183188
page_table: AppleUAT<Uat>,
184189
mm: mm::Allocator<(), KernelMappingInner>,
185190
uat_inner: Arc<UatInner>,
@@ -412,10 +417,10 @@ impl VmInner {
412417

413418
/// Map an IOVA to the shifted address the underlying io_pgtable uses.
414419
fn map_iova(&self, iova: u64, size: usize) -> Result<u64> {
415-
if iova < self.min_va || (iova + size as u64) > self.max_va {
420+
if !self.va_range.is_superset(iova..(iova + size as u64)) {
416421
Err(EINVAL)
417422
} else if self.is_kernel {
418-
Ok(iova - self.min_va)
423+
Ok(iova - self.va_range.start)
419424
} else {
420425
Ok(iova)
421426
}
@@ -1006,18 +1011,13 @@ impl Vm {
10061011
},
10071012
(),
10081013
)?;
1009-
let min_va = if is_kernel {
1010-
IOVA_KERN_BASE
1011-
} else {
1012-
IOVA_USER_BASE
1013-
};
1014-
let max_va = if is_kernel {
1015-
IOVA_KERN_TOP
1014+
let va_range = if is_kernel {
1015+
IOVA_KERN_RANGE
10161016
} else {
1017-
IOVA_USER_TOP
1017+
IOVA_USER_RANGE
10181018
};
10191019

1020-
let mm = mm::Allocator::new(min_va, max_va - min_va, ())?;
1020+
let mm = mm::Allocator::new(va_range.start, va_range.range(), ())?;
10211021

10221022
let binding = Arc::pin_init(
10231023
Mutex::new_named(
@@ -1039,14 +1039,11 @@ impl Vm {
10391039
c_str!("Asahi::GpuVm"),
10401040
dev,
10411041
&*(dummy_obj.gem),
1042-
min_va,
1043-
max_va - min_va,
1044-
0,
1045-
0,
1042+
va_range.clone(),
1043+
0..0,
10461044
init!(VmInner {
10471045
dev: dev.into(),
1048-
min_va,
1049-
max_va,
1046+
va_range,
10501047
is_kernel,
10511048
page_table,
10521049
mm,

0 commit comments

Comments
 (0)