]> www.infradead.org Git - users/hch/misc.git/commitdiff
drm/amdgpu: Add vbios build number interface
authorLijo Lazar <lijo.lazar@amd.com>
Thu, 28 Aug 2025 07:20:09 +0000 (12:50 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 5 Sep 2025 21:38:40 +0000 (17:38 -0400)
Fetch VBIOS build number from atom rom image. Add a sysfs interface to
read the build number.

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
drivers/gpu/drm/amd/amdgpu/atom.c
drivers/gpu/drm/amd/amdgpu/atom.h

index e476e45b996a211b09dd6ab5156688dbc7578663..9dfdc08cc8877699542e743b843ce242b6ff4c38 100644 (file)
@@ -1816,16 +1816,43 @@ static ssize_t amdgpu_atombios_get_vbios_version(struct device *dev,
        return sysfs_emit(buf, "%s\n", ctx->vbios_pn);
 }
 
+static ssize_t amdgpu_atombios_get_vbios_build(struct device *dev,
+                                              struct device_attribute *attr,
+                                              char *buf)
+{
+       struct drm_device *ddev = dev_get_drvdata(dev);
+       struct amdgpu_device *adev = drm_to_adev(ddev);
+       struct atom_context *ctx = adev->mode_info.atom_context;
+
+       return sysfs_emit(buf, "%s\n", ctx->build_num);
+}
+
 static DEVICE_ATTR(vbios_version, 0444, amdgpu_atombios_get_vbios_version,
                   NULL);
+static DEVICE_ATTR(vbios_build, 0444, amdgpu_atombios_get_vbios_build, NULL);
 
 static struct attribute *amdgpu_vbios_version_attrs[] = {
-       &dev_attr_vbios_version.attr,
-       NULL
+       &dev_attr_vbios_version.attr, &dev_attr_vbios_build.attr, NULL
 };
 
+static umode_t amdgpu_vbios_version_attrs_is_visible(struct kobject *kobj,
+                                                    struct attribute *attr,
+                                                    int index)
+{
+       struct device *dev = kobj_to_dev(kobj);
+       struct drm_device *ddev = dev_get_drvdata(dev);
+       struct amdgpu_device *adev = drm_to_adev(ddev);
+       struct atom_context *ctx = adev->mode_info.atom_context;
+
+       if (attr == &dev_attr_vbios_build.attr && !strlen(ctx->build_num))
+               return 0;
+
+       return attr->mode;
+}
+
 const struct attribute_group amdgpu_vbios_version_attr_group = {
-       .attrs = amdgpu_vbios_version_attrs
+       .attrs = amdgpu_vbios_version_attrs,
+       .is_visible = amdgpu_vbios_version_attrs_is_visible,
 };
 
 int amdgpu_atombios_sysfs_init(struct amdgpu_device *adev)
index 427b073de2fc143a432b9f249921b97212eb2c1e..1c994d0cc50b54567b61ce450903da0c40217006 100644 (file)
@@ -1494,6 +1494,27 @@ static void atom_get_vbios_version(struct atom_context *ctx)
        }
 }
 
+static void atom_get_vbios_build(struct atom_context *ctx)
+{
+       unsigned char *atom_rom_hdr;
+       unsigned char *str;
+       uint16_t base;
+
+       base = CU16(ATOM_ROM_TABLE_PTR);
+       atom_rom_hdr = CSTR(base);
+
+       str = CSTR(CU16(base + ATOM_ROM_CFG_PTR));
+       /* Skip config string */
+       while (str < atom_rom_hdr && *str++)
+               ;
+       /* Skip change list string */
+       while (str < atom_rom_hdr && *str++)
+               ;
+
+       if ((str + STRLEN_NORMAL) < atom_rom_hdr)
+               strscpy(ctx->build_num, str, STRLEN_NORMAL);
+}
+
 struct atom_context *amdgpu_atom_parse(struct card_info *card, void *bios)
 {
        int base;
@@ -1554,6 +1575,7 @@ struct atom_context *amdgpu_atom_parse(struct card_info *card, void *bios)
        atom_get_vbios_pn(ctx);
        atom_get_vbios_date(ctx);
        atom_get_vbios_version(ctx);
+       atom_get_vbios_build(ctx);
 
        return ctx;
 }
index b807f6639a4c67c5282e5217472c6c4add7079d4..825ff28731f52d99b2eb283b925a882f3ac40f82 100644 (file)
@@ -37,6 +37,7 @@ struct drm_device;
 #define ATOM_ROM_MAGIC         "ATOM"
 #define ATOM_ROM_MAGIC_PTR     4
 
+#define ATOM_ROM_CFG_PTR 0xC
 #define ATOM_ROM_MSG_PTR       0x10
 #define ATOM_ROM_CMD_PTR       0x1E
 #define ATOM_ROM_DATA_PTR      0x20
@@ -151,6 +152,7 @@ struct atom_context {
        uint32_t version;
        uint8_t vbios_ver_str[STRLEN_NORMAL];
        uint8_t date[STRLEN_NORMAL];
+       uint8_t build_num[STRLEN_NORMAL];
 };
 
 extern int amdgpu_atom_debug;