aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
diff options
context:
space:
mode:
authorTom St Denis <tom.stdenis@amd.com>2016-07-28 09:39:22 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-08-08 11:32:37 -0400
commitbd12267dd896ff8e3dfd25ac31cbc255e9184715 (patch)
tree10266645e128653595bb7f779fb04262deafd930 /drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
parente95a14a9094a8e6396fba22cbdea9201824d6fd1 (diff)
drm/amd/amdgpu: add pm lock to debugfs mmio entry
Adds support for PM locks around access to registers that might have race conditions on PG transistions. Signed-off-by: Tom St Denis <tom.stdenis@amd.com> Reviewed-by: Rex Zhu <Rex.Zhu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 309e58cd1263..9b358df6e886 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2282,22 +2282,26 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
2282 struct amdgpu_device *adev = f->f_inode->i_private; 2282 struct amdgpu_device *adev = f->f_inode->i_private;
2283 ssize_t result = 0; 2283 ssize_t result = 0;
2284 int r; 2284 int r;
2285 bool use_bank; 2285 bool pm_pg_lock, use_bank;
2286 unsigned instance_bank, sh_bank, se_bank; 2286 unsigned instance_bank, sh_bank, se_bank;
2287 2287
2288 if (size & 0x3 || *pos & 0x3) 2288 if (size & 0x3 || *pos & 0x3)
2289 return -EINVAL; 2289 return -EINVAL;
2290 2290
2291 /* are we reading registers for which a PG lock is necessary? */
2292 pm_pg_lock = (*pos >> 23) & 1;
2293
2291 if (*pos & (1ULL << 62)) { 2294 if (*pos & (1ULL << 62)) {
2292 se_bank = (*pos >> 24) & 0x3FF; 2295 se_bank = (*pos >> 24) & 0x3FF;
2293 sh_bank = (*pos >> 34) & 0x3FF; 2296 sh_bank = (*pos >> 34) & 0x3FF;
2294 instance_bank = (*pos >> 44) & 0x3FF; 2297 instance_bank = (*pos >> 44) & 0x3FF;
2295 use_bank = 1; 2298 use_bank = 1;
2296 *pos &= 0xFFFFFF;
2297 } else { 2299 } else {
2298 use_bank = 0; 2300 use_bank = 0;
2299 } 2301 }
2300 2302
2303 *pos &= 0x3FFFF;
2304
2301 if (use_bank) { 2305 if (use_bank) {
2302 if (sh_bank >= adev->gfx.config.max_sh_per_se || 2306 if (sh_bank >= adev->gfx.config.max_sh_per_se ||
2303 se_bank >= adev->gfx.config.max_shader_engines) 2307 se_bank >= adev->gfx.config.max_shader_engines)
@@ -2307,6 +2311,9 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
2307 sh_bank, instance_bank); 2311 sh_bank, instance_bank);
2308 } 2312 }
2309 2313
2314 if (pm_pg_lock)
2315 mutex_lock(&adev->pm.mutex);
2316
2310 while (size) { 2317 while (size) {
2311 uint32_t value; 2318 uint32_t value;
2312 2319
@@ -2332,6 +2339,9 @@ end:
2332 mutex_unlock(&adev->grbm_idx_mutex); 2339 mutex_unlock(&adev->grbm_idx_mutex);
2333 } 2340 }
2334 2341
2342 if (pm_pg_lock)
2343 mutex_unlock(&adev->pm.mutex);
2344
2335 return result; 2345 return result;
2336} 2346}
2337 2347