@@ -456,6 +456,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
456456 u64 vis_usage = 0 , max_bytes , min_block_size ;
457457 struct amdgpu_vram_mgr_resource * vres ;
458458 u64 size , remaining_size , lpfn , fpfn ;
459+ unsigned int adjust_dcc_size = 0 ;
459460 struct drm_buddy * mm = & mgr -> mm ;
460461 struct drm_buddy_block * block ;
461462 unsigned long pages_per_block ;
@@ -511,7 +512,19 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
511512 /* Allocate blocks in desired range */
512513 vres -> flags |= DRM_BUDDY_RANGE_ALLOCATION ;
513514
515+ if (bo -> flags & AMDGPU_GEM_CREATE_GFX12_DCC &&
516+ adev -> gmc .gmc_funcs -> get_dcc_alignment )
517+ adjust_dcc_size = amdgpu_gmc_get_dcc_alignment (adev );
518+
514519 remaining_size = (u64 )vres -> base .size ;
520+ if (bo -> flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS && adjust_dcc_size ) {
521+ unsigned int dcc_size ;
522+
523+ dcc_size = roundup_pow_of_two (vres -> base .size + adjust_dcc_size );
524+ remaining_size = (u64 )dcc_size ;
525+
526+ vres -> flags |= DRM_BUDDY_TRIM_DISABLE ;
527+ }
515528
516529 mutex_lock (& mgr -> lock );
517530 while (remaining_size ) {
@@ -521,8 +534,11 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
521534 min_block_size = mgr -> default_page_size ;
522535
523536 size = remaining_size ;
524- if ((size >= (u64 )pages_per_block << PAGE_SHIFT ) &&
525- !(size & (((u64 )pages_per_block << PAGE_SHIFT ) - 1 )))
537+
538+ if (bo -> flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS && adjust_dcc_size )
539+ min_block_size = size ;
540+ else if ((size >= (u64 )pages_per_block << PAGE_SHIFT ) &&
541+ !(size & (((u64 )pages_per_block << PAGE_SHIFT ) - 1 )))
526542 min_block_size = (u64 )pages_per_block << PAGE_SHIFT ;
527543
528544 BUG_ON (min_block_size < mm -> chunk_size );
@@ -553,6 +569,22 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
553569 }
554570 mutex_unlock (& mgr -> lock );
555571
572+ if (bo -> flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS && adjust_dcc_size ) {
573+ struct drm_buddy_block * dcc_block ;
574+ unsigned long dcc_start ;
575+ u64 trim_start ;
576+
577+ dcc_block = amdgpu_vram_mgr_first_block (& vres -> blocks );
578+ /* Adjust the start address for DCC buffers only */
579+ dcc_start =
580+ roundup ((unsigned long )amdgpu_vram_mgr_block_start (dcc_block ),
581+ adjust_dcc_size );
582+ trim_start = (u64 )dcc_start ;
583+ drm_buddy_block_trim (mm , & trim_start ,
584+ (u64 )vres -> base .size ,
585+ & vres -> blocks );
586+ }
587+
556588 vres -> base .start = 0 ;
557589 size = max_t (u64 , amdgpu_vram_mgr_blocks_size (& vres -> blocks ),
558590 vres -> base .size );
0 commit comments