aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2862-drm-amdgpu-Add-func-s-to-get-set-iq_wait_time.patch
blob: 6a008baf1588256ba5577ac246b2a486cecaa7a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
From 113f2e95ecd3235d5082c289a6c38a3102ccf23a Mon Sep 17 00:00:00 2001
From: Philip Cox <Philip.Cox@amd.com>
Date: Wed, 29 May 2019 15:55:35 -0400
Subject: [PATCH 2862/2940] drm/amdgpu: Add func's to get/set iq_wait_time

Add functions to read the mmCP_IQ_WAIT_TIME1 and
mmCP_IQ_WAIT_TIME2 register values, and a function to build a modified
version to be used to update the grace period value.  These are needed
to support the grace period for amdkfd suspend queue functionality.

Change-Id: If1352501182a22a28903225515374908cbf25765
Signed-off-by: Philip Cox <Philip.Cox@amd.com>
---
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 48 ++++++++++++++++++-
 .../gpu/drm/amd/include/kgd_kfd_interface.h   | 12 +++++
 2 files changed, 58 insertions(+), 2 deletions(-)

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 1c8279d3832d..2b409085759c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
@@ -125,7 +125,8 @@ static uint32_t kgd_set_wave_launch_trap_override(struct kgd_dev *kgd,
 static uint32_t kgd_set_wave_launch_mode(struct kgd_dev *kgd,
 					uint8_t wave_launch_mode,
 					uint32_t vmid);
-
+static void kgd_get_iq_wait_times(struct kgd_dev *kgd,
+					uint32_t *wait_times);
 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,
@@ -137,6 +138,12 @@ static void set_scratch_backing_va(struct kgd_dev *kgd,
 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 kgd_build_grace_period_packet_info(struct kgd_dev *kgd,
+		uint32_t wait_times,
+		uint32_t grace_period,
+		uint32_t *reg_offset,
+		uint32_t *reg_data);
+
 /* Because of REG_GET_FIELD() being used, we put this function in the
  * asic specific file.
  */
@@ -189,7 +196,8 @@ static const struct kfd2kgd_calls kfd2kgd = {
         .set_debug_trap_data = kgd_set_debug_trap_data,
         .set_wave_launch_trap_override = kgd_set_wave_launch_trap_override,
         .set_wave_launch_mode = kgd_set_wave_launch_mode,
-
+        .get_iq_wait_times = kgd_get_iq_wait_times,
+        .build_grace_period_packet_info = kgd_build_grace_period_packet_info,
 };
 
 struct kfd2kgd_calls *amdgpu_amdkfd_gfx_9_0_get_functions(void)
@@ -1080,6 +1088,26 @@ static uint32_t kgd_set_wave_launch_mode(struct kgd_dev *kgd,
 	return 0;
 }
 
+/* kgd_get_iq_wait_times: Returns the mmCP_IQ_WAIT_TIME1/2 values
+ * The values read are:
+ *     ib_offload_wait_time     -- Wait Count for Indirect Buffer Offloads.
+ *     atomic_offload_wait_time -- Wait Count for L2 and GDS Atomics Offloads.
+ *     wrm_offload_wait_time    -- Wait Count for WAIT_REG_MEM Offloads.
+ *     gws_wait_time            -- Wait Count for Global Wave Syncs.
+ *     que_sleep_wait_time      -- Wait Count for Dequeue Retry.
+ *     sch_wave_wait_time       -- Wait Count for Scheduling Wave Message.
+ *     sem_rearm_wait_time      -- Wait Count for Semaphore re-arm.
+ *     deq_retry_wait_time      -- Wait Count for Global Wave Syncs.
+ */
+static void kgd_get_iq_wait_times(struct kgd_dev *kgd,
+					uint32_t *wait_times)
+
+{
+	struct amdgpu_device *adev = get_amdgpu_device(kgd);
+
+	*wait_times = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_IQ_WAIT_TIME2));
+}
+
 static void set_scratch_backing_va(struct kgd_dev *kgd,
 					uint64_t va, uint32_t vmid)
 {
@@ -1108,3 +1136,19 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
 
 	gfxhub_v1_0_setup_vm_pt_regs(adev, vmid, page_table_base);
 }
+
+static void kgd_build_grace_period_packet_info(struct kgd_dev *kgd,
+		uint32_t wait_times,
+		uint32_t grace_period,
+		uint32_t *reg_offset,
+		uint32_t *reg_data)
+{
+	*reg_data = wait_times;
+
+	*reg_data = REG_SET_FIELD(*reg_data,
+			CP_IQ_WAIT_TIME2,
+			SCH_WAVE,
+			grace_period);
+
+	*reg_offset = mmCP_IQ_WAIT_TIME2;
+}
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
index 66608a381400..db3f4b76d40f 100644
--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
@@ -239,6 +239,11 @@ struct tile_config {
  *
  * @get_hive_id: Returns hive id of current  device,  0 if xgmi is not enabled
  *
+ * @get_iq_wait_times: Returns the mmCP_IQ_WAIT_TIME1/2 values
+ *
+ * @build_grace_period_packet_info: build a IQ_WAUT_TIME2 reg value with an
+ * updated grace period value.
+ *
  * This structure contains function pointers to services that the kgd driver
  * provides to amdkfd driver.
  *
@@ -328,6 +333,13 @@ struct kfd2kgd_calls {
 	uint32_t (*set_wave_launch_mode)(struct kgd_dev *kgd,
 					uint8_t wave_launch_mode,
 					uint32_t vmid);
+	void (*get_iq_wait_times)(struct kgd_dev *kgd,
+			uint32_t *wait_times);
+	void (*build_grace_period_packet_info)(struct kgd_dev *kgd,
+			uint32_t wait_times,
+			uint32_t grace_period,
+			uint32_t *reg_offset,
+			uint32_t *reg_data);
 };
 
 #endif	/* KGD_KFD_INTERFACE_H_INCLUDED */
-- 
2.17.1