On 5/26/26 12:13, Timur Kristóf wrote:
> 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.


My bad, I was misreading the code.

In that case Reviewed-by: Christian König <[email protected]>

Thanks,
Christian.

> 
> 
> 
> 

Reply via email to