On Fri, May 18, 2018 at 11:06 PM, Felix Kuehling <felix.kuehling at amd.com> wrote: > Two more comments inline. One cosmetic, one real issue. With that fixed, > this patch is Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com> > > Regards, > Felix > > On 2018-05-18 03:42 PM, Oded Gabbay wrote: >> In case CONFIG_HSA_AMD is not chosen, there is no need to compile amdkfd >> files that reside inside amdgpu dirver. In addition, because amdkfd >> depends on x86_64 architecture and amdgpu is not, compiling amdkfd files >> under i386 architecture can cause compiler errors and warnings. >> >> This patch modifies amdgpu's makefile to build amdkfd files only if >> CONFIG_HSA_AMD is chosen. The only file to be compiled unconditionally >> is amdgpu_amdkfd.c >> >> Direct calls from amdgpu driver proper to functions in other >> amdgpu_amdkfd_*.c files were changed to calls to functions inside >> amdgpu_amdkfd.c. These functions call the original functions using a >> function pointer to allow compilation without the original functions. > > The above paragraph needs to be updated. Yeah, I'll send v3. > >> >> v2: >> Instead of using function pointers, use stub functions that are compiled >> only if amdkfd is not compiled. >> >> Signed-off-by: Oded Gabbay <oded.gabbay at gmail.com> >> --- >> drivers/gpu/drm/amd/amdgpu/Makefile | 13 +++++++-- >> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 46 ++++++++++++++++++++++++++++++ >> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 12 ++++---- >> 3 files changed, 62 insertions(+), 9 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile >> index 68e9f584c570..e03ee41cedcb 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/Makefile >> +++ b/drivers/gpu/drm/amd/amdgpu/Makefile >> @@ -56,8 +56,7 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \ >> >> # add asic specific block >> amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \ >> - ci_smc.o ci_dpm.o dce_v8_0.o gfx_v7_0.o cik_sdma.o uvd_v4_2.o vce_v2_0.o \ >> - amdgpu_amdkfd_gfx_v7.o >> + ci_smc.o ci_dpm.o dce_v8_0.o gfx_v7_0.o cik_sdma.o uvd_v4_2.o vce_v2_0.o >> >> amdgpu-$(CONFIG_DRM_AMDGPU_SI)+= si.o gmc_v6_0.o gfx_v6_0.o si_ih.o si_dma.o dce_v6_0.o si_dpm.o si_smc.o >> >> @@ -130,13 +129,21 @@ amdgpu-y += \ >> vcn_v1_0.o >> >> # add amdkfd interfaces >> +amdgpu-y += amdgpu_amdkfd.o >> + >> +ifneq ($(CONFIG_HSA_AMD),) >> amdgpu-y += \ >> - amdgpu_amdkfd.o \ >> amdgpu_amdkfd_fence.o \ >> amdgpu_amdkfd_gpuvm.o \ >> amdgpu_amdkfd_gfx_v8.o \ >> amdgpu_amdkfd_gfx_v9.o >> >> +ifneq ($(CONFIG_DRM_AMDGPU_CIK),) >> +amdgpu-y += amdgpu_amdkfd_gfx_v7.o >> +endif >> + >> +endif >> + >> # add cgs >> amdgpu-y += amdgpu_cgs.o >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c >> index bd36ee9f7e6d..b0b39bd83f0f 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c >> @@ -50,7 +50,9 @@ int amdgpu_amdkfd_init(void) >> kgd2kfd = NULL; >> } >> >> + >> #elif defined(CONFIG_HSA_AMD) >> + >> ret = kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd); >> if (ret) >> kgd2kfd = NULL; >> @@ -58,7 +60,10 @@ int amdgpu_amdkfd_init(void) >> #else >> ret = -ENOENT; >> #endif >> + >> +#if defined(CONFIG_HSA_AMD_MODULE) || defined(CONFIG_HSA_AMD) >> amdgpu_amdkfd_gpuvm_init_mem_limits(); >> +#endif >> >> return ret; >> } >> @@ -464,3 +469,44 @@ bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid) >> >> return false; >> } >> + >> +#if !defined(CONFIG_HSA_AMD_MODULE) && !defined(CONFIG_HSA_AMD) >> +bool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm) >> +{ >> + return false; >> +} >> + >> +void amdgpu_amdkfd_unreserve_system_memory_limit(struct amdgpu_bo *bo) >> +{ >> +} >> + >> +void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev, >> + struct amdgpu_vm *vm) >> +{ >> +} >> + >> +struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f) >> +{ >> + return NULL; >> +} >> + >> +int amdgpu_amdkfd_evict_userptr(struct kgd_mem *mem, struct mm_struct *mm) >> +{ >> + return 0; >> +} >> + >> +struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void) >> +{ >> + return NULL; > > I think this will cause an oops in amdgpu_amdkfd_probe because that > function doesn't handle kgd2kfd == NULL. You could remove > amdgpu_amdkfd_gfx_*_get_functions and instead turn amdgpu_amdkfd_probe > itself into a stub to simplify this. That's the only place where > *_get_functions are called. Actually this function will never be called if amdkfd is not compiled, because amdgpu_amdkfd_probe will exit immediately due to the if statement at the start of that function (which checks kgd2kfd is not NULL). I did see that kgd2kfd is not initialized to NULL in case amdkfd is not compiled and I fixed that in v3. I prefer not to add stub for probe because then I will have to #ifdef around the real probe function and I prefer to minimize #ifdefs Oded > >> +} >> + >> +struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void) >> +{ >> + return NULL; >> +} >> + >> +struct kfd2kgd_calls *amdgpu_amdkfd_gfx_9_0_get_functions(void) >> +{ >> + return NULL; >> +} >> +#endif >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h >> index 12367a9951e8..a8418a3f4e9d 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h >> @@ -156,14 +156,14 @@ uint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd); >> >> /* GPUVM API */ >> int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm, >> - void **process_info, >> - struct dma_fence **ef); >> + void **process_info, >> + struct dma_fence **ef); >> int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd, >> - struct file *filp, >> - void **vm, void **process_info, >> - struct dma_fence **ef); >> + struct file *filp, >> + void **vm, void **process_info, >> + struct dma_fence **ef); >> void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev, >> - struct amdgpu_vm *vm); >> + struct amdgpu_vm *vm); >> void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm); >> uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm); >> int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( >