linux/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
<<
>>
Prefs
   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 */
  34int 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
  68static int  amdgpu_debugfs_process_reg_op(bool read, struct file *f,
  69                char __user *buf, size_t size, loff_t *pos)
  70{
  71        struct amdgpu_device *adev = file_inode(f)->i_private;
  72        ssize_t result = 0;
  73        int r;
  74        bool pm_pg_lock, use_bank, use_ring;
  75        unsigned instance_bank, sh_bank, se_bank, me, pipe, queue;
  76
  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))))
  82                return -EINVAL;
  83
  84        /* are we reading registers for which a PG lock is necessary? */
  85        pm_pg_lock = (*pos >> 23) & 1;
  86
  87        if (*pos & (1ULL << 62)) {
  88                se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24;
  89                sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34;
  90                instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44;
  91
  92                if (se_bank == 0x3FF)
  93                        se_bank = 0xFFFFFFFF;
  94                if (sh_bank == 0x3FF)
  95                        sh_bank = 0xFFFFFFFF;
  96                if (instance_bank == 0x3FF)
  97                        instance_bank = 0xFFFFFFFF;
  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;
 106        } else {
 107                use_bank = use_ring = 0;
 108        }
 109
 110        *pos &= (1UL << 22) - 1;
 111
 112        if (use_bank) {
 113                if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
 114                    (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
 115                        return -EINVAL;
 116                mutex_lock(&adev->grbm_idx_mutex);
 117                amdgpu_gfx_select_se_sh(adev, se_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);
 122        }
 123
 124        if (pm_pg_lock)
 125                mutex_lock(&adev->pm.mutex);
 126
 127        while (size) {
 128                uint32_t value;
 129
 130                if (*pos > adev->rmmio_size)
 131                        goto end;
 132
 133                if (read) {
 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                }
 141                if (r) {
 142                        result = r;
 143                        goto end;
 144                }
 145
 146                result += 4;
 147                buf += 4;
 148                *pos += 4;
 149                size -= 4;
 150        }
 151
 152end:
 153        if (use_bank) {
 154                amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
 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);
 159        }
 160
 161        if (pm_pg_lock)
 162                mutex_unlock(&adev->pm.mutex);
 163
 164        return result;
 165}
 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
 174static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
 175                                         size_t size, loff_t *pos)
 176{
 177        return amdgpu_debugfs_process_reg_op(false, f, (char __user *)buf, size, pos);
 178}
 179
 180static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
 181                                        size_t size, loff_t *pos)
 182{
 183        struct amdgpu_device *adev = file_inode(f)->i_private;
 184        ssize_t result = 0;
 185        int r;
 186
 187        if (size & 0x3 || *pos & 0x3)
 188                return -EINVAL;
 189
 190        while (size) {
 191                uint32_t value;
 192
 193                value = RREG32_PCIE(*pos >> 2);
 194                r = put_user(value, (uint32_t *)buf);
 195                if (r)
 196                        return r;
 197
 198                result += 4;
 199                buf += 4;
 200                *pos += 4;
 201                size -= 4;
 202        }
 203
 204        return result;
 205}
 206
 207static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf,
 208                                         size_t size, loff_t *pos)
 209{
 210        struct amdgpu_device *adev = file_inode(f)->i_private;
 211        ssize_t result = 0;
 212        int r;
 213
 214        if (size & 0x3 || *pos & 0x3)
 215                return -EINVAL;
 216
 217        while (size) {
 218                uint32_t value;
 219
 220                r = get_user(value, (uint32_t *)buf);
 221                if (r)
 222                        return r;
 223
 224                WREG32_PCIE(*pos >> 2, value);
 225
 226                result += 4;
 227                buf += 4;
 228                *pos += 4;
 229                size -= 4;
 230        }
 231
 232        return result;
 233}
 234
 235static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
 236                                        size_t size, loff_t *pos)
 237{
 238        struct amdgpu_device *adev = file_inode(f)->i_private;
 239        ssize_t result = 0;
 240        int r;
 241
 242        if (size & 0x3 || *pos & 0x3)
 243                return -EINVAL;
 244
 245        while (size) {
 246                uint32_t value;
 247
 248                value = RREG32_DIDT(*pos >> 2);
 249                r = put_user(value, (uint32_t *)buf);
 250                if (r)
 251                        return r;
 252
 253                result += 4;
 254                buf += 4;
 255                *pos += 4;
 256                size -= 4;
 257        }
 258
 259        return result;
 260}
 261
 262static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf,
 263                                         size_t size, loff_t *pos)
 264{
 265        struct amdgpu_device *adev = file_inode(f)->i_private;
 266        ssize_t result = 0;
 267        int r;
 268
 269        if (size & 0x3 || *pos & 0x3)
 270                return -EINVAL;
 271
 272        while (size) {
 273                uint32_t value;
 274
 275                r = get_user(value, (uint32_t *)buf);
 276                if (r)
 277                        return r;
 278
 279                WREG32_DIDT(*pos >> 2, value);
 280
 281                result += 4;
 282                buf += 4;
 283                *pos += 4;
 284                size -= 4;
 285        }
 286
 287        return result;
 288}
 289
 290static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
 291                                        size_t size, loff_t *pos)
 292{
 293        struct amdgpu_device *adev = file_inode(f)->i_private;
 294        ssize_t result = 0;
 295        int r;
 296
 297        if (size & 0x3 || *pos & 0x3)
 298                return -EINVAL;
 299
 300        while (size) {
 301                uint32_t value;
 302
 303                value = RREG32_SMC(*pos);
 304                r = put_user(value, (uint32_t *)buf);
 305                if (r)
 306                        return r;
 307
 308                result += 4;
 309                buf += 4;
 310                *pos += 4;
 311                size -= 4;
 312        }
 313
 314        return result;
 315}
 316
 317static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf,
 318                                         size_t size, loff_t *pos)
 319{
 320        struct amdgpu_device *adev = file_inode(f)->i_private;
 321        ssize_t result = 0;
 322        int r;
 323
 324        if (size & 0x3 || *pos & 0x3)
 325                return -EINVAL;
 326
 327        while (size) {
 328                uint32_t value;
 329
 330                r = get_user(value, (uint32_t *)buf);
 331                if (r)
 332                        return r;
 333
 334                WREG32_SMC(*pos, value);
 335
 336                result += 4;
 337                buf += 4;
 338                *pos += 4;
 339                size -= 4;
 340        }
 341
 342        return result;
 343}
 344
 345static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf,
 346                                        size_t size, loff_t *pos)
 347{
 348        struct amdgpu_device *adev = file_inode(f)->i_private;
 349        ssize_t result = 0;
 350        int r;
 351        uint32_t *config, no_regs = 0;
 352
 353        if (size & 0x3 || *pos & 0x3)
 354                return -EINVAL;
 355
 356        config = kmalloc_array(256, sizeof(*config), GFP_KERNEL);
 357        if (!config)
 358                return -ENOMEM;
 359
 360        /* version, increment each time something is added */
 361        config[no_regs++] = 3;
 362        config[no_regs++] = adev->gfx.config.max_shader_engines;
 363        config[no_regs++] = adev->gfx.config.max_tile_pipes;
 364        config[no_regs++] = adev->gfx.config.max_cu_per_sh;
 365        config[no_regs++] = adev->gfx.config.max_sh_per_se;
 366        config[no_regs++] = adev->gfx.config.max_backends_per_se;
 367        config[no_regs++] = adev->gfx.config.max_texture_channel_caches;
 368        config[no_regs++] = adev->gfx.config.max_gprs;
 369        config[no_regs++] = adev->gfx.config.max_gs_threads;
 370        config[no_regs++] = adev->gfx.config.max_hw_contexts;
 371        config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_frontend;
 372        config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_backend;
 373        config[no_regs++] = adev->gfx.config.sc_hiz_tile_fifo_size;
 374        config[no_regs++] = adev->gfx.config.sc_earlyz_tile_fifo_size;
 375        config[no_regs++] = adev->gfx.config.num_tile_pipes;
 376        config[no_regs++] = adev->gfx.config.backend_enable_mask;
 377        config[no_regs++] = adev->gfx.config.mem_max_burst_length_bytes;
 378        config[no_regs++] = adev->gfx.config.mem_row_size_in_kb;
 379        config[no_regs++] = adev->gfx.config.shader_engine_tile_size;
 380        config[no_regs++] = adev->gfx.config.num_gpus;
 381        config[no_regs++] = adev->gfx.config.multi_gpu_tile_size;
 382        config[no_regs++] = adev->gfx.config.mc_arb_ramcfg;
 383        config[no_regs++] = adev->gfx.config.gb_addr_config;
 384        config[no_regs++] = adev->gfx.config.num_rbs;
 385
 386        /* rev==1 */
 387        config[no_regs++] = adev->rev_id;
 388        config[no_regs++] = adev->pg_flags;
 389        config[no_regs++] = adev->cg_flags;
 390
 391        /* rev==2 */
 392        config[no_regs++] = adev->family;
 393        config[no_regs++] = adev->external_rev_id;
 394
 395        /* rev==3 */
 396        config[no_regs++] = adev->pdev->device;
 397        config[no_regs++] = adev->pdev->revision;
 398        config[no_regs++] = adev->pdev->subsystem_device;
 399        config[no_regs++] = adev->pdev->subsystem_vendor;
 400
 401        while (size && (*pos < no_regs * 4)) {
 402                uint32_t value;
 403
 404                value = config[*pos >> 2];
 405                r = put_user(value, (uint32_t *)buf);
 406                if (r) {
 407                        kfree(config);
 408                        return r;
 409                }
 410
 411                result += 4;
 412                buf += 4;
 413                *pos += 4;
 414                size -= 4;
 415        }
 416
 417        kfree(config);
 418        return result;
 419}
 420
 421static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,
 422                                        size_t size, loff_t *pos)
 423{
 424        struct amdgpu_device *adev = file_inode(f)->i_private;
 425        int idx, x, outsize, r, valuesize;
 426        uint32_t values[16];
 427
 428        if (size & 3 || *pos & 0x3)
 429                return -EINVAL;
 430
 431        if (amdgpu_dpm == 0)
 432                return -EINVAL;
 433
 434        /* convert offset to sensor number */
 435        idx = *pos >> 2;
 436
 437        valuesize = sizeof(values);
 438        if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->read_sensor)
 439                r = amdgpu_dpm_read_sensor(adev, idx, &values[0], &valuesize);
 440        else
 441                return -EINVAL;
 442
 443        if (size > valuesize)
 444                return -EINVAL;
 445
 446        outsize = 0;
 447        x = 0;
 448        if (!r) {
 449                while (size) {
 450                        r = put_user(values[x++], (int32_t *)buf);
 451                        buf += 4;
 452                        size -= 4;
 453                        outsize += 4;
 454                }
 455        }
 456
 457        return !r ? outsize : r;
 458}
 459
 460static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,
 461                                        size_t size, loff_t *pos)
 462{
 463        struct amdgpu_device *adev = f->f_inode->i_private;
 464        int r, x;
 465        ssize_t result=0;
 466        uint32_t offset, se, sh, cu, wave, simd, data[32];
 467
 468        if (size & 3 || *pos & 3)
 469                return -EINVAL;
 470
 471        /* decode offset */
 472        offset = (*pos & GENMASK_ULL(6, 0));
 473        se = (*pos & GENMASK_ULL(14, 7)) >> 7;
 474        sh = (*pos & GENMASK_ULL(22, 15)) >> 15;
 475        cu = (*pos & GENMASK_ULL(30, 23)) >> 23;
 476        wave = (*pos & GENMASK_ULL(36, 31)) >> 31;
 477        simd = (*pos & GENMASK_ULL(44, 37)) >> 37;
 478
 479        /* switch to the specific se/sh/cu */
 480        mutex_lock(&adev->grbm_idx_mutex);
 481        amdgpu_gfx_select_se_sh(adev, se, sh, cu);
 482
 483        x = 0;
 484        if (adev->gfx.funcs->read_wave_data)
 485                adev->gfx.funcs->read_wave_data(adev, simd, wave, data, &x);
 486
 487        amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
 488        mutex_unlock(&adev->grbm_idx_mutex);
 489
 490        if (!x)
 491                return -EINVAL;
 492
 493        while (size && (offset < x * 4)) {
 494                uint32_t value;
 495
 496                value = data[offset >> 2];
 497                r = put_user(value, (uint32_t *)buf);
 498                if (r)
 499                        return r;
 500
 501                result += 4;
 502                buf += 4;
 503                offset += 4;
 504                size -= 4;
 505        }
 506
 507        return result;
 508}
 509
 510static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
 511                                        size_t size, loff_t *pos)
 512{
 513        struct amdgpu_device *adev = f->f_inode->i_private;
 514        int r;
 515        ssize_t result = 0;
 516        uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data;
 517
 518        if (size & 3 || *pos & 3)
 519                return -EINVAL;
 520
 521        /* decode offset */
 522        offset = *pos & GENMASK_ULL(11, 0);
 523        se = (*pos & GENMASK_ULL(19, 12)) >> 12;
 524        sh = (*pos & GENMASK_ULL(27, 20)) >> 20;
 525        cu = (*pos & GENMASK_ULL(35, 28)) >> 28;
 526        wave = (*pos & GENMASK_ULL(43, 36)) >> 36;
 527        simd = (*pos & GENMASK_ULL(51, 44)) >> 44;
 528        thread = (*pos & GENMASK_ULL(59, 52)) >> 52;
 529        bank = (*pos & GENMASK_ULL(61, 60)) >> 60;
 530
 531        data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL);
 532        if (!data)
 533                return -ENOMEM;
 534
 535        /* switch to the specific se/sh/cu */
 536        mutex_lock(&adev->grbm_idx_mutex);
 537        amdgpu_gfx_select_se_sh(adev, se, sh, cu);
 538
 539        if (bank == 0) {
 540                if (adev->gfx.funcs->read_wave_vgprs)
 541                        adev->gfx.funcs->read_wave_vgprs(adev, simd, wave, thread, offset, size>>2, data);
 542        } else {
 543                if (adev->gfx.funcs->read_wave_sgprs)
 544                        adev->gfx.funcs->read_wave_sgprs(adev, simd, wave, offset, size>>2, data);
 545        }
 546
 547        amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
 548        mutex_unlock(&adev->grbm_idx_mutex);
 549
 550        while (size) {
 551                uint32_t value;
 552
 553                value = data[offset++];
 554                r = put_user(value, (uint32_t *)buf);
 555                if (r) {
 556                        result = r;
 557                        goto err;
 558                }
 559
 560                result += 4;
 561                buf += 4;
 562                size -= 4;
 563        }
 564
 565err:
 566        kfree(data);
 567        return result;
 568}
 569
 570static const struct file_operations amdgpu_debugfs_regs_fops = {
 571        .owner = THIS_MODULE,
 572        .read = amdgpu_debugfs_regs_read,
 573        .write = amdgpu_debugfs_regs_write,
 574        .llseek = default_llseek
 575};
 576static const struct file_operations amdgpu_debugfs_regs_didt_fops = {
 577        .owner = THIS_MODULE,
 578        .read = amdgpu_debugfs_regs_didt_read,
 579        .write = amdgpu_debugfs_regs_didt_write,
 580        .llseek = default_llseek
 581};
 582static const struct file_operations amdgpu_debugfs_regs_pcie_fops = {
 583        .owner = THIS_MODULE,
 584        .read = amdgpu_debugfs_regs_pcie_read,
 585        .write = amdgpu_debugfs_regs_pcie_write,
 586        .llseek = default_llseek
 587};
 588static const struct file_operations amdgpu_debugfs_regs_smc_fops = {
 589        .owner = THIS_MODULE,
 590        .read = amdgpu_debugfs_regs_smc_read,
 591        .write = amdgpu_debugfs_regs_smc_write,
 592        .llseek = default_llseek
 593};
 594
 595static const struct file_operations amdgpu_debugfs_gca_config_fops = {
 596        .owner = THIS_MODULE,
 597        .read = amdgpu_debugfs_gca_config_read,
 598        .llseek = default_llseek
 599};
 600
 601static const struct file_operations amdgpu_debugfs_sensors_fops = {
 602        .owner = THIS_MODULE,
 603        .read = amdgpu_debugfs_sensor_read,
 604        .llseek = default_llseek
 605};
 606
 607static const struct file_operations amdgpu_debugfs_wave_fops = {
 608        .owner = THIS_MODULE,
 609        .read = amdgpu_debugfs_wave_read,
 610        .llseek = default_llseek
 611};
 612static const struct file_operations amdgpu_debugfs_gpr_fops = {
 613        .owner = THIS_MODULE,
 614        .read = amdgpu_debugfs_gpr_read,
 615        .llseek = default_llseek
 616};
 617
 618static const struct file_operations *debugfs_regs[] = {
 619        &amdgpu_debugfs_regs_fops,
 620        &amdgpu_debugfs_regs_didt_fops,
 621        &amdgpu_debugfs_regs_pcie_fops,
 622        &amdgpu_debugfs_regs_smc_fops,
 623        &amdgpu_debugfs_gca_config_fops,
 624        &amdgpu_debugfs_sensors_fops,
 625        &amdgpu_debugfs_wave_fops,
 626        &amdgpu_debugfs_gpr_fops,
 627};
 628
 629static const char *debugfs_regs_names[] = {
 630        "amdgpu_regs",
 631        "amdgpu_regs_didt",
 632        "amdgpu_regs_pcie",
 633        "amdgpu_regs_smc",
 634        "amdgpu_gca_config",
 635        "amdgpu_sensors",
 636        "amdgpu_wave",
 637        "amdgpu_gpr",
 638};
 639
 640int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
 641{
 642        struct drm_minor *minor = adev->ddev->primary;
 643        struct dentry *ent, *root = minor->debugfs_root;
 644        unsigned i, j;
 645
 646        for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
 647                ent = debugfs_create_file(debugfs_regs_names[i],
 648                                          S_IFREG | S_IRUGO, root,
 649                                          adev, debugfs_regs[i]);
 650                if (IS_ERR(ent)) {
 651                        for (j = 0; j < i; j++) {
 652                                debugfs_remove(adev->debugfs_regs[i]);
 653                                adev->debugfs_regs[i] = NULL;
 654                        }
 655                        return PTR_ERR(ent);
 656                }
 657
 658                if (!i)
 659                        i_size_write(ent->d_inode, adev->rmmio_size);
 660                adev->debugfs_regs[i] = ent;
 661        }
 662
 663        return 0;
 664}
 665
 666void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev)
 667{
 668        unsigned i;
 669
 670        for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
 671                if (adev->debugfs_regs[i]) {
 672                        debugfs_remove(adev->debugfs_regs[i]);
 673                        adev->debugfs_regs[i] = NULL;
 674                }
 675        }
 676}
 677
 678static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data)
 679{
 680        struct drm_info_node *node = (struct drm_info_node *) m->private;
 681        struct drm_device *dev = node->minor->dev;
 682        struct amdgpu_device *adev = dev->dev_private;
 683        int r = 0, i;
 684
 685        /* hold on the scheduler */
 686        for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
 687                struct amdgpu_ring *ring = adev->rings[i];
 688
 689                if (!ring || !ring->sched.thread)
 690                        continue;
 691                kthread_park(ring->sched.thread);
 692        }
 693
 694        seq_printf(m, "run ib test:\n");
 695        r = amdgpu_ib_ring_tests(adev);
 696        if (r)
 697                seq_printf(m, "ib ring tests failed (%d).\n", r);
 698        else
 699                seq_printf(m, "ib ring tests passed.\n");
 700
 701        /* go on the scheduler */
 702        for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
 703                struct amdgpu_ring *ring = adev->rings[i];
 704
 705                if (!ring || !ring->sched.thread)
 706                        continue;
 707                kthread_unpark(ring->sched.thread);
 708        }
 709
 710        return 0;
 711}
 712
 713static int amdgpu_debugfs_get_vbios_dump(struct seq_file *m, void *data)
 714{
 715        struct drm_info_node *node = (struct drm_info_node *) m->private;
 716        struct drm_device *dev = node->minor->dev;
 717        struct amdgpu_device *adev = dev->dev_private;
 718
 719        seq_write(m, adev->bios, adev->bios_size);
 720        return 0;
 721}
 722
 723static int amdgpu_debugfs_evict_vram(struct seq_file *m, void *data)
 724{
 725        struct drm_info_node *node = (struct drm_info_node *)m->private;
 726        struct drm_device *dev = node->minor->dev;
 727        struct amdgpu_device *adev = dev->dev_private;
 728
 729        seq_printf(m, "(%d)\n", amdgpu_bo_evict_vram(adev));
 730        return 0;
 731}
 732
 733static int amdgpu_debugfs_evict_gtt(struct seq_file *m, void *data)
 734{
 735        struct drm_info_node *node = (struct drm_info_node *)m->private;
 736        struct drm_device *dev = node->minor->dev;
 737        struct amdgpu_device *adev = dev->dev_private;
 738
 739        seq_printf(m, "(%d)\n", ttm_bo_evict_mm(&adev->mman.bdev, TTM_PL_TT));
 740        return 0;
 741}
 742
 743static const struct drm_info_list amdgpu_debugfs_list[] = {
 744        {"amdgpu_vbios", amdgpu_debugfs_get_vbios_dump},
 745        {"amdgpu_test_ib", &amdgpu_debugfs_test_ib},
 746        {"amdgpu_evict_vram", &amdgpu_debugfs_evict_vram},
 747        {"amdgpu_evict_gtt", &amdgpu_debugfs_evict_gtt},
 748};
 749
 750int amdgpu_debugfs_init(struct amdgpu_device *adev)
 751{
 752        return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_list,
 753                                        ARRAY_SIZE(amdgpu_debugfs_list));
 754}
 755
 756#else
 757int amdgpu_debugfs_init(struct amdgpu_device *adev)
 758{
 759        return 0;
 760}
 761int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
 762{
 763        return 0;
 764}
 765void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev) { }
 766#endif
 767