Add a sysfs attribute which shows the board form factor like OAM or
CEM.

Signed-off-by: Lijo Lazar <lijo.la...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 57 ++++++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 5436d7a34014..139a7fb2d4b0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -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 @@ int amdgpu_device_init(struct amdgpu_device *adev,
        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))
-- 
2.25.1

Reply via email to