aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3050-drm-amdkfd-Add-invalidate_tlbs_vmid-into-kfd2dgd_cal.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3050-drm-amdkfd-Add-invalidate_tlbs_vmid-into-kfd2dgd_cal.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3050-drm-amdkfd-Add-invalidate_tlbs_vmid-into-kfd2dgd_cal.patch201
1 files changed, 201 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3050-drm-amdkfd-Add-invalidate_tlbs_vmid-into-kfd2dgd_cal.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3050-drm-amdkfd-Add-invalidate_tlbs_vmid-into-kfd2dgd_cal.patch
new file mode 100644
index 00000000..a9cf9063
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3050-drm-amdkfd-Add-invalidate_tlbs_vmid-into-kfd2dgd_cal.patch
@@ -0,0 +1,201 @@
+From 7995d33fb0f9bd70003cd4452fe64ad392750367 Mon Sep 17 00:00:00 2001
+From: Yong Zhao <yong.zhao@amd.com>
+Date: Thu, 23 Nov 2017 18:53:15 -0500
+Subject: [PATCH 3050/4131] drm/amdkfd: Add invalidate_tlbs_vmid into
+ kfd2dgd_calls interface
+
+Change-Id: I108b989881bd84dce9748645d7d543cfd13bef92
+Signed-off-by: Yong Zhao <yong.zhao@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 29 +++++++++++++++++------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 29 +++++++++++++++++------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 15 ++++++++++++
+ drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 1 +
+ 4 files changed, 60 insertions(+), 14 deletions(-)
+
+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 4faf452..3a4e5ed 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+@@ -147,6 +147,7 @@ static bool get_atc_vmid_pasid_mapping_valid(struct kgd_dev *kgd, uint8_t vmid);
+ static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd,
+ uint8_t vmid);
+ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid);
++static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid);
+ static void set_num_of_requests(struct kgd_dev *dev, uint8_t num_of_req);
+ static int alloc_memory_of_scratch(struct kgd_dev *kgd,
+ uint64_t va, uint32_t vmid);
+@@ -216,6 +217,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
+ get_atc_vmid_pasid_mapping_valid,
+ .read_vmid_from_vmfault_reg = read_vmid_from_vmfault_reg,
+ .invalidate_tlbs = invalidate_tlbs,
++ .invalidate_tlbs_vmid = invalidate_tlbs_vmid,
+ .sync_memory = amdgpu_amdkfd_gpuvm_sync_memory,
+ .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
+ .free_memory_of_gpu = amdgpu_amdkfd_gpuvm_free_memory_of_gpu,
+@@ -840,23 +842,36 @@ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
+ int vmid;
++ unsigned int tmp;
+
+ for (vmid = 0; vmid < 16; vmid++) {
+ if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid))
+ continue;
+- if (RREG32(mmATC_VMID0_PASID_MAPPING + vmid) &
+- ATC_VMID0_PASID_MAPPING__VALID_MASK) {
+- if ((RREG32(mmATC_VMID0_PASID_MAPPING + vmid) &
+- ATC_VMID0_PASID_MAPPING__PASID_MASK) == pasid) {
+- WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
+- break;
+- }
++
++ 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);
++ 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);
++ return 0;
++}
++
+ static int write_config_static_mem(struct kgd_dev *kgd, bool swizzle_enable,
+ uint8_t element_size, uint8_t index_stride, uint8_t mtype)
+ {
+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 6228dd8..aa23fa3 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+@@ -128,6 +128,7 @@ static int write_config_static_mem(struct kgd_dev *kgd, bool swizzle_enable,
+ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
+ uint32_t page_table_base);
+ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid);
++static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid);
+
+ /* Because of REG_GET_FIELD() being used, we put this function in the
+ * asic specific file.
+@@ -189,6 +190,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
+ .get_atc_vmid_pasid_mapping_valid =
+ get_atc_vmid_pasid_mapping_valid,
+ .invalidate_tlbs = invalidate_tlbs,
++ .invalidate_tlbs_vmid = invalidate_tlbs_vmid,
+ .sync_memory = amdgpu_amdkfd_gpuvm_sync_memory,
+ .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
+ .free_memory_of_gpu = amdgpu_amdkfd_gpuvm_free_memory_of_gpu,
+@@ -811,6 +813,7 @@ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
+ int vmid;
++ unsigned int tmp;
+
+ #ifdef V8_SUPPORT_IT_OFFICIAL
+ struct amdgpu_ring *ring = &adev->gfx.kiq.ring;
+@@ -822,19 +825,31 @@ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
+ for (vmid = 0; vmid < 16; vmid++) {
+ if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid))
+ continue;
+- if (RREG32(mmATC_VMID0_PASID_MAPPING + vmid) &
+- ATC_VMID0_PASID_MAPPING__VALID_MASK) {
+- if ((RREG32(mmATC_VMID0_PASID_MAPPING + vmid) &
+- ATC_VMID0_PASID_MAPPING__PASID_MASK) == pasid) {
+- WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
+- break;
+- }
++
++ 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);
++ 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;
++ }
++
++ WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
++ return 0;
++}
++
+ static int kgd_address_watch_disable(struct kgd_dev *kgd)
+ {
+ struct amdgpu_device *adev = get_amdgpu_device(kgd);
+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 0f6b395..8eae0a7 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+@@ -165,6 +165,7 @@ static int write_config_static_mem(struct kgd_dev *kgd, bool swizzle_enable,
+ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
+ uint32_t page_table_base);
+ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid);
++static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid);
+
+ /* Because of REG_GET_FIELD() being used, we put this function in the
+ * asic specific file.
+@@ -233,6 +234,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
+ .get_atc_vmid_pasid_mapping_valid =
+ get_atc_vmid_pasid_mapping_valid,
+ .invalidate_tlbs = invalidate_tlbs,
++ .invalidate_tlbs_vmid = invalidate_tlbs_vmid,
+ .sync_memory = amdgpu_amdkfd_gpuvm_sync_memory,
+ .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
+ .free_memory_of_gpu = amdgpu_amdkfd_gpuvm_free_memory_of_gpu,
+@@ -1016,6 +1018,19 @@ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
+ 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;
++ }
++
++ write_vmid_invalidate_request(kgd, vmid);
++ return 0;
++}
++
+ static int kgd_address_watch_disable(struct kgd_dev *kgd)
+ {
+ struct amdgpu_device *adev = get_amdgpu_device(kgd);
+diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+index f94f49b..1da5b4f 100644
+--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
++++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+@@ -345,6 +345,7 @@ struct kfd2kgd_calls {
+ uint32_t (*read_vmid_from_vmfault_reg)(struct kgd_dev *kgd);
+
+ int (*invalidate_tlbs)(struct kgd_dev *kgd, uint16_t pasid);
++ int (*invalidate_tlbs_vmid)(struct kgd_dev *kgd, uint16_t vmid);
+
+ int (*sync_memory)(struct kgd_dev *kgd, struct kgd_mem *mem, bool intr);
+
+--
+2.7.4
+