Skip to content

Commit 9a7aeae

Browse files
committed
drm/asahi: mmu: Convert to using Range
Signed-off-by: Asahi Lina <lina@asahilina.net>
1 parent 0969c9c commit 9a7aeae

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(Mutex::new_named(
10231023
VmBinding {
@@ -1036,14 +1036,11 @@ impl Vm {
10361036
c_str!("Asahi::GpuVm"),
10371037
dev,
10381038
&*(dummy_obj.gem),
1039-
min_va,
1040-
max_va - min_va,
1041-
0,
1042-
0,
1039+
va_range.clone(),
1040+
0..0,
10431041
init!(VmInner {
10441042
dev: dev.into(),
1045-
min_va,
1046-
max_va,
1043+
va_range,
10471044
is_kernel,
10481045
page_table,
10491046
mm,

0 commit comments

Comments
 (0)