From patchwork Fri Aug 4 14:31:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sudeep Holla X-Patchwork-Id: 109408 Delivered-To: patch@linaro.org Received: by 10.140.101.6 with SMTP id t6csp2234656qge; Fri, 4 Aug 2017 07:32:35 -0700 (PDT) X-Received: by 10.84.216.30 with SMTP id m30mr3213963pli.218.1501857154939; Fri, 04 Aug 2017 07:32:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1501857154; cv=none; d=google.com; s=arc-20160816; b=WgaZ1xgGhyVVVk+eX4vM/6PSeDcHKa9aT3kdE9zk/NN7Nd4wH5BqCcCejxgQUVagYt xVjYCGm/35oBY7hTxFVqsCJdjDNVoDMbVQLWdDeFYkfR0rPMMkisdqg3IHcwolT0CqNP qv48hFa6kLD9k06kovDGO818F4bCATqby6/7plEfSUCWQaYSsIRvvfBKll+IrM6+o6bO Zy2IcDzB2wuRvLYDVmjMVCX5tQxeF4L7RLPWdAnVmBlX+lUPsRDFkdozmIpfjNWtMwGm MTmHtQZvHuxBXBd7ekGDsJEBK8iWEOAnqleKPe7f1YR4sYE1UASZKnBMlUWz54tmSxH7 LbUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=xXZyNzZRDNClLMOYFjiWLGQ+w2zEL7Xz3qnHxrNrpeY=; b=wyK5NboCz6aZuE0zt8CVN6M/vytVYm/z9LYdW3PJD8+Y98t2ExhqoniwvwvERTiHih pk6tJypFP2PkKYh9LeaMP7CW4ncbiAyZpcowYwiXh3swRcg0M5WYWSlJimgVbjy/Zlae o84luMXmpBoB/SJ8JCogMQjhAKFTovKR/j8Qze7iE7Tf6NtjbMRhnsaVmi0kY2EjU/BO vVSPg6uKNKvq1jlU7vQl3kOT7tWHy4+twjtEvgfXCfNH4vBVfUBmj85GP1D5sp/KIftT K+f3UU4PVqGNdDZLmT9SFU+Hs4dYmHXG+k09raOef/EKiMJHt3Fb8BoXPBkWa593mZZp YFHA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f6si1029133pgc.774.2017.08.04.07.32.34; Fri, 04 Aug 2017 07:32:34 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752562AbdHDOcc (ORCPT + 6 others); Fri, 4 Aug 2017 10:32:32 -0400 Received: from foss.arm.com ([217.140.101.70]:54366 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752519AbdHDOcb (ORCPT ); Fri, 4 Aug 2017 10:32:31 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E6399168F; Fri, 4 Aug 2017 07:32:30 -0700 (PDT) Received: from e107155-lin.cambridge.arm.com (unknown [10.1.210.28]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id C92B03F3E1; Fri, 4 Aug 2017 07:32:28 -0700 (PDT) From: Sudeep Holla To: ALKML , LKML , DTML Cc: Sudeep Holla , Roy Franz , Harb Abdulhamid , Nishanth Menon , Arnd Bergmann , Loc Ho , Alexey Klimov , Ryan Harkin , Jassi Brar Subject: [PATCH v2 11/18] firmware: arm_scmi: add option for polling based performance domain operations Date: Fri, 4 Aug 2017 15:31:37 +0100 Message-Id: <1501857104-11279-12-git-send-email-sudeep.holla@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1501857104-11279-1-git-send-email-sudeep.holla@arm.com> References: <1501857104-11279-1-git-send-email-sudeep.holla@arm.com> Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org In order to implement fast CPU DVFS switching, we need to perform all DVFS operations atomically. Since SCMI transfer already provide option to choose between pooling vs interrupt driven(default), we can opt for polling based transfers for set,get performance domain operations. This patch adds option to choose between polling vs interrupt driven SCMI transfers for set,get performance level operations. Cc: Arnd Bergmann Signed-off-by: Sudeep Holla --- drivers/firmware/arm_scmi/perf.c | 19 +++++++++++-------- include/linux/scmi_protocol.h | 8 ++++---- 2 files changed, 15 insertions(+), 12 deletions(-) -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c index 13d84d829201..334e8ec321ed 100644 --- a/drivers/firmware/arm_scmi/perf.c +++ b/drivers/firmware/arm_scmi/perf.c @@ -305,8 +305,8 @@ static int scmi_perf_limits_get(const struct scmi_handle *handle, u32 domain, return ret; } -static int -scmi_perf_level_set(const struct scmi_handle *handle, u32 domain, u32 level) +static int scmi_perf_level_set(const struct scmi_handle *handle, u32 domain, + u32 level, bool poll) { int ret; struct scmi_xfer *t; @@ -317,6 +317,7 @@ scmi_perf_level_set(const struct scmi_handle *handle, u32 domain, u32 level) if (ret) return ret; + t->hdr.poll_completion = poll; lvl = t->tx.buf; lvl->domain = cpu_to_le32(domain); lvl->level = cpu_to_le32(level); @@ -327,8 +328,8 @@ scmi_perf_level_set(const struct scmi_handle *handle, u32 domain, u32 level) return ret; } -static int -scmi_perf_level_get(const struct scmi_handle *handle, u32 domain, u32 *level) +static int scmi_perf_level_get(const struct scmi_handle *handle, u32 domain, + u32 *level, bool poll) { int ret; struct scmi_xfer *t; @@ -338,6 +339,7 @@ scmi_perf_level_get(const struct scmi_handle *handle, u32 domain, u32 *level) if (ret) return ret; + t->hdr.poll_completion = poll; *(__le32 *)t->tx.buf = cpu_to_le32(domain); ret = scmi_do_xfer(handle, t); @@ -445,21 +447,22 @@ static int scmi_dvfs_get_transition_latency(struct device *dev) } static int scmi_dvfs_freq_set(const struct scmi_handle *handle, u32 domain, - unsigned long freq) + unsigned long freq, bool poll) { struct perf_dom_info *dom = perf_info.dom_info + domain; - return scmi_perf_level_set(handle, domain, freq / dom->mult_factor); + return scmi_perf_level_set(handle, domain, freq / dom->mult_factor, + poll); } static int scmi_dvfs_freq_get(const struct scmi_handle *handle, u32 domain, - unsigned long *freq) + unsigned long *freq, bool poll) { int ret; u32 level; struct perf_dom_info *dom = perf_info.dom_info + domain; - ret = scmi_perf_level_get(handle, domain, &level); + ret = scmi_perf_level_get(handle, domain, &level, poll); if (!ret) *freq = level * dom->mult_factor; diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h index d2a34cc9df8b..cf48fc3e2243 100644 --- a/include/linux/scmi_protocol.h +++ b/include/linux/scmi_protocol.h @@ -99,15 +99,15 @@ struct scmi_clk_ops { struct scmi_perf_ops { int (*limits_set)(const struct scmi_handle *, u32, u32, u32); int (*limits_get)(const struct scmi_handle *, u32, u32 *, u32 *); - int (*level_set)(const struct scmi_handle *, u32, u32); - int (*level_get)(const struct scmi_handle *, u32, u32 *); + int (*level_set)(const struct scmi_handle *, u32, u32, bool); + int (*level_get)(const struct scmi_handle *, u32, u32 *, bool); int (*limits_notify_enable)(const struct scmi_handle *, u32, bool); int (*level_notify_enable)(const struct scmi_handle *, u32, bool); int (*device_domain_id)(struct device *); int (*get_transition_latency)(struct device *); int (*add_opps_to_device)(struct device *); - int (*freq_set)(const struct scmi_handle *, u32, unsigned long); - int (*freq_get)(const struct scmi_handle *, u32, unsigned long *); + int (*freq_set)(const struct scmi_handle *, u32, unsigned long, bool); + int (*freq_get)(const struct scmi_handle *, u32, unsigned long *, bool); }; /**