aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorAndrey Grodzovsky <andrey.grodzovsky@amd.com>2018-03-29 09:09:39 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-04-03 14:08:44 -0400
commitf7a9ee81a88b83915e7c15895c507abede44b0c5 (patch)
tree61903e2fc7a93c70bdbd895cf12fda708cba7b31 /drivers/gpu/drm/amd/amdgpu
parent073997ccd9dd8eb8015f5371ff0ea85a48814bb4 (diff)
drm/amdgpu: Add support for SRBM selection v3
Also remove code duplication in write and read regs functions. This also fixes potential missing unlock in amdgpu_debugfs_regs_write in case get_user would fail. v2: Add SRBM mutex locking. v3: Fix TO counter and fix comment location. Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c117
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c11
6 files changed, 72 insertions, 79 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index f44a83ab2bf4..0193f6ced00b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -890,6 +890,7 @@ struct amdgpu_gfx_funcs {
890 void (*read_wave_data)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields); 890 void (*read_wave_data)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields);
891 void (*read_wave_vgprs)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t thread, uint32_t start, uint32_t size, uint32_t *dst); 891 void (*read_wave_vgprs)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t thread, uint32_t start, uint32_t size, uint32_t *dst);
892 void (*read_wave_sgprs)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t start, uint32_t size, uint32_t *dst); 892 void (*read_wave_sgprs)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t start, uint32_t size, uint32_t *dst);
893 void (*select_me_pipe_q)(struct amdgpu_device *adev, u32 me, u32 pipe, u32 queue);
893}; 894};
894 895
895struct amdgpu_ngg_buf { 896struct amdgpu_ngg_buf {
@@ -1812,6 +1813,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
1812#define amdgpu_gfx_select_se_sh(adev, se, sh, instance) (adev)->gfx.funcs->select_se_sh((adev), (se), (sh), (instance)) 1813#define amdgpu_gfx_select_se_sh(adev, se, sh, instance) (adev)->gfx.funcs->select_se_sh((adev), (se), (sh), (instance))
1813#define amdgpu_gds_switch(adev, r, v, d, w, a) (adev)->gds.funcs->patch_gds_switch((r), (v), (d), (w), (a)) 1814#define amdgpu_gds_switch(adev, r, v, d, w, a) (adev)->gds.funcs->patch_gds_switch((r), (v), (d), (w), (a))
1814#define amdgpu_psp_check_fw_loading_status(adev, i) (adev)->firmware.funcs->check_fw_loading_status((adev), (i)) 1815#define amdgpu_psp_check_fw_loading_status(adev, i) (adev)->firmware.funcs->check_fw_loading_status((adev), (i))
1816#define amdgpu_gfx_select_me_pipe_q(adev, me, pipe, q) (adev)->gfx.funcs->select_me_pipe_q((adev), (me), (pipe), (q))
1815 1817
1816/* Common functions */ 1818/* Common functions */
1817int amdgpu_device_gpu_recover(struct amdgpu_device *adev, 1819int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
index 369beb5041a2..448d69fe3756 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
@@ -64,16 +64,21 @@ int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
64 64
65#if defined(CONFIG_DEBUG_FS) 65#if defined(CONFIG_DEBUG_FS)
66 66
67static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf, 67
68 size_t size, loff_t *pos) 68static int amdgpu_debugfs_process_reg_op(bool read, struct file *f,
69 char __user *buf, size_t size, loff_t *pos)
69{ 70{
70 struct amdgpu_device *adev = file_inode(f)->i_private; 71 struct amdgpu_device *adev = file_inode(f)->i_private;
71 ssize_t result = 0; 72 ssize_t result = 0;
72 int r; 73 int r;
73 bool pm_pg_lock, use_bank; 74 bool pm_pg_lock, use_bank, use_ring;
74 unsigned instance_bank, sh_bank, se_bank; 75 unsigned instance_bank, sh_bank, se_bank, me, pipe, queue;
75 76
76 if (size & 0x3 || *pos & 0x3) 77 pm_pg_lock = use_bank = use_ring = false;
78 instance_bank = sh_bank = se_bank = me = pipe = queue = 0;
79
80 if (size & 0x3 || *pos & 0x3 ||
81 ((*pos & (1ULL << 62)) && (*pos & (1ULL << 61))))
77 return -EINVAL; 82 return -EINVAL;
78 83
79 /* are we reading registers for which a PG lock is necessary? */ 84 /* are we reading registers for which a PG lock is necessary? */
@@ -91,8 +96,15 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
91 if (instance_bank == 0x3FF) 96 if (instance_bank == 0x3FF)
92 instance_bank = 0xFFFFFFFF; 97 instance_bank = 0xFFFFFFFF;
93 use_bank = 1; 98 use_bank = 1;
99 } else if (*pos & (1ULL << 61)) {
100
101 me = (*pos & GENMASK_ULL(33, 24)) >> 24;
102 pipe = (*pos & GENMASK_ULL(43, 34)) >> 34;
103 queue = (*pos & GENMASK_ULL(53, 44)) >> 44;
104
105 use_ring = 1;
94 } else { 106 } else {
95 use_bank = 0; 107 use_bank = use_ring = 0;
96 } 108 }
97 109
98 *pos &= (1UL << 22) - 1; 110 *pos &= (1UL << 22) - 1;
@@ -104,6 +116,9 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
104 mutex_lock(&adev->grbm_idx_mutex); 116 mutex_lock(&adev->grbm_idx_mutex);
105 amdgpu_gfx_select_se_sh(adev, se_bank, 117 amdgpu_gfx_select_se_sh(adev, se_bank,
106 sh_bank, instance_bank); 118 sh_bank, instance_bank);
119 } else if (use_ring) {
120 mutex_lock(&adev->srbm_mutex);
121 amdgpu_gfx_select_me_pipe_q(adev, me, pipe, queue);
107 } 122 }
108 123
109 if (pm_pg_lock) 124 if (pm_pg_lock)
@@ -115,8 +130,14 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
115 if (*pos > adev->rmmio_size) 130 if (*pos > adev->rmmio_size)
116 goto end; 131 goto end;
117 132
118 value = RREG32(*pos >> 2); 133 if (read) {
119 r = put_user(value, (uint32_t *)buf); 134 value = RREG32(*pos >> 2);
135 r = put_user(value, (uint32_t *)buf);
136 } else {
137 r = get_user(value, (uint32_t *)buf);
138 if (!r)
139 WREG32(*pos >> 2, value);
140 }
120 if (r) { 141 if (r) {
121 result = r; 142 result = r;
122 goto end; 143 goto end;
@@ -132,6 +153,9 @@ end:
132 if (use_bank) { 153 if (use_bank) {
133 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 154 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
134 mutex_unlock(&adev->grbm_idx_mutex); 155 mutex_unlock(&adev->grbm_idx_mutex);
156 } else if (use_ring) {
157 amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0);
158 mutex_unlock(&adev->srbm_mutex);
135 } 159 }
136 160
137 if (pm_pg_lock) 161 if (pm_pg_lock)
@@ -140,78 +164,17 @@ end:
140 return result; 164 return result;
141} 165}
142 166
167
168static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
169 size_t size, loff_t *pos)
170{
171 return amdgpu_debugfs_process_reg_op(true, f, buf, size, pos);
172}
173
143static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf, 174static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
144 size_t size, loff_t *pos) 175 size_t size, loff_t *pos)
145{ 176{
146 struct amdgpu_device *adev = file_inode(f)->i_private; 177 return amdgpu_debugfs_process_reg_op(false, f, (char __user *)buf, size, pos);
147 ssize_t result = 0;
148 int r;
149 bool pm_pg_lock, use_bank;
150 unsigned instance_bank, sh_bank, se_bank;
151
152 if (size & 0x3 || *pos & 0x3)
153 return -EINVAL;
154
155 /* are we reading registers for which a PG lock is necessary? */
156 pm_pg_lock = (*pos >> 23) & 1;
157
158 if (*pos & (1ULL << 62)) {
159 se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24;
160 sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34;
161 instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44;
162
163 if (se_bank == 0x3FF)
164 se_bank = 0xFFFFFFFF;
165 if (sh_bank == 0x3FF)
166 sh_bank = 0xFFFFFFFF;
167 if (instance_bank == 0x3FF)
168 instance_bank = 0xFFFFFFFF;
169 use_bank = 1;
170 } else {
171 use_bank = 0;
172 }
173
174 *pos &= (1UL << 22) - 1;
175
176 if (use_bank) {
177 if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
178 (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
179 return -EINVAL;
180 mutex_lock(&adev->grbm_idx_mutex);
181 amdgpu_gfx_select_se_sh(adev, se_bank,
182 sh_bank, instance_bank);
183 }
184
185 if (pm_pg_lock)
186 mutex_lock(&adev->pm.mutex);
187
188 while (size) {
189 uint32_t value;
190
191 if (*pos > adev->rmmio_size)
192 return result;
193
194 r = get_user(value, (uint32_t *)buf);
195 if (r)
196 return r;
197
198 WREG32(*pos >> 2, value);
199
200 result += 4;
201 buf += 4;
202 *pos += 4;
203 size -= 4;
204 }
205
206 if (use_bank) {
207 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
208 mutex_unlock(&adev->grbm_idx_mutex);
209 }
210
211 if (pm_pg_lock)
212 mutex_unlock(&adev->pm.mutex);
213
214 return result;
215} 178}
216 179
217static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf, 180static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
index 0fff5b8cd318..cd6bf291a853 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
@@ -3061,11 +3061,18 @@ static void gfx_v6_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd,
3061 start + SQIND_WAVE_SGPRS_OFFSET, size, dst); 3061 start + SQIND_WAVE_SGPRS_OFFSET, size, dst);
3062} 3062}
3063 3063
3064static void gfx_v6_0_select_me_pipe_q(struct amdgpu_device *adev,
3065 u32 me, u32 pipe, u32 q)
3066{
3067 DRM_INFO("Not implemented\n");
3068}
3069
3064static const struct amdgpu_gfx_funcs gfx_v6_0_gfx_funcs = { 3070static const struct amdgpu_gfx_funcs gfx_v6_0_gfx_funcs = {
3065 .get_gpu_clock_counter = &gfx_v6_0_get_gpu_clock_counter, 3071 .get_gpu_clock_counter = &gfx_v6_0_get_gpu_clock_counter,
3066 .select_se_sh = &gfx_v6_0_select_se_sh, 3072 .select_se_sh = &gfx_v6_0_select_se_sh,
3067 .read_wave_data = &gfx_v6_0_read_wave_data, 3073 .read_wave_data = &gfx_v6_0_read_wave_data,
3068 .read_wave_sgprs = &gfx_v6_0_read_wave_sgprs, 3074 .read_wave_sgprs = &gfx_v6_0_read_wave_sgprs,
3075 .select_me_pipe_q = &gfx_v6_0_select_me_pipe_q
3069}; 3076};
3070 3077
3071static int gfx_v6_0_early_init(void *handle) 3078static int gfx_v6_0_early_init(void *handle)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index e13d9d83767b..42b6144c1fd5 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -4270,11 +4270,18 @@ static void gfx_v7_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd,
4270 start + SQIND_WAVE_SGPRS_OFFSET, size, dst); 4270 start + SQIND_WAVE_SGPRS_OFFSET, size, dst);
4271} 4271}
4272 4272
4273static void gfx_v7_0_select_me_pipe_q(struct amdgpu_device *adev,
4274 u32 me, u32 pipe, u32 q)
4275{
4276 cik_srbm_select(adev, me, pipe, q, 0);
4277}
4278
4273static const struct amdgpu_gfx_funcs gfx_v7_0_gfx_funcs = { 4279static const struct amdgpu_gfx_funcs gfx_v7_0_gfx_funcs = {
4274 .get_gpu_clock_counter = &gfx_v7_0_get_gpu_clock_counter, 4280 .get_gpu_clock_counter = &gfx_v7_0_get_gpu_clock_counter,
4275 .select_se_sh = &gfx_v7_0_select_se_sh, 4281 .select_se_sh = &gfx_v7_0_select_se_sh,
4276 .read_wave_data = &gfx_v7_0_read_wave_data, 4282 .read_wave_data = &gfx_v7_0_read_wave_data,
4277 .read_wave_sgprs = &gfx_v7_0_read_wave_sgprs, 4283 .read_wave_sgprs = &gfx_v7_0_read_wave_sgprs,
4284 .select_me_pipe_q = &gfx_v7_0_select_me_pipe_q
4278}; 4285};
4279 4286
4280static const struct amdgpu_rlc_funcs gfx_v7_0_rlc_funcs = { 4287static const struct amdgpu_rlc_funcs gfx_v7_0_rlc_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 27943e57681c..b0e591eaa71a 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -3475,6 +3475,12 @@ static void gfx_v8_0_select_se_sh(struct amdgpu_device *adev,
3475 WREG32(mmGRBM_GFX_INDEX, data); 3475 WREG32(mmGRBM_GFX_INDEX, data);
3476} 3476}
3477 3477
3478static void gfx_v8_0_select_me_pipe_q(struct amdgpu_device *adev,
3479 u32 me, u32 pipe, u32 q)
3480{
3481 vi_srbm_select(adev, me, pipe, q, 0);
3482}
3483
3478static u32 gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device *adev) 3484static u32 gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device *adev)
3479{ 3485{
3480 u32 data, mask; 3486 u32 data, mask;
@@ -5442,6 +5448,7 @@ static const struct amdgpu_gfx_funcs gfx_v8_0_gfx_funcs = {
5442 .select_se_sh = &gfx_v8_0_select_se_sh, 5448 .select_se_sh = &gfx_v8_0_select_se_sh,
5443 .read_wave_data = &gfx_v8_0_read_wave_data, 5449 .read_wave_data = &gfx_v8_0_read_wave_data,
5444 .read_wave_sgprs = &gfx_v8_0_read_wave_sgprs, 5450 .read_wave_sgprs = &gfx_v8_0_read_wave_sgprs,
5451 .select_me_pipe_q = &gfx_v8_0_select_me_pipe_q
5445}; 5452};
5446 5453
5447static int gfx_v8_0_early_init(void *handle) 5454static int gfx_v8_0_early_init(void *handle)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
index ae90c95e36af..9d39fd5b1822 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
@@ -998,12 +998,19 @@ static void gfx_v9_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t simd,
998 start + SQIND_WAVE_VGPRS_OFFSET, size, dst); 998 start + SQIND_WAVE_VGPRS_OFFSET, size, dst);
999} 999}
1000 1000
1001static void gfx_v9_0_select_me_pipe_q(struct amdgpu_device *adev,
1002 u32 me, u32 pipe, u32 q)
1003{
1004 soc15_grbm_select(adev, me, pipe, q, 0);
1005}
1006
1001static const struct amdgpu_gfx_funcs gfx_v9_0_gfx_funcs = { 1007static const struct amdgpu_gfx_funcs gfx_v9_0_gfx_funcs = {
1002 .get_gpu_clock_counter = &gfx_v9_0_get_gpu_clock_counter, 1008 .get_gpu_clock_counter = &gfx_v9_0_get_gpu_clock_counter,
1003 .select_se_sh = &gfx_v9_0_select_se_sh, 1009 .select_se_sh = &gfx_v9_0_select_se_sh,
1004 .read_wave_data = &gfx_v9_0_read_wave_data, 1010 .read_wave_data = &gfx_v9_0_read_wave_data,
1005 .read_wave_sgprs = &gfx_v9_0_read_wave_sgprs, 1011 .read_wave_sgprs = &gfx_v9_0_read_wave_sgprs,
1006 .read_wave_vgprs = &gfx_v9_0_read_wave_vgprs, 1012 .read_wave_vgprs = &gfx_v9_0_read_wave_vgprs,
1013 .select_me_pipe_q = &gfx_v9_0_select_me_pipe_q
1007}; 1014};
1008 1015
1009static void gfx_v9_0_gpu_early_init(struct amdgpu_device *adev) 1016static void gfx_v9_0_gpu_early_init(struct amdgpu_device *adev)
@@ -2773,13 +2780,13 @@ static int gfx_v9_0_kiq_fini_register(struct amdgpu_ring *ring)
2773 udelay(1); 2780 udelay(1);
2774 } 2781 }
2775 2782
2776 if (adev->usec_timeout == AMDGPU_MAX_USEC_TIMEOUT) { 2783 if (j == AMDGPU_MAX_USEC_TIMEOUT) {
2777 DRM_DEBUG("KIQ dequeue request failed.\n"); 2784 DRM_DEBUG("KIQ dequeue request failed.\n");
2778 2785
2786 /* Manual disable if dequeue request times out */
2779 WREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE, 0); 2787 WREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE, 0);
2780 } 2788 }
2781 2789
2782 /* Manual disable if dequeue request times out */
2783 WREG32_SOC15(GC, 0, mmCP_HQD_DEQUEUE_REQUEST, 2790 WREG32_SOC15(GC, 0, mmCP_HQD_DEQUEUE_REQUEST,
2784 0); 2791 0);
2785 } 2792 }