drm/amdgpu: Add debugfs file for VBIOS and version
authorKent Russell <kent.russell@amd.com>
Tue, 22 Aug 2017 16:31:43 +0000 (12:31 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 29 Aug 2017 19:27:54 +0000 (15:27 -0400)
Add 2 debugfs files, one that contains the VBIOS version, and one that
contains the VBIOS itself. These won't change after initialization,
so we can add the VBIOS version when we parse the atombios information.

This ensures that we can find out the VBIOS version, even when the dmesg
buffer fills up, and makes it easier to associate which VBIOS version is
for which GPU on mGPU configurations. Set the size to 20 characters in
case of some weird VBIOS version that exceeds the expected 17 character
format (3-8-3\0). The VBIOS dump also allows for easy debugging

    v2: Move to debugfs, clarify commit message, add VBIOS dump file

Signed-off-by: Kent Russell <kent.russell@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/atom.c
drivers/gpu/drm/amd/amdgpu/atom.h

index e630d91..da0a667 100644 (file)
@@ -65,6 +65,8 @@ MODULE_FIRMWARE("amdgpu/raven_gpu_info.bin");
 static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev);
 static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev);
 static int amdgpu_debugfs_test_ib_ring_init(struct amdgpu_device *adev);
+static int amdgpu_debugfs_vbios_dump_init(struct amdgpu_device *adev);
+static int amdgpu_debugfs_vbios_version_init(struct amdgpu_device *adev);
 
 static const char *amdgpu_asic_name[] = {
        "TAHITI",
@@ -2201,6 +2203,14 @@ int amdgpu_device_init(struct amdgpu_device *adev,
        if (r)
                DRM_ERROR("registering firmware debugfs failed (%d).\n", r);
 
+       r = amdgpu_debugfs_vbios_dump_init(adev);
+       if (r)
+               DRM_ERROR("Creating vbios dump debugfs failed (%d).\n", r);
+
+       r = amdgpu_debugfs_vbios_version_init(adev);
+       if (r)
+               DRM_ERROR("Creating vbios version debugfs failed (%d).\n", r);
+
        if ((amdgpu_testing & 1)) {
                if (adev->accel_working)
                        amdgpu_test_moves(adev);
@@ -3754,6 +3764,50 @@ int amdgpu_debugfs_init(struct drm_minor *minor)
 {
        return 0;
 }
+
+static int amdgpu_debugfs_get_vbios_dump(struct seq_file *m, void *data)
+{
+       struct drm_info_node *node = (struct drm_info_node *) m->private;
+       struct drm_device *dev = node->minor->dev;
+       struct amdgpu_device *adev = dev->dev_private;
+
+       seq_write(m, adev->bios, adev->bios_size);
+       return 0;
+}
+
+static int amdgpu_debugfs_get_vbios_version(struct seq_file *m, void *data)
+{
+       struct drm_info_node *node = (struct drm_info_node *) m->private;
+       struct drm_device *dev = node->minor->dev;
+       struct amdgpu_device *adev = dev->dev_private;
+       struct atom_context *ctx = adev->mode_info.atom_context;
+
+       seq_printf(m, "%s\n", ctx->vbios_version);
+       return 0;
+}
+
+static const struct drm_info_list amdgpu_vbios_dump_list[] = {
+               {"amdgpu_vbios",
+                amdgpu_debugfs_get_vbios_dump,
+                0, NULL},
+};
+
+static const struct drm_info_list amdgpu_vbios_version_list[] = {
+               {"amdgpu_vbios_version",
+                amdgpu_debugfs_get_vbios_version,
+                0, NULL},
+};
+
+static int amdgpu_debugfs_vbios_dump_init(struct amdgpu_device *adev)
+{
+       return amdgpu_debugfs_add_files(adev,
+                                       amdgpu_vbios_dump_list, 1);
+}
+static int amdgpu_debugfs_vbios_version_init(struct amdgpu_device *adev)
+{
+       return amdgpu_debugfs_add_files(adev,
+                                       amdgpu_vbios_version_list, 1);
+}
 #else
 static int amdgpu_debugfs_test_ib_ring_init(struct amdgpu_device *adev)
 {
@@ -3763,5 +3817,13 @@ static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
 {
        return 0;
 }
+static int amdgpu_debugfs_vbios_dump_init(struct amdgpu_device *adev)
+{
+       return 0;
+}
+static int amdgpu_debugfs_vbios_version_init(struct amdgpu_device *adev)
+{
+       return 0;
+}
 static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev) { }
 #endif
index d69aa2e..69500a8 100644 (file)
@@ -1343,8 +1343,11 @@ struct atom_context *amdgpu_atom_parse(struct card_info *card, void *bios)
                idx = 0x80;
 
        str = CSTR(idx);
-       if (*str != '\0')
+       if (*str != '\0') {
                pr_info("ATOM BIOS: %s\n", str);
+               strlcpy(ctx->vbios_version, str, sizeof(ctx->vbios_version));
+       }
+
 
        return ctx;
 }
index ddd8045..a391709 100644 (file)
@@ -140,6 +140,7 @@ struct atom_context {
        int io_mode;
        uint32_t *scratch;
        int scratch_size_bytes;
+       char vbios_version[20];
 };
 
 extern int amdgpu_atom_debug;