[PATCH 2/3] drm/amdgpu: allocate gart memory when it's required (v2)
Zhang, Jerry (Junwei)
Jerry.Zhang at amd.com
Thu Jun 28 02:03:24 UTC 2018
On 06/28/2018 12:52 AM, Felix Kuehling wrote:
> On 2018-06-26 09:42 PM, Zhang, Jerry (Junwei) wrote:
>>
>> BTW, kfd2kgd_calls kfd2kgd looks duplicated in amdkfd_gfx_v7/8/9.c
>> we may initialize it in a common place(at least for common members).
>> If it has other purpose, please ignore that.
>
> Some of the function pointers in kfd2kgd_calls are HW-specific (static
> functions implemented in amdgpu_amdkfd_gfx_v[789].c). Therefore they are
> not really duplicates. They may look the same in the source code, but
> they'll end up pointing to different functions.
Thanks for your explanation.
I see.
Just a suggestion. In this case, we may add the version for each func
to clarify the different HW support, e.g. kgd_program_sh_mem_settings_v9.
Then the common func would be identified clearly, like alloc_gtt_mem() for all HWs.
So do HW-specific func.
(seems to talk too much regardless of this thread, thanks for your discussion)
Jerry
>
> Regards,
> Felix
>
>>
>> Jerry
>>
>>>
>>> Regards,
>>> Felix
>>>
>>>> ret = amdgpu_bo_kmap(bo, kptr);
>>>> if (ret) {
>>>> pr_err("Failed to map bo to kernel. ret %d\n", ret);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
>>>> index cb88d7e..3079ea8 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
>>>> @@ -96,11 +96,16 @@ static void amdgpu_benchmark_move(struct
>>>> amdgpu_device *adev, unsigned size,
>>>> if (unlikely(r != 0))
>>>> goto out_cleanup;
>>>> r = amdgpu_bo_pin(sobj, sdomain);
>>>> - saddr = amdgpu_bo_gpu_offset(sobj);
>>>> + if (r) {
>>>> + amdgpu_bo_unreserve(sobj);
>>>> + goto out_cleanup;
>>>> + }
>>>> + r = amdgpu_ttm_alloc_gart(&sobj->tbo);
>>>> amdgpu_bo_unreserve(sobj);
>>>> if (r) {
>>>> goto out_cleanup;
>>>> }
>>>> + saddr = amdgpu_bo_gpu_offset(sobj);
>>>> bp.domain = ddomain;
>>>> r = amdgpu_bo_create(adev, &bp, &dobj);
>>>> if (r) {
>>>> @@ -110,11 +115,16 @@ static void amdgpu_benchmark_move(struct
>>>> amdgpu_device *adev, unsigned size,
>>>> if (unlikely(r != 0))
>>>> goto out_cleanup;
>>>> r = amdgpu_bo_pin(dobj, ddomain);
>>>> - daddr = amdgpu_bo_gpu_offset(dobj);
>>>> + if (r) {
>>>> + amdgpu_bo_unreserve(sobj);
>>>> + goto out_cleanup;
>>>> + }
>>>> + r = amdgpu_ttm_alloc_gart(&dobj->tbo);
>>>> amdgpu_bo_unreserve(dobj);
>>>> if (r) {
>>>> goto out_cleanup;
>>>> }
>>>> + daddr = amdgpu_bo_gpu_offset(dobj);
>>>>
>>>> if (adev->mman.buffer_funcs) {
>>>> time = amdgpu_benchmark_do_move(adev, size, saddr, daddr, n);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>>>> index 036b6f7..7d6a36b 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>>>> @@ -194,6 +194,12 @@ int amdgpu_display_crtc_page_flip_target(struct
>>>> drm_crtc *crtc,
>>>> goto unreserve;
>>>> }
>>>>
>>>> + r = amdgpu_ttm_alloc_gart(&new_abo->tbo);
>>>> + if (unlikely(r != 0)) {
>>>> + DRM_ERROR("%p bind failed\n", new_abo);
>>>> + goto unpin;
>>>> + }
>>>> +
>>>> r = reservation_object_get_fences_rcu(new_abo->tbo.resv,
>>>> &work->excl,
>>>> &work->shared_count,
>>>> &work->shared);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
>>>> index 462b7a1..cd68a2e 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
>>>> @@ -173,6 +173,14 @@ static int amdgpufb_create_pinned_object(struct
>>>> amdgpu_fbdev *rfbdev,
>>>> amdgpu_bo_unreserve(abo);
>>>> goto out_unref;
>>>> }
>>>> +
>>>> + ret = amdgpu_ttm_alloc_gart(&abo->tbo);
>>>> + if (ret) {
>>>> + amdgpu_bo_unreserve(abo);
>>>> + dev_err(adev->dev, "%p bind failed\n", abo);
>>>> + goto out_unref;
>>>> + }
>>>> +
>>>> ret = amdgpu_bo_kmap(abo, NULL);
>>>> amdgpu_bo_unreserve(abo);
>>>> if (ret) {
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>>> index 79cdbf1..7f7c221 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>>> @@ -257,6 +257,13 @@ int amdgpu_bo_create_reserved(struct
>>>> amdgpu_device *adev,
>>>> dev_err(adev->dev, "(%d) kernel bo pin failed\n", r);
>>>> goto error_unreserve;
>>>> }
>>>> +
>>>> + r = amdgpu_ttm_alloc_gart(&(*bo_ptr)->tbo);
>>>> + if (r) {
>>>> + dev_err(adev->dev, "%p bind failed\n", *bo_ptr);
>>>> + goto error_unpin;
>>>> + }
>>>> +
>>>> if (gpu_addr)
>>>> *gpu_addr = amdgpu_bo_gpu_offset(*bo_ptr);
>>>>
>>>> @@ -270,6 +277,8 @@ int amdgpu_bo_create_reserved(struct
>>>> amdgpu_device *adev,
>>>>
>>>> return 0;
>>>>
>>>> +error_unpin:
>>>> + amdgpu_bo_unpin(*bo_ptr);
>>>> error_unreserve:
>>>> amdgpu_bo_unreserve(*bo_ptr);
>>>>
>>>> @@ -903,12 +912,6 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo
>>>> *bo, u32 domain,
>>>> goto error;
>>>> }
>>>>
>>>> - r = amdgpu_ttm_alloc_gart(&bo->tbo);
>>>> - if (unlikely(r)) {
>>>> - dev_err(adev->dev, "%p bind failed\n", bo);
>>>> - goto error;
>>>> - }
>>>> -
>>>> bo->pin_count = 1;
>>>>
>>>> domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
>>>> index 622affc..d6eeea1 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
>>>> @@ -102,6 +102,11 @@ static void amdgpu_do_test_moves(struct
>>>> amdgpu_device *adev)
>>>> DRM_ERROR("Failed to pin GTT object %d\n", i);
>>>> goto out_lclean_unres;
>>>> }
>>>> + r = amdgpu_ttm_alloc_gart(>t_obj[i]->tbo);
>>>> + if (r) {
>>>> + DRM_ERROR("%p bind failed\n", gtt_obj[i]);
>>>> + goto out_lclean_unpin;
>>>> + }
>>>> gart_addr = amdgpu_bo_gpu_offset(gtt_obj[i]);
>>>>
>>>> r = amdgpu_bo_kmap(gtt_obj[i], >t_map);
>>>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>> index 31652c1e..d433428 100644
>>>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>> @@ -3110,13 +3110,22 @@ static int dm_plane_helper_prepare_fb(struct
>>>> drm_plane *plane,
>>>> domain = AMDGPU_GEM_DOMAIN_VRAM;
>>>>
>>>> r = amdgpu_bo_pin(rbo, domain);
>>>> - amdgpu_bo_unreserve(rbo);
>>>> -
>>>> if (unlikely(r != 0)) {
>>>> if (r != -ERESTARTSYS)
>>>> DRM_ERROR("Failed to pin framebuffer with error %d\n",
>>>> r);
>>>> + amdgpu_bo_unreserve(rbo);
>>>> + return r;
>>>> + }
>>>> +
>>>> + r = amdgpu_ttm_alloc_gart(&rbo->tbo);
>>>> + if (unlikely(r != 0)) {
>>>> + amdgpu_bo_unpin(rbo);
>>>> + amdgpu_bo_unreserve(rbo);
>>>> + DRM_ERROR("%p bind failed\n", rbo);
>>>> return r;
>>>> }
>>>> + amdgpu_bo_unreserve(rbo);
>>>> +
>>>> afb->address = amdgpu_bo_gpu_offset(rbo);
>>>>
>>>> amdgpu_bo_ref(rbo);
>>>
>
More information about the amd-gfx
mailing list