On 2026. május 26., kedd 10:10:33 közép-európai nyári idő Christian König 
wrote:
> On 5/25/26 13:33, Timur Kristóf wrote:
> > UVD 4.x and older can only access MSG, FEEDBACK buffers from a
> > specific 256M VRAM segment that the VCPU BO is also located in.
> > We already modify all placements of the given BO to ensure
> > the BO is placed within this segment.
> > 
> > Previously, it always assumed that the VCPU segment is
> > the first 256M of VRAM, even though under some conditions
> > the VCPU BO could be allocated outside this segment,
> > which made UVD non-functional as the BOs were
> > not inside the same segment as the UVD VCPU BO.
> > 
> > Solve that by using the segment where the VCPU BO actually is.
> > 
> > This fixes an issue with UVD failing to initialize on SI/CIK
> > when resizable BAR is enabled and the VCPU BO is allocated
> > in a different segment.
> > 
> > v2:
> > - For other BOs, keep using the same UVD segment as before.
> > 
> > Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/3851
> > Signed-off-by: Timur Kristóf <[email protected]>
> > ---
> > 
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 33 ++++++++++++++++++-------
> >  1 file changed, 24 insertions(+), 9 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c index
> > 1e59ca924abe..480bf88def46 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> > @@ -135,7 +135,7 @@ MODULE_FIRMWARE(FIRMWARE_VEGA12);
> > 
> >  MODULE_FIRMWARE(FIRMWARE_VEGA20);
> >  
> >  static void amdgpu_uvd_idle_work_handler(struct work_struct *work);
> > 
> > -static void amdgpu_uvd_force_into_uvd_segment(struct amdgpu_bo *abo);
> > +static void amdgpu_uvd_force_into_vcpu_segment(struct amdgpu_bo *abo);
> > 
> >  static int amdgpu_uvd_create_msg_bo_helper(struct amdgpu_device *adev,
> >  
> >                                        uint32_t size,
> > 
> > @@ -158,7 +158,7 @@ static int amdgpu_uvd_create_msg_bo_helper(struct
> > amdgpu_device *adev,> 
> >     amdgpu_bo_kunmap(bo);
> >     amdgpu_bo_unpin(bo);
> >     amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
> > 
> > -   amdgpu_uvd_force_into_uvd_segment(bo);
> > +   amdgpu_uvd_force_into_vcpu_segment(bo);
> > 
> >     r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
> >     if (r)
> >     
> >             goto err;
> > 
> > @@ -550,6 +550,24 @@ void amdgpu_uvd_free_handles(struct amdgpu_device
> > *adev, struct drm_file *filp)> 
> >     }
> >  
> >  }
> > 
> > +static void amdgpu_uvd_force_into_vcpu_segment(struct amdgpu_bo *bo)
> > +{
> > +   struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
> > +   struct amdgpu_bo *vcpu_bo = adev->uvd.inst[0].vcpu_bo;
> > +   struct amdgpu_res_cursor vcpu_cur;
> > +
> > +   amdgpu_res_first(vcpu_bo->tbo.resource, 0,
> > +                    amdgpu_bo_size(vcpu_bo), &vcpu_cur);
> > +
> > +   bo->placement.num_placement = 1;
> > +   bo->placement.placement = &bo->placements[0];
> > +   bo->placements[0].fpfn = ALIGN_DOWN(vcpu_cur.start, SZ_256M) >>
> > PAGE_SHIFT; +       bo->placements[0].lpfn = bo->placements[0].fpfn + 
(SZ_256M
> > >> PAGE_SHIFT); +   bo->placements[0].mem_type =
> > vcpu_bo->tbo.resource->mem_type;
> > +   if (bo->placements[0].mem_type == TTM_PL_VRAM)
> > +           bo->placements[0].flags |= TTM_PL_FLAG_CONTIGUOUS;
> 
> You need to call ttm_bo_validate() here.

Can you say why?
ttm_bo_validate() is already called by both callers of this function.




Reply via email to