Am 11.01.2017 um 11:43 schrieb Monk Liu: > for SRIOV usage, CSA is only used per device and each > VM will map on it. > > Change-Id: Ibc63d87be59d7d89b96117e4d1b7e970a872580d > Signed-off-by: Monk Liu <Monk.Liu at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/Makefile | 2 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 95 ++++++++++++++++++++++++++++++++ > drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 4 ++ > 3 files changed, 100 insertions(+), 1 deletion(-) > create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c > > diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile > index 4185b03..0b8e470 100644 > --- a/drivers/gpu/drm/amd/amdgpu/Makefile > +++ b/drivers/gpu/drm/amd/amdgpu/Makefile > @@ -30,7 +30,7 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \ > atombios_encoders.o amdgpu_sa.o atombios_i2c.o \ > amdgpu_prime.o amdgpu_vm.o amdgpu_ib.o amdgpu_pll.o \ > amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o \ > - amdgpu_gtt_mgr.o amdgpu_vram_mgr.o > + amdgpu_gtt_mgr.o amdgpu_vram_mgr.o amdgpu_virt.o > > # add asic specific block > amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \ > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c > new file mode 100644 > index 0000000..0247a2e > --- /dev/null > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c > @@ -0,0 +1,95 @@ > +/* > + * Copyright 2016 Advanced Micro Devices, Inc. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR > + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > + * OTHER DEALINGS IN THE SOFTWARE. > + * > + */ > + > +#include "amdgpu.h" > + > +int amdgpu_allocate_static_csa(struct amdgpu_device *adev) > +{ > + int r; > + void *ptr; > + > + r = amdgpu_bo_create_kernel(adev, adev->virt.csa_size, PAGE_SIZE, > + AMDGPU_GEM_DOMAIN_VRAM, &adev->virt.csa_obj, > + &adev->virt.csa_vmid0_addr, &ptr); > + if (r) > + return r; > + > + /* gds part take the bottom half buffer */ > + adev->virt.gds_vmid0_addr = adev->virt.csa_vmid0_addr + PAGE_SIZE; > + memset(ptr, 0, adev->virt.csa_size); > + return 0; > +} > + > +/* > + * amdgpu_map_static_csa should be called during amdgpu_vm_init > + * it maps virtual address "AMDGPU_VA_RESERVED_SIZE - adev->virt.csa_size" > + * to this VM, and each command submission of GFX should use this virtual > + * address within META_DATA init package to support SRIOV gfx preemption. > + */ > + > +int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm) > +{ > + int r; > + struct amdgpu_bo_va *bo_va; > + struct ww_acquire_ctx ticket; > + struct list_head list, duplicates; Only a nit pick, but no need for the duplicates list here. > + struct amdgpu_bo_list_entry pd; > + > + INIT_LIST_HEAD(&list); > + INIT_LIST_HEAD(&duplicates); > + INIT_LIST_HEAD(&vm->csa_tv.head); As said on the other patch as well the csa_tv is only used temporary here, please move that to the stack as well. With those two comments fixed the patch is Reviewed-by: Christian König <christian.koenig at amd.com>. Regards, Christian. > + vm->csa_tv.bo = &adev->virt.csa_obj->tbo; > + vm->csa_tv.shared = true; > + > + list_add(&vm->csa_tv.head, &list); > + amdgpu_vm_get_pd_bo(vm, &list, &pd); > + > + r = ttm_eu_reserve_buffers(&ticket, &list, true, &duplicates); > + if (r) { > + DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r); > + return r; > + } > + > + bo_va = amdgpu_vm_bo_add(adev, vm, adev->virt.csa_obj); > + if (!bo_va) { > + ttm_eu_backoff_reservation(&ticket, &list); > + DRM_ERROR("failed to create bo_va for static CSA\n"); > + return -ENOMEM; > + } > + > + r = amdgpu_vm_bo_map(adev, bo_va, AMDGPU_CSA_VADDR, 0,AMDGPU_CSA_SIZE, > + AMDGPU_PTE_READABLE | AMDGPU_PTE_WRITEABLE | > + AMDGPU_PTE_EXECUTABLE); > + > + if (r) { > + DRM_ERROR("failed to do bo_map on static CSA, err=%d\n", r); > + amdgpu_vm_bo_rmv(adev, bo_va); > + ttm_eu_backoff_reservation(&ticket, &list); > + kfree(bo_va); > + return r; > + } > + > + vm->csa_bo_va = bo_va; > + ttm_eu_backoff_reservation(&ticket, &list); > + return 0; > +} > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h > index b65bedc..a59b404 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h > @@ -62,4 +62,8 @@ static inline bool is_virtual_machine(void) > #endif > } > > +struct amdgpu_vm; > +int amdgpu_allocate_static_csa(struct amdgpu_device *adev); > +int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm); > + > #endif