[PATCH 2/3] drm/amdgpu: allocate gart memory when it's required (v2)
Felix Kuehling
felix.kuehling at amd.com
Wed Jun 27 16:52:29 UTC 2018
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.
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