@@ -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) ;
0 commit comments