@@ -309,12 +309,13 @@ static void svm_range_free(struct svm_range *prange, bool do_unmap)
309
309
}
310
310
311
311
static void
312
- svm_range_set_default_attributes (int32_t * location , int32_t * prefetch_loc ,
313
- uint8_t * granularity , uint32_t * flags )
312
+ svm_range_set_default_attributes (struct svm_range_list * svms , int32_t * location ,
313
+ int32_t * prefetch_loc , uint8_t * granularity ,
314
+ uint32_t * flags )
314
315
{
315
316
* location = KFD_IOCTL_SVM_LOCATION_UNDEFINED ;
316
317
* prefetch_loc = KFD_IOCTL_SVM_LOCATION_UNDEFINED ;
317
- * granularity = 9 ;
318
+ * granularity = svms -> default_granularity ;
318
319
* flags =
319
320
KFD_IOCTL_SVM_FLAG_HOST_ACCESS | KFD_IOCTL_SVM_FLAG_COHERENT ;
320
321
}
@@ -358,7 +359,7 @@ svm_range *svm_range_new(struct svm_range_list *svms, uint64_t start,
358
359
bitmap_copy (prange -> bitmap_access , svms -> bitmap_supported ,
359
360
MAX_GPU_INSTANCE );
360
361
361
- svm_range_set_default_attributes (& prange -> preferred_loc ,
362
+ svm_range_set_default_attributes (svms , & prange -> preferred_loc ,
362
363
& prange -> prefetch_loc ,
363
364
& prange -> granularity , & prange -> flags );
364
365
@@ -2703,9 +2704,10 @@ svm_range_get_range_boundaries(struct kfd_process *p, int64_t addr,
2703
2704
* is_heap_stack = vma_is_initial_heap (vma ) || vma_is_initial_stack (vma );
2704
2705
2705
2706
start_limit = max (vma -> vm_start >> PAGE_SHIFT ,
2706
- (unsigned long )ALIGN_DOWN (addr , 2UL << 8 ));
2707
+ (unsigned long )ALIGN_DOWN (addr , 1UL << p -> svms . default_granularity ));
2707
2708
end_limit = min (vma -> vm_end >> PAGE_SHIFT ,
2708
- (unsigned long )ALIGN (addr + 1 , 2UL << 8 ));
2709
+ (unsigned long )ALIGN (addr + 1 , 1UL << p -> svms .default_granularity ));
2710
+
2709
2711
/* First range that starts after the fault address */
2710
2712
node = interval_tree_iter_first (& p -> svms .objects , addr + 1 , ULONG_MAX );
2711
2713
if (node ) {
@@ -3249,6 +3251,12 @@ int svm_range_list_init(struct kfd_process *p)
3249
3251
if (KFD_IS_SVM_API_SUPPORTED (p -> pdds [i ]-> dev -> adev ))
3250
3252
bitmap_set (svms -> bitmap_supported , i , 1 );
3251
3253
3254
+ /* Value of default granularity cannot exceed 0x1B, the
3255
+ * number of pages supported by a 4-level paging table
3256
+ */
3257
+ svms -> default_granularity = min_t (u8 , amdgpu_svm_default_granularity , 0x1B );
3258
+ pr_debug ("Default SVM Granularity to use: %d\n" , svms -> default_granularity );
3259
+
3252
3260
return 0 ;
3253
3261
}
3254
3262
@@ -3776,7 +3784,7 @@ svm_range_get_attr(struct kfd_process *p, struct mm_struct *mm,
3776
3784
node = interval_tree_iter_first (& svms -> objects , start , last );
3777
3785
if (!node ) {
3778
3786
pr_debug ("range attrs not found return default values\n" );
3779
- svm_range_set_default_attributes (& location , & prefetch_loc ,
3787
+ svm_range_set_default_attributes (svms , & location , & prefetch_loc ,
3780
3788
& granularity , & flags_and );
3781
3789
flags_or = flags_and ;
3782
3790
if (p -> xnack_enabled )
0 commit comments