drm/amdgpu: Add sysfs attribute to get board info
authorLijo Lazar <lijo.lazar@amd.com>
Thu, 28 Sep 2023 03:26:20 +0000 (08:56 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 5 Oct 2023 21:59:35 +0000 (17:59 -0400)
Add a sysfs attribute which shows the board form factor like OAM or
CEM.

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

index bad2b5577e96a149f101916cb91d36ba80ef2f57..10f1641aede9b2988ee754a50fadee770fddb7c8 100644 (file)
@@ -162,6 +162,58 @@ static ssize_t amdgpu_device_get_pcie_replay_count(struct device *dev,
 static DEVICE_ATTR(pcie_replay_count, 0444,
                amdgpu_device_get_pcie_replay_count, NULL);
 
+static ssize_t amdgpu_device_get_board_info(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);
+       enum amdgpu_pkg_type pkg_type = AMDGPU_PKG_TYPE_CEM;
+       const char *pkg;
+
+       if (adev->smuio.funcs && adev->smuio.funcs->get_pkg_type)
+               pkg_type = adev->smuio.funcs->get_pkg_type(adev);
+
+       switch (pkg_type) {
+       case AMDGPU_PKG_TYPE_CEM:
+               pkg = "cem";
+               break;
+       case AMDGPU_PKG_TYPE_OAM:
+               pkg = "oam";
+               break;
+       default:
+               pkg = "unknown";
+               break;
+       }
+
+       return sysfs_emit(buf, "%s : %s\n", "type", pkg);
+}
+
+static DEVICE_ATTR(board_info, 0444, amdgpu_device_get_board_info, NULL);
+
+static struct attribute *amdgpu_board_attrs[] = {
+       &dev_attr_board_info.attr,
+       NULL,
+};
+
+static umode_t amdgpu_board_attrs_is_visible(struct kobject *kobj,
+                                            struct attribute *attr, int n)
+{
+       struct device *dev = kobj_to_dev(kobj);
+       struct drm_device *ddev = dev_get_drvdata(dev);
+       struct amdgpu_device *adev = drm_to_adev(ddev);
+
+       if (adev->flags & AMD_IS_APU)
+               return 0;
+
+       return attr->mode;
+}
+
+static const struct attribute_group amdgpu_board_attrs_group = {
+       .attrs = amdgpu_board_attrs,
+       .is_visible = amdgpu_board_attrs_is_visible
+};
+
 static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev);
 
 
@@ -4038,6 +4090,11 @@ fence_driver_init:
        if (r)
                dev_err(adev->dev, "Could not create amdgpu device attr\n");
 
+       r = devm_device_add_group(adev->dev, &amdgpu_board_attrs_group);
+       if (r)
+               dev_err(adev->dev,
+                       "Could not create amdgpu board attributes\n");
+
        amdgpu_fru_sysfs_init(adev);
 
        if (IS_ENABLED(CONFIG_PERF_EVENTS))