From patchwork Mon Feb 12 18:45:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sudeep Holla X-Patchwork-Id: 128159 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp3487704ljc; Mon, 12 Feb 2018 10:49:26 -0800 (PST) X-Google-Smtp-Source: AH8x225ur3A3z/bB5AhwT/Wxdf+9+1IYzBkoHsph5avfUBUAvdQRSML0GiKsEnN9wbpnYyxquVpI X-Received: by 2002:a17:902:7d8d:: with SMTP id a13-v6mr4213226plm.304.1518461366298; Mon, 12 Feb 2018 10:49:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518461366; cv=none; d=google.com; s=arc-20160816; b=g3MRDjSBNJVCDTcU5GT1atcv6qdKGwkUA/sLBgN/5ZRrcVdG1jSEdPIz6m2XeQZ6Uk 4f6uEQBluLZ3kmWoZvQbEc6DY2quVOqJjhr0cSVLAcVyKpPF9pD2T5Uwy9kh93z5TeTi Mpuj+oGfghRTkIEQ99Y/W8nG3BY0H/NoWndOWDDfVyVVi6RB2IF6KMILLPZRoCoBLdYc CJbT9jUNLsV/gdkqM+qoiWjZUL+8IkOxrHjso7ZeWAI2En2rbOl56tiaqMEEMbTHSrA0 O8qpjC2MBNCKapP3GsUC8XZaQsleCXjg/+S7RxnDsjo4KtaVx+DhEQyEAoT752losWVa xSYg== 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=64ao8uaeps0Foww8D2F7WQA+koPgQMgSMf8VLK7cqdI=; b=tG5h4PvgBqBjJbpUyIs7q6JNFsK98LPLaa62eifcdZ4GJUdQsMOz+w8Gt6J4nI1TEL J4PRjkovbKylDRELBmxBfGfaVomO4M/mKNSsvaYAC4RAIE9NNElUxMivoxIKxEO5YsFe Kcy1S574q0W+pVyCZRUvvPTevdl0iw1DGAyI+90uttGBjEig6l1gTh1KanfkyRy1Fa+K mXH9ByYRu4PW0Nqkw+EL4bOez+h4+xmwD53nkFuZzfs4wP2xFlqDO+TNuFnyyY0OeoAv rq08/RiyXCpIO5GDM6LnH2dwlW4MVhb8mDTiL5XIOTljeN4ZCitytYQdv64fdysfr6Vs zNDw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-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 g24si3785399pfd.140.2018.02.12.10.49.26; Mon, 12 Feb 2018 10:49:26 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-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 linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932503AbeBLStV (ORCPT + 26 others); Mon, 12 Feb 2018 13:49:21 -0500 Received: from foss.arm.com ([217.140.101.70]:47244 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753346AbeBLSqC (ORCPT ); Mon, 12 Feb 2018 13:46:02 -0500 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 B42AD1682; Mon, 12 Feb 2018 10:46:01 -0800 (PST) Received: from e107155-lin.cambridge.arm.com (e107155-lin.cambridge.arm.com [10.1.210.28]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 5EAED3F24D; Mon, 12 Feb 2018 10:46:00 -0800 (PST) From: Sudeep Holla To: ALKML , LKML , DTML Cc: Sudeep Holla , Greg Kroah-Hartman , Arnd Bergmann , Alexey Klimov Subject: [PATCH v5 12/20] firmware: arm_scmi: add option for polling based performance domain operations Date: Mon, 12 Feb 2018 18:45:16 +0000 Message-Id: <1518461124-17371-13-git-send-email-sudeep.holla@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1518461124-17371-1-git-send-email-sudeep.holla@arm.com> References: <1518461124-17371-1-git-send-email-sudeep.holla@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@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 Cc: Greg Kroah-Hartman 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 diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c index a14093386b57..6c9126dd6ec7 100644 --- a/drivers/firmware/arm_scmi/perf.c +++ b/drivers/firmware/arm_scmi/perf.c @@ -303,8 +303,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; @@ -315,6 +315,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); @@ -325,8 +326,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; @@ -336,6 +337,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); @@ -411,23 +413,24 @@ static int scmi_dvfs_get_transition_latency(const struct scmi_handle *handle, } static int scmi_dvfs_freq_set(const struct scmi_handle *handle, u32 domain, - unsigned long freq) + unsigned long freq, bool poll) { struct scmi_perf_info *pi = handle->perf_priv; struct perf_dom_info *dom = pi->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 scmi_perf_info *pi = handle->perf_priv; struct perf_dom_info *dom = pi->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 6785dd9f61e3..06e8ef1d8aea 100644 --- a/include/linux/scmi_protocol.h +++ b/include/linux/scmi_protocol.h @@ -103,14 +103,14 @@ 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 (*device_domain_id)(struct device *); int (*get_transition_latency)(const struct scmi_handle *, struct device *); int (*add_opps_to_device)(const struct scmi_handle *, 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); }; /**