[PATCH 7/7] drm/amdgpu: flush TLB functions removal from kfd2kgd interface
Christian König
ckoenig.leichtzumerken at gmail.com
Mon Jan 13 12:17:02 UTC 2020
Am 11.01.20 um 19:39 schrieb Alex Sierra:
> [Why]
> kfd2kgd interface will be deprecated. This removal only covers TLB
> invalidation for now. They have been replaced in amdgpu_amdkfd API.
>
> [How]
> TLB invalidate functions removed from the different amdkfd_gfx_v*
> versions.
>
> Change-Id: Ic2c7d4a0d19fe1e884dee1ff10a520d31252afee
> Signed-off-by: Alex Sierra <alex.sierra at amd.com>
> Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
Nice work for the patch set. Acked-by: Christian König
<christian.koenig at amd.com>
> ---
> .../drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c | 2 -
> .../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c | 67 -------------
> .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 41 --------
> .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 41 --------
> .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 96 -------------------
> .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h | 2 -
> .../gpu/drm/amd/include/kgd_kfd_interface.h | 2 -
> 7 files changed, 251 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c
> index f9011a07cb90..562e7a7f51a8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c
> @@ -317,7 +317,5 @@ const struct kfd2kgd_calls arcturus_kfd2kgd = {
> kgd_gfx_v9_get_atc_vmid_pasid_mapping_info,
> .get_tile_config = kgd_gfx_v9_get_tile_config,
> .set_vm_context_page_table_base = kgd_set_vm_context_page_table_base,
> - .invalidate_tlbs = kgd_gfx_v9_invalidate_tlbs,
> - .invalidate_tlbs_vmid = kgd_gfx_v9_invalidate_tlbs_vmid,
> .get_hive_id = amdgpu_amdkfd_get_hive_id,
> };
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c
> index 61cd707158e4..6132b4874498 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c
> @@ -686,71 +686,6 @@ static bool get_atc_vmid_pasid_mapping_info(struct kgd_dev *kgd,
> return !!(value & ATC_VMID0_PASID_MAPPING__VALID_MASK);
> }
>
> -static int invalidate_tlbs_with_kiq(struct amdgpu_device *adev, uint16_t pasid)
> -{
> - signed long r;
> - uint32_t seq;
> - struct amdgpu_ring *ring = &adev->gfx.kiq.ring;
> -
> - spin_lock(&adev->gfx.kiq.ring_lock);
> - amdgpu_ring_alloc(ring, 12); /* fence + invalidate_tlbs package*/
> - amdgpu_ring_write(ring, PACKET3(PACKET3_INVALIDATE_TLBS, 0));
> - amdgpu_ring_write(ring,
> - PACKET3_INVALIDATE_TLBS_DST_SEL(1) |
> - PACKET3_INVALIDATE_TLBS_PASID(pasid));
> - amdgpu_fence_emit_polling(ring, &seq);
> - amdgpu_ring_commit(ring);
> - spin_unlock(&adev->gfx.kiq.ring_lock);
> -
> - r = amdgpu_fence_wait_polling(ring, seq, adev->usec_timeout);
> - if (r < 1) {
> - DRM_ERROR("wait for kiq fence error: %ld.\n", r);
> - return -ETIME;
> - }
> -
> - return 0;
> -}
> -
> -static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
> -{
> - struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
> - int vmid;
> - uint16_t queried_pasid;
> - bool ret;
> - struct amdgpu_ring *ring = &adev->gfx.kiq.ring;
> -
> - if (amdgpu_emu_mode == 0 && ring->sched.ready)
> - return invalidate_tlbs_with_kiq(adev, pasid);
> -
> - for (vmid = 0; vmid < 16; vmid++) {
> - if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid))
> - continue;
> -
> - ret = get_atc_vmid_pasid_mapping_info(kgd, vmid,
> - &queried_pasid);
> - if (ret && queried_pasid == pasid) {
> - amdgpu_gmc_flush_gpu_tlb(adev, vmid,
> - AMDGPU_GFXHUB_0, 0);
> - break;
> - }
> - }
> -
> - return 0;
> -}
> -
> -static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid)
> -{
> - struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
> -
> - if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) {
> - pr_err("non kfd vmid %d\n", vmid);
> - return 0;
> - }
> -
> - amdgpu_gmc_flush_gpu_tlb(adev, vmid, AMDGPU_GFXHUB_0, 0);
> - return 0;
> -}
> -
> static int kgd_address_watch_disable(struct kgd_dev *kgd)
> {
> return 0;
> @@ -832,7 +767,5 @@ const struct kfd2kgd_calls gfx_v10_kfd2kgd = {
> get_atc_vmid_pasid_mapping_info,
> .get_tile_config = amdgpu_amdkfd_get_tile_config,
> .set_vm_context_page_table_base = set_vm_context_page_table_base,
> - .invalidate_tlbs = invalidate_tlbs,
> - .invalidate_tlbs_vmid = invalidate_tlbs_vmid,
> .get_hive_id = amdgpu_amdkfd_get_hive_id,
> };
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> index 6e6f0a99ec06..8f052e98a3c6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> @@ -696,45 +696,6 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
> lower_32_bits(page_table_base));
> }
>
> -static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
> -{
> - struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
> - int vmid;
> - unsigned int tmp;
> -
> - if (adev->in_gpu_reset)
> - return -EIO;
> -
> - for (vmid = 0; vmid < 16; vmid++) {
> - if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid))
> - continue;
> -
> - tmp = RREG32(mmATC_VMID0_PASID_MAPPING + vmid);
> - if ((tmp & ATC_VMID0_PASID_MAPPING__VALID_MASK) &&
> - (tmp & ATC_VMID0_PASID_MAPPING__PASID_MASK) == pasid) {
> - WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
> - RREG32(mmVM_INVALIDATE_RESPONSE);
> - break;
> - }
> - }
> -
> - return 0;
> -}
> -
> -static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid)
> -{
> - struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
> -
> - if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) {
> - pr_err("non kfd vmid\n");
> - return 0;
> - }
> -
> - WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
> - RREG32(mmVM_INVALIDATE_RESPONSE);
> - return 0;
> -}
> -
> /**
> * read_vmid_from_vmfault_reg - read vmid from register
> *
> @@ -771,7 +732,5 @@ const struct kfd2kgd_calls gfx_v7_kfd2kgd = {
> .set_scratch_backing_va = set_scratch_backing_va,
> .get_tile_config = get_tile_config,
> .set_vm_context_page_table_base = set_vm_context_page_table_base,
> - .invalidate_tlbs = invalidate_tlbs,
> - .invalidate_tlbs_vmid = invalidate_tlbs_vmid,
> .read_vmid_from_vmfault_reg = read_vmid_from_vmfault_reg,
> };
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> index bfbddedb2380..19a10db93d68 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> @@ -657,45 +657,6 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
> lower_32_bits(page_table_base));
> }
>
> -static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
> -{
> - struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
> - int vmid;
> - unsigned int tmp;
> -
> - if (adev->in_gpu_reset)
> - return -EIO;
> -
> - for (vmid = 0; vmid < 16; vmid++) {
> - if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid))
> - continue;
> -
> - tmp = RREG32(mmATC_VMID0_PASID_MAPPING + vmid);
> - if ((tmp & ATC_VMID0_PASID_MAPPING__VALID_MASK) &&
> - (tmp & ATC_VMID0_PASID_MAPPING__PASID_MASK) == pasid) {
> - WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
> - RREG32(mmVM_INVALIDATE_RESPONSE);
> - break;
> - }
> - }
> -
> - return 0;
> -}
> -
> -static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid)
> -{
> - struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
> -
> - if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) {
> - pr_err("non kfd vmid %d\n", vmid);
> - return -EINVAL;
> - }
> -
> - WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
> - RREG32(mmVM_INVALIDATE_RESPONSE);
> - return 0;
> -}
> -
> const struct kfd2kgd_calls gfx_v8_kfd2kgd = {
> .program_sh_mem_settings = kgd_program_sh_mem_settings,
> .set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping,
> @@ -717,6 +678,4 @@ const struct kfd2kgd_calls gfx_v8_kfd2kgd = {
> .set_scratch_backing_va = set_scratch_backing_va,
> .get_tile_config = get_tile_config,
> .set_vm_context_page_table_base = set_vm_context_page_table_base,
> - .invalidate_tlbs = invalidate_tlbs,
> - .invalidate_tlbs_vmid = invalidate_tlbs_vmid,
> };
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> index e7861f0ef415..932ae85d97e2 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> @@ -617,100 +617,6 @@ bool kgd_gfx_v9_get_atc_vmid_pasid_mapping_info(struct kgd_dev *kgd,
> return !!(value & ATC_VMID0_PASID_MAPPING__VALID_MASK);
> }
>
> -static int invalidate_tlbs_with_kiq(struct amdgpu_device *adev, uint16_t pasid,
> - uint32_t flush_type)
> -{
> - signed long r;
> - uint32_t seq;
> - struct amdgpu_ring *ring = &adev->gfx.kiq.ring;
> -
> - spin_lock(&adev->gfx.kiq.ring_lock);
> - amdgpu_ring_alloc(ring, 12); /* fence + invalidate_tlbs package*/
> - amdgpu_ring_write(ring, PACKET3(PACKET3_INVALIDATE_TLBS, 0));
> - amdgpu_ring_write(ring,
> - PACKET3_INVALIDATE_TLBS_DST_SEL(1) |
> - PACKET3_INVALIDATE_TLBS_ALL_HUB(1) |
> - PACKET3_INVALIDATE_TLBS_PASID(pasid) |
> - PACKET3_INVALIDATE_TLBS_FLUSH_TYPE(flush_type));
> - amdgpu_fence_emit_polling(ring, &seq);
> - amdgpu_ring_commit(ring);
> - spin_unlock(&adev->gfx.kiq.ring_lock);
> -
> - r = amdgpu_fence_wait_polling(ring, seq, adev->usec_timeout);
> - if (r < 1) {
> - DRM_ERROR("wait for kiq fence error: %ld.\n", r);
> - return -ETIME;
> - }
> -
> - return 0;
> -}
> -
> -int kgd_gfx_v9_invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
> -{
> - struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
> - int vmid, i;
> - uint16_t queried_pasid;
> - bool ret;
> - struct amdgpu_ring *ring = &adev->gfx.kiq.ring;
> - uint32_t flush_type = 0;
> -
> - if (adev->in_gpu_reset)
> - return -EIO;
> - if (adev->gmc.xgmi.num_physical_nodes &&
> - adev->asic_type == CHIP_VEGA20)
> - flush_type = 2;
> -
> - if (ring->sched.ready)
> - return invalidate_tlbs_with_kiq(adev, pasid, flush_type);
> -
> - for (vmid = 0; vmid < 16; vmid++) {
> - if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid))
> - continue;
> -
> - ret = kgd_gfx_v9_get_atc_vmid_pasid_mapping_info(kgd, vmid,
> - &queried_pasid);
> - if (ret && queried_pasid == pasid) {
> - for (i = 0; i < adev->num_vmhubs; i++)
> - amdgpu_gmc_flush_gpu_tlb(adev, vmid,
> - i, flush_type);
> - break;
> - }
> - }
> -
> - return 0;
> -}
> -
> -int kgd_gfx_v9_invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid)
> -{
> - struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
> - int i;
> -
> - if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) {
> - pr_err("non kfd vmid %d\n", vmid);
> - return 0;
> - }
> -
> - /* Use legacy mode tlb invalidation.
> - *
> - * Currently on Raven the code below is broken for anything but
> - * legacy mode due to a MMHUB power gating problem. A workaround
> - * is for MMHUB to wait until the condition PER_VMID_INVALIDATE_REQ
> - * == PER_VMID_INVALIDATE_ACK instead of simply waiting for the ack
> - * bit.
> - *
> - * TODO 1: agree on the right set of invalidation registers for
> - * KFD use. Use the last one for now. Invalidate both GC and
> - * MMHUB.
> - *
> - * TODO 2: support range-based invalidation, requires kfg2kgd
> - * interface change
> - */
> - for (i = 0; i < adev->num_vmhubs; i++)
> - amdgpu_gmc_flush_gpu_tlb(adev, vmid, i, 0);
> -
> - return 0;
> -}
> -
> int kgd_gfx_v9_address_watch_disable(struct kgd_dev *kgd)
> {
> return 0;
> @@ -793,7 +699,5 @@ const struct kfd2kgd_calls gfx_v9_kfd2kgd = {
> kgd_gfx_v9_get_atc_vmid_pasid_mapping_info,
> .get_tile_config = kgd_gfx_v9_get_tile_config,
> .set_vm_context_page_table_base = kgd_gfx_v9_set_vm_context_page_table_base,
> - .invalidate_tlbs = kgd_gfx_v9_invalidate_tlbs,
> - .invalidate_tlbs_vmid = kgd_gfx_v9_invalidate_tlbs_vmid,
> .get_hive_id = amdgpu_amdkfd_get_hive_id,
> };
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h
> index 02b1426d17d1..dfafa28b7559 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h
> @@ -57,7 +57,5 @@ uint32_t kgd_gfx_v9_address_watch_get_offset(struct kgd_dev *kgd,
>
> bool kgd_gfx_v9_get_atc_vmid_pasid_mapping_info(struct kgd_dev *kgd,
> uint8_t vmid, uint16_t *p_pasid);
> -int kgd_gfx_v9_invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid);
> -int kgd_gfx_v9_invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid);
> int kgd_gfx_v9_get_tile_config(struct kgd_dev *kgd,
> struct tile_config *config);
> diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> index 2cd217e60125..a01ef836ad58 100644
> --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> @@ -307,8 +307,6 @@ struct kfd2kgd_calls {
>
> void (*set_vm_context_page_table_base)(struct kgd_dev *kgd,
> uint32_t vmid, uint64_t page_table_base);
> - int (*invalidate_tlbs)(struct kgd_dev *kgd, uint16_t pasid);
> - int (*invalidate_tlbs_vmid)(struct kgd_dev *kgd, uint16_t vmid);
> uint32_t (*read_vmid_from_vmfault_reg)(struct kgd_dev *kgd);
> uint64_t (*get_hive_id)(struct kgd_dev *kgd);
>
More information about the amd-gfx
mailing list