From patchwork Tue Jan 2 14:42:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sudeep Holla X-Patchwork-Id: 123142 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp9043890qgn; Tue, 2 Jan 2018 06:45:42 -0800 (PST) X-Google-Smtp-Source: ACJfBoubVyTnwACoVX1lkkW1NzgOlA9OmbeG2421fdwuBjBTZIEk8n5I4ps0N9oAryhc/LGcCE+r X-Received: by 10.159.216.139 with SMTP id s11mr44906920plp.266.1514904342128; Tue, 02 Jan 2018 06:45:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1514904342; cv=none; d=google.com; s=arc-20160816; b=mT0P6hl7B0JdBkmzrXJGBW9Hz2NW7FzoZPADXWxvRuGAeQShq2cBY2TTHZe/qGKbBK cnQ+MUThJAUSqIdTNRbwrNRj1Jk7eDJZMdMi2CTIBUehBj3uAlHBj3CiI2ms2l2pmKiM SsMe6VxzSHe28Fl8KTLjA/uk05cLjTXhOrwHUN29ICgdHioe1vM6uQxk5rpe6032XlQQ tdbXD1ZiWohOd2WLCdrS0g4IKTZ5jahUj4KaNoGACE7f0aegcZJnto1GgEWGWVueN76T IRg+bzzhwPoJiSQoZ0hRuFtYeUAVCEhQvk1JDfXNfdy+4TdOKnEv1prg7QoNLB+vGUJn AOiw== 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=Ywze5g/uqabuiDbmOySf2Ld4of8AjODtc0hpc8auKzI=; b=uxycIOBsNl75Om86FIE0j9id9yjlA3C3LzEIqcGpAFPO8cM/SM7WKJhSULVJM+4Pbq hR8mL5rE8AIINRyQF5t54VYsl021iJsvZfpi3Iq/QQEqTe2DqGl+3ubaVi0E2005oTno /7vfPuRU91YBN6uNuEJbt9u0BDx/xruhLpXEzlcDZVLYRoYjI5vGjmjBn2OdkTGeaT4l iG8e6Ox64WaPSNV3RPrK7X6DNeqxlPurrKxQ7uPZ0jou7vietjVI2Z0XKwsXyqZdiMhZ 3arRg58UpI4ARlAVlP1u9lFOAH1Tk2UPbwr7lF8TVFUv2j+snAgCdmsih5odKUO3Qk0Y ClfA== 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 q1si33713603plb.356.2018.01.02.06.45.41; Tue, 02 Jan 2018 06:45: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 S1753477AbeABOna (ORCPT + 28 others); Tue, 2 Jan 2018 09:43:30 -0500 Received: from foss.arm.com ([217.140.101.70]:39790 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752316AbeABOn0 (ORCPT ); Tue, 2 Jan 2018 09:43:26 -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 BC67F16A0; Tue, 2 Jan 2018 06:43:25 -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 AA04E3F25C; Tue, 2 Jan 2018 06:43:23 -0800 (PST) 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 v5 12/20] firmware: arm_scmi: add option for polling based performance domain operations Date: Tue, 2 Jan 2018 14:42:34 +0000 Message-Id: <1514904162-11201-13-git-send-email-sudeep.holla@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1514904162-11201-1-git-send-email-sudeep.holla@arm.com> References: <1514904162-11201-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 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 a1f5cf136748..ad73ef6b8d7d 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); @@ -447,23 +449,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 70e2993f6d48..3b378af1badd 100644 --- a/include/linux/scmi_protocol.h +++ b/include/linux/scmi_protocol.h @@ -100,16 +100,16 @@ 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)(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); }; /**