@@ -91,7 +91,10 @@ static void amdgpu_ttm_placement_init(struct amdgpu_device *adev,
9191
9292 if (domain & AMDGPU_GEM_DOMAIN_GTT ) {
9393 places [c ].fpfn = 0 ;
94- places [c ].lpfn = 0 ;
94+ if (flags & AMDGPU_GEM_CREATE_SHADOW )
95+ places [c ].lpfn = adev -> mc .gart_size >> PAGE_SHIFT ;
96+ else
97+ places [c ].lpfn = 0 ;
9598 places [c ].flags = TTM_PL_FLAG_TT ;
9699 if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC )
97100 places [c ].flags |= TTM_PL_FLAG_WC |
@@ -446,17 +449,16 @@ static int amdgpu_bo_create_shadow(struct amdgpu_device *adev,
446449 if (bo -> shadow )
447450 return 0 ;
448451
449- bo -> flags |= AMDGPU_GEM_CREATE_SHADOW ;
450- memset (& placements , 0 ,
451- (AMDGPU_GEM_DOMAIN_MAX + 1 ) * sizeof (struct ttm_place ));
452-
453- amdgpu_ttm_placement_init (adev , & placement ,
454- placements , AMDGPU_GEM_DOMAIN_GTT ,
455- AMDGPU_GEM_CREATE_CPU_GTT_USWC );
452+ memset (& placements , 0 , sizeof (placements ));
453+ amdgpu_ttm_placement_init (adev , & placement , placements ,
454+ AMDGPU_GEM_DOMAIN_GTT ,
455+ AMDGPU_GEM_CREATE_CPU_GTT_USWC |
456+ AMDGPU_GEM_CREATE_SHADOW );
456457
457458 r = amdgpu_bo_create_restricted (adev , size , byte_align , true,
458459 AMDGPU_GEM_DOMAIN_GTT ,
459- AMDGPU_GEM_CREATE_CPU_GTT_USWC ,
460+ AMDGPU_GEM_CREATE_CPU_GTT_USWC |
461+ AMDGPU_GEM_CREATE_SHADOW ,
460462 NULL , & placement ,
461463 bo -> tbo .resv ,
462464 0 ,
@@ -484,30 +486,28 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
484486{
485487 struct ttm_placement placement = {0 };
486488 struct ttm_place placements [AMDGPU_GEM_DOMAIN_MAX + 1 ];
489+ uint64_t parent_flags = flags & ~AMDGPU_GEM_CREATE_SHADOW ;
487490 int r ;
488491
489- memset (& placements , 0 ,
490- (AMDGPU_GEM_DOMAIN_MAX + 1 ) * sizeof (struct ttm_place ));
492+ memset (& placements , 0 , sizeof (placements ));
493+ amdgpu_ttm_placement_init (adev , & placement , placements ,
494+ domain , parent_flags );
491495
492- amdgpu_ttm_placement_init (adev , & placement ,
493- placements , domain , flags );
494-
495- r = amdgpu_bo_create_restricted (adev , size , byte_align , kernel ,
496- domain , flags , sg , & placement ,
497- resv , init_value , bo_ptr );
496+ r = amdgpu_bo_create_restricted (adev , size , byte_align , kernel , domain ,
497+ parent_flags , sg , & placement , resv ,
498+ init_value , bo_ptr );
498499 if (r )
499500 return r ;
500501
501- if (amdgpu_need_backup (adev ) && (flags & AMDGPU_GEM_CREATE_SHADOW )) {
502- if (!resv ) {
503- r = ww_mutex_lock (& (* bo_ptr )-> tbo .resv -> lock , NULL );
504- WARN_ON (r != 0 );
505- }
502+ if ((flags & AMDGPU_GEM_CREATE_SHADOW ) && amdgpu_need_backup (adev )) {
503+ if (!resv )
504+ WARN_ON (reservation_object_lock ((* bo_ptr )-> tbo .resv ,
505+ NULL ));
506506
507507 r = amdgpu_bo_create_shadow (adev , size , byte_align , (* bo_ptr ));
508508
509509 if (!resv )
510- ww_mutex_unlock ( & (* bo_ptr )-> tbo .resv -> lock );
510+ reservation_object_unlock ( (* bo_ptr )-> tbo .resv );
511511
512512 if (r )
513513 amdgpu_bo_unref (bo_ptr );
0 commit comments