1212
1313use core:: fmt:: Debug ;
1414use core:: mem:: size_of;
15+ use core:: ops:: Range ;
1516use core:: ptr:: NonNull ;
1617use core:: sync:: atomic:: { fence, AtomicU32 , AtomicU64 , AtomicU8 , Ordering } ;
1718use core:: time:: Duration ;
@@ -34,7 +35,7 @@ use kernel::{
3435
3536use crate :: debug:: * ;
3637use crate :: no_debug;
37- use crate :: { driver, fw, gem, hw, mem, slotalloc} ;
38+ use crate :: { driver, fw, gem, hw, mem, slotalloc, util :: RangeExt } ;
3839
3940const DEBUG_CLASS : DebugFlags = DebugFlags :: Mmu ;
4041
@@ -69,12 +70,17 @@ pub(crate) const UAT_IAS_KERN: usize = 36;
6970pub ( crate ) const IOVA_USER_BASE : u64 = UAT_PGSZ as u64 ;
7071/// Lower/user top VA
7172pub ( 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
7579const IOVA_KERN_BASE : u64 = 0xffffffa000000000 ;
7680/// Driver-managed kernel top VA
7781const IOVA_KERN_TOP : u64 = 0xffffffb000000000 ;
82+ /// Lower/user VA range
83+ const IOVA_KERN_RANGE : Range < u64 > = IOVA_KERN_BASE ..IOVA_KERN_TOP ;
7884
7985const TTBR_VALID : u64 = 0x1 ; // BIT(0)
8086const TTBR_ASID_SHIFT : usize = 48 ;
@@ -178,8 +184,7 @@ const PAGETABLES_SIZE: usize = UAT_PGSZ;
178184struct 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