From: "james qian wang (Arm Technology China)" <james.qian.w...@arm.com>

Add two sysfs node: core_id, config_id, user can read them to fetch the
HW product information.

v2: Rebase

Signed-off-by: James Qian Wang (Arm Technology China) <james.qian.w...@arm.com>
---
 .../drm/arm/display/include/malidp_product.h  | 12 +++++
 .../gpu/drm/arm/display/komeda/komeda_dev.c   | 48 +++++++++++++++++++
 .../gpu/drm/arm/display/komeda/komeda_dev.h   |  2 +
 .../gpu/drm/arm/display/komeda/komeda_drv.c   |  7 +++
 4 files changed, 69 insertions(+)

diff --git a/drivers/gpu/drm/arm/display/include/malidp_product.h 
b/drivers/gpu/drm/arm/display/include/malidp_product.h
index b35fc5db866b..1053b11352eb 100644
--- a/drivers/gpu/drm/arm/display/include/malidp_product.h
+++ b/drivers/gpu/drm/arm/display/include/malidp_product.h
@@ -20,4 +20,16 @@
 /* Mali-display product IDs */
 #define MALIDP_D71_PRODUCT_ID   0x0071
 
+union komeda_config_id {
+       struct {
+               __u32   max_line_sz:16,
+                       n_pipelines:2,
+                       n_scalers:2, /* number of scalers per pipeline */
+                       n_layers:3, /* number of layers per pipeline */
+                       n_richs:3, /* number of rich layers per pipeline */
+                       reserved_bits:6;
+       };
+       __u32 value;
+};
+
 #endif /* _MALIDP_PRODUCT_H_ */
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
index 7152f2c08e01..9e017ce89d69 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
@@ -53,6 +53,46 @@ static void komeda_debugfs_init(struct komeda_dev *mdev)
                            mdev, &komeda_register_fops);
 }
 
+static ssize_t
+core_id_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct komeda_dev *mdev = dev_to_mdev(dev);
+
+       return snprintf(buf, PAGE_SIZE, "0x%08x\n", mdev->chip.core_id);
+}
+static DEVICE_ATTR_RO(core_id);
+
+static ssize_t
+config_id_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct komeda_dev *mdev = dev_to_mdev(dev);
+       struct komeda_pipeline *pipe = mdev->pipelines[0];
+       union komeda_config_id config_id = {0,};
+       int i;
+
+       config_id.max_line_sz = pipe->layers[0]->hsize_in.end;
+       config_id.n_pipelines = mdev->n_pipelines;
+       config_id.n_scalers = pipe->n_scalers;
+       config_id.n_layers = pipe->n_layers;
+       config_id.n_richs = 0;
+       for (i = 0; i < pipe->n_layers; i++) {
+               if (pipe->layers[i]->layer_type == KOMEDA_FMT_RICH_LAYER)
+                       config_id.n_richs++;
+       }
+       return snprintf(buf, PAGE_SIZE, "0x%08x\n", config_id.value);
+}
+static DEVICE_ATTR_RO(config_id);
+
+static struct attribute *komeda_sysfs_entries[] = {
+       &dev_attr_core_id.attr,
+       &dev_attr_config_id.attr,
+       NULL,
+};
+
+static struct attribute_group komeda_sysfs_attr_group = {
+       .attrs = komeda_sysfs_entries,
+};
+
 static int komeda_parse_pipe_dt(struct komeda_dev *mdev, struct device_node 
*np)
 {
        struct komeda_pipeline *pipe;
@@ -201,6 +241,12 @@ struct komeda_dev *komeda_dev_create(struct device *dev)
                goto err_cleanup;
        }
 
+       err = sysfs_create_group(&dev->kobj, &komeda_sysfs_attr_group);
+       if (err) {
+               DRM_ERROR("create sysfs group failed.\n");
+               goto err_cleanup;
+       }
+
 #ifdef CONFIG_DEBUG_FS
        komeda_debugfs_init(mdev);
 #endif
@@ -218,6 +264,8 @@ void komeda_dev_destroy(struct komeda_dev *mdev)
        struct komeda_dev_funcs *funcs = mdev->funcs;
        int i;
 
+       sysfs_remove_group(&dev->kobj, &komeda_sysfs_attr_group);
+
 #ifdef CONFIG_DEBUG_FS
        debugfs_remove_recursive(mdev->debugfs_root);
 #endif
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h 
b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
index 8acd25afb3e9..0c3e32b596d9 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
@@ -190,4 +190,6 @@ d71_identify(u32 __iomem *reg, struct komeda_chip_info 
*chip);
 struct komeda_dev *komeda_dev_create(struct device *dev);
 void komeda_dev_destroy(struct komeda_dev *mdev);
 
+struct komeda_dev *dev_to_mdev(struct device *dev);
+
 #endif /*_KOMEDA_DEV_H_*/
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
index 2bdd189b041d..0285fd37a016 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
@@ -17,6 +17,13 @@ struct komeda_drv {
        struct komeda_kms_dev *kms;
 };
 
+struct komeda_dev *dev_to_mdev(struct device *dev)
+{
+       struct komeda_drv *mdrv = dev_get_drvdata(dev);
+
+       return mdrv ? mdrv->mdev : NULL;
+}
+
 static void komeda_unbind(struct device *dev)
 {
        struct komeda_drv *mdrv = dev_get_drvdata(dev);
-- 
2.17.1

Reply via email to