All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Bjorn Andersson <bjorn.andersson@linaro.org>
Cc: Vaishali Thakkar <vaishali.thakkar@linaro.org>,
	andy.gross@linaro.org, david.brown@linaro.org,
	gregkh@linuxfoundation.org, linux-arm-msm@vger.kernel.org,
	linux-kernel@vger.kernel.org, rafael@kernel.org,
	vkoul@kernel.org
Subject: Re: [PATCH v2 3/5] soc: qcom: socinfo: Expose custom attributes
Date: Fri, 22 Feb 2019 00:13:59 +0200	[thread overview]
Message-ID: <20190221221359.GD3485@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20190221155742.GD2122@tuxbook-pro>

Hi Bjorn,

On Thu, Feb 21, 2019 at 07:57:42AM -0800, Bjorn Andersson wrote:
> On Thu 21 Feb 04:18 PST 2019, Laurent Pinchart wrote:
> 
> > Hi Vaishali,
> > 
> > Thank you for the patch.
> > 
> > On Wed, Feb 20, 2019 at 10:28:29AM +0530, Vaishali Thakkar wrote:
> > > The Qualcomm socinfo provides a number of additional attributes,
> > > add these to the socinfo driver and expose them via debugfs
> > > functionality.
> > 
> > What is the use case for these attributes ? I fear they will be used in
> > production systems, and that would require debugfs in production, which
> > isn't a good idea. If you need to expose those attributes for anything
> > else than debugging then we need a proper API, likely sysfs-based.
> 
> The use case of these attributes, beyond development/debugging, are
> unfortunately somewhat unknown and is the reason why they where moved to
> debugfs from the earlier attempts to upstream this.
> 
> I think the production requirements at hand prohibits debugfs to be
> present, so attributes that are required beyond development/debugging
> purposes would have to be migrated out to sysfs - but the idea here is
> that such migration would have come with the missing motivation to add
> them there today.

If the use case is just debug/development, would it be enough to print
this information in the kernel log at boot time ? I may be a bit
paranoid, but I always worry about API abuse :-(

> > > Signed-off-by: Vaishali Thakkar <vaishali.thakkar@linaro.org>
> > > ---
> > > Changes since v1:
> > > 	- Remove unnecessary debugfs dir creation check
> > > 	- Align ifdefs to left
> > > 	- Fix function signatures for debugfs init/exit
> > > ---
> > >  drivers/soc/qcom/socinfo.c | 198 +++++++++++++++++++++++++++++++++++++
> > >  1 file changed, 198 insertions(+)
> > > 
> > > diff --git a/drivers/soc/qcom/socinfo.c b/drivers/soc/qcom/socinfo.c
> > > index 02078049fac7..5f4bef216ae1 100644
> > > --- a/drivers/soc/qcom/socinfo.c
> > > +++ b/drivers/soc/qcom/socinfo.c
> > > @@ -4,6 +4,7 @@
> > >   * Copyright (c) 2017-2019, Linaro Ltd.
> > >   */
> > >  
> > > +#include <linux/debugfs.h>
> > >  #include <linux/err.h>
> > >  #include <linux/module.h>
> > >  #include <linux/platform_device.h>
> > > @@ -29,6 +30,28 @@
> > >   */
> > >  #define SMEM_HW_SW_BUILD_ID            137
> > >  
> > > +#ifdef CONFIG_DEBUG_FS
> > > +/* pmic model info */
> > > +static const char *const pmic_model[] = {
> > > +	[0]  = "Unknown PMIC model",
> > > +	[9]  = "PM8994",
> > > +	[11] = "PM8916",
> > > +	[13] = "PM8058",
> > > +	[14] = "PM8028",
> > > +	[15] = "PM8901",
> > > +	[16] = "PM8027",
> > > +	[17] = "ISL9519",
> > > +	[18] = "PM8921",
> > > +	[19] = "PM8018",
> > > +	[20] = "PM8015",
> > > +	[21] = "PM8014",
> > > +	[22] = "PM8821",
> > > +	[23] = "PM8038",
> > > +	[24] = "PM8922",
> > > +	[25] = "PM8917",
> > > +};
> > > +#endif /* CONFIG_DEBUG_FS */
> > > +
> > >  /* Socinfo SMEM item structure */
> > >  struct socinfo {
> > >  	__le32 fmt;
> > > @@ -70,6 +93,10 @@ struct socinfo {
> > >  struct qcom_socinfo {
> > >  	struct soc_device *soc_dev;
> > >  	struct soc_device_attribute attr;
> > > +#ifdef CONFIG_DEBUG_FS
> > > +	struct dentry *dbg_root;
> > > +#endif /* CONFIG_DEBUG_FS */
> > > +	struct socinfo *socinfo;
> > >  };
> > >  
> > >  struct soc_of_id {
> > > @@ -133,6 +160,171 @@ static const char *socinfo_machine(struct device *dev, unsigned int id)
> > >  	return NULL;
> > >  }
> > >  
> > > +#ifdef CONFIG_DEBUG_FS
> > > +
> > > +#define UINT_SHOW(name, attr)						\
> > > +static int qcom_show_##name(struct seq_file *seq, void *p)		\
> > > +{									\
> > > +	struct socinfo *socinfo = seq->private;				\
> > > +	seq_printf(seq, "%u\n", le32_to_cpu(socinfo->attr));		\
> > > +	return 0;							\
> > > +}									\
> > > +static int qcom_open_##name(struct inode *inode, struct file *file)	\
> > > +{									\
> > > +	return single_open(file, qcom_show_##name, inode->i_private);	\
> > > +}									\
> > > +									\
> > > +static const struct file_operations qcom_ ##name## _ops = {		\
> > > +	.open = qcom_open_##name,					\
> > > +	.read = seq_read,						\
> > > +	.llseek = seq_lseek,						\
> > > +	.release = single_release,					\
> > > +}
> > > +
> > > +#define DEBUGFS_UINT_ADD(name)						\
> > > +	debugfs_create_file(__stringify(name), 0400,			\
> > > +			    qcom_socinfo->dbg_root,			\
> > > +			    qcom_socinfo->socinfo, &qcom_ ##name## _ops)
> > > +
> > > +#define HEX_SHOW(name, attr)						\
> > > +static int qcom_show_##name(struct seq_file *seq, void *p)		\
> > > +{									\
> > > +	struct socinfo *socinfo = seq->private;				\
> > > +	seq_printf(seq, "0x%x\n", le32_to_cpu(socinfo->attr));		\
> > > +	return 0;							\
> > > +}									\
> > > +static int qcom_open_##name(struct inode *inode, struct file *file)	\
> > > +{									\
> > > +	return single_open(file, qcom_show_##name, inode->i_private);	\
> > > +}									\
> > > +									\
> > > +static const struct file_operations qcom_ ##name## _ops = {		\
> > > +	.open = qcom_open_##name,					\
> > > +	.read = seq_read,						\
> > > +	.llseek = seq_lseek,						\
> > > +	.release = single_release,					\
> > > +}
> > > +
> > > +#define DEBUGFS_HEX_ADD(name)						\
> > > +	debugfs_create_file(__stringify(name), 0400,			\
> > > +			    qcom_socinfo->dbg_root,			\
> > > +			    qcom_socinfo->socinfo, &qcom_ ##name## _ops)
> > > +
> > > +
> > > +#define QCOM_OPEN(name, _func)						\
> > > +static int qcom_open_##name(struct inode *inode, struct file *file)	\
> > > +{									\
> > > +	return single_open(file, _func, inode->i_private);		\
> > > +}									\
> > > +									\
> > > +static const struct file_operations qcom_ ##name## _ops = {		\
> > > +	.open = qcom_open_##name,					\
> > > +	.read = seq_read,						\
> > > +	.llseek = seq_lseek,						\
> > > +	.release = single_release,					\
> > > +}
> > > +
> > > +#define DEBUGFS_ADD(name)						\
> > > +	debugfs_create_file(__stringify(name), 0400,			\
> > > +			    qcom_socinfo->dbg_root,			\
> > > +			    qcom_socinfo->socinfo, &qcom_ ##name## _ops)
> > > +
> > > +
> > > +static int qcom_show_build_id(struct seq_file *seq, void *p)
> > > +{
> > > +	struct socinfo *socinfo = seq->private;
> > > +
> > > +	seq_printf(seq, "%s\n", socinfo->build_id);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int qcom_show_accessory_chip(struct seq_file *seq, void *p)
> > > +{
> > > +	struct socinfo *socinfo = seq->private;
> > > +
> > > +	seq_printf(seq, "%d\n", le32_to_cpu(socinfo->accessory_chip));
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int qcom_show_platform_subtype(struct seq_file *seq, void *p)
> > > +{
> > > +	struct socinfo *socinfo = seq->private;
> > > +	int subtype = le32_to_cpu(socinfo->hw_plat_subtype);
> > > +
> > > +	if (subtype < 0)
> > > +		return -EINVAL;
> > > +
> > > +	seq_printf(seq, "%u\n", subtype);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int qcom_show_pmic_model(struct seq_file *seq, void *p)
> > > +{
> > > +	struct socinfo *socinfo = seq->private;
> > > +	int model = SOCINFO_MINOR(le32_to_cpu(socinfo->pmic_model));
> > > +
> > > +	if (model < 0)
> > > +		return -EINVAL;
> > > +
> > > +	seq_printf(seq, "%s\n", pmic_model[model]);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int qcom_show_pmic_die_revision(struct seq_file *seq, void *p)
> > > +{
> > > +	struct socinfo *socinfo = seq->private;
> > > +
> > > +	seq_printf(seq, "%u.%u\n",
> > > +		   SOCINFO_MAJOR(le32_to_cpu(socinfo->pmic_die_rev)),
> > > +		   SOCINFO_MINOR(le32_to_cpu(socinfo->pmic_die_rev)));
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +UINT_SHOW(raw_version, raw_ver);
> > > +UINT_SHOW(hardware_platform, hw_plat);
> > > +UINT_SHOW(platform_version, plat_ver);
> > > +UINT_SHOW(foundry_id, foundry_id);
> > > +HEX_SHOW(chip_family, chip_family);
> > > +HEX_SHOW(raw_device_family, raw_device_family);
> > > +HEX_SHOW(raw_device_number, raw_device_num);
> > > +QCOM_OPEN(build_id, qcom_show_build_id);
> > > +QCOM_OPEN(accessory_chip, qcom_show_accessory_chip);
> > > +QCOM_OPEN(pmic_model, qcom_show_pmic_model);
> > > +QCOM_OPEN(platform_subtype, qcom_show_platform_subtype);
> > > +QCOM_OPEN(pmic_die_revision, qcom_show_pmic_die_revision);
> > > +
> > > +static void socinfo_debugfs_init(struct qcom_socinfo *qcom_socinfo)
> > > +{
> > > +	qcom_socinfo->dbg_root = debugfs_create_dir("qcom_socinfo", NULL);
> > > +
> > > +	DEBUGFS_UINT_ADD(raw_version);
> > > +	DEBUGFS_UINT_ADD(hardware_platform);
> > > +	DEBUGFS_UINT_ADD(platform_version);
> > > +	DEBUGFS_UINT_ADD(foundry_id);
> > > +	DEBUGFS_HEX_ADD(chip_family);
> > > +	DEBUGFS_HEX_ADD(raw_device_family);
> > > +	DEBUGFS_HEX_ADD(raw_device_number);
> > > +	DEBUGFS_ADD(build_id);
> > > +	DEBUGFS_ADD(accessory_chip);
> > > +	DEBUGFS_ADD(pmic_model);
> > > +	DEBUGFS_ADD(platform_subtype);
> > > +	DEBUGFS_ADD(pmic_die_revision);
> > > +}
> > > +
> > > +static void socinfo_debugfs_exit(struct qcom_socinfo *qcom_socinfo)
> > > +{
> > > +	debugfs_remove_recursive(qcom_socinfo->dbg_root);
> > > +}
> > > +#else
> > > +static void socinfo_debugfs_init(struct qcom_socinfo *qcom_socinfo) { return 0; }
> > > +static void socinfo_debugfs_exit(struct qcom_socinfo *qcom_socinfo) {  }
> > > +#endif /* CONFIG_DEBUG_FS */
> > > +
> > >  static int qcom_socinfo_probe(struct platform_device *pdev)
> > >  {
> > >  	struct qcom_socinfo *qs;
> > > @@ -165,6 +357,10 @@ static int qcom_socinfo_probe(struct platform_device *pdev)
> > >  	if (IS_ERR(qs->soc_dev))
> > >  		return PTR_ERR(qs->soc_dev);
> > >  
> > > +	qs->socinfo = info;
> > > +
> > > +	socinfo_debugfs_init(qs);
> > > +
> > >  	/* Feed the soc specific unique data into entropy pool */
> > >  	add_device_randomness(info, item_size);
> > >  
> > > @@ -179,6 +375,8 @@ static int qcom_socinfo_remove(struct platform_device *pdev)
> > >  
> > >  	soc_device_unregister(qs->soc_dev);
> > >  
> > > +	socinfo_debugfs_exit(qs);
> > > +
> > >  	return 0;
> > >  }
> > > 

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2019-02-21 22:13 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-20  4:58 [PATCH v2 3/5] soc: qcom: socinfo: Expose custom attributes Vaishali Thakkar
2019-02-21 12:18 ` Laurent Pinchart
2019-02-21 15:57   ` Bjorn Andersson
2019-02-21 22:13     ` Laurent Pinchart [this message]
2019-02-22  7:16       ` Greg KH
2019-02-22  9:51         ` Laurent Pinchart
2019-02-22 10:52           ` Greg KH
2019-02-22 11:54     ` Marc Gonzalez

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190221221359.GD3485@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=andy.gross@linaro.org \
    --cc=bjorn.andersson@linaro.org \
    --cc=david.brown@linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rafael@kernel.org \
    --cc=vaishali.thakkar@linaro.org \
    --cc=vkoul@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.