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 e630d918fefc0993e540ac4ecb1734eeaaf3aec6..da0a667a911b065bcb5111d9e51362f94e3edc37 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 d69aa2e179bbedbcc955a9848fc80d0f03eada85..69500a8b4e2df89004d0280abb47e186ee4fd72b 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 ddd8045accf3e764d47498bfbc0c0bd8cbb71433..a39170991afe73ce4e1d2c38277487e060faebc6 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;