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); >>> >