[PATCH 01/10] drm/amdgpu: pin the csb buffer on hw init
Alex Deucher
alexdeucher at gmail.com
Thu Jul 5 15:25:20 UTC 2018
On Thu, Jul 5, 2018 at 11:25 AM, Huang Rui <ray.huang at amd.com> wrote:
> On Thu, Jul 05, 2018 at 05:09:26PM +0800, Evan Quan wrote:
>> Without this pin, the csb buffer will be filled with inconsistent
>> data after S3 resume. And that will causes gfx hang on gfxoff
>> exit since this csb will be executed then.
>>
>> Change-Id: I1ae1f2eed096eaba5f601cf2a3e2650c8e583dc9
>> Signed-off-by: Evan Quan <evan.quan at amd.com>
>
> It is nice to have the comments behind of csb_vram_pin function to explain
> why we need "pin" here during resume phase.
>
> Reviewed-by: Huang Rui <ray.huang at amd.com>
Do the save restore buffers in gfx7 and 8 need a similar fix?
Alex
>
>> ---
>> drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 40 +++++++++++++++++++++++++++
>> 1 file changed, 40 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>> index ac46eabe3bcd..65cc30766658 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>> @@ -943,6 +943,7 @@ static int gfx_v9_0_rlc_init(struct amdgpu_device *adev)
>> dst_ptr = adev->gfx.rlc.cs_ptr;
>> gfx_v9_0_get_csb_buffer(adev, dst_ptr);
>> amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj);
>> + amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
>> amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
>> }
>>
>> @@ -971,6 +972,39 @@ static int gfx_v9_0_rlc_init(struct amdgpu_device *adev)
>> return 0;
>> }
>>
>> +static int gfx_v9_0_csb_vram_pin(struct amdgpu_device *adev)
>> +{
>> + uint64_t gpu_addr;
>> + int r;
>> +
>> + r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false);
>> + if (unlikely(r != 0))
>> + return r;
>> +
>> + r = amdgpu_bo_pin(adev->gfx.rlc.clear_state_obj,
>> + AMDGPU_GEM_DOMAIN_VRAM, &gpu_addr);
>> + if (!r)
>> + adev->gfx.rlc.clear_state_gpu_addr = gpu_addr;
>> +
>> + amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
>> +
>> + return r;
>> +}
>> +
>> +static void gfx_v9_0_csb_vram_unpin(struct amdgpu_device *adev)
>> +{
>> + int r;
>> +
>> + if (!adev->gfx.rlc.clear_state_obj)
>> + return;
>> +
>> + r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, true);
>> + if (likely(r == 0)) {
>> + amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
>> + amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
>> + }
>> +}
>> +
>> static void gfx_v9_0_mec_fini(struct amdgpu_device *adev)
>> {
>> amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL);
>> @@ -3116,6 +3150,10 @@ static int gfx_v9_0_hw_init(void *handle)
>>
>> gfx_v9_0_gpu_init(adev);
>>
>> + r = gfx_v9_0_csb_vram_pin(adev);
>> + if (r)
>> + return r;
>> +
>> r = gfx_v9_0_rlc_resume(adev);
>> if (r)
>> return r;
>> @@ -3224,6 +3262,8 @@ static int gfx_v9_0_hw_fini(void *handle)
>> gfx_v9_0_cp_enable(adev, false);
>> gfx_v9_0_rlc_stop(adev);
>>
>> + gfx_v9_0_csb_vram_unpin(adev);
>> +
>> return 0;
>> }
>>
>> --
>> 2.18.0
>>
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list