Commit 55223394 authored by james qian wang (Arm Technology China)'s avatar james qian wang (Arm Technology China) Committed by Liviu Dudau
Browse files

drm/komeda: Add sysfs attribute: core_id and config_id



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

Also, use memset to initialize config_id, rather than quirky C syntax.
Courtesy of Nathan Chancellor <natechancellor@gmail.com>.

Signed-off-by: default avatarJames Qian Wang (Arm Technology China) <james.qian.wang@arm.com>
Signed-off-by: default avatarNathan Chancellor <natechancellor@gmail.com>
[Merged Nathan's patch that uses memset to initialize config_id into
original patch as the fixes tag changed due to rebase, reworded the
commit to reference the merged patch]
Signed-off-by: default avatarLiviu Dudau <liviu.dudau@arm.com>
parent 42c72941
Loading
Loading
Loading
Loading
+12 −0
Original line number Original line Diff line number Diff line
@@ -20,4 +20,16 @@
/* Mali-display product IDs */
/* Mali-display product IDs */
#define MALIDP_D71_PRODUCT_ID   0x0071
#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_ */
#endif /* _MALIDP_PRODUCT_H_ */
+50 −0
Original line number Original line Diff line number Diff line
@@ -59,6 +59,48 @@ static void komeda_debugfs_init(struct komeda_dev *mdev)
}
}
#endif
#endif


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;
	int i;

	memset(&config_id, 0, sizeof(config_id));

	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)
static int komeda_parse_pipe_dt(struct komeda_dev *mdev, struct device_node *np)
{
{
	struct komeda_pipeline *pipe;
	struct komeda_pipeline *pipe;
@@ -207,6 +249,12 @@ struct komeda_dev *komeda_dev_create(struct device *dev)
		goto err_cleanup;
		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
#ifdef CONFIG_DEBUG_FS
	komeda_debugfs_init(mdev);
	komeda_debugfs_init(mdev);
#endif
#endif
@@ -224,6 +272,8 @@ void komeda_dev_destroy(struct komeda_dev *mdev)
	struct komeda_dev_funcs *funcs = mdev->funcs;
	struct komeda_dev_funcs *funcs = mdev->funcs;
	int i;
	int i;


	sysfs_remove_group(&dev->kobj, &komeda_sysfs_attr_group);

#ifdef CONFIG_DEBUG_FS
#ifdef CONFIG_DEBUG_FS
	debugfs_remove_recursive(mdev->debugfs_root);
	debugfs_remove_recursive(mdev->debugfs_root);
#endif
#endif
+2 −0
Original line number Original line Diff line number Diff line
@@ -190,4 +190,6 @@ d71_identify(u32 __iomem *reg, struct komeda_chip_info *chip);
struct komeda_dev *komeda_dev_create(struct device *dev);
struct komeda_dev *komeda_dev_create(struct device *dev);
void komeda_dev_destroy(struct komeda_dev *mdev);
void komeda_dev_destroy(struct komeda_dev *mdev);


struct komeda_dev *dev_to_mdev(struct device *dev);

#endif /*_KOMEDA_DEV_H_*/
#endif /*_KOMEDA_DEV_H_*/
+7 −0
Original line number Original line Diff line number Diff line
@@ -17,6 +17,13 @@ struct komeda_drv {
	struct komeda_kms_dev *kms;
	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)
static void komeda_unbind(struct device *dev)
{
{
	struct komeda_drv *mdrv = dev_get_drvdata(dev);
	struct komeda_drv *mdrv = dev_get_drvdata(dev);