]> Git Repo - J-linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
Merge tag 'ovl-update-6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs
[J-linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_debugfs.c
index eedb12f6b8a32df4e223c643cc607cd176788a08..e2eec985adb3a4434ec27eb5d07589497281c126 100644 (file)
@@ -383,12 +383,8 @@ static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
 
                value = RREG32_PCIE(*pos);
                r = put_user(value, (uint32_t *)buf);
-               if (r) {
-                       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-                       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-                       amdgpu_virt_disable_access_debugfs(adev);
-                       return r;
-               }
+               if (r)
+                       goto out;
 
                result += 4;
                buf += 4;
@@ -396,11 +392,12 @@ static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
                size -= 4;
        }
 
+       r = result;
+out:
        pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
        pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-
        amdgpu_virt_disable_access_debugfs(adev);
-       return result;
+       return r;
 }
 
 /**
@@ -441,12 +438,8 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user
                uint32_t value;
 
                r = get_user(value, (uint32_t *)buf);
-               if (r) {
-                       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-                       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-                       amdgpu_virt_disable_access_debugfs(adev);
-                       return r;
-               }
+               if (r)
+                       goto out;
 
                WREG32_PCIE(*pos, value);
 
@@ -456,11 +449,12 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user
                size -= 4;
        }
 
+       r = result;
+out:
        pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
        pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-
        amdgpu_virt_disable_access_debugfs(adev);
-       return result;
+       return r;
 }
 
 /**
@@ -502,12 +496,8 @@ static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
 
                value = RREG32_DIDT(*pos >> 2);
                r = put_user(value, (uint32_t *)buf);
-               if (r) {
-                       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-                       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-                       amdgpu_virt_disable_access_debugfs(adev);
-                       return r;
-               }
+               if (r)
+                       goto out;
 
                result += 4;
                buf += 4;
@@ -515,11 +505,12 @@ static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
                size -= 4;
        }
 
+       r = result;
+out:
        pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
        pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-
        amdgpu_virt_disable_access_debugfs(adev);
-       return result;
+       return r;
 }
 
 /**
@@ -560,12 +551,8 @@ static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user
                uint32_t value;
 
                r = get_user(value, (uint32_t *)buf);
-               if (r) {
-                       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-                       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-                       amdgpu_virt_disable_access_debugfs(adev);
-                       return r;
-               }
+               if (r)
+                       goto out;
 
                WREG32_DIDT(*pos >> 2, value);
 
@@ -575,11 +562,12 @@ static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user
                size -= 4;
        }
 
+       r = result;
+out:
        pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
        pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-
        amdgpu_virt_disable_access_debugfs(adev);
-       return result;
+       return r;
 }
 
 /**
@@ -621,12 +609,8 @@ static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
 
                value = RREG32_SMC(*pos);
                r = put_user(value, (uint32_t *)buf);
-               if (r) {
-                       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-                       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-                       amdgpu_virt_disable_access_debugfs(adev);
-                       return r;
-               }
+               if (r)
+                       goto out;
 
                result += 4;
                buf += 4;
@@ -634,11 +618,12 @@ static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
                size -= 4;
        }
 
+       r = result;
+out:
        pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
        pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-
        amdgpu_virt_disable_access_debugfs(adev);
-       return result;
+       return r;
 }
 
 /**
@@ -679,12 +664,8 @@ static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *
                uint32_t value;
 
                r = get_user(value, (uint32_t *)buf);
-               if (r) {
-                       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-                       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-                       amdgpu_virt_disable_access_debugfs(adev);
-                       return r;
-               }
+               if (r)
+                       goto out;
 
                WREG32_SMC(*pos, value);
 
@@ -694,11 +675,12 @@ static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *
                size -= 4;
        }
 
+       r = result;
+out:
        pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
        pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-
        amdgpu_virt_disable_access_debugfs(adev);
-       return result;
+       return r;
 }
 
 /**
@@ -1090,11 +1072,8 @@ static ssize_t amdgpu_debugfs_gfxoff_write(struct file *f, const char __user *bu
                uint32_t value;
 
                r = get_user(value, (uint32_t *)buf);
-               if (r) {
-                       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-                       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-                       return r;
-               }
+               if (r)
+                       goto out;
 
                amdgpu_gfx_off_ctrl(adev, value ? true : false);
 
@@ -1104,10 +1083,12 @@ static ssize_t amdgpu_debugfs_gfxoff_write(struct file *f, const char __user *bu
                size -= 4;
        }
 
+       r = result;
+out:
        pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
        pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
 
-       return result;
+       return r;
 }
 
 
@@ -1136,21 +1117,52 @@ static ssize_t amdgpu_debugfs_gfxoff_read(struct file *f, char __user *buf,
        }
 
        while (size) {
-               uint32_t value;
+               u32 value = adev->gfx.gfx_off_state;
+
+               r = put_user(value, (u32 *)buf);
+               if (r)
+                       goto out;
+
+               result += 4;
+               buf += 4;
+               *pos += 4;
+               size -= 4;
+       }
+
+       r = result;
+out:
+       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
+       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
+
+       return r;
+}
+
+static ssize_t amdgpu_debugfs_gfxoff_status_read(struct file *f, char __user *buf,
+                                                size_t size, loff_t *pos)
+{
+       struct amdgpu_device *adev = file_inode(f)->i_private;
+       ssize_t result = 0;
+       int r;
+
+       if (size & 0x3 || *pos & 0x3)
+               return -EINVAL;
+
+       r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
+       if (r < 0) {
+               pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
+               return r;
+       }
+
+       while (size) {
+               u32 value;
 
                r = amdgpu_get_gfx_off_status(adev, &value);
-               if (r) {
-                       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-                       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-                       return r;
-               }
+               if (r)
+                       goto out;
 
-               r = put_user(value, (uint32_t *)buf);
-               if (r) {
-                       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-                       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-                       return r;
-               }
+               r = put_user(value, (u32 *)buf);
+               if (r)
+                       goto out;
 
                result += 4;
                buf += 4;
@@ -1158,10 +1170,12 @@ static ssize_t amdgpu_debugfs_gfxoff_read(struct file *f, char __user *buf,
                size -= 4;
        }
 
+       r = result;
+out:
        pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
        pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
 
-       return result;
+       return r;
 }
 
 static const struct file_operations amdgpu_debugfs_regs2_fops = {
@@ -1229,6 +1243,12 @@ static const struct file_operations amdgpu_debugfs_gfxoff_fops = {
        .llseek = default_llseek
 };
 
+static const struct file_operations amdgpu_debugfs_gfxoff_status_fops = {
+       .owner = THIS_MODULE,
+       .read = amdgpu_debugfs_gfxoff_status_read,
+       .llseek = default_llseek
+};
+
 static const struct file_operations *debugfs_regs[] = {
        &amdgpu_debugfs_regs_fops,
        &amdgpu_debugfs_regs2_fops,
@@ -1240,6 +1260,7 @@ static const struct file_operations *debugfs_regs[] = {
        &amdgpu_debugfs_wave_fops,
        &amdgpu_debugfs_gpr_fops,
        &amdgpu_debugfs_gfxoff_fops,
+       &amdgpu_debugfs_gfxoff_status_fops,
 };
 
 static const char *debugfs_regs_names[] = {
@@ -1253,6 +1274,7 @@ static const char *debugfs_regs_names[] = {
        "amdgpu_wave",
        "amdgpu_gpr",
        "amdgpu_gfxoff",
+       "amdgpu_gfxoff_status",
 };
 
 /**
@@ -1709,17 +1731,24 @@ static ssize_t amdgpu_reset_dump_register_list_write(struct file *f,
                i++;
        } while (len < size);
 
+       new = kmalloc_array(i, sizeof(uint32_t), GFP_KERNEL);
+       if (!new) {
+               ret = -ENOMEM;
+               goto error_free;
+       }
        ret = down_write_killable(&adev->reset_domain->sem);
        if (ret)
                goto error_free;
 
        swap(adev->reset_dump_reg_list, tmp);
+       swap(adev->reset_dump_reg_value, new);
        adev->num_regs = i;
        up_write(&adev->reset_domain->sem);
        ret = size;
 
 error_free:
        kfree(tmp);
+       kfree(new);
        return ret;
 }
 
This page took 0.0418 seconds and 4 git commands to generate.