Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: move debugfs functions to their own file

amdgpu_device.c was getting pretty cluttered.

Acked-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+838 -785
+1 -1
drivers/gpu/drm/amd/amdgpu/Makefile
··· 52 52 amdgpu_prime.o amdgpu_vm.o amdgpu_ib.o amdgpu_pll.o \ 53 53 amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o \ 54 54 amdgpu_gtt_mgr.o amdgpu_vram_mgr.o amdgpu_virt.o amdgpu_atomfirmware.o \ 55 - amdgpu_queue_mgr.o amdgpu_vf_error.o amdgpu_sched.o 55 + amdgpu_queue_mgr.o amdgpu_vf_error.o amdgpu_sched.o amdgpu_debugfs.o 56 56 57 57 # add asic specific block 58 58 amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \
+1 -15
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 71 71 #include "amdgpu_dm.h" 72 72 #include "amdgpu_virt.h" 73 73 #include "amdgpu_gart.h" 74 - 74 + #include "amdgpu_debugfs.h" 75 75 76 76 /* 77 77 * Modules parameters. ··· 425 425 void *amdgpu_gem_prime_vmap(struct drm_gem_object *obj); 426 426 void amdgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr); 427 427 int amdgpu_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); 428 - int amdgpu_gem_debugfs_init(struct amdgpu_device *adev); 429 428 430 429 /* sub-allocation manager, it has to be protected by another lock. 431 430 * By conception this is an helper for other part of the driver ··· 1239 1240 */ 1240 1241 void amdgpu_test_moves(struct amdgpu_device *adev); 1241 1242 1242 - /* 1243 - * Debugfs 1244 - */ 1245 - struct amdgpu_debugfs { 1246 - const struct drm_info_list *files; 1247 - unsigned num_files; 1248 - }; 1249 - 1250 - int amdgpu_debugfs_add_files(struct amdgpu_device *adev, 1251 - const struct drm_info_list *files, 1252 - unsigned nfiles); 1253 - int amdgpu_debugfs_fence_init(struct amdgpu_device *adev); 1254 - int amdgpu_debugfs_firmware_init(struct amdgpu_device *adev); 1255 1243 1256 1244 /* 1257 1245 * amdgpu smumgr functions
+792
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
··· 1 + /* 2 + * Copyright 2008 Advanced Micro Devices, Inc. 3 + * Copyright 2008 Red Hat Inc. 4 + * Copyright 2009 Jerome Glisse. 5 + * 6 + * Permission is hereby granted, free of charge, to any person obtaining a 7 + * copy of this software and associated documentation files (the "Software"), 8 + * to deal in the Software without restriction, including without limitation 9 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 + * and/or sell copies of the Software, and to permit persons to whom the 11 + * Software is furnished to do so, subject to the following conditions: 12 + * 13 + * The above copyright notice and this permission notice shall be included in 14 + * all copies or substantial portions of the Software. 15 + * 16 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 + * OTHER DEALINGS IN THE SOFTWARE. 23 + * 24 + */ 25 + 26 + #include <linux/kthread.h> 27 + #include <drm/drmP.h> 28 + #include <linux/debugfs.h> 29 + #include "amdgpu.h" 30 + 31 + /* 32 + * Debugfs 33 + */ 34 + int amdgpu_debugfs_add_files(struct amdgpu_device *adev, 35 + const struct drm_info_list *files, 36 + unsigned nfiles) 37 + { 38 + unsigned i; 39 + 40 + for (i = 0; i < adev->debugfs_count; i++) { 41 + if (adev->debugfs[i].files == files) { 42 + /* Already registered */ 43 + return 0; 44 + } 45 + } 46 + 47 + i = adev->debugfs_count + 1; 48 + if (i > AMDGPU_DEBUGFS_MAX_COMPONENTS) { 49 + DRM_ERROR("Reached maximum number of debugfs components.\n"); 50 + DRM_ERROR("Report so we increase " 51 + "AMDGPU_DEBUGFS_MAX_COMPONENTS.\n"); 52 + return -EINVAL; 53 + } 54 + adev->debugfs[adev->debugfs_count].files = files; 55 + adev->debugfs[adev->debugfs_count].num_files = nfiles; 56 + adev->debugfs_count = i; 57 + #if defined(CONFIG_DEBUG_FS) 58 + drm_debugfs_create_files(files, nfiles, 59 + adev->ddev->primary->debugfs_root, 60 + adev->ddev->primary); 61 + #endif 62 + return 0; 63 + } 64 + 65 + #if defined(CONFIG_DEBUG_FS) 66 + 67 + static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf, 68 + size_t size, loff_t *pos) 69 + { 70 + struct amdgpu_device *adev = file_inode(f)->i_private; 71 + ssize_t result = 0; 72 + int r; 73 + bool pm_pg_lock, use_bank; 74 + unsigned instance_bank, sh_bank, se_bank; 75 + 76 + if (size & 0x3 || *pos & 0x3) 77 + return -EINVAL; 78 + 79 + /* are we reading registers for which a PG lock is necessary? */ 80 + pm_pg_lock = (*pos >> 23) & 1; 81 + 82 + if (*pos & (1ULL << 62)) { 83 + se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24; 84 + sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34; 85 + instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44; 86 + 87 + if (se_bank == 0x3FF) 88 + se_bank = 0xFFFFFFFF; 89 + if (sh_bank == 0x3FF) 90 + sh_bank = 0xFFFFFFFF; 91 + if (instance_bank == 0x3FF) 92 + instance_bank = 0xFFFFFFFF; 93 + use_bank = 1; 94 + } else { 95 + use_bank = 0; 96 + } 97 + 98 + *pos &= (1UL << 22) - 1; 99 + 100 + if (use_bank) { 101 + if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) || 102 + (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines)) 103 + return -EINVAL; 104 + mutex_lock(&adev->grbm_idx_mutex); 105 + amdgpu_gfx_select_se_sh(adev, se_bank, 106 + sh_bank, instance_bank); 107 + } 108 + 109 + if (pm_pg_lock) 110 + mutex_lock(&adev->pm.mutex); 111 + 112 + while (size) { 113 + uint32_t value; 114 + 115 + if (*pos > adev->rmmio_size) 116 + goto end; 117 + 118 + value = RREG32(*pos >> 2); 119 + r = put_user(value, (uint32_t *)buf); 120 + if (r) { 121 + result = r; 122 + goto end; 123 + } 124 + 125 + result += 4; 126 + buf += 4; 127 + *pos += 4; 128 + size -= 4; 129 + } 130 + 131 + end: 132 + if (use_bank) { 133 + amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 134 + mutex_unlock(&adev->grbm_idx_mutex); 135 + } 136 + 137 + if (pm_pg_lock) 138 + mutex_unlock(&adev->pm.mutex); 139 + 140 + return result; 141 + } 142 + 143 + static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf, 144 + size_t size, loff_t *pos) 145 + { 146 + struct amdgpu_device *adev = file_inode(f)->i_private; 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 + } 216 + 217 + static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf, 218 + size_t size, loff_t *pos) 219 + { 220 + struct amdgpu_device *adev = file_inode(f)->i_private; 221 + ssize_t result = 0; 222 + int r; 223 + 224 + if (size & 0x3 || *pos & 0x3) 225 + return -EINVAL; 226 + 227 + while (size) { 228 + uint32_t value; 229 + 230 + value = RREG32_PCIE(*pos >> 2); 231 + r = put_user(value, (uint32_t *)buf); 232 + if (r) 233 + return r; 234 + 235 + result += 4; 236 + buf += 4; 237 + *pos += 4; 238 + size -= 4; 239 + } 240 + 241 + return result; 242 + } 243 + 244 + static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf, 245 + size_t size, loff_t *pos) 246 + { 247 + struct amdgpu_device *adev = file_inode(f)->i_private; 248 + ssize_t result = 0; 249 + int r; 250 + 251 + if (size & 0x3 || *pos & 0x3) 252 + return -EINVAL; 253 + 254 + while (size) { 255 + uint32_t value; 256 + 257 + r = get_user(value, (uint32_t *)buf); 258 + if (r) 259 + return r; 260 + 261 + WREG32_PCIE(*pos >> 2, value); 262 + 263 + result += 4; 264 + buf += 4; 265 + *pos += 4; 266 + size -= 4; 267 + } 268 + 269 + return result; 270 + } 271 + 272 + static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf, 273 + size_t size, loff_t *pos) 274 + { 275 + struct amdgpu_device *adev = file_inode(f)->i_private; 276 + ssize_t result = 0; 277 + int r; 278 + 279 + if (size & 0x3 || *pos & 0x3) 280 + return -EINVAL; 281 + 282 + while (size) { 283 + uint32_t value; 284 + 285 + value = RREG32_DIDT(*pos >> 2); 286 + r = put_user(value, (uint32_t *)buf); 287 + if (r) 288 + return r; 289 + 290 + result += 4; 291 + buf += 4; 292 + *pos += 4; 293 + size -= 4; 294 + } 295 + 296 + return result; 297 + } 298 + 299 + static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf, 300 + size_t size, loff_t *pos) 301 + { 302 + struct amdgpu_device *adev = file_inode(f)->i_private; 303 + ssize_t result = 0; 304 + int r; 305 + 306 + if (size & 0x3 || *pos & 0x3) 307 + return -EINVAL; 308 + 309 + while (size) { 310 + uint32_t value; 311 + 312 + r = get_user(value, (uint32_t *)buf); 313 + if (r) 314 + return r; 315 + 316 + WREG32_DIDT(*pos >> 2, value); 317 + 318 + result += 4; 319 + buf += 4; 320 + *pos += 4; 321 + size -= 4; 322 + } 323 + 324 + return result; 325 + } 326 + 327 + static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf, 328 + size_t size, loff_t *pos) 329 + { 330 + struct amdgpu_device *adev = file_inode(f)->i_private; 331 + ssize_t result = 0; 332 + int r; 333 + 334 + if (size & 0x3 || *pos & 0x3) 335 + return -EINVAL; 336 + 337 + while (size) { 338 + uint32_t value; 339 + 340 + value = RREG32_SMC(*pos); 341 + r = put_user(value, (uint32_t *)buf); 342 + if (r) 343 + return r; 344 + 345 + result += 4; 346 + buf += 4; 347 + *pos += 4; 348 + size -= 4; 349 + } 350 + 351 + return result; 352 + } 353 + 354 + static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf, 355 + size_t size, loff_t *pos) 356 + { 357 + struct amdgpu_device *adev = file_inode(f)->i_private; 358 + ssize_t result = 0; 359 + int r; 360 + 361 + if (size & 0x3 || *pos & 0x3) 362 + return -EINVAL; 363 + 364 + while (size) { 365 + uint32_t value; 366 + 367 + r = get_user(value, (uint32_t *)buf); 368 + if (r) 369 + return r; 370 + 371 + WREG32_SMC(*pos, value); 372 + 373 + result += 4; 374 + buf += 4; 375 + *pos += 4; 376 + size -= 4; 377 + } 378 + 379 + return result; 380 + } 381 + 382 + static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf, 383 + size_t size, loff_t *pos) 384 + { 385 + struct amdgpu_device *adev = file_inode(f)->i_private; 386 + ssize_t result = 0; 387 + int r; 388 + uint32_t *config, no_regs = 0; 389 + 390 + if (size & 0x3 || *pos & 0x3) 391 + return -EINVAL; 392 + 393 + config = kmalloc_array(256, sizeof(*config), GFP_KERNEL); 394 + if (!config) 395 + return -ENOMEM; 396 + 397 + /* version, increment each time something is added */ 398 + config[no_regs++] = 3; 399 + config[no_regs++] = adev->gfx.config.max_shader_engines; 400 + config[no_regs++] = adev->gfx.config.max_tile_pipes; 401 + config[no_regs++] = adev->gfx.config.max_cu_per_sh; 402 + config[no_regs++] = adev->gfx.config.max_sh_per_se; 403 + config[no_regs++] = adev->gfx.config.max_backends_per_se; 404 + config[no_regs++] = adev->gfx.config.max_texture_channel_caches; 405 + config[no_regs++] = adev->gfx.config.max_gprs; 406 + config[no_regs++] = adev->gfx.config.max_gs_threads; 407 + config[no_regs++] = adev->gfx.config.max_hw_contexts; 408 + config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_frontend; 409 + config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_backend; 410 + config[no_regs++] = adev->gfx.config.sc_hiz_tile_fifo_size; 411 + config[no_regs++] = adev->gfx.config.sc_earlyz_tile_fifo_size; 412 + config[no_regs++] = adev->gfx.config.num_tile_pipes; 413 + config[no_regs++] = adev->gfx.config.backend_enable_mask; 414 + config[no_regs++] = adev->gfx.config.mem_max_burst_length_bytes; 415 + config[no_regs++] = adev->gfx.config.mem_row_size_in_kb; 416 + config[no_regs++] = adev->gfx.config.shader_engine_tile_size; 417 + config[no_regs++] = adev->gfx.config.num_gpus; 418 + config[no_regs++] = adev->gfx.config.multi_gpu_tile_size; 419 + config[no_regs++] = adev->gfx.config.mc_arb_ramcfg; 420 + config[no_regs++] = adev->gfx.config.gb_addr_config; 421 + config[no_regs++] = adev->gfx.config.num_rbs; 422 + 423 + /* rev==1 */ 424 + config[no_regs++] = adev->rev_id; 425 + config[no_regs++] = adev->pg_flags; 426 + config[no_regs++] = adev->cg_flags; 427 + 428 + /* rev==2 */ 429 + config[no_regs++] = adev->family; 430 + config[no_regs++] = adev->external_rev_id; 431 + 432 + /* rev==3 */ 433 + config[no_regs++] = adev->pdev->device; 434 + config[no_regs++] = adev->pdev->revision; 435 + config[no_regs++] = adev->pdev->subsystem_device; 436 + config[no_regs++] = adev->pdev->subsystem_vendor; 437 + 438 + while (size && (*pos < no_regs * 4)) { 439 + uint32_t value; 440 + 441 + value = config[*pos >> 2]; 442 + r = put_user(value, (uint32_t *)buf); 443 + if (r) { 444 + kfree(config); 445 + return r; 446 + } 447 + 448 + result += 4; 449 + buf += 4; 450 + *pos += 4; 451 + size -= 4; 452 + } 453 + 454 + kfree(config); 455 + return result; 456 + } 457 + 458 + static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf, 459 + size_t size, loff_t *pos) 460 + { 461 + struct amdgpu_device *adev = file_inode(f)->i_private; 462 + int idx, x, outsize, r, valuesize; 463 + uint32_t values[16]; 464 + 465 + if (size & 3 || *pos & 0x3) 466 + return -EINVAL; 467 + 468 + if (amdgpu_dpm == 0) 469 + return -EINVAL; 470 + 471 + /* convert offset to sensor number */ 472 + idx = *pos >> 2; 473 + 474 + valuesize = sizeof(values); 475 + if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->read_sensor) 476 + r = amdgpu_dpm_read_sensor(adev, idx, &values[0], &valuesize); 477 + else 478 + return -EINVAL; 479 + 480 + if (size > valuesize) 481 + return -EINVAL; 482 + 483 + outsize = 0; 484 + x = 0; 485 + if (!r) { 486 + while (size) { 487 + r = put_user(values[x++], (int32_t *)buf); 488 + buf += 4; 489 + size -= 4; 490 + outsize += 4; 491 + } 492 + } 493 + 494 + return !r ? outsize : r; 495 + } 496 + 497 + static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf, 498 + size_t size, loff_t *pos) 499 + { 500 + struct amdgpu_device *adev = f->f_inode->i_private; 501 + int r, x; 502 + ssize_t result=0; 503 + uint32_t offset, se, sh, cu, wave, simd, data[32]; 504 + 505 + if (size & 3 || *pos & 3) 506 + return -EINVAL; 507 + 508 + /* decode offset */ 509 + offset = (*pos & GENMASK_ULL(6, 0)); 510 + se = (*pos & GENMASK_ULL(14, 7)) >> 7; 511 + sh = (*pos & GENMASK_ULL(22, 15)) >> 15; 512 + cu = (*pos & GENMASK_ULL(30, 23)) >> 23; 513 + wave = (*pos & GENMASK_ULL(36, 31)) >> 31; 514 + simd = (*pos & GENMASK_ULL(44, 37)) >> 37; 515 + 516 + /* switch to the specific se/sh/cu */ 517 + mutex_lock(&adev->grbm_idx_mutex); 518 + amdgpu_gfx_select_se_sh(adev, se, sh, cu); 519 + 520 + x = 0; 521 + if (adev->gfx.funcs->read_wave_data) 522 + adev->gfx.funcs->read_wave_data(adev, simd, wave, data, &x); 523 + 524 + amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); 525 + mutex_unlock(&adev->grbm_idx_mutex); 526 + 527 + if (!x) 528 + return -EINVAL; 529 + 530 + while (size && (offset < x * 4)) { 531 + uint32_t value; 532 + 533 + value = data[offset >> 2]; 534 + r = put_user(value, (uint32_t *)buf); 535 + if (r) 536 + return r; 537 + 538 + result += 4; 539 + buf += 4; 540 + offset += 4; 541 + size -= 4; 542 + } 543 + 544 + return result; 545 + } 546 + 547 + static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf, 548 + size_t size, loff_t *pos) 549 + { 550 + struct amdgpu_device *adev = f->f_inode->i_private; 551 + int r; 552 + ssize_t result = 0; 553 + uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data; 554 + 555 + if (size & 3 || *pos & 3) 556 + return -EINVAL; 557 + 558 + /* decode offset */ 559 + offset = *pos & GENMASK_ULL(11, 0); 560 + se = (*pos & GENMASK_ULL(19, 12)) >> 12; 561 + sh = (*pos & GENMASK_ULL(27, 20)) >> 20; 562 + cu = (*pos & GENMASK_ULL(35, 28)) >> 28; 563 + wave = (*pos & GENMASK_ULL(43, 36)) >> 36; 564 + simd = (*pos & GENMASK_ULL(51, 44)) >> 44; 565 + thread = (*pos & GENMASK_ULL(59, 52)) >> 52; 566 + bank = (*pos & GENMASK_ULL(61, 60)) >> 60; 567 + 568 + data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL); 569 + if (!data) 570 + return -ENOMEM; 571 + 572 + /* switch to the specific se/sh/cu */ 573 + mutex_lock(&adev->grbm_idx_mutex); 574 + amdgpu_gfx_select_se_sh(adev, se, sh, cu); 575 + 576 + if (bank == 0) { 577 + if (adev->gfx.funcs->read_wave_vgprs) 578 + adev->gfx.funcs->read_wave_vgprs(adev, simd, wave, thread, offset, size>>2, data); 579 + } else { 580 + if (adev->gfx.funcs->read_wave_sgprs) 581 + adev->gfx.funcs->read_wave_sgprs(adev, simd, wave, offset, size>>2, data); 582 + } 583 + 584 + amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); 585 + mutex_unlock(&adev->grbm_idx_mutex); 586 + 587 + while (size) { 588 + uint32_t value; 589 + 590 + value = data[offset++]; 591 + r = put_user(value, (uint32_t *)buf); 592 + if (r) { 593 + result = r; 594 + goto err; 595 + } 596 + 597 + result += 4; 598 + buf += 4; 599 + size -= 4; 600 + } 601 + 602 + err: 603 + kfree(data); 604 + return result; 605 + } 606 + 607 + static const struct file_operations amdgpu_debugfs_regs_fops = { 608 + .owner = THIS_MODULE, 609 + .read = amdgpu_debugfs_regs_read, 610 + .write = amdgpu_debugfs_regs_write, 611 + .llseek = default_llseek 612 + }; 613 + static const struct file_operations amdgpu_debugfs_regs_didt_fops = { 614 + .owner = THIS_MODULE, 615 + .read = amdgpu_debugfs_regs_didt_read, 616 + .write = amdgpu_debugfs_regs_didt_write, 617 + .llseek = default_llseek 618 + }; 619 + static const struct file_operations amdgpu_debugfs_regs_pcie_fops = { 620 + .owner = THIS_MODULE, 621 + .read = amdgpu_debugfs_regs_pcie_read, 622 + .write = amdgpu_debugfs_regs_pcie_write, 623 + .llseek = default_llseek 624 + }; 625 + static const struct file_operations amdgpu_debugfs_regs_smc_fops = { 626 + .owner = THIS_MODULE, 627 + .read = amdgpu_debugfs_regs_smc_read, 628 + .write = amdgpu_debugfs_regs_smc_write, 629 + .llseek = default_llseek 630 + }; 631 + 632 + static const struct file_operations amdgpu_debugfs_gca_config_fops = { 633 + .owner = THIS_MODULE, 634 + .read = amdgpu_debugfs_gca_config_read, 635 + .llseek = default_llseek 636 + }; 637 + 638 + static const struct file_operations amdgpu_debugfs_sensors_fops = { 639 + .owner = THIS_MODULE, 640 + .read = amdgpu_debugfs_sensor_read, 641 + .llseek = default_llseek 642 + }; 643 + 644 + static const struct file_operations amdgpu_debugfs_wave_fops = { 645 + .owner = THIS_MODULE, 646 + .read = amdgpu_debugfs_wave_read, 647 + .llseek = default_llseek 648 + }; 649 + static const struct file_operations amdgpu_debugfs_gpr_fops = { 650 + .owner = THIS_MODULE, 651 + .read = amdgpu_debugfs_gpr_read, 652 + .llseek = default_llseek 653 + }; 654 + 655 + static const struct file_operations *debugfs_regs[] = { 656 + &amdgpu_debugfs_regs_fops, 657 + &amdgpu_debugfs_regs_didt_fops, 658 + &amdgpu_debugfs_regs_pcie_fops, 659 + &amdgpu_debugfs_regs_smc_fops, 660 + &amdgpu_debugfs_gca_config_fops, 661 + &amdgpu_debugfs_sensors_fops, 662 + &amdgpu_debugfs_wave_fops, 663 + &amdgpu_debugfs_gpr_fops, 664 + }; 665 + 666 + static const char *debugfs_regs_names[] = { 667 + "amdgpu_regs", 668 + "amdgpu_regs_didt", 669 + "amdgpu_regs_pcie", 670 + "amdgpu_regs_smc", 671 + "amdgpu_gca_config", 672 + "amdgpu_sensors", 673 + "amdgpu_wave", 674 + "amdgpu_gpr", 675 + }; 676 + 677 + int amdgpu_debugfs_regs_init(struct amdgpu_device *adev) 678 + { 679 + struct drm_minor *minor = adev->ddev->primary; 680 + struct dentry *ent, *root = minor->debugfs_root; 681 + unsigned i, j; 682 + 683 + for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) { 684 + ent = debugfs_create_file(debugfs_regs_names[i], 685 + S_IFREG | S_IRUGO, root, 686 + adev, debugfs_regs[i]); 687 + if (IS_ERR(ent)) { 688 + for (j = 0; j < i; j++) { 689 + debugfs_remove(adev->debugfs_regs[i]); 690 + adev->debugfs_regs[i] = NULL; 691 + } 692 + return PTR_ERR(ent); 693 + } 694 + 695 + if (!i) 696 + i_size_write(ent->d_inode, adev->rmmio_size); 697 + adev->debugfs_regs[i] = ent; 698 + } 699 + 700 + return 0; 701 + } 702 + 703 + void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev) 704 + { 705 + unsigned i; 706 + 707 + for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) { 708 + if (adev->debugfs_regs[i]) { 709 + debugfs_remove(adev->debugfs_regs[i]); 710 + adev->debugfs_regs[i] = NULL; 711 + } 712 + } 713 + } 714 + 715 + static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data) 716 + { 717 + struct drm_info_node *node = (struct drm_info_node *) m->private; 718 + struct drm_device *dev = node->minor->dev; 719 + struct amdgpu_device *adev = dev->dev_private; 720 + int r = 0, i; 721 + 722 + /* hold on the scheduler */ 723 + for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 724 + struct amdgpu_ring *ring = adev->rings[i]; 725 + 726 + if (!ring || !ring->sched.thread) 727 + continue; 728 + kthread_park(ring->sched.thread); 729 + } 730 + 731 + seq_printf(m, "run ib test:\n"); 732 + r = amdgpu_ib_ring_tests(adev); 733 + if (r) 734 + seq_printf(m, "ib ring tests failed (%d).\n", r); 735 + else 736 + seq_printf(m, "ib ring tests passed.\n"); 737 + 738 + /* go on the scheduler */ 739 + for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 740 + struct amdgpu_ring *ring = adev->rings[i]; 741 + 742 + if (!ring || !ring->sched.thread) 743 + continue; 744 + kthread_unpark(ring->sched.thread); 745 + } 746 + 747 + return 0; 748 + } 749 + 750 + static int amdgpu_debugfs_get_vbios_dump(struct seq_file *m, void *data) 751 + { 752 + struct drm_info_node *node = (struct drm_info_node *) m->private; 753 + struct drm_device *dev = node->minor->dev; 754 + struct amdgpu_device *adev = dev->dev_private; 755 + 756 + seq_write(m, adev->bios, adev->bios_size); 757 + return 0; 758 + } 759 + 760 + static int amdgpu_debugfs_evict_vram(struct seq_file *m, void *data) 761 + { 762 + struct drm_info_node *node = (struct drm_info_node *)m->private; 763 + struct drm_device *dev = node->minor->dev; 764 + struct amdgpu_device *adev = dev->dev_private; 765 + 766 + seq_printf(m, "(%d)\n", amdgpu_bo_evict_vram(adev)); 767 + return 0; 768 + } 769 + 770 + static const struct drm_info_list amdgpu_debugfs_list[] = { 771 + {"amdgpu_vbios", amdgpu_debugfs_get_vbios_dump}, 772 + {"amdgpu_test_ib", &amdgpu_debugfs_test_ib}, 773 + {"amdgpu_evict_vram", &amdgpu_debugfs_evict_vram} 774 + }; 775 + 776 + int amdgpu_debugfs_init(struct amdgpu_device *adev) 777 + { 778 + return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_list, 779 + ARRAY_SIZE(amdgpu_debugfs_list)); 780 + } 781 + 782 + #else 783 + int amdgpu_debugfs_init(struct amdgpu_device *adev) 784 + { 785 + return 0; 786 + } 787 + int amdgpu_debugfs_regs_init(struct amdgpu_device *adev) 788 + { 789 + return 0; 790 + } 791 + void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev) { } 792 + #endif
+42
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h
··· 1 + /* 2 + * Copyright 2008 Advanced Micro Devices, Inc. 3 + * Copyright 2008 Red Hat Inc. 4 + * Copyright 2009 Jerome Glisse. 5 + * 6 + * Permission is hereby granted, free of charge, to any person obtaining a 7 + * copy of this software and associated documentation files (the "Software"), 8 + * to deal in the Software without restriction, including without limitation 9 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 + * and/or sell copies of the Software, and to permit persons to whom the 11 + * Software is furnished to do so, subject to the following conditions: 12 + * 13 + * The above copyright notice and this permission notice shall be included in 14 + * all copies or substantial portions of the Software. 15 + * 16 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 + * OTHER DEALINGS IN THE SOFTWARE. 23 + * 24 + */ 25 + 26 + /* 27 + * Debugfs 28 + */ 29 + struct amdgpu_debugfs { 30 + const struct drm_info_list *files; 31 + unsigned num_files; 32 + }; 33 + 34 + int amdgpu_debugfs_regs_init(struct amdgpu_device *adev); 35 + void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev); 36 + int amdgpu_debugfs_init(struct amdgpu_device *adev); 37 + int amdgpu_debugfs_add_files(struct amdgpu_device *adev, 38 + const struct drm_info_list *files, 39 + unsigned nfiles); 40 + int amdgpu_debugfs_fence_init(struct amdgpu_device *adev); 41 + int amdgpu_debugfs_firmware_init(struct amdgpu_device *adev); 42 + int amdgpu_debugfs_gem_init(struct amdgpu_device *adev);
+1 -768
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 28 28 #include <linux/kthread.h> 29 29 #include <linux/console.h> 30 30 #include <linux/slab.h> 31 - #include <linux/debugfs.h> 32 31 #include <drm/drmP.h> 33 32 #include <drm/drm_crtc_helper.h> 34 33 #include <drm/drm_atomic_helper.h> ··· 62 63 MODULE_FIRMWARE("amdgpu/raven_gpu_info.bin"); 63 64 64 65 #define AMDGPU_RESUME_MS 2000 65 - 66 - static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev); 67 - static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev); 68 - static int amdgpu_debugfs_init(struct amdgpu_device *adev); 69 66 70 67 static const char *amdgpu_asic_name[] = { 71 68 "TAHITI", ··· 2166 2171 if (r) 2167 2172 DRM_ERROR("registering pm debugfs failed (%d).\n", r); 2168 2173 2169 - r = amdgpu_gem_debugfs_init(adev); 2174 + r = amdgpu_debugfs_gem_init(adev); 2170 2175 if (r) 2171 2176 DRM_ERROR("registering gem debugfs failed (%d).\n", r); 2172 2177 ··· 3015 3020 } 3016 3021 } 3017 3022 3018 - /* 3019 - * Debugfs 3020 - */ 3021 - int amdgpu_debugfs_add_files(struct amdgpu_device *adev, 3022 - const struct drm_info_list *files, 3023 - unsigned nfiles) 3024 - { 3025 - unsigned i; 3026 - 3027 - for (i = 0; i < adev->debugfs_count; i++) { 3028 - if (adev->debugfs[i].files == files) { 3029 - /* Already registered */ 3030 - return 0; 3031 - } 3032 - } 3033 - 3034 - i = adev->debugfs_count + 1; 3035 - if (i > AMDGPU_DEBUGFS_MAX_COMPONENTS) { 3036 - DRM_ERROR("Reached maximum number of debugfs components.\n"); 3037 - DRM_ERROR("Report so we increase " 3038 - "AMDGPU_DEBUGFS_MAX_COMPONENTS.\n"); 3039 - return -EINVAL; 3040 - } 3041 - adev->debugfs[adev->debugfs_count].files = files; 3042 - adev->debugfs[adev->debugfs_count].num_files = nfiles; 3043 - adev->debugfs_count = i; 3044 - #if defined(CONFIG_DEBUG_FS) 3045 - drm_debugfs_create_files(files, nfiles, 3046 - adev->ddev->primary->debugfs_root, 3047 - adev->ddev->primary); 3048 - #endif 3049 - return 0; 3050 - } 3051 - 3052 - #if defined(CONFIG_DEBUG_FS) 3053 - 3054 - static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf, 3055 - size_t size, loff_t *pos) 3056 - { 3057 - struct amdgpu_device *adev = file_inode(f)->i_private; 3058 - ssize_t result = 0; 3059 - int r; 3060 - bool pm_pg_lock, use_bank; 3061 - unsigned instance_bank, sh_bank, se_bank; 3062 - 3063 - if (size & 0x3 || *pos & 0x3) 3064 - return -EINVAL; 3065 - 3066 - /* are we reading registers for which a PG lock is necessary? */ 3067 - pm_pg_lock = (*pos >> 23) & 1; 3068 - 3069 - if (*pos & (1ULL << 62)) { 3070 - se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24; 3071 - sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34; 3072 - instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44; 3073 - 3074 - if (se_bank == 0x3FF) 3075 - se_bank = 0xFFFFFFFF; 3076 - if (sh_bank == 0x3FF) 3077 - sh_bank = 0xFFFFFFFF; 3078 - if (instance_bank == 0x3FF) 3079 - instance_bank = 0xFFFFFFFF; 3080 - use_bank = 1; 3081 - } else { 3082 - use_bank = 0; 3083 - } 3084 - 3085 - *pos &= (1UL << 22) - 1; 3086 - 3087 - if (use_bank) { 3088 - if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) || 3089 - (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines)) 3090 - return -EINVAL; 3091 - mutex_lock(&adev->grbm_idx_mutex); 3092 - amdgpu_gfx_select_se_sh(adev, se_bank, 3093 - sh_bank, instance_bank); 3094 - } 3095 - 3096 - if (pm_pg_lock) 3097 - mutex_lock(&adev->pm.mutex); 3098 - 3099 - while (size) { 3100 - uint32_t value; 3101 - 3102 - if (*pos > adev->rmmio_size) 3103 - goto end; 3104 - 3105 - value = RREG32(*pos >> 2); 3106 - r = put_user(value, (uint32_t *)buf); 3107 - if (r) { 3108 - result = r; 3109 - goto end; 3110 - } 3111 - 3112 - result += 4; 3113 - buf += 4; 3114 - *pos += 4; 3115 - size -= 4; 3116 - } 3117 - 3118 - end: 3119 - if (use_bank) { 3120 - amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 3121 - mutex_unlock(&adev->grbm_idx_mutex); 3122 - } 3123 - 3124 - if (pm_pg_lock) 3125 - mutex_unlock(&adev->pm.mutex); 3126 - 3127 - return result; 3128 - } 3129 - 3130 - static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf, 3131 - size_t size, loff_t *pos) 3132 - { 3133 - struct amdgpu_device *adev = file_inode(f)->i_private; 3134 - ssize_t result = 0; 3135 - int r; 3136 - bool pm_pg_lock, use_bank; 3137 - unsigned instance_bank, sh_bank, se_bank; 3138 - 3139 - if (size & 0x3 || *pos & 0x3) 3140 - return -EINVAL; 3141 - 3142 - /* are we reading registers for which a PG lock is necessary? */ 3143 - pm_pg_lock = (*pos >> 23) & 1; 3144 - 3145 - if (*pos & (1ULL << 62)) { 3146 - se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24; 3147 - sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34; 3148 - instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44; 3149 - 3150 - if (se_bank == 0x3FF) 3151 - se_bank = 0xFFFFFFFF; 3152 - if (sh_bank == 0x3FF) 3153 - sh_bank = 0xFFFFFFFF; 3154 - if (instance_bank == 0x3FF) 3155 - instance_bank = 0xFFFFFFFF; 3156 - use_bank = 1; 3157 - } else { 3158 - use_bank = 0; 3159 - } 3160 - 3161 - *pos &= (1UL << 22) - 1; 3162 - 3163 - if (use_bank) { 3164 - if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) || 3165 - (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines)) 3166 - return -EINVAL; 3167 - mutex_lock(&adev->grbm_idx_mutex); 3168 - amdgpu_gfx_select_se_sh(adev, se_bank, 3169 - sh_bank, instance_bank); 3170 - } 3171 - 3172 - if (pm_pg_lock) 3173 - mutex_lock(&adev->pm.mutex); 3174 - 3175 - while (size) { 3176 - uint32_t value; 3177 - 3178 - if (*pos > adev->rmmio_size) 3179 - return result; 3180 - 3181 - r = get_user(value, (uint32_t *)buf); 3182 - if (r) 3183 - return r; 3184 - 3185 - WREG32(*pos >> 2, value); 3186 - 3187 - result += 4; 3188 - buf += 4; 3189 - *pos += 4; 3190 - size -= 4; 3191 - } 3192 - 3193 - if (use_bank) { 3194 - amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 3195 - mutex_unlock(&adev->grbm_idx_mutex); 3196 - } 3197 - 3198 - if (pm_pg_lock) 3199 - mutex_unlock(&adev->pm.mutex); 3200 - 3201 - return result; 3202 - } 3203 - 3204 - static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf, 3205 - size_t size, loff_t *pos) 3206 - { 3207 - struct amdgpu_device *adev = file_inode(f)->i_private; 3208 - ssize_t result = 0; 3209 - int r; 3210 - 3211 - if (size & 0x3 || *pos & 0x3) 3212 - return -EINVAL; 3213 - 3214 - while (size) { 3215 - uint32_t value; 3216 - 3217 - value = RREG32_PCIE(*pos >> 2); 3218 - r = put_user(value, (uint32_t *)buf); 3219 - if (r) 3220 - return r; 3221 - 3222 - result += 4; 3223 - buf += 4; 3224 - *pos += 4; 3225 - size -= 4; 3226 - } 3227 - 3228 - return result; 3229 - } 3230 - 3231 - static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf, 3232 - size_t size, loff_t *pos) 3233 - { 3234 - struct amdgpu_device *adev = file_inode(f)->i_private; 3235 - ssize_t result = 0; 3236 - int r; 3237 - 3238 - if (size & 0x3 || *pos & 0x3) 3239 - return -EINVAL; 3240 - 3241 - while (size) { 3242 - uint32_t value; 3243 - 3244 - r = get_user(value, (uint32_t *)buf); 3245 - if (r) 3246 - return r; 3247 - 3248 - WREG32_PCIE(*pos >> 2, value); 3249 - 3250 - result += 4; 3251 - buf += 4; 3252 - *pos += 4; 3253 - size -= 4; 3254 - } 3255 - 3256 - return result; 3257 - } 3258 - 3259 - static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf, 3260 - size_t size, loff_t *pos) 3261 - { 3262 - struct amdgpu_device *adev = file_inode(f)->i_private; 3263 - ssize_t result = 0; 3264 - int r; 3265 - 3266 - if (size & 0x3 || *pos & 0x3) 3267 - return -EINVAL; 3268 - 3269 - while (size) { 3270 - uint32_t value; 3271 - 3272 - value = RREG32_DIDT(*pos >> 2); 3273 - r = put_user(value, (uint32_t *)buf); 3274 - if (r) 3275 - return r; 3276 - 3277 - result += 4; 3278 - buf += 4; 3279 - *pos += 4; 3280 - size -= 4; 3281 - } 3282 - 3283 - return result; 3284 - } 3285 - 3286 - static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf, 3287 - size_t size, loff_t *pos) 3288 - { 3289 - struct amdgpu_device *adev = file_inode(f)->i_private; 3290 - ssize_t result = 0; 3291 - int r; 3292 - 3293 - if (size & 0x3 || *pos & 0x3) 3294 - return -EINVAL; 3295 - 3296 - while (size) { 3297 - uint32_t value; 3298 - 3299 - r = get_user(value, (uint32_t *)buf); 3300 - if (r) 3301 - return r; 3302 - 3303 - WREG32_DIDT(*pos >> 2, value); 3304 - 3305 - result += 4; 3306 - buf += 4; 3307 - *pos += 4; 3308 - size -= 4; 3309 - } 3310 - 3311 - return result; 3312 - } 3313 - 3314 - static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf, 3315 - size_t size, loff_t *pos) 3316 - { 3317 - struct amdgpu_device *adev = file_inode(f)->i_private; 3318 - ssize_t result = 0; 3319 - int r; 3320 - 3321 - if (size & 0x3 || *pos & 0x3) 3322 - return -EINVAL; 3323 - 3324 - while (size) { 3325 - uint32_t value; 3326 - 3327 - value = RREG32_SMC(*pos); 3328 - r = put_user(value, (uint32_t *)buf); 3329 - if (r) 3330 - return r; 3331 - 3332 - result += 4; 3333 - buf += 4; 3334 - *pos += 4; 3335 - size -= 4; 3336 - } 3337 - 3338 - return result; 3339 - } 3340 - 3341 - static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf, 3342 - size_t size, loff_t *pos) 3343 - { 3344 - struct amdgpu_device *adev = file_inode(f)->i_private; 3345 - ssize_t result = 0; 3346 - int r; 3347 - 3348 - if (size & 0x3 || *pos & 0x3) 3349 - return -EINVAL; 3350 - 3351 - while (size) { 3352 - uint32_t value; 3353 - 3354 - r = get_user(value, (uint32_t *)buf); 3355 - if (r) 3356 - return r; 3357 - 3358 - WREG32_SMC(*pos, value); 3359 - 3360 - result += 4; 3361 - buf += 4; 3362 - *pos += 4; 3363 - size -= 4; 3364 - } 3365 - 3366 - return result; 3367 - } 3368 - 3369 - static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf, 3370 - size_t size, loff_t *pos) 3371 - { 3372 - struct amdgpu_device *adev = file_inode(f)->i_private; 3373 - ssize_t result = 0; 3374 - int r; 3375 - uint32_t *config, no_regs = 0; 3376 - 3377 - if (size & 0x3 || *pos & 0x3) 3378 - return -EINVAL; 3379 - 3380 - config = kmalloc_array(256, sizeof(*config), GFP_KERNEL); 3381 - if (!config) 3382 - return -ENOMEM; 3383 - 3384 - /* version, increment each time something is added */ 3385 - config[no_regs++] = 3; 3386 - config[no_regs++] = adev->gfx.config.max_shader_engines; 3387 - config[no_regs++] = adev->gfx.config.max_tile_pipes; 3388 - config[no_regs++] = adev->gfx.config.max_cu_per_sh; 3389 - config[no_regs++] = adev->gfx.config.max_sh_per_se; 3390 - config[no_regs++] = adev->gfx.config.max_backends_per_se; 3391 - config[no_regs++] = adev->gfx.config.max_texture_channel_caches; 3392 - config[no_regs++] = adev->gfx.config.max_gprs; 3393 - config[no_regs++] = adev->gfx.config.max_gs_threads; 3394 - config[no_regs++] = adev->gfx.config.max_hw_contexts; 3395 - config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_frontend; 3396 - config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_backend; 3397 - config[no_regs++] = adev->gfx.config.sc_hiz_tile_fifo_size; 3398 - config[no_regs++] = adev->gfx.config.sc_earlyz_tile_fifo_size; 3399 - config[no_regs++] = adev->gfx.config.num_tile_pipes; 3400 - config[no_regs++] = adev->gfx.config.backend_enable_mask; 3401 - config[no_regs++] = adev->gfx.config.mem_max_burst_length_bytes; 3402 - config[no_regs++] = adev->gfx.config.mem_row_size_in_kb; 3403 - config[no_regs++] = adev->gfx.config.shader_engine_tile_size; 3404 - config[no_regs++] = adev->gfx.config.num_gpus; 3405 - config[no_regs++] = adev->gfx.config.multi_gpu_tile_size; 3406 - config[no_regs++] = adev->gfx.config.mc_arb_ramcfg; 3407 - config[no_regs++] = adev->gfx.config.gb_addr_config; 3408 - config[no_regs++] = adev->gfx.config.num_rbs; 3409 - 3410 - /* rev==1 */ 3411 - config[no_regs++] = adev->rev_id; 3412 - config[no_regs++] = adev->pg_flags; 3413 - config[no_regs++] = adev->cg_flags; 3414 - 3415 - /* rev==2 */ 3416 - config[no_regs++] = adev->family; 3417 - config[no_regs++] = adev->external_rev_id; 3418 - 3419 - /* rev==3 */ 3420 - config[no_regs++] = adev->pdev->device; 3421 - config[no_regs++] = adev->pdev->revision; 3422 - config[no_regs++] = adev->pdev->subsystem_device; 3423 - config[no_regs++] = adev->pdev->subsystem_vendor; 3424 - 3425 - while (size && (*pos < no_regs * 4)) { 3426 - uint32_t value; 3427 - 3428 - value = config[*pos >> 2]; 3429 - r = put_user(value, (uint32_t *)buf); 3430 - if (r) { 3431 - kfree(config); 3432 - return r; 3433 - } 3434 - 3435 - result += 4; 3436 - buf += 4; 3437 - *pos += 4; 3438 - size -= 4; 3439 - } 3440 - 3441 - kfree(config); 3442 - return result; 3443 - } 3444 - 3445 - static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf, 3446 - size_t size, loff_t *pos) 3447 - { 3448 - struct amdgpu_device *adev = file_inode(f)->i_private; 3449 - int idx, x, outsize, r, valuesize; 3450 - uint32_t values[16]; 3451 - 3452 - if (size & 3 || *pos & 0x3) 3453 - return -EINVAL; 3454 - 3455 - if (amdgpu_dpm == 0) 3456 - return -EINVAL; 3457 - 3458 - /* convert offset to sensor number */ 3459 - idx = *pos >> 2; 3460 - 3461 - valuesize = sizeof(values); 3462 - if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->read_sensor) 3463 - r = amdgpu_dpm_read_sensor(adev, idx, &values[0], &valuesize); 3464 - else 3465 - return -EINVAL; 3466 - 3467 - if (size > valuesize) 3468 - return -EINVAL; 3469 - 3470 - outsize = 0; 3471 - x = 0; 3472 - if (!r) { 3473 - while (size) { 3474 - r = put_user(values[x++], (int32_t *)buf); 3475 - buf += 4; 3476 - size -= 4; 3477 - outsize += 4; 3478 - } 3479 - } 3480 - 3481 - return !r ? outsize : r; 3482 - } 3483 - 3484 - static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf, 3485 - size_t size, loff_t *pos) 3486 - { 3487 - struct amdgpu_device *adev = f->f_inode->i_private; 3488 - int r, x; 3489 - ssize_t result=0; 3490 - uint32_t offset, se, sh, cu, wave, simd, data[32]; 3491 - 3492 - if (size & 3 || *pos & 3) 3493 - return -EINVAL; 3494 - 3495 - /* decode offset */ 3496 - offset = (*pos & GENMASK_ULL(6, 0)); 3497 - se = (*pos & GENMASK_ULL(14, 7)) >> 7; 3498 - sh = (*pos & GENMASK_ULL(22, 15)) >> 15; 3499 - cu = (*pos & GENMASK_ULL(30, 23)) >> 23; 3500 - wave = (*pos & GENMASK_ULL(36, 31)) >> 31; 3501 - simd = (*pos & GENMASK_ULL(44, 37)) >> 37; 3502 - 3503 - /* switch to the specific se/sh/cu */ 3504 - mutex_lock(&adev->grbm_idx_mutex); 3505 - amdgpu_gfx_select_se_sh(adev, se, sh, cu); 3506 - 3507 - x = 0; 3508 - if (adev->gfx.funcs->read_wave_data) 3509 - adev->gfx.funcs->read_wave_data(adev, simd, wave, data, &x); 3510 - 3511 - amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); 3512 - mutex_unlock(&adev->grbm_idx_mutex); 3513 - 3514 - if (!x) 3515 - return -EINVAL; 3516 - 3517 - while (size && (offset < x * 4)) { 3518 - uint32_t value; 3519 - 3520 - value = data[offset >> 2]; 3521 - r = put_user(value, (uint32_t *)buf); 3522 - if (r) 3523 - return r; 3524 - 3525 - result += 4; 3526 - buf += 4; 3527 - offset += 4; 3528 - size -= 4; 3529 - } 3530 - 3531 - return result; 3532 - } 3533 - 3534 - static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf, 3535 - size_t size, loff_t *pos) 3536 - { 3537 - struct amdgpu_device *adev = f->f_inode->i_private; 3538 - int r; 3539 - ssize_t result = 0; 3540 - uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data; 3541 - 3542 - if (size & 3 || *pos & 3) 3543 - return -EINVAL; 3544 - 3545 - /* decode offset */ 3546 - offset = *pos & GENMASK_ULL(11, 0); 3547 - se = (*pos & GENMASK_ULL(19, 12)) >> 12; 3548 - sh = (*pos & GENMASK_ULL(27, 20)) >> 20; 3549 - cu = (*pos & GENMASK_ULL(35, 28)) >> 28; 3550 - wave = (*pos & GENMASK_ULL(43, 36)) >> 36; 3551 - simd = (*pos & GENMASK_ULL(51, 44)) >> 44; 3552 - thread = (*pos & GENMASK_ULL(59, 52)) >> 52; 3553 - bank = (*pos & GENMASK_ULL(61, 60)) >> 60; 3554 - 3555 - data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL); 3556 - if (!data) 3557 - return -ENOMEM; 3558 - 3559 - /* switch to the specific se/sh/cu */ 3560 - mutex_lock(&adev->grbm_idx_mutex); 3561 - amdgpu_gfx_select_se_sh(adev, se, sh, cu); 3562 - 3563 - if (bank == 0) { 3564 - if (adev->gfx.funcs->read_wave_vgprs) 3565 - adev->gfx.funcs->read_wave_vgprs(adev, simd, wave, thread, offset, size>>2, data); 3566 - } else { 3567 - if (adev->gfx.funcs->read_wave_sgprs) 3568 - adev->gfx.funcs->read_wave_sgprs(adev, simd, wave, offset, size>>2, data); 3569 - } 3570 - 3571 - amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); 3572 - mutex_unlock(&adev->grbm_idx_mutex); 3573 - 3574 - while (size) { 3575 - uint32_t value; 3576 - 3577 - value = data[offset++]; 3578 - r = put_user(value, (uint32_t *)buf); 3579 - if (r) { 3580 - result = r; 3581 - goto err; 3582 - } 3583 - 3584 - result += 4; 3585 - buf += 4; 3586 - size -= 4; 3587 - } 3588 - 3589 - err: 3590 - kfree(data); 3591 - return result; 3592 - } 3593 - 3594 - static const struct file_operations amdgpu_debugfs_regs_fops = { 3595 - .owner = THIS_MODULE, 3596 - .read = amdgpu_debugfs_regs_read, 3597 - .write = amdgpu_debugfs_regs_write, 3598 - .llseek = default_llseek 3599 - }; 3600 - static const struct file_operations amdgpu_debugfs_regs_didt_fops = { 3601 - .owner = THIS_MODULE, 3602 - .read = amdgpu_debugfs_regs_didt_read, 3603 - .write = amdgpu_debugfs_regs_didt_write, 3604 - .llseek = default_llseek 3605 - }; 3606 - static const struct file_operations amdgpu_debugfs_regs_pcie_fops = { 3607 - .owner = THIS_MODULE, 3608 - .read = amdgpu_debugfs_regs_pcie_read, 3609 - .write = amdgpu_debugfs_regs_pcie_write, 3610 - .llseek = default_llseek 3611 - }; 3612 - static const struct file_operations amdgpu_debugfs_regs_smc_fops = { 3613 - .owner = THIS_MODULE, 3614 - .read = amdgpu_debugfs_regs_smc_read, 3615 - .write = amdgpu_debugfs_regs_smc_write, 3616 - .llseek = default_llseek 3617 - }; 3618 - 3619 - static const struct file_operations amdgpu_debugfs_gca_config_fops = { 3620 - .owner = THIS_MODULE, 3621 - .read = amdgpu_debugfs_gca_config_read, 3622 - .llseek = default_llseek 3623 - }; 3624 - 3625 - static const struct file_operations amdgpu_debugfs_sensors_fops = { 3626 - .owner = THIS_MODULE, 3627 - .read = amdgpu_debugfs_sensor_read, 3628 - .llseek = default_llseek 3629 - }; 3630 - 3631 - static const struct file_operations amdgpu_debugfs_wave_fops = { 3632 - .owner = THIS_MODULE, 3633 - .read = amdgpu_debugfs_wave_read, 3634 - .llseek = default_llseek 3635 - }; 3636 - static const struct file_operations amdgpu_debugfs_gpr_fops = { 3637 - .owner = THIS_MODULE, 3638 - .read = amdgpu_debugfs_gpr_read, 3639 - .llseek = default_llseek 3640 - }; 3641 - 3642 - static const struct file_operations *debugfs_regs[] = { 3643 - &amdgpu_debugfs_regs_fops, 3644 - &amdgpu_debugfs_regs_didt_fops, 3645 - &amdgpu_debugfs_regs_pcie_fops, 3646 - &amdgpu_debugfs_regs_smc_fops, 3647 - &amdgpu_debugfs_gca_config_fops, 3648 - &amdgpu_debugfs_sensors_fops, 3649 - &amdgpu_debugfs_wave_fops, 3650 - &amdgpu_debugfs_gpr_fops, 3651 - }; 3652 - 3653 - static const char *debugfs_regs_names[] = { 3654 - "amdgpu_regs", 3655 - "amdgpu_regs_didt", 3656 - "amdgpu_regs_pcie", 3657 - "amdgpu_regs_smc", 3658 - "amdgpu_gca_config", 3659 - "amdgpu_sensors", 3660 - "amdgpu_wave", 3661 - "amdgpu_gpr", 3662 - }; 3663 - 3664 - static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev) 3665 - { 3666 - struct drm_minor *minor = adev->ddev->primary; 3667 - struct dentry *ent, *root = minor->debugfs_root; 3668 - unsigned i, j; 3669 - 3670 - for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) { 3671 - ent = debugfs_create_file(debugfs_regs_names[i], 3672 - S_IFREG | S_IRUGO, root, 3673 - adev, debugfs_regs[i]); 3674 - if (IS_ERR(ent)) { 3675 - for (j = 0; j < i; j++) { 3676 - debugfs_remove(adev->debugfs_regs[i]); 3677 - adev->debugfs_regs[i] = NULL; 3678 - } 3679 - return PTR_ERR(ent); 3680 - } 3681 - 3682 - if (!i) 3683 - i_size_write(ent->d_inode, adev->rmmio_size); 3684 - adev->debugfs_regs[i] = ent; 3685 - } 3686 - 3687 - return 0; 3688 - } 3689 - 3690 - static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev) 3691 - { 3692 - unsigned i; 3693 - 3694 - for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) { 3695 - if (adev->debugfs_regs[i]) { 3696 - debugfs_remove(adev->debugfs_regs[i]); 3697 - adev->debugfs_regs[i] = NULL; 3698 - } 3699 - } 3700 - } 3701 - 3702 - static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data) 3703 - { 3704 - struct drm_info_node *node = (struct drm_info_node *) m->private; 3705 - struct drm_device *dev = node->minor->dev; 3706 - struct amdgpu_device *adev = dev->dev_private; 3707 - int r = 0, i; 3708 - 3709 - /* hold on the scheduler */ 3710 - for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 3711 - struct amdgpu_ring *ring = adev->rings[i]; 3712 - 3713 - if (!ring || !ring->sched.thread) 3714 - continue; 3715 - kthread_park(ring->sched.thread); 3716 - } 3717 - 3718 - seq_printf(m, "run ib test:\n"); 3719 - r = amdgpu_ib_ring_tests(adev); 3720 - if (r) 3721 - seq_printf(m, "ib ring tests failed (%d).\n", r); 3722 - else 3723 - seq_printf(m, "ib ring tests passed.\n"); 3724 - 3725 - /* go on the scheduler */ 3726 - for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 3727 - struct amdgpu_ring *ring = adev->rings[i]; 3728 - 3729 - if (!ring || !ring->sched.thread) 3730 - continue; 3731 - kthread_unpark(ring->sched.thread); 3732 - } 3733 - 3734 - return 0; 3735 - } 3736 - 3737 - static int amdgpu_debugfs_get_vbios_dump(struct seq_file *m, void *data) 3738 - { 3739 - struct drm_info_node *node = (struct drm_info_node *) m->private; 3740 - struct drm_device *dev = node->minor->dev; 3741 - struct amdgpu_device *adev = dev->dev_private; 3742 - 3743 - seq_write(m, adev->bios, adev->bios_size); 3744 - return 0; 3745 - } 3746 - 3747 - static int amdgpu_debugfs_evict_vram(struct seq_file *m, void *data) 3748 - { 3749 - struct drm_info_node *node = (struct drm_info_node *)m->private; 3750 - struct drm_device *dev = node->minor->dev; 3751 - struct amdgpu_device *adev = dev->dev_private; 3752 - 3753 - seq_printf(m, "(%d)\n", amdgpu_bo_evict_vram(adev)); 3754 - return 0; 3755 - } 3756 - 3757 - static const struct drm_info_list amdgpu_debugfs_list[] = { 3758 - {"amdgpu_vbios", amdgpu_debugfs_get_vbios_dump}, 3759 - {"amdgpu_test_ib", &amdgpu_debugfs_test_ib}, 3760 - {"amdgpu_evict_vram", &amdgpu_debugfs_evict_vram} 3761 - }; 3762 - 3763 - static int amdgpu_debugfs_init(struct amdgpu_device *adev) 3764 - { 3765 - return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_list, 3766 - ARRAY_SIZE(amdgpu_debugfs_list)); 3767 - } 3768 - 3769 - #else 3770 - static int amdgpu_debugfs_init(struct amdgpu_device *adev) 3771 - { 3772 - return 0; 3773 - } 3774 - static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev) 3775 - { 3776 - return 0; 3777 - } 3778 - static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev) { } 3779 - #endif
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
··· 851 851 }; 852 852 #endif 853 853 854 - int amdgpu_gem_debugfs_init(struct amdgpu_device *adev) 854 + int amdgpu_debugfs_gem_init(struct amdgpu_device *adev) 855 855 { 856 856 #if defined(CONFIG_DEBUG_FS) 857 857 return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_gem_list, 1);