mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Sudeep Holla <sudeep.holla@arm.com>
To: ALKML <linux-arm-kernel@lists.infradead.org>,
	LKML <linux-kernel@vger.kernel.org>,
	DTML <devicetree@vger.kernel.org>
Cc: Sudeep Holla <sudeep.holla@arm.com>,
	Roy Franz <roy.franz@cavium.com>,
	Harb Abdulhamid <harba@codeaurora.org>,
	Nishanth Menon <nm@ti.com>, Arnd Bergmann <arnd@arndb.de>,
	Loc Ho <lho@apm.com>, Alexey Klimov <alexey.klimov@arm.com>,
	Ryan Harkin <Ryan.Harkin@arm.com>,
	Jassi Brar <jassisinghbrar@gmail.com>
Subject: [PATCH v3 14/22] firmware: arm_scmi: add per-protocol channels support using idr objects
Date: Thu, 28 Sep 2017 14:11:38 +0100	[thread overview]
Message-ID: <1506604306-20739-15-git-send-email-sudeep.holla@arm.com> (raw)
In-Reply-To: <1506604306-20739-1-git-send-email-sudeep.holla@arm.com>

In order to maintain the channel information per protocol, we need
some sort of list or hashtable to hold all this information. IDR
provides sparse array mapping of small integer ID numbers onto arbitrary
pointers. In this case the arbitrary pointers can be pointers to the
channel information.

This patch adds support for per-protocol channels using those idr
objects.

Cc: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
---
 drivers/firmware/arm_scmi/driver.c | 47 +++++++++++++++++++++++++++++---------
 1 file changed, 36 insertions(+), 11 deletions(-)

diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index 93b3bd8d437f..92ef21d6aa5a 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -128,7 +128,7 @@ struct scmi_chan_info {
  * @version: SCMI revision information containing protocol version,
  *	implementation version and (sub-)vendor identification.
  * @minfo: Message info
- * @tx_cinfo: Reference to SCMI channel information
+ * @tx_idr: IDR object to map protocol id to channel info pointer
  * @protocols_imp: list of protocols implemented, currently maximum of
  *	MAX_PROTOCOLS_IMP elements allocated by the base protocol
  * @node: list head
@@ -140,7 +140,7 @@ struct scmi_info {
 	struct scmi_revision_info version;
 	struct scmi_handle handle;
 	struct scmi_xfers_info minfo;
-	struct scmi_chan_info *tx_cinfo;
+	struct idr tx_idr;
 	u8 *protocols_imp;
 	struct list_head node;
 	int users;
@@ -413,7 +413,11 @@ int scmi_do_xfer(const struct scmi_handle *handle, struct scmi_xfer *xfer)
 	int timeout;
 	struct scmi_info *info = handle_to_scmi_info(handle);
 	struct device *dev = info->dev;
-	struct scmi_chan_info *cinfo = info->tx_cinfo;
+	struct scmi_chan_info *cinfo;
+
+	cinfo = idr_find(&info->tx_idr, xfer->hdr.protocol_id);
+	if (unlikely(!cinfo))
+		return -EINVAL;
 
 	ret = mbox_send_message(cinfo->chan, xfer);
 	if (ret < 0) {
@@ -771,13 +775,18 @@ static int scmi_mailbox_check(struct device_node *np)
 	return of_parse_phandle_with_args(np, "mboxes", "#mbox-cells", 0, &arg);
 }
 
-static int scmi_mbox_free_channel(struct scmi_chan_info *cinfo)
+static int scmi_mbox_free_channel(int id, void *p, void *data)
 {
+	struct scmi_chan_info *cinfo = p;
+	struct idr *idr = data;
+
 	if (!IS_ERR_OR_NULL(cinfo->chan)) {
 		mbox_free_channel(cinfo->chan);
 		cinfo->chan = NULL;
 	}
 
+	idr_remove(idr, id);
+
 	return 0;
 }
 
@@ -785,6 +794,7 @@ static int scmi_remove(struct platform_device *pdev)
 {
 	int ret = 0;
 	struct scmi_info *info = platform_get_drvdata(pdev);
+	struct idr *idr = &info->tx_idr;
 
 	of_platform_depopulate(&pdev->dev);
 
@@ -795,28 +805,34 @@ static int scmi_remove(struct platform_device *pdev)
 		list_del(&info->node);
 	mutex_unlock(&scmi_list_mutex);
 
-	if (!ret)
+	if (!ret) {
 		/* Safe to free channels since no more users */
-		return scmi_mbox_free_channel(info->tx_cinfo);
+		ret = idr_for_each(idr, scmi_mbox_free_channel, idr);
+		idr_destroy(&info->tx_idr);
+	}
 
 	return ret;
 }
 
-static inline int scmi_mbox_chan_setup(struct scmi_info *info)
+static inline int
+scmi_mbox_chan_setup(struct scmi_info *info, struct device *dev, int prot_id)
 {
 	int ret;
 	struct resource res;
 	resource_size_t size;
-	struct device *dev = info->dev;
 	struct device_node *shmem, *np = dev->of_node;
 	struct scmi_chan_info *cinfo;
 	struct mbox_client *cl;
 
+	if (scmi_mailbox_check(np)) {
+		cinfo = idr_find(&info->tx_idr, SCMI_PROTOCOL_BASE);
+		goto idr_alloc;
+	}
+
 	cinfo = devm_kzalloc(info->dev, sizeof(*cinfo), GFP_KERNEL);
 	if (!cinfo)
 		return -ENOMEM;
 
-	info->tx_cinfo = cinfo;
 	cinfo->dev = dev;
 
 	cl = &cinfo->cl;
@@ -850,6 +866,13 @@ static inline int scmi_mbox_chan_setup(struct scmi_info *info)
 		return ret;
 	}
 
+idr_alloc:
+	ret = idr_alloc(&info->tx_idr, cinfo, prot_id, prot_id + 1, GFP_KERNEL);
+	if (ret != prot_id) {
+		dev_err(dev, "unable to allocate SCMI idr slot err %d\n", ret);
+		return ret;
+	}
+
 	return 0;
 }
 
@@ -868,6 +891,8 @@ scmi_create_protocol_device(struct device_node *np, struct scmi_info *info,
 
 	platform_set_drvdata(cdev, info);
 
+	scmi_mbox_chan_setup(info, &cdev->dev, match->protocol_id);
+
 	init_ret = match->fn(&info->handle);
 	if (init_ret) {
 		dev_err(info->dev, "SCMI protocol %d init error %d\n",
@@ -906,19 +931,19 @@ static int scmi_probe(struct platform_device *pdev)
 		return ret;
 
 	platform_set_drvdata(pdev, info);
+	idr_init(&info->tx_idr);
 
 	handle = &info->handle;
 	handle->dev = info->dev;
 	handle->version = &info->version;
 
-	ret = scmi_mbox_chan_setup(info);
+	ret = scmi_mbox_chan_setup(info, dev, SCMI_PROTOCOL_BASE);
 	if (ret)
 		return ret;
 
 	ret = scmi_base_protocol_init(handle);
 	if (ret) {
 		dev_err(dev, "unable to communicate with SCMI(%d)\n", ret);
-		scmi_mbox_free_channel(info->tx_cinfo);
 		return ret;
 	}
 
-- 
2.7.4

  parent reply	other threads:[~2017-09-28 13:14 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-28 13:11 [PATCH v3 00/22] firmware: ARM System Control and Management Interface(SCMI) support Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 01/22] dt-bindings: mailbox: add support for mailbox client shared memory Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 02/22] dt-bindings: arm: add support for ARM System Control and Management Interface(SCMI) protocol Sudeep Holla
2017-10-04 10:50   ` Arnd Bergmann
2017-10-04 11:07     ` Sudeep Holla
2017-10-04 12:35       ` Arnd Bergmann
2017-10-04 13:53         ` Sudeep Holla
2017-10-04 14:17           ` Arnd Bergmann
2017-10-04 14:47             ` Sudeep Holla
2017-10-05 11:56               ` Arnd Bergmann
2017-10-05 12:56                 ` Sudeep Holla
2017-10-05 13:20         ` Jassi Brar
2017-10-05 14:10           ` Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 03/22] dt-bindings: arm: scmi: add ARM MHU specific mailbox client bindings Sudeep Holla
2017-10-05 23:20   ` Rob Herring
2017-10-06  9:42     ` Sudeep Holla
2017-10-06 11:01     ` Jassi Brar
2017-10-06 15:54       ` Rob Herring
2017-10-07  2:26         ` Jassi Brar
2017-10-09 13:52           ` Rob Herring
2017-10-09 14:37             ` Sudeep Holla
2017-10-09 14:46             ` Jassi Brar
2017-10-09 22:57               ` Rob Herring
2017-10-10  1:52                 ` Jassi Brar
2017-10-10 11:04                 ` Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 04/22] firmware: arm_scmi: add basic driver infrastructure for SCMI Sudeep Holla
2017-10-04 10:59   ` Arnd Bergmann
2017-10-04 17:37     ` Sudeep Holla
2017-10-04 11:19   ` Arnd Bergmann
2017-09-28 13:11 ` [PATCH v3 05/22] firmware: arm_scmi: add common infrastructure and support for base protocol Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 06/22] firmware: arm_scmi: add initial support for performance protocol Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 07/22] firmware: arm_scmi: add initial support for clock protocol Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 08/22] firmware: arm_scmi: add initial support for power protocol Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 09/22] firmware: arm_scmi: add initial support for sensor protocol Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 10/22] firmware: arm_scmi: probe and initialise all the supported protocols Sudeep Holla
2017-10-04 11:06   ` Arnd Bergmann
2017-09-28 13:11 ` [PATCH v3 11/22] firmware: arm_scmi: add support for polling based SCMI transfers Sudeep Holla
2017-10-04 11:13   ` Arnd Bergmann
2017-10-04 11:18     ` Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 12/22] firmware: arm_scmi: add option for polling based performance domain operations Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 13/22] firmware: arm_scmi: refactor in preparation to support per-protocol channels Sudeep Holla
2017-09-28 13:11 ` Sudeep Holla [this message]
2017-09-28 13:11 ` [PATCH v3 15/22] firmware: arm_scmi: abstract mailbox interface Sudeep Holla
2017-10-04 11:24   ` Arnd Bergmann
2017-10-04 11:32     ` Sudeep Holla
2017-10-06 11:34       ` Jassi Brar
2017-10-06 13:27         ` Sudeep Holla
2017-10-06 13:34           ` Jassi Brar
2017-10-06 13:41             ` Sudeep Holla
2017-10-12 21:20       ` Bjorn Andersson
2017-09-28 13:11 ` [PATCH v3 16/22] firmware: arm_scmi: add arm_mhu specific " Sudeep Holla
2017-10-04 11:36   ` Arnd Bergmann
2017-10-04 11:48     ` Sudeep Holla
2017-10-06 11:26     ` Jassi Brar
2017-10-06 13:32       ` Sudeep Holla
2017-10-06 13:47         ` Jassi Brar
2017-10-06 13:51           ` Sudeep Holla
2017-10-12 21:03             ` Bjorn Andersson
2017-10-13 13:42               ` Sudeep Holla
2017-10-13 14:12                 ` Jassi Brar
2017-10-13 14:47                   ` Sudeep Holla
2017-10-13 15:19                     ` Jassi Brar
2017-09-28 13:11 ` [PATCH v3 17/22] firmware: arm_scmi: add device power domain support using genpd Sudeep Holla
2017-09-28 21:18   ` Ulf Hansson
2017-09-29 13:40     ` Sudeep Holla
2017-09-29 13:42   ` [PATCH v3 17/22][UPDATE] firmware: arm_scmi: add device power domain support genpd Sudeep Holla
2017-10-10 11:05     ` Ulf Hansson
2017-10-10 13:02       ` Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 18/22] clk: add support for clocks provided by SCMI Sudeep Holla
2017-11-02  7:23   ` Stephen Boyd
2017-11-02 10:04     ` Sudeep Holla
2017-11-03 15:12       ` Stephen Boyd
2017-09-28 13:11 ` [PATCH v3 19/22] hwmon: (core) Add hwmon_max to hwmon_sensor_types enumeration Sudeep Holla
2017-10-01 14:21   ` [v3, " Guenter Roeck
2017-09-28 13:11 ` [PATCH v3 20/22] hwmon: add support for sensors exported via ARM SCMI Sudeep Holla
2017-10-01 14:26   ` [v3,20/22] " Guenter Roeck
2017-10-02  9:25     ` Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 21/22] cpufreq: add support for CPU DVFS based on SCMI message protocol Sudeep Holla
2017-10-04 11:30   ` Arnd Bergmann
2017-10-04 15:01     ` Sudeep Holla
2017-10-05 11:20       ` Arnd Bergmann
2017-10-05 11:26         ` Sudeep Holla
2017-09-28 13:11 ` [PATCH v3 22/22] cpufreq: scmi: add support for fast frequency switching Sudeep Holla

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=1506604306-20739-15-git-send-email-sudeep.holla@arm.com \
    --to=sudeep.holla@arm.com \
    --cc=Ryan.Harkin@arm.com \
    --cc=alexey.klimov@arm.com \
    --cc=arnd@arndb.de \
    --cc=devicetree@vger.kernel.org \
    --cc=harba@codeaurora.org \
    --cc=jassisinghbrar@gmail.com \
    --cc=lho@apm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nm@ti.com \
    --cc=roy.franz@cavium.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®