From patchwork Fri Feb 23 16:23:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sudeep Holla X-Patchwork-Id: 129449 Delivered-To: patch@linaro.org Received: by 10.46.66.2 with SMTP id p2csp792366lja; Fri, 23 Feb 2018 08:27:42 -0800 (PST) X-Google-Smtp-Source: AH8x227jXYz5jp/XyXza+jclJdhfHcSDoAUTE1schsrB+XZTV+R/6fXGm1m5fFFO1pwQlH7jN7Dh X-Received: by 10.99.164.74 with SMTP id c10mr543382pgp.230.1519403262230; Fri, 23 Feb 2018 08:27:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519403262; cv=none; d=google.com; s=arc-20160816; b=j5PENMN9RCwwMpvOkGg6s3EIYG92eA4i/b3NrVJ0TUT2pMcmcaNnWvxrMscmgt0oh/ 2lSgYvqiP/Ie/BwWRh8uKc8b/EQzgfevQwAVgIVW+TJ3lDAcRxGqj0Af2zHOE1W6/1N/ yul0/OH/isBf1aPqC9SgFkNLAFeh93HA32ucTabrQ39VmbQy90TmwLxpDsKxXoHUTFHc SPIt2e4Amd6BqSycw4BvdKQvW6dYhQ3rr+l/iMHasY2xtW0r01gQPyq6hkJqW43nMlsJ SzplnObYwIXc1VfVVmTPfoN4EWU+kndWBln7V6SSRma6z6XQa85mTWFckoGjOINiny/l WtGQ== 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=VFgrragzIj8KN8myf5Hr6qi9K3Kz0l0SqwsgpxizvGI=; b=fBqq2hw3E+q/pzZFcC47EACSJBfHoTDEiBkD5Zrq0QTo2wr+48xMpW4L8iPkNDr3n4 4yBeO/cCGEMNqgCPx7uYQiPt543IUZEE1NatM6S9TvTPbrEaT/Lex/Hzdx2q1fqmo5Ps q3P+gClfUv7kyFWVdE16KwVsmUijjYbiiRFJjxlBSrMm21EXNLEe27UIvoJnfBh6zBuP rx4mEM9mEDnD973ShnISkepKTawwVTm/fi4NS9J5oo8anUfqE+Rx0+FPqfLvzYE8nv1+ q7942tU8fU2x3AfFgBDFkezH8hpCO5/COLZqN8Xo3wuQ81NH6SWzG/ZbisV3HGobrC7Y t6gA== 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 d14-v6si2000132plj.279.2018.02.23.08.27.41; Fri, 23 Feb 2018 08:27:42 -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 S1752102AbeBWQ1h (ORCPT + 28 others); Fri, 23 Feb 2018 11:27:37 -0500 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:57344 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751917AbeBWQY1 (ORCPT ); Fri, 23 Feb 2018 11:24:27 -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 735671684; Fri, 23 Feb 2018 08:24:27 -0800 (PST) Received: from e107155-lin.cambridge.arm.com (unknown [10.1.210.28]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 1E1183F25C; Fri, 23 Feb 2018 08:24:25 -0800 (PST) From: Sudeep Holla To: ALKML , LKML , DTML Cc: Sudeep Holla , Alexey Klimov , Arnd Bergmann , Greg Kroah-Hartman Subject: [PATCH v6 12/20] firmware: arm_scmi: add option for polling based performance domain operations Date: Fri, 23 Feb 2018 16:23:42 +0000 Message-Id: <1519403030-21189-13-git-send-email-sudeep.holla@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1519403030-21189-1-git-send-email-sudeep.holla@arm.com> References: <1519403030-21189-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 c189c5a3163f..ba7c8afb07c0 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 0bb12f822f12..50246a1ee630 100644 --- a/include/linux/scmi_protocol.h +++ b/include/linux/scmi_protocol.h @@ -109,18 +109,18 @@ struct scmi_perf_ops { int (*limits_get)(const struct scmi_handle *handle, u32 domain, u32 *max_perf, u32 *min_perf); int (*level_set)(const struct scmi_handle *handle, u32 domain, - u32 level); + u32 level, bool poll); int (*level_get)(const struct scmi_handle *handle, u32 domain, - u32 *level); + u32 *level, bool poll); int (*device_domain_id)(struct device *dev); int (*get_transition_latency)(const struct scmi_handle *handle, struct device *dev); int (*add_opps_to_device)(const struct scmi_handle *handle, struct device *dev); int (*freq_set)(const struct scmi_handle *handle, u32 domain, - unsigned long rate); + unsigned long rate, bool poll); int (*freq_get)(const struct scmi_handle *handle, u32 domain, - unsigned long *rate); + unsigned long *rate, bool poll); }; /**