From patchwork Wed Jan 16 16:10:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Georgi Djakov X-Patchwork-Id: 155720 Delivered-To: patch@linaro.org Received: by 2002:a02:48:0:0:0:0:0 with SMTP id 69csp835669jaa; Wed, 16 Jan 2019 08:11:16 -0800 (PST) X-Google-Smtp-Source: ALg8bN7v04ykjDm/kC0gPrPki2jABE5+yjZwOE+YqfT/6yrHyMydUHD1i8FyAii+74S6foyxCGIP X-Received: by 2002:a62:de06:: with SMTP id h6mr10825753pfg.158.1547655076892; Wed, 16 Jan 2019 08:11:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547655076; cv=none; d=google.com; s=arc-20160816; b=DAcZE2Y6JFTm3/+iwQtocpM2i1d3RoqFpEPGgXCV8ugc9iaU65jYYWTso5EntvQy0p mDMaaXJ7qyRVA0kApqvcGk4+4doGV7c7y9/ybgLsUhyemopfdPv96d2xUERu45iQLbow iBga0N42beM2rkHhWAdxtKrZSrGk8ZIf3eQFuo1ToHAm5Cy7ewwvgG+MubipJLCaaYfM mXeUYr21Ymhd2yCWpkrRA21zQ3rwnOWJGLSpEhzQDz8Nt2iHl0Yjt0yHJtojHI//ZE8Q gnQcxcYe6RBewV6im6Jxa/HZ+S0Hlu52d3oWk3kDbCRMdL/u3ZGUvwzOgE+kT80E2SMM Migg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Zq2oMbbyivDSUeOMLU6UgVaZMPHzfeEtdH+iJhaQzFI=; b=GKRzhk6f7P7w1cWr7iK+KUYZsyQjGAqauJBktCxRzfOSLo0OcyAr+PUjVfhql1hwW3 N58J9XWHxxEuomN3hy7hg4Ky6ArRG/60GnZhTmZLc7RN34PHaJvxPM0uWKveoKHkt+Tk B/VDWaD4GiVWMoc27pSfD8mOsLAm9/0ONXFYx62YXEREZHYUaqPmvUsbO6F6m3Kf+/i+ cYxQ2YR0SwZpmRQ4QD/7RSauYrs8+dxbyQpXGsa5hyDZxgCn7JGm01WrCgxP97cvFMEn oZz5OQoZb161DkoO36QbEYJQWPoDcbuljqNC2eV85TMLDE5Xi7cCvQUm/vYkWF9/p7nN md+w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Bz6AnpAO; spf=pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j22si6537425pfi.252.2019.01.16.08.11.16; Wed, 16 Jan 2019 08:11:16 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Bz6AnpAO; spf=pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2405194AbfAPQLP (ORCPT + 11 others); Wed, 16 Jan 2019 11:11:15 -0500 Received: from mail-wm1-f66.google.com ([209.85.128.66]:54318 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2405185AbfAPQLN (ORCPT ); Wed, 16 Jan 2019 11:11:13 -0500 Received: by mail-wm1-f66.google.com with SMTP id a62so2580366wmh.4 for ; Wed, 16 Jan 2019 08:11:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Zq2oMbbyivDSUeOMLU6UgVaZMPHzfeEtdH+iJhaQzFI=; b=Bz6AnpAOC1LWp7HIBwDPW+c8rI8rUIahEAzNe0cf4f9UbL5QjWiz+9EPB6M8Nomzlh oaHmJRLfPCL9PHQSBM4L1e4f9TLFbjrjJ5tOTWBpDhIWOBhONvm1Y4f1pdYJZBm1cCCg KNQiq/we5MfhtJ2paVJvkrEDQx1ztjjFkjxHg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Zq2oMbbyivDSUeOMLU6UgVaZMPHzfeEtdH+iJhaQzFI=; b=ID9Ao91IEM8c2Ha3ZSsLzDlvUuixyfENTQk/Gcs0xIKAJGUagE9n7ROiOJrYtACUvg gSOTV7id7/rzsPJ+gqRQjqqDljNb+EWYUm1dnVa5YvzKvTSG8HppajcYWfXfSdwmDGpY LschnHdz3XAYOnUoXZnReYM/p66mtx/Ki2mfcqeX73cvptUUYO3lqQ4acUK3NLdspP4s sjkabGRduzscOwGD314yY9eMKyUdUjGCnDWQlk90rJ5sZVxXETeVGSWCYq6MiSem7ngC HMXjheLQcuWx6pcW+ZKEZ5usErIO2WxBjeweolaXnH5y5BeSYRgcNOvgHXQhaIxg9uHA Y66g== X-Gm-Message-State: AJcUukd6hewGfZbmoQCKsNACCrX8apEGcIIQdlLLqcqR8uaTrXM9A9lM p4/7YAmwJYsxWZTQ5OLJfWBswg== X-Received: by 2002:a1c:d1cd:: with SMTP id i196mr7978630wmg.107.1547655071506; Wed, 16 Jan 2019 08:11:11 -0800 (PST) Received: from localhost.localdomain ([212.45.67.2]) by smtp.googlemail.com with ESMTPSA id a17sm78193407wrs.58.2019.01.16.08.11.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 16 Jan 2019 08:11:10 -0800 (PST) From: Georgi Djakov To: gregkh@linuxfoundation.org Cc: andy.gross@linaro.org, olof@lixom.net, arnd@arndb.de, rjw@rjwysocki.net, robh+dt@kernel.org, mturquette@baylibre.com, khilman@baylibre.com, vincent.guittot@linaro.org, skannan@codeaurora.org, bjorn.andersson@linaro.org, amit.kucheria@linaro.org, seansw@qti.qualcomm.com, daidavid1@codeaurora.org, evgreen@chromium.org, dianders@chromium.org, abailon@baylibre.com, maxime.ripard@bootlin.com, thierry.reding@gmail.com, ksitaraman@nvidia.com, sanjayc@nvidia.com, henryc.chen@mediatek.com, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-mediatek@lists.infradead.org, georgi.djakov@linaro.org Subject: [PATCH v13 2/8] dt-bindings: Introduce interconnect binding Date: Wed, 16 Jan 2019 18:10:57 +0200 Message-Id: <20190116161103.6937-3-georgi.djakov@linaro.org> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190116161103.6937-1-georgi.djakov@linaro.org> References: <20190116161103.6937-1-georgi.djakov@linaro.org> MIME-Version: 1.0 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org This binding is intended to represent the relations between interconnect controllers (providers) and consumer device nodes. It will allow creating links between consumers and interconnect paths (exposed by interconnect providers). Reviewed-by: Evan Green Reviewed-by: Rob Herring Signed-off-by: Georgi Djakov --- .../bindings/interconnect/interconnect.txt | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 Documentation/devicetree/bindings/interconnect/interconnect.txt diff --git a/Documentation/devicetree/bindings/interconnect/interconnect.txt b/Documentation/devicetree/bindings/interconnect/interconnect.txt new file mode 100644 index 000000000000..5a3c575b387a --- /dev/null +++ b/Documentation/devicetree/bindings/interconnect/interconnect.txt @@ -0,0 +1,60 @@ +Interconnect Provider Device Tree Bindings +========================================= + +The purpose of this document is to define a common set of generic interconnect +providers/consumers properties. + + += interconnect providers = + +The interconnect provider binding is intended to represent the interconnect +controllers in the system. Each provider registers a set of interconnect +nodes, which expose the interconnect related capabilities of the interconnect +to consumer drivers. These capabilities can be throughput, latency, priority +etc. The consumer drivers set constraints on interconnect path (or endpoints) +depending on the use case. Interconnect providers can also be interconnect +consumers, such as in the case where two network-on-chip fabrics interface +directly. + +Required properties: +- compatible : contains the interconnect provider compatible string +- #interconnect-cells : number of cells in a interconnect specifier needed to + encode the interconnect node id + +Example: + + snoc: interconnect@580000 { + compatible = "qcom,msm8916-snoc"; + #interconnect-cells = <1>; + reg = <0x580000 0x14000>; + clock-names = "bus_clk", "bus_a_clk"; + clocks = <&rpmcc RPM_SMD_SNOC_CLK>, + <&rpmcc RPM_SMD_SNOC_A_CLK>; + }; + + += interconnect consumers = + +The interconnect consumers are device nodes which dynamically express their +bandwidth requirements along interconnect paths they are connected to. There +can be multiple interconnect providers on a SoC and the consumer may consume +multiple paths from different providers depending on use case and the +components it has to interact with. + +Required properties: +interconnects : Pairs of phandles and interconnect provider specifier to denote + the edge source and destination ports of the interconnect path. + +Optional properties: +interconnect-names : List of interconnect path name strings sorted in the same + order as the interconnects property. Consumers drivers will use + interconnect-names to match interconnect paths with interconnect + specifier pairs. + +Example: + + sdhci@7864000 { + ... + interconnects = <&pnoc MASTER_SDCC_1 &bimc SLAVE_EBI_CH0>; + interconnect-names = "sdhc-mem"; + }; From patchwork Wed Jan 16 16:10:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Georgi Djakov X-Patchwork-Id: 155727 Delivered-To: patch@linaro.org Received: by 2002:a02:48:0:0:0:0:0 with SMTP id 69csp836633jaa; Wed, 16 Jan 2019 08:12:05 -0800 (PST) X-Google-Smtp-Source: ALg8bN6yg8sBObUIg/V/UXpPbUmAYbdAOolkUTB7Lx1lXjRd0+2LAeFJUh2e6lU+a8PX7Wm4yLzg X-Received: by 2002:a62:399b:: with SMTP id u27mr10843209pfj.181.1547655124941; Wed, 16 Jan 2019 08:12:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547655124; cv=none; d=google.com; s=arc-20160816; b=praZlQDsJWkYc0n8PoALnrXM+gK2+638XIBbDEhOb2CuQ9Gsfivn8wz5G/tdHOw7V5 E6fBUaJGa8zRhXP9kKFWQjtgIdfUFX1eWC0bhZatd7nXdiuUCvsme/I7NKPrFZ6UXjJb G33RRLHEdm6uYOo1bflq0KuzczsZ6vEhM5I0GpkMdt3HQexxUoWM93Yv69qHFRX59bmH MYOniSepQkUF7FPZJlL4Tkb5NDw0okCnGyY7gjF6wJLbfnKpWf8HZ06Z9b8aPCnhljC3 bQspIN6CXSpxEZbseFKV/joz44kp2kmTXH0j0DgiTy3+z4JKsYVUfQm06knsO8G4PiXC Crvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=kamvgp22OZ2lC2CgQIDQ09qvX48AAxDWMNt8RTccA94=; b=Tws8sks3nvzjXOvr1MzHqfalPz5VplUHZ9kyAIwTU6C0LC4hC2weLZZ3P+jDvYLcpS ups6hXWsisTaA/qQKYDDjaD3WJ/ghG1oi4E0htOKVElA8h7v/jX29csBHgnOahL5EDLk hyAL5IOY64XixXE6z2x6F5eTAoCHb3/sPgMTAjxOIwtPrQsArQ8g8E7UKyIJVJ6IQm6V QS5e7rw3n/IXuVIvRJ0t4iMC16jooiHAEMcI6BTFehrkqWyyfgFKKQKpvJT4wC/PG4xo fVj6TETRs+kkUCqGtdyc2Iaq5h25oNAXgHDwJjuebDMZUPleE5sQPQZNDWKDtyeOZjUN FFXw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=RbKKLVqb; spf=pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r18si3124468pls.115.2019.01.16.08.12.03; Wed, 16 Jan 2019 08:12:04 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=RbKKLVqb; spf=pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2405206AbfAPQLR (ORCPT + 11 others); Wed, 16 Jan 2019 11:11:17 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:51412 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2405186AbfAPQLQ (ORCPT ); Wed, 16 Jan 2019 11:11:16 -0500 Received: by mail-wm1-f68.google.com with SMTP id b11so2594819wmj.1 for ; Wed, 16 Jan 2019 08:11:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kamvgp22OZ2lC2CgQIDQ09qvX48AAxDWMNt8RTccA94=; b=RbKKLVqbEqEAWF3jnkdul5t1R8QVtB6kPhWtqzNvxi7rT8Kh6eNa+/AWfbS8cS5yUL oeUYeMTszhq7J0oZUH0WKYI+U87du8+MU6NoXBadhq9rvuosoFCFP5cDk1ZYlZMLKdHE 73+j2/7f3aRpMHana7wuse1B++g22BJLVWHBQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kamvgp22OZ2lC2CgQIDQ09qvX48AAxDWMNt8RTccA94=; b=jQPhJnwPgOTAP15mI8HQLGSwjy97w5Ii1xWKCfZkxQ2tJmWx6FY5AfsHnRFsD8IN2G 8i8HbbPGLUsofWNl8NDSQBAv/JtMi1Wt2sRLyRkRzBL4cK+P0ZKk+nzu+h0btZ7loAVr 9l1lrt8CFI6apgi2jdOwXEhlrgs1x3g8Y3GuW+2EnyvNlLScbqxVoAo/eSAhU9ywnjrj TAlQ3U7914w0mod4bGORpx1r3YjJqo03rB2ufHRNVfhVh5vhil5jNWCm50I/9dJk1IAa At9g2iRXa/HwX21lIkhtIxyyoK/DClNunW2ejjuJjUtJmQ9g0I6ExsDTyPz+4BJvibGg BNKQ== X-Gm-Message-State: AJcUukcgG8k6WfKvKjmFpya1uqN9tYzU6iTRC3M3vzmoZ036AdWLC4hL MJ78txO6kGUJ30PiWp6sIhK2mg== X-Received: by 2002:a1c:1d8e:: with SMTP id d136mr7953184wmd.98.1547655073749; Wed, 16 Jan 2019 08:11:13 -0800 (PST) Received: from localhost.localdomain ([212.45.67.2]) by smtp.googlemail.com with ESMTPSA id a17sm78193407wrs.58.2019.01.16.08.11.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 16 Jan 2019 08:11:12 -0800 (PST) From: Georgi Djakov To: gregkh@linuxfoundation.org Cc: andy.gross@linaro.org, olof@lixom.net, arnd@arndb.de, rjw@rjwysocki.net, robh+dt@kernel.org, mturquette@baylibre.com, khilman@baylibre.com, vincent.guittot@linaro.org, skannan@codeaurora.org, bjorn.andersson@linaro.org, amit.kucheria@linaro.org, seansw@qti.qualcomm.com, daidavid1@codeaurora.org, evgreen@chromium.org, dianders@chromium.org, abailon@baylibre.com, maxime.ripard@bootlin.com, thierry.reding@gmail.com, ksitaraman@nvidia.com, sanjayc@nvidia.com, henryc.chen@mediatek.com, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-mediatek@lists.infradead.org, georgi.djakov@linaro.org Subject: [PATCH v13 3/8] interconnect: Allow endpoints translation via DT Date: Wed, 16 Jan 2019 18:10:58 +0200 Message-Id: <20190116161103.6937-4-georgi.djakov@linaro.org> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190116161103.6937-1-georgi.djakov@linaro.org> References: <20190116161103.6937-1-georgi.djakov@linaro.org> MIME-Version: 1.0 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org Currently we support only platform data for specifying the interconnect endpoints. As now the endpoints are hard-coded into the consumer driver this may lead to complications when a single driver is used by multiple SoCs, which may have different interconnect topology. To avoid cluttering the consumer drivers, introduce a translation function to help us get the board specific interconnect data from device-tree. Reviewed-by: Evan Green Signed-off-by: Georgi Djakov --- drivers/interconnect/core.c | 149 ++++++++++++++++++++++++++ include/linux/interconnect-provider.h | 17 +++ include/linux/interconnect.h | 7 ++ 3 files changed, 173 insertions(+) diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c index 2b937b4f43c4..a8c2bd35197f 100644 --- a/drivers/interconnect/core.c +++ b/drivers/interconnect/core.c @@ -15,6 +15,7 @@ #include #include #include +#include #include static DEFINE_IDR(icc_idr); @@ -194,6 +195,152 @@ static int apply_constraints(struct icc_path *path) return ret; } +/* of_icc_xlate_onecell() - Translate function using a single index. + * @spec: OF phandle args to map into an interconnect node. + * @data: private data (pointer to struct icc_onecell_data) + * + * This is a generic translate function that can be used to model simple + * interconnect providers that have one device tree node and provide + * multiple interconnect nodes. A single cell is used as an index into + * an array of icc nodes specified in the icc_onecell_data struct when + * registering the provider. + */ +struct icc_node *of_icc_xlate_onecell(struct of_phandle_args *spec, + void *data) +{ + struct icc_onecell_data *icc_data = data; + unsigned int idx = spec->args[0]; + + if (idx >= icc_data->num_nodes) { + pr_err("%s: invalid index %u\n", __func__, idx); + return ERR_PTR(-EINVAL); + } + + return icc_data->nodes[idx]; +} +EXPORT_SYMBOL_GPL(of_icc_xlate_onecell); + +/** + * of_icc_get_from_provider() - Look-up interconnect node + * @spec: OF phandle args to use for look-up + * + * Looks for interconnect provider under the node specified by @spec and if + * found, uses xlate function of the provider to map phandle args to node. + * + * Returns a valid pointer to struct icc_node on success or ERR_PTR() + * on failure. + */ +static struct icc_node *of_icc_get_from_provider(struct of_phandle_args *spec) +{ + struct icc_node *node = ERR_PTR(-EPROBE_DEFER); + struct icc_provider *provider; + + if (!spec || spec->args_count != 1) + return ERR_PTR(-EINVAL); + + mutex_lock(&icc_lock); + list_for_each_entry(provider, &icc_providers, provider_list) { + if (provider->dev->of_node == spec->np) + node = provider->xlate(spec, provider->data); + if (!IS_ERR(node)) + break; + } + mutex_unlock(&icc_lock); + + return node; +} + +/** + * of_icc_get() - get a path handle from a DT node based on name + * @dev: device pointer for the consumer device + * @name: interconnect path name + * + * This function will search for a path between two endpoints and return an + * icc_path handle on success. Use icc_put() to release constraints when they + * are not needed anymore. + * If the interconnect API is disabled, NULL is returned and the consumer + * drivers will still build. Drivers are free to handle this specifically, + * but they don't have to. + * + * Return: icc_path pointer on success or ERR_PTR() on error. NULL is returned + * when the API is disabled or the "interconnects" DT property is missing. + */ +struct icc_path *of_icc_get(struct device *dev, const char *name) +{ + struct icc_path *path = ERR_PTR(-EPROBE_DEFER); + struct icc_node *src_node, *dst_node; + struct device_node *np = NULL; + struct of_phandle_args src_args, dst_args; + int idx = 0; + int ret; + + if (!dev || !dev->of_node) + return ERR_PTR(-ENODEV); + + np = dev->of_node; + + /* + * When the consumer DT node do not have "interconnects" property + * return a NULL path to skip setting constraints. + */ + if (!of_find_property(np, "interconnects", NULL)) + return NULL; + + /* + * We use a combination of phandle and specifier for endpoint. For now + * lets support only global ids and extend this in the future if needed + * without breaking DT compatibility. + */ + if (name) { + idx = of_property_match_string(np, "interconnect-names", name); + if (idx < 0) + return ERR_PTR(idx); + } + + ret = of_parse_phandle_with_args(np, "interconnects", + "#interconnect-cells", idx * 2, + &src_args); + if (ret) + return ERR_PTR(ret); + + of_node_put(src_args.np); + + ret = of_parse_phandle_with_args(np, "interconnects", + "#interconnect-cells", idx * 2 + 1, + &dst_args); + if (ret) + return ERR_PTR(ret); + + of_node_put(dst_args.np); + + src_node = of_icc_get_from_provider(&src_args); + + if (IS_ERR(src_node)) { + if (PTR_ERR(src_node) != -EPROBE_DEFER) + dev_err(dev, "error finding src node: %ld\n", + PTR_ERR(src_node)); + return ERR_CAST(src_node); + } + + dst_node = of_icc_get_from_provider(&dst_args); + + if (IS_ERR(dst_node)) { + if (PTR_ERR(dst_node) != -EPROBE_DEFER) + dev_err(dev, "error finding dst node: %ld\n", + PTR_ERR(dst_node)); + return ERR_CAST(dst_node); + } + + mutex_lock(&icc_lock); + path = path_find(dev, src_node, dst_node); + if (IS_ERR(path)) + dev_err(dev, "%s: invalid path=%ld\n", __func__, PTR_ERR(path)); + mutex_unlock(&icc_lock); + + return path; +} +EXPORT_SYMBOL_GPL(of_icc_get); + /** * icc_set_bw() - set bandwidth constraints on an interconnect path * @path: reference to the path returned by icc_get() @@ -519,6 +666,8 @@ int icc_provider_add(struct icc_provider *provider) { if (WARN_ON(!provider->set)) return -EINVAL; + if (WARN_ON(!provider->xlate)) + return -EINVAL; mutex_lock(&icc_lock); diff --git a/include/linux/interconnect-provider.h b/include/linux/interconnect-provider.h index 78208a754181..63caccadc2db 100644 --- a/include/linux/interconnect-provider.h +++ b/include/linux/interconnect-provider.h @@ -12,6 +12,21 @@ #define icc_units_to_bps(bw) ((bw) * 1000ULL) struct icc_node; +struct of_phandle_args; + +/** + * struct icc_onecell_data - driver data for onecell interconnect providers + * + * @num_nodes: number of nodes in this device + * @nodes: array of pointers to the nodes in this device + */ +struct icc_onecell_data { + unsigned int num_nodes; + struct icc_node *nodes[]; +}; + +struct icc_node *of_icc_xlate_onecell(struct of_phandle_args *spec, + void *data); /** * struct icc_provider - interconnect provider (controller) entity that might @@ -21,6 +36,7 @@ struct icc_node; * @nodes: internal list of the interconnect provider nodes * @set: pointer to device specific set operation function * @aggregate: pointer to device specific aggregate operation function + * @xlate: provider-specific callback for mapping nodes from phandle arguments * @dev: the device this interconnect provider belongs to * @users: count of active users * @data: pointer to private data @@ -31,6 +47,7 @@ struct icc_provider { int (*set)(struct icc_node *src, struct icc_node *dst); int (*aggregate)(struct icc_node *node, u32 avg_bw, u32 peak_bw, u32 *agg_avg, u32 *agg_peak); + struct icc_node* (*xlate)(struct of_phandle_args *spec, void *data); struct device *dev; int users; void *data; diff --git a/include/linux/interconnect.h b/include/linux/interconnect.h index c331afb3a2c8..dc25864755ba 100644 --- a/include/linux/interconnect.h +++ b/include/linux/interconnect.h @@ -27,6 +27,7 @@ struct device; struct icc_path *icc_get(struct device *dev, const int src_id, const int dst_id); +struct icc_path *of_icc_get(struct device *dev, const char *name); void icc_put(struct icc_path *path); int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw); @@ -38,6 +39,12 @@ static inline struct icc_path *icc_get(struct device *dev, const int src_id, return NULL; } +static inline struct icc_path *of_icc_get(struct device *dev, + const char *name) +{ + return NULL; +} + static inline void icc_put(struct icc_path *path) { } From patchwork Wed Jan 16 16:11:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Georgi Djakov X-Patchwork-Id: 155724 Delivered-To: patch@linaro.org Received: by 2002:a02:48:0:0:0:0:0 with SMTP id 69csp835987jaa; Wed, 16 Jan 2019 08:11:32 -0800 (PST) X-Google-Smtp-Source: ALg8bN5vbjN5dB1mpwsHZ1w6QqGcgS8mOWCS7ZUJnr4iCiA4snCBMTt1v6BkUP74HZS+qHbogbg4 X-Received: by 2002:a17:902:b118:: with SMTP id q24mr10726243plr.209.1547655091940; Wed, 16 Jan 2019 08:11:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547655091; cv=none; d=google.com; s=arc-20160816; b=O3Zsg6jUQ/1mob6ZcDjYWovWUxfho1D/uv0L+XHBzw74sJK42fdOHIUU9TexjiYle8 cXUYUb6GyjFLfSlVYeI91L4ci4XGLO5EELJFQQuqDzS6oorWQPLhfDW07Ns7Qpi4J7jf nPJZCItroeTdZc7DOjagS+uF58agttmTqMjG+ioCGnA2vYRHiLfjnj8s30TmZVptLopS dLTgEZRiljfXLevECWRnQrQXJiJd38CLMou9dz00ekkXmew1WwoQxbSb1NYatXpFL+F9 uOky3B4D/OzOQeNmkTld6mCgDE7a2Zz6NstTv0E8FMdXf48Qv6+M4jOKFFwxjI0xzNlj HkQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=JgRm2aO2Ij1KQwzH5NiF8dvBkSLnMrQ8RcNVlPauU/8=; b=0nU+yRRCtRlYKMMmDwvgZe66XsPAnh710hDNaG228GI6yaVuHaJtTm8byHMHwEaYkV hLp1k5vH+ZCHNvXk+UDpovCNwgrHWYh8B9FgxjwZ0qaHQAgiEkicAuBK/gFg16dZzkd1 0L/UfUdWqdMO8viObqHc1cxAXKgkcokScJHiKJM1kSUPeN/Fxr3PVmIngLfNcp3Mw76o xzQvMTmA4gxmsyczOCThRTwqhzDR9FxLTB2B6i9zuFAdmuEX4GbjApTKExapAMR32YU/ lqnNrshgtxZhZnzlaP+IM+FyVoJj8z0IXR2eDp8BaV3cseHce9fauB0ZQ8mGQp1MulUr HrkA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=eng73Q+r; spf=pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s8si3259005pgm.508.2019.01.16.08.11.30; Wed, 16 Jan 2019 08:11:31 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=eng73Q+r; spf=pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2405257AbfAPQL2 (ORCPT + 11 others); Wed, 16 Jan 2019 11:11:28 -0500 Received: from mail-wr1-f65.google.com ([209.85.221.65]:39145 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2405229AbfAPQL1 (ORCPT ); Wed, 16 Jan 2019 11:11:27 -0500 Received: by mail-wr1-f65.google.com with SMTP id t27so7576955wra.6 for ; Wed, 16 Jan 2019 08:11:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=JgRm2aO2Ij1KQwzH5NiF8dvBkSLnMrQ8RcNVlPauU/8=; b=eng73Q+rXVdfvwKcoCIxc2D2TnbLST3DbvtVZT8/wMBHycQWUXcjrQVVYynjYN/eNf VonNHpkhw1c7lT6ZkVMUAofI3642MqI0OXWXKd32g4ZlYaDCKlGeEL2s8PpN9ptmiyT0 xqsUXzokZRLa+SpQMOVnOyL4vTE3MoqtorQrs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JgRm2aO2Ij1KQwzH5NiF8dvBkSLnMrQ8RcNVlPauU/8=; b=dE1XjFSWsXi3nqT8PQyi5gswv52QreYK1d7ksqgtkIY72+ZcA38sVMd4ZgvMrMG9lJ 0EHFdNYPZabcztSujfvG1NFWxL4U8UOp/lwnwD4+/0aXFp1rwOvbGhEEhsU0ALG5A/oU ReW7LlcneMo0BolN8rHxolPf/Ik56NA2HkPP/VPCCk703a67TIBuH2D06kRb5EZpwmIw iaVsI3tWi9iQ+J9dIebH3EJwvmIY4wZuhc6G/BOzoLokXpnyequ7P2tBpj2Nhz8qzu9r KVAyp+340R/gP4PtlV/A/2WCyUAfNh86qImoctXLynrF2BjyT6aSlYlyAOmakWwCC28h 8poQ== X-Gm-Message-State: AJcUukdtuYYgR4kLGo0+1QsZBIAHXfrEuai9VkOcG2MPOmt39SLaW0mA o1zOkc5HFYvtsWUOkr9pRbA+Mg== X-Received: by 2002:adf:b3c3:: with SMTP id x3mr8262877wrd.294.1547655085306; Wed, 16 Jan 2019 08:11:25 -0800 (PST) Received: from localhost.localdomain ([212.45.67.2]) by smtp.googlemail.com with ESMTPSA id a17sm78193407wrs.58.2019.01.16.08.11.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 16 Jan 2019 08:11:24 -0800 (PST) From: Georgi Djakov To: gregkh@linuxfoundation.org Cc: andy.gross@linaro.org, olof@lixom.net, arnd@arndb.de, rjw@rjwysocki.net, robh+dt@kernel.org, mturquette@baylibre.com, khilman@baylibre.com, vincent.guittot@linaro.org, skannan@codeaurora.org, bjorn.andersson@linaro.org, amit.kucheria@linaro.org, seansw@qti.qualcomm.com, daidavid1@codeaurora.org, evgreen@chromium.org, dianders@chromium.org, abailon@baylibre.com, maxime.ripard@bootlin.com, thierry.reding@gmail.com, ksitaraman@nvidia.com, sanjayc@nvidia.com, henryc.chen@mediatek.com, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-tegra@vger.kernel.org, linux-mediatek@lists.infradead.org, georgi.djakov@linaro.org Subject: [PATCH v13 8/8] interconnect: Revert to previous config if any request fails Date: Wed, 16 Jan 2019 18:11:03 +0200 Message-Id: <20190116161103.6937-9-georgi.djakov@linaro.org> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190116161103.6937-1-georgi.djakov@linaro.org> References: <20190116161103.6937-1-georgi.djakov@linaro.org> MIME-Version: 1.0 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org When consumers report their bandwidth needs with icc_set_bw(), it's possible that the requested amount of bandwidth is not available or just the new configuration fails to apply on some path. In this case revert to the previous configuration and propagate the error back to the consumers to let them know that bandwidth is not available, hardware is busy or whatever error is returned by the interconnect platform driver. Signed-off-by: Georgi Djakov --- drivers/interconnect/core.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c index 8091d998549a..6005a1c189f6 100644 --- a/drivers/interconnect/core.c +++ b/drivers/interconnect/core.c @@ -414,14 +414,18 @@ EXPORT_SYMBOL_GPL(of_icc_get); int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw) { struct icc_node *node; + u32 old_avg, old_peak; size_t i; int ret; - if (!path) + if (!path || !path->num_nodes) return 0; mutex_lock(&icc_lock); + old_avg = path->reqs[0].avg_bw; + old_peak = path->reqs[0].peak_bw; + for (i = 0; i < path->num_nodes; i++) { node = path->reqs[i].node; @@ -434,10 +438,19 @@ int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw) } ret = apply_constraints(path); - if (ret) + if (ret) { pr_debug("interconnect: error applying constraints (%d)\n", ret); + for (i = 0; i < path->num_nodes; i++) { + node = path->reqs[i].node; + path->reqs[i].avg_bw = old_avg; + path->reqs[i].peak_bw = old_peak; + aggregate_requests(node); + } + apply_constraints(path); + } + mutex_unlock(&icc_lock); return ret;