diff options
author | Tom St Denis <tom.stdenis@amd.com> | 2016-07-28 09:39:22 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-08-08 11:32:37 -0400 |
commit | bd12267dd896ff8e3dfd25ac31cbc255e9184715 (patch) | |
tree | 10266645e128653595bb7f779fb04262deafd930 /drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |
parent | e95a14a9094a8e6396fba22cbdea9201824d6fd1 (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.c | 14 |
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 | ||