From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 43A8DC432C1 for ; Wed, 25 Sep 2019 06:59:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 061BF21D7E for ; Wed, 25 Sep 2019 06:59:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="MmG2Ln/A" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2442436AbfIYG7C (ORCPT ); Wed, 25 Sep 2019 02:59:02 -0400 Received: from mailout3.samsung.com ([203.254.224.33]:36310 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2405037AbfIYG7B (ORCPT ); Wed, 25 Sep 2019 02:59:01 -0400 Received: from epcas1p1.samsung.com (unknown [182.195.41.45]) by mailout3.samsung.com (KnoxPortal) with ESMTP id 20190925065858epoutp0333a389c706e9d1d078f93e16cb88d189~HnDMpWuS92568425684epoutp03i for ; Wed, 25 Sep 2019 06:58:58 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout3.samsung.com 20190925065858epoutp0333a389c706e9d1d078f93e16cb88d189~HnDMpWuS92568425684epoutp03i DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1569394738; bh=xQWzs/pedDJSsxtEmCy1Lrdn5MIpIiQkDtODnQQwnt4=; h=Subject:To:Cc:From:Date:In-Reply-To:References:From; b=MmG2Ln/Ap9AIivrRhGYnn4AfbRbR3xdJc5B7yng4eOosvouTXSduW7wwtpwDBJRv3 sMBtBHxOkbMH843tdlmTyOLB2FREKXYOWKobFXMIsAcD+Ctl9dBNqSOIfZFtXOLCz6 EZU2LvTdOGDUM3n4kq5INcY85AH0o0hmdQ/G1CpU= Received: from epsnrtp4.localdomain (unknown [182.195.42.165]) by epcas1p4.samsung.com (KnoxPortal) with ESMTP id 20190925065858epcas1p4b71b876c150beaf3a5710898fd9f6e1d~HnDMEEACA0631506315epcas1p4W; Wed, 25 Sep 2019 06:58:58 +0000 (GMT) Received: from epsmges1p3.samsung.com (unknown [182.195.40.156]) by epsnrtp4.localdomain (Postfix) with ESMTP id 46dTRz2X8szMqYkg; Wed, 25 Sep 2019 06:58:55 +0000 (GMT) Received: from epcas1p3.samsung.com ( [182.195.41.47]) by epsmges1p3.samsung.com (Symantec Messaging Gateway) with SMTP id 9C.4F.04085.F201B8D5; Wed, 25 Sep 2019 15:58:55 +0900 (KST) Received: from epsmtrp2.samsung.com (unknown [182.195.40.14]) by epcas1p2.samsung.com (KnoxPortal) with ESMTPA id 20190925065854epcas1p281f94f5d17ffa46a8805ae596c3a1c29~HnDJDKRQq1907419074epcas1p2b; Wed, 25 Sep 2019 06:58:54 +0000 (GMT) Received: from epsmgms1p1new.samsung.com (unknown [182.195.42.41]) by epsmtrp2.samsung.com (KnoxPortal) with ESMTP id 20190925065854epsmtrp29f7422eb9abc7dca7a1a1033d07d6d62~HnDJCLF1C2870428704epsmtrp2g; Wed, 25 Sep 2019 06:58:54 +0000 (GMT) X-AuditID: b6c32a37-e19ff70000000ff5-b5-5d8b102f6860 Received: from epsmtip2.samsung.com ( [182.195.34.31]) by epsmgms1p1new.samsung.com (Symantec Messaging Gateway) with SMTP id C8.8F.04081.E201B8D5; Wed, 25 Sep 2019 15:58:54 +0900 (KST) Received: from [10.113.221.102] (unknown [10.113.221.102]) by epsmtip2.samsung.com (KnoxPortal) with ESMTPA id 20190925065854epsmtip2f99ad334c976ac4fbb5c45aa33ef7c1a~HnDIkt6tm0309903099epsmtip2L; Wed, 25 Sep 2019 06:58:54 +0000 (GMT) Subject: Re: [RFC PATCH v2 09/11] devfreq: exynos-bus: Add interconnect functionality to exynos-bus To: =?UTF-8?B?QXJ0dXIgxZp3aWdvxYQ=?= , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, dri-devel@lists.freedesktop.org Cc: =?UTF-8?B?QXJ0dXIgxZp3aWdvxYQ=?= , myungjoo.ham@samsung.com, inki.dae@samsung.com, sw0312.kim@samsung.com, georgi.djakov@linaro.org, leonard.crestez@nxp.com, m.szyprowski@samsung.com, b.zolnierkie@samsung.com, krzk@kernel.org From: Chanwoo Choi Organization: Samsung Electronics Message-ID: Date: Wed, 25 Sep 2019 16:03:17 +0900 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20190919142236.4071-10-a.swigon@samsung.com> Content-Language: en-US Content-Transfer-Encoding: 8bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrEJsWRmVeSWpSXmKPExsWy7bCmvq6+QHeswdHtwhaHjm1lt7g/r5XR YuOM9awW84+cY7W48vU9m8X0vZvYLCbdn8Bicf78BnaLFXc/slpsenyN1eLyrjlsFp97jzBa zDi/j8li7ZG77Ba3G1ewWcyY/JLNQcBj06pONo871/awedzvPs7ksXlJvcfGdzuYPA6+28Pk 0bdlFaPH501yARxR2TYZqYkpqUUKqXnJ+SmZeem2St7B8c7xpmYGhrqGlhbmSgp5ibmptkou PgG6bpk5QB8oKZQl5pQChQISi4uV9O1sivJLS1IVMvKLS2yVUgtScgosC/SKE3OLS/PS9ZLz c60MDQyMTIEKE7Iz5u9oZCtY6FDx+lwHWwPjGuMuRk4OCQETiZ6fR5i6GLk4hAR2MEpMnXqA FcL5xCix8+FRRgjnG6PEkZNbmGBajj7ZwgaR2Mso8WH/K6j+94wSrZ8usoJUCQukSsxZu50Z JCEi8J9R4vSylWCDmQU6mSR+P98BVsUmoCWx/8UNNhCbX0BR4uqPx4wgNq+AncTbJVuZQWwW AVWJc3Mvg+0WFYiQ+PTgMCtEjaDEyZlPWLoYOTg4Bawklu31BgkzC4hL3HoynwnClpdo3job 7AgJgXPsErsXn2OF+MFF4vC/xVC2sMSr41vYIWwpic/v9rJB2NUSK08eYYNo7mCU2LL/AlSD scT+pZOZQBYzC2hKrN+lDxFWlNj5ey4jxGI+iXdfe1hBSiQEeCU62oQgSpQlLj+4Cw1GSYnF 7Z1sExiVZiH5ZhaSF2YheWEWwrIFjCyrGMVSC4pz01OLDQuMkeN7EyM4fWuZ72DccM7nEKMA B6MSD68Da1esEGtiWXFl7iFGCQ5mJRHeWTJAId6UxMqq1KL8+KLSnNTiQ4ymwMCeyCwlmpwP zC15JfGGpkbGxsYWJoZmpoaGSuK8HukNsUIC6YklqdmpqQWpRTB9TBycUg2MVvMv3FNcuTD2 gmh7+DOGzZP2Hbgkq55abDeb33tBw5QNv39b/FOZnL6g1+J2z9n7B6eznD9Yvudj1+lE/yj9 lV3PuR9lsB+pz/TP357Vnu6RIOwz/c6Pf0XaVxXC/N+VOebO/LX1Xtj0y8+DNi10F5xidujb mRy57b2hvN9YnrpOCQ8x+G8Sq8RSnJFoqMVcVJwIAFdOVcn1AwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrDIsWRmVeSWpSXmKPExsWy7bCSvK6eQHeswYFl2haHjm1lt7g/r5XR YuOM9awW84+cY7W48vU9m8X0vZvYLCbdn8Bicf78BnaLFXc/slpsenyN1eLyrjlsFp97jzBa zDi/j8li7ZG77Ba3G1ewWcyY/JLNQcBj06pONo871/awedzvPs7ksXlJvcfGdzuYPA6+28Pk 0bdlFaPH501yARxRXDYpqTmZZalF+nYJXBnzdzSyFSx0qHh9roOtgXGNcRcjJ4eEgInE0Sdb 2LoYuTiEBHYzSpz/sokdIiEpMe3iUeYuRg4gW1ji8OFiiJq3jBKNy0+ygdQIC6RKzFm7nRkk ISLwn1HiYdsxRhCHWaCTSWLxlh8sEC17GCWu75gO1sImoCWx/8UNMJtfQFHi6o/HjCA2r4Cd xNslW5lBbBYBVYlzcy8zgdiiAhESh3fMgqoRlDg58wkLyEmcAlYSy/Z6g4SZBdQl/sy7xAxh i0vcejKfCcKWl2jeOpt5AqPwLCTds5C0zELSMgtJywJGllWMkqkFxbnpucWGBYZ5qeV6xYm5 xaV56XrJ+bmbGMFxrKW5g/HykvhDjAIcjEo8vA6sXbFCrIllxZW5hxglOJiVRHhnyQCFeFMS K6tSi/Lji0pzUosPMUpzsCiJ8z7NOxYpJJCeWJKanZpakFoEk2Xi4JRqYNQrT3HimzA785p8 0qtKR5GWRS5LLrHxmrv1B3/9bcz752uh7DzeH2c3r3rAsWzV/5tnIk6c7dAw4dtUUi6ssF0i 4+bLJc1zOyYnuPFa+0s9OHR1gU7iB7uWLwK+nBX9/IoMZZeXmR2fXF8y0eDE8fp0s9f/Yye/ zXqXdfe73y7Lng8BkZd+GCuxFGckGmoxFxUnAgBW+oGG3wIAAA== X-CMS-MailID: 20190925065854epcas1p281f94f5d17ffa46a8805ae596c3a1c29 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-Sendblock-Type: SVC_REQ_APPROVE CMS-TYPE: 101P DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20190919142329eucas1p2e53992eab9ec6b404f716f955b3c228e References: <20190919142236.4071-1-a.swigon@samsung.com> <20190919142236.4071-10-a.swigon@samsung.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, I need the time to dig the ICC framework to understand them detailed. After that, I'll review this. Basically, I agree this approach. But, I'm wondering the existing binding method between 'bus_leftbus' and 'bus_dmc'. >From before, I thought that devfreq framework need to enhance the binding method between parent devfreq device and passive devfreq device instead of 'devfreq' property. On this patch, use the same binding way between 'bus_leftbus' and 'bus_dmc' with 'parent' property as following: +++ b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi @@ -106,6 +106,7 @@ &bus_leftbus { devfreq-events = <&ppmu_leftbus_3>, <&ppmu_rightbus_3>; vdd-supply = <&buck3_reg>; + parent = <&bus_dmc>; status = "okay"; }; I'm not sure about continuing to use this method for new feature. If possible, hope to replace the existing binding style with new method like of_graph. Actually, I don't know the correct method. On 19. 9. 19. 오후 11:22, Artur Świgoń wrote: > From: Artur Świgoń > > This patch adds interconnect functionality to the exynos-bus devfreq > driver. > > The SoC topology is a graph (or, more specifically, a tree) and most of > its edges are taken from the devfreq parent-child hierarchy (cf. > Documentation/devicetree/bindings/devfreq/exynos-bus.txt). Due to > unspecified relative probing order, -EPROBE_DEFER may be propagated to > guarantee that a child is probed before its parent. > > Each bus is now an interconnect provider and an interconnect node as well > (cf. Documentation/interconnect/interconnect.rst), i.e. every bus registers > itself as a node. Node IDs are not hardcoded but rather assigned at > runtime, in probing order (subject to the above-mentioned exception > regarding relative order). This approach allows for using this driver with > various Exynos SoCs. > > Frequencies requested via the interconnect API for a given node are > propagated to devfreq using dev_pm_qos_update_request(). Please note that > it is not an error when CONFIG_INTERCONNECT is 'n', in which case all > interconnect API functions are no-op. > > Signed-off-by: Artur Świgoń > --- > drivers/devfreq/exynos-bus.c | 153 +++++++++++++++++++++++++++++++++++ > 1 file changed, 153 insertions(+) > > diff --git a/drivers/devfreq/exynos-bus.c b/drivers/devfreq/exynos-bus.c > index 8d44810cac69..e0232202720d 100644 > --- a/drivers/devfreq/exynos-bus.c > +++ b/drivers/devfreq/exynos-bus.c > @@ -14,14 +14,19 @@ > #include > #include > #include > +#include > +#include > #include > #include > #include > +#include > #include > #include > > #define DEFAULT_SATURATION_RATIO 40 > > +#define icc_units_to_khz(x) ((x) / 8) > + > struct exynos_bus { > struct device *dev; > > @@ -35,6 +40,12 @@ struct exynos_bus { > struct opp_table *opp_table; > struct clk *clk; > unsigned int ratio; > + > + /* One provider per bus, one node per provider */ > + struct icc_provider provider; > + struct icc_node *node; > + > + struct dev_pm_qos_request qos_req; > }; > > /* > @@ -59,6 +70,13 @@ exynos_bus_ops_edev(enable_edev); > exynos_bus_ops_edev(disable_edev); > exynos_bus_ops_edev(set_event); > > +static int exynos_bus_next_id(void) > +{ > + static DEFINE_IDA(exynos_bus_icc_ida); > + > + return ida_alloc(&exynos_bus_icc_ida, GFP_KERNEL); > +} > + > static int exynos_bus_get_event(struct exynos_bus *bus, > struct devfreq_event_data *edata) > { > @@ -171,6 +189,38 @@ static void exynos_bus_passive_exit(struct device *dev) > clk_disable_unprepare(bus->clk); > } > > +static int exynos_bus_icc_set(struct icc_node *src, struct icc_node *dst) > +{ > + struct exynos_bus *src_bus = src->data, *dst_bus = dst->data; > + s32 src_freq = icc_units_to_khz(src->avg_bw); > + s32 dst_freq = icc_units_to_khz(dst->avg_bw); > + > + dev_pm_qos_update_request(&src_bus->qos_req, src_freq); > + dev_pm_qos_update_request(&dst_bus->qos_req, dst_freq); > + > + return 0; > +} > + > +static int exynos_bus_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw, > + u32 peak_bw, u32 *agg_avg, u32 *agg_peak) > +{ > + *agg_avg += avg_bw; > + *agg_peak = max(*agg_peak, peak_bw); > + > + return 0; > +} > + > +static struct icc_node *exynos_bus_icc_xlate(struct of_phandle_args *spec, > + void *data) > +{ > + struct exynos_bus *bus = data; > + > + if (spec->np != bus->dev->of_node) > + return ERR_PTR(-EINVAL); > + > + return bus->node; > +} > + > static int exynos_bus_parent_parse_of(struct device_node *np, > struct exynos_bus *bus) > { > @@ -366,6 +416,101 @@ static int exynos_bus_profile_init_passive(struct exynos_bus *bus, > return 0; > } > > +static int exynos_bus_icc_connect(struct exynos_bus *bus) > +{ > + struct device_node *np = bus->dev->of_node; > + struct devfreq *parent_devfreq; > + struct icc_node *parent_node = NULL; > + struct of_phandle_args args; > + int ret = 0; > + > + parent_devfreq = devfreq_get_devfreq_by_phandle(bus->dev, 0); > + if (!IS_ERR(parent_devfreq)) { > + struct exynos_bus *parent_bus; > + > + parent_bus = dev_get_drvdata(parent_devfreq->dev.parent); > + parent_node = parent_bus->node; > + } else { > + /* Look for parent in DT */ > + int num = of_count_phandle_with_args(np, "parent", > + "#interconnect-cells"); > + if (num != 1) > + goto out; /* 'parent' is optional */ > + > + ret = of_parse_phandle_with_args(np, "parent", > + "#interconnect-cells", > + 0, &args); > + if (ret < 0) > + goto out; > + > + of_node_put(args.np); > + > + parent_node = of_icc_get_from_provider(&args); > + if (IS_ERR(parent_node)) { > + /* May be -EPROBE_DEFER */ > + ret = PTR_ERR(parent_node); > + goto out; > + } > + } > + > + ret = icc_link_create(bus->node, parent_node->id); > + > +out: > + return ret; > +} > + > +static int exynos_bus_icc_init(struct exynos_bus *bus) > +{ > + struct device *dev = bus->dev; > + struct icc_provider *provider = &bus->provider; > + struct icc_node *node; > + int id, ret; > + > + /* Initialize the interconnect provider */ > + provider->set = exynos_bus_icc_set; > + provider->aggregate = exynos_bus_icc_aggregate; > + provider->xlate = exynos_bus_icc_xlate; > + provider->dev = dev; > + provider->data = bus; > + > + ret = icc_provider_add(provider); > + if (ret < 0) > + goto out; > + > + ret = id = exynos_bus_next_id(); > + if (ret < 0) > + goto err_node; > + > + node = icc_node_create(id); > + if (IS_ERR(node)) { > + ret = PTR_ERR(node); > + goto err_node; > + } > + > + bus->node = node; > + node->name = dev->of_node->name; > + node->data = bus; > + icc_node_add(node, provider); > + > + ret = exynos_bus_icc_connect(bus); > + if (ret < 0) > + goto err_connect; > + > + ret = dev_pm_qos_add_request(bus->devfreq->dev.parent, &bus->qos_req, > + DEV_PM_QOS_MIN_FREQUENCY, 0); > + > +out: > + return ret; > + > +err_connect: > + icc_node_del(node); > + icc_node_destroy(id); > +err_node: > + icc_provider_del(provider); > + > + return ret; > +} > + > static int exynos_bus_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > @@ -415,6 +560,14 @@ static int exynos_bus_probe(struct platform_device *pdev) > if (ret < 0) > goto err; > > + /* > + * Initialize interconnect provider. A return value of -ENOTSUPP means > + * that CONFIG_INTERCONNECT is disabled. > + */ > + ret = exynos_bus_icc_init(bus); > + if (ret < 0 && ret != -ENOTSUPP) > + goto err; > + > max_state = bus->devfreq->profile->max_state; > min_freq = (bus->devfreq->profile->freq_table[0] / 1000); > max_freq = (bus->devfreq->profile->freq_table[max_state - 1] / 1000); > -- Best Regards, Chanwoo Choi Samsung Electronics From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chanwoo Choi Subject: Re: [RFC PATCH v2 09/11] devfreq: exynos-bus: Add interconnect functionality to exynos-bus Date: Wed, 25 Sep 2019 16:03:17 +0900 Message-ID: References: <20190919142236.4071-1-a.swigon@samsung.com> <20190919142236.4071-10-a.swigon@samsung.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <20190919142236.4071-10-a.swigon@samsung.com> Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org To: =?UTF-8?B?QXJ0dXIgxZp3aWdvxYQ=?= , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, dri-devel@lists.freedesktop.org Cc: =?UTF-8?B?QXJ0dXIgxZp3aWdvxYQ=?= , myungjoo.ham@samsung.com, inki.dae@samsung.com, sw0312.kim@samsung.com, georgi.djakov@linaro.org, leonard.crestez@nxp.com, m.szyprowski@samsung.com, b.zolnierkie@samsung.com, krzk@kernel.org List-Id: devicetree@vger.kernel.org Hi, I need the time to dig the ICC framework to understand them detailed. After that, I'll review this. Basically, I agree this approach. But, I'm wondering the existing binding method between 'bus_leftbus' and 'bus_dmc'. >>From before, I thought that devfreq framework need to enhance the binding method between parent devfreq device and passive devfreq device instead of 'devfreq' property. On this patch, use the same binding way between 'bus_leftbus' and 'bus_dmc' with 'parent' property as following: +++ b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi @@ -106,6 +106,7 @@ &bus_leftbus { devfreq-events = <&ppmu_leftbus_3>, <&ppmu_rightbus_3>; vdd-supply = <&buck3_reg>; + parent = <&bus_dmc>; status = "okay"; }; I'm not sure about continuing to use this method for new feature. If possible, hope to replace the existing binding style with new method like of_graph. Actually, I don't know the correct method. On 19. 9. 19. 오후 11:22, Artur Świgoń wrote: > From: Artur Świgoń > > This patch adds interconnect functionality to the exynos-bus devfreq > driver. > > The SoC topology is a graph (or, more specifically, a tree) and most of > its edges are taken from the devfreq parent-child hierarchy (cf. > Documentation/devicetree/bindings/devfreq/exynos-bus.txt). Due to > unspecified relative probing order, -EPROBE_DEFER may be propagated to > guarantee that a child is probed before its parent. > > Each bus is now an interconnect provider and an interconnect node as well > (cf. Documentation/interconnect/interconnect.rst), i.e. every bus registers > itself as a node. Node IDs are not hardcoded but rather assigned at > runtime, in probing order (subject to the above-mentioned exception > regarding relative order). This approach allows for using this driver with > various Exynos SoCs. > > Frequencies requested via the interconnect API for a given node are > propagated to devfreq using dev_pm_qos_update_request(). Please note that > it is not an error when CONFIG_INTERCONNECT is 'n', in which case all > interconnect API functions are no-op. > > Signed-off-by: Artur Świgoń > --- > drivers/devfreq/exynos-bus.c | 153 +++++++++++++++++++++++++++++++++++ > 1 file changed, 153 insertions(+) > > diff --git a/drivers/devfreq/exynos-bus.c b/drivers/devfreq/exynos-bus.c > index 8d44810cac69..e0232202720d 100644 > --- a/drivers/devfreq/exynos-bus.c > +++ b/drivers/devfreq/exynos-bus.c > @@ -14,14 +14,19 @@ > #include > #include > #include > +#include > +#include > #include > #include > #include > +#include > #include > #include > > #define DEFAULT_SATURATION_RATIO 40 > > +#define icc_units_to_khz(x) ((x) / 8) > + > struct exynos_bus { > struct device *dev; > > @@ -35,6 +40,12 @@ struct exynos_bus { > struct opp_table *opp_table; > struct clk *clk; > unsigned int ratio; > + > + /* One provider per bus, one node per provider */ > + struct icc_provider provider; > + struct icc_node *node; > + > + struct dev_pm_qos_request qos_req; > }; > > /* > @@ -59,6 +70,13 @@ exynos_bus_ops_edev(enable_edev); > exynos_bus_ops_edev(disable_edev); > exynos_bus_ops_edev(set_event); > > +static int exynos_bus_next_id(void) > +{ > + static DEFINE_IDA(exynos_bus_icc_ida); > + > + return ida_alloc(&exynos_bus_icc_ida, GFP_KERNEL); > +} > + > static int exynos_bus_get_event(struct exynos_bus *bus, > struct devfreq_event_data *edata) > { > @@ -171,6 +189,38 @@ static void exynos_bus_passive_exit(struct device *dev) > clk_disable_unprepare(bus->clk); > } > > +static int exynos_bus_icc_set(struct icc_node *src, struct icc_node *dst) > +{ > + struct exynos_bus *src_bus = src->data, *dst_bus = dst->data; > + s32 src_freq = icc_units_to_khz(src->avg_bw); > + s32 dst_freq = icc_units_to_khz(dst->avg_bw); > + > + dev_pm_qos_update_request(&src_bus->qos_req, src_freq); > + dev_pm_qos_update_request(&dst_bus->qos_req, dst_freq); > + > + return 0; > +} > + > +static int exynos_bus_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw, > + u32 peak_bw, u32 *agg_avg, u32 *agg_peak) > +{ > + *agg_avg += avg_bw; > + *agg_peak = max(*agg_peak, peak_bw); > + > + return 0; > +} > + > +static struct icc_node *exynos_bus_icc_xlate(struct of_phandle_args *spec, > + void *data) > +{ > + struct exynos_bus *bus = data; > + > + if (spec->np != bus->dev->of_node) > + return ERR_PTR(-EINVAL); > + > + return bus->node; > +} > + > static int exynos_bus_parent_parse_of(struct device_node *np, > struct exynos_bus *bus) > { > @@ -366,6 +416,101 @@ static int exynos_bus_profile_init_passive(struct exynos_bus *bus, > return 0; > } > > +static int exynos_bus_icc_connect(struct exynos_bus *bus) > +{ > + struct device_node *np = bus->dev->of_node; > + struct devfreq *parent_devfreq; > + struct icc_node *parent_node = NULL; > + struct of_phandle_args args; > + int ret = 0; > + > + parent_devfreq = devfreq_get_devfreq_by_phandle(bus->dev, 0); > + if (!IS_ERR(parent_devfreq)) { > + struct exynos_bus *parent_bus; > + > + parent_bus = dev_get_drvdata(parent_devfreq->dev.parent); > + parent_node = parent_bus->node; > + } else { > + /* Look for parent in DT */ > + int num = of_count_phandle_with_args(np, "parent", > + "#interconnect-cells"); > + if (num != 1) > + goto out; /* 'parent' is optional */ > + > + ret = of_parse_phandle_with_args(np, "parent", > + "#interconnect-cells", > + 0, &args); > + if (ret < 0) > + goto out; > + > + of_node_put(args.np); > + > + parent_node = of_icc_get_from_provider(&args); > + if (IS_ERR(parent_node)) { > + /* May be -EPROBE_DEFER */ > + ret = PTR_ERR(parent_node); > + goto out; > + } > + } > + > + ret = icc_link_create(bus->node, parent_node->id); > + > +out: > + return ret; > +} > + > +static int exynos_bus_icc_init(struct exynos_bus *bus) > +{ > + struct device *dev = bus->dev; > + struct icc_provider *provider = &bus->provider; > + struct icc_node *node; > + int id, ret; > + > + /* Initialize the interconnect provider */ > + provider->set = exynos_bus_icc_set; > + provider->aggregate = exynos_bus_icc_aggregate; > + provider->xlate = exynos_bus_icc_xlate; > + provider->dev = dev; > + provider->data = bus; > + > + ret = icc_provider_add(provider); > + if (ret < 0) > + goto out; > + > + ret = id = exynos_bus_next_id(); > + if (ret < 0) > + goto err_node; > + > + node = icc_node_create(id); > + if (IS_ERR(node)) { > + ret = PTR_ERR(node); > + goto err_node; > + } > + > + bus->node = node; > + node->name = dev->of_node->name; > + node->data = bus; > + icc_node_add(node, provider); > + > + ret = exynos_bus_icc_connect(bus); > + if (ret < 0) > + goto err_connect; > + > + ret = dev_pm_qos_add_request(bus->devfreq->dev.parent, &bus->qos_req, > + DEV_PM_QOS_MIN_FREQUENCY, 0); > + > +out: > + return ret; > + > +err_connect: > + icc_node_del(node); > + icc_node_destroy(id); > +err_node: > + icc_provider_del(provider); > + > + return ret; > +} > + > static int exynos_bus_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > @@ -415,6 +560,14 @@ static int exynos_bus_probe(struct platform_device *pdev) > if (ret < 0) > goto err; > > + /* > + * Initialize interconnect provider. A return value of -ENOTSUPP means > + * that CONFIG_INTERCONNECT is disabled. > + */ > + ret = exynos_bus_icc_init(bus); > + if (ret < 0 && ret != -ENOTSUPP) > + goto err; > + > max_state = bus->devfreq->profile->max_state; > min_freq = (bus->devfreq->profile->freq_table[0] / 1000); > max_freq = (bus->devfreq->profile->freq_table[max_state - 1] / 1000); > -- Best Regards, Chanwoo Choi Samsung Electronics From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6CEDEC432C1 for ; Wed, 25 Sep 2019 06:59:11 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 356C3217F4 for ; Wed, 25 Sep 2019 06:59:11 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="r5BT3QgI"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="MmG2Ln/A" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 356C3217F4 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=samsung.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:References:In-Reply-To:MIME-Version: Date:Message-ID:From:To:Subject:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=RjhksuntEANJn7sOLlDeI7SUpQCnGmClwWGXC5bSUFE=; b=r5BT3QgIGcpWHG 3QXZlGpHDBZGko9dwdjiqqaH9rXz8JAAVdr59YXwuWzRQ+nqKY82DOGzutcgxPeU6TudvZRNROkRS c5snUDKKwr4Sl6jB6+qgAlcX+lvXi7S4R3Q7M1XILuhb+7DOG0Kw34LsYYldhHF2hrLxHUeN5ZSJl 70zkVN9XQMoZja9xt+8CWV64l6MDevy5CZlzaXF0ZvdCvnuJLTMsHb+e/Dueo/Z/AORtNt7iIdH31 VSTJDquFt7p1JGX0nCPskHpysQyl8T+snkXxLuujYcnQUC8m9CRzgOaQfZhYAw12j3ubWZQtc63J4 SRhGgoe2MKCehFzlcUjw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.2 #3 (Red Hat Linux)) id 1iD1GT-0008FR-Dp; Wed, 25 Sep 2019 06:59:05 +0000 Received: from mailout2.samsung.com ([203.254.224.25]) by bombadil.infradead.org with esmtps (Exim 4.92.2 #3 (Red Hat Linux)) id 1iD1GP-0008Ex-AC for linux-arm-kernel@lists.infradead.org; Wed, 25 Sep 2019 06:59:03 +0000 Received: from epcas1p1.samsung.com (unknown [182.195.41.45]) by mailout2.samsung.com (KnoxPortal) with ESMTP id 20190925065858epoutp02aca705e02e74998fa0035dce39a23660~HnDMeAp_S1074010740epoutp02h for ; Wed, 25 Sep 2019 06:58:58 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.samsung.com 20190925065858epoutp02aca705e02e74998fa0035dce39a23660~HnDMeAp_S1074010740epoutp02h DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1569394738; bh=xQWzs/pedDJSsxtEmCy1Lrdn5MIpIiQkDtODnQQwnt4=; h=Subject:To:Cc:From:Date:In-Reply-To:References:From; b=MmG2Ln/Ap9AIivrRhGYnn4AfbRbR3xdJc5B7yng4eOosvouTXSduW7wwtpwDBJRv3 sMBtBHxOkbMH843tdlmTyOLB2FREKXYOWKobFXMIsAcD+Ctl9dBNqSOIfZFtXOLCz6 EZU2LvTdOGDUM3n4kq5INcY85AH0o0hmdQ/G1CpU= Received: from epsnrtp4.localdomain (unknown [182.195.42.165]) by epcas1p4.samsung.com (KnoxPortal) with ESMTP id 20190925065858epcas1p4b71b876c150beaf3a5710898fd9f6e1d~HnDMEEACA0631506315epcas1p4W; Wed, 25 Sep 2019 06:58:58 +0000 (GMT) Received: from epsmges1p3.samsung.com (unknown [182.195.40.156]) by epsnrtp4.localdomain (Postfix) with ESMTP id 46dTRz2X8szMqYkg; Wed, 25 Sep 2019 06:58:55 +0000 (GMT) Received: from epcas1p3.samsung.com ( [182.195.41.47]) by epsmges1p3.samsung.com (Symantec Messaging Gateway) with SMTP id 9C.4F.04085.F201B8D5; Wed, 25 Sep 2019 15:58:55 +0900 (KST) Received: from epsmtrp2.samsung.com (unknown [182.195.40.14]) by epcas1p2.samsung.com (KnoxPortal) with ESMTPA id 20190925065854epcas1p281f94f5d17ffa46a8805ae596c3a1c29~HnDJDKRQq1907419074epcas1p2b; Wed, 25 Sep 2019 06:58:54 +0000 (GMT) Received: from epsmgms1p1new.samsung.com (unknown [182.195.42.41]) by epsmtrp2.samsung.com (KnoxPortal) with ESMTP id 20190925065854epsmtrp29f7422eb9abc7dca7a1a1033d07d6d62~HnDJCLF1C2870428704epsmtrp2g; Wed, 25 Sep 2019 06:58:54 +0000 (GMT) X-AuditID: b6c32a37-e19ff70000000ff5-b5-5d8b102f6860 Received: from epsmtip2.samsung.com ( [182.195.34.31]) by epsmgms1p1new.samsung.com (Symantec Messaging Gateway) with SMTP id C8.8F.04081.E201B8D5; Wed, 25 Sep 2019 15:58:54 +0900 (KST) Received: from [10.113.221.102] (unknown [10.113.221.102]) by epsmtip2.samsung.com (KnoxPortal) with ESMTPA id 20190925065854epsmtip2f99ad334c976ac4fbb5c45aa33ef7c1a~HnDIkt6tm0309903099epsmtip2L; Wed, 25 Sep 2019 06:58:54 +0000 (GMT) Subject: Re: [RFC PATCH v2 09/11] devfreq: exynos-bus: Add interconnect functionality to exynos-bus To: =?UTF-8?B?QXJ0dXIgxZp3aWdvxYQ=?= , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, dri-devel@lists.freedesktop.org From: Chanwoo Choi Organization: Samsung Electronics Message-ID: Date: Wed, 25 Sep 2019 16:03:17 +0900 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20190919142236.4071-10-a.swigon@samsung.com> Content-Language: en-US X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrEJsWRmVeSWpSXmKPExsWy7bCmvq6+QHeswdHtwhaHjm1lt7g/r5XR YuOM9awW84+cY7W48vU9m8X0vZvYLCbdn8Bicf78BnaLFXc/slpsenyN1eLyrjlsFp97jzBa zDi/j8li7ZG77Ba3G1ewWcyY/JLNQcBj06pONo871/awedzvPs7ksXlJvcfGdzuYPA6+28Pk 0bdlFaPH501yARxR2TYZqYkpqUUKqXnJ+SmZeem2St7B8c7xpmYGhrqGlhbmSgp5ibmptkou PgG6bpk5QB8oKZQl5pQChQISi4uV9O1sivJLS1IVMvKLS2yVUgtScgosC/SKE3OLS/PS9ZLz c60MDQyMTIEKE7Iz5u9oZCtY6FDx+lwHWwPjGuMuRk4OCQETiZ6fR5i6GLk4hAR2MEpMnXqA FcL5xCix8+FRRgjnG6PEkZNbmGBajj7ZwgaR2Mso8WH/K6j+94wSrZ8usoJUCQukSsxZu50Z JCEi8J9R4vSylWCDmQU6mSR+P98BVsUmoCWx/8UNNhCbX0BR4uqPx4wgNq+AncTbJVuZQWwW AVWJc3Mvg+0WFYiQ+PTgMCtEjaDEyZlPWLoYOTg4Bawklu31BgkzC4hL3HoynwnClpdo3job 7AgJgXPsErsXn2OF+MFF4vC/xVC2sMSr41vYIWwpic/v9rJB2NUSK08eYYNo7mCU2LL/AlSD scT+pZOZQBYzC2hKrN+lDxFWlNj5ey4jxGI+iXdfe1hBSiQEeCU62oQgSpQlLj+4Cw1GSYnF 7Z1sExiVZiH5ZhaSF2YheWEWwrIFjCyrGMVSC4pz01OLDQuMkeN7EyM4fWuZ72DccM7nEKMA B6MSD68Da1esEGtiWXFl7iFGCQ5mJRHeWTJAId6UxMqq1KL8+KLSnNTiQ4ymwMCeyCwlmpwP zC15JfGGpkbGxsYWJoZmpoaGSuK8HukNsUIC6YklqdmpqQWpRTB9TBycUg2MVvMv3FNcuTD2 gmh7+DOGzZP2Hbgkq55abDeb33tBw5QNv39b/FOZnL6g1+J2z9n7B6eznD9Yvudj1+lE/yj9 lV3PuR9lsB+pz/TP357Vnu6RIOwz/c6Pf0XaVxXC/N+VOebO/LX1Xtj0y8+DNi10F5xidujb mRy57b2hvN9YnrpOCQ8x+G8Sq8RSnJFoqMVcVJwIAFdOVcn1AwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrDIsWRmVeSWpSXmKPExsWy7bCSvK6eQHeswYFl2haHjm1lt7g/r5XR YuOM9awW84+cY7W48vU9m8X0vZvYLCbdn8Bicf78BnaLFXc/slpsenyN1eLyrjlsFp97jzBa zDi/j8li7ZG77Ba3G1ewWcyY/JLNQcBj06pONo871/awedzvPs7ksXlJvcfGdzuYPA6+28Pk 0bdlFaPH501yARxRXDYpqTmZZalF+nYJXBnzdzSyFSx0qHh9roOtgXGNcRcjJ4eEgInE0Sdb 2LoYuTiEBHYzSpz/sokdIiEpMe3iUeYuRg4gW1ji8OFiiJq3jBKNy0+ygdQIC6RKzFm7nRkk ISLwn1HiYdsxRhCHWaCTSWLxlh8sEC17GCWu75gO1sImoCWx/8UNMJtfQFHi6o/HjCA2r4Cd xNslW5lBbBYBVYlzcy8zgdiiAhESh3fMgqoRlDg58wkLyEmcAlYSy/Z6g4SZBdQl/sy7xAxh i0vcejKfCcKWl2jeOpt5AqPwLCTds5C0zELSMgtJywJGllWMkqkFxbnpucWGBYZ5qeV6xYm5 xaV56XrJ+bmbGMFxrKW5g/HykvhDjAIcjEo8vA6sXbFCrIllxZW5hxglOJiVRHhnyQCFeFMS K6tSi/Lji0pzUosPMUpzsCiJ8z7NOxYpJJCeWJKanZpakFoEk2Xi4JRqYNQrT3HimzA785p8 0qtKR5GWRS5LLrHxmrv1B3/9bcz752uh7DzeH2c3r3rAsWzV/5tnIk6c7dAw4dtUUi6ssF0i 4+bLJc1zOyYnuPFa+0s9OHR1gU7iB7uWLwK+nBX9/IoMZZeXmR2fXF8y0eDE8fp0s9f/Yye/ zXqXdfe73y7Lng8BkZd+GCuxFGckGmoxFxUnAgBW+oGG3wIAAA== X-CMS-MailID: 20190925065854epcas1p281f94f5d17ffa46a8805ae596c3a1c29 X-Msg-Generator: CA X-Sendblock-Type: SVC_REQ_APPROVE CMS-TYPE: 101P DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20190919142329eucas1p2e53992eab9ec6b404f716f955b3c228e References: <20190919142236.4071-1-a.swigon@samsung.com> <20190919142236.4071-10-a.swigon@samsung.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190924_235901_743723_F613D751 X-CRM114-Status: GOOD ( 32.61 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?B?QXJ0dXIgxZp3aWdvxYQ=?= , b.zolnierkie@samsung.com, sw0312.kim@samsung.com, krzk@kernel.org, inki.dae@samsung.com, myungjoo.ham@samsung.com, leonard.crestez@nxp.com, georgi.djakov@linaro.org, m.szyprowski@samsung.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGksCgpJIG5lZWQgdGhlIHRpbWUgdG8gZGlnIHRoZSBJQ0MgZnJhbWV3b3JrCnRvIHVuZGVyc3Rh bmQgdGhlbSBkZXRhaWxlZC4gQWZ0ZXIgdGhhdCwgSSdsbCByZXZpZXcgdGhpcy4KCkJhc2ljYWxs eSwgSSBhZ3JlZSB0aGlzIGFwcHJvYWNoLiBCdXQsIEknbSB3b25kZXJpbmcKdGhlIGV4aXN0aW5n IGJpbmRpbmcgbWV0aG9kIGJldHdlZW4gJ2J1c19sZWZ0YnVzJyBhbmQgJ2J1c19kbWMnLgpGcm9t IGJlZm9yZSwgSSB0aG91Z2h0IHRoYXQgZGV2ZnJlcSBmcmFtZXdvcmsgbmVlZCB0bwplbmhhbmNl IHRoZSBiaW5kaW5nIG1ldGhvZCBiZXR3ZWVuIHBhcmVudCBkZXZmcmVxIGRldmljZQphbmQgcGFz c2l2ZSBkZXZmcmVxIGRldmljZSBpbnN0ZWFkIG9mICdkZXZmcmVxJyBwcm9wZXJ0eS4KCk9uIHRo aXMgcGF0Y2gsIHVzZSB0aGUgc2FtZSBiaW5kaW5nIHdheSBiZXR3ZWVuCididXNfbGVmdGJ1cycg YW5kICdidXNfZG1jJyB3aXRoICdwYXJlbnQnIHByb3BlcnR5CmFzIGZvbGxvd2luZzoKCisrKyBi L2FyY2gvYXJtL2Jvb3QvZHRzL2V4eW5vczQ0MTItb2Ryb2lkLWNvbW1vbi5kdHNpCkBAIC0xMDYs NiArMTA2LDcgQEAKICZidXNfbGVmdGJ1cyB7CiAJZGV2ZnJlcS1ldmVudHMgPSA8JnBwbXVfbGVm dGJ1c18zPiwgPCZwcG11X3JpZ2h0YnVzXzM+OwogCXZkZC1zdXBwbHkgPSA8JmJ1Y2szX3JlZz47 CisJcGFyZW50ID0gPCZidXNfZG1jPjsKIAlzdGF0dXMgPSAib2theSI7CiB9OwoKSSdtIG5vdCBz dXJlIGFib3V0IGNvbnRpbnVpbmcgdG8gdXNlIHRoaXMgbWV0aG9kIGZvciBuZXcgZmVhdHVyZS4K SWYgcG9zc2libGUsIGhvcGUgdG8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgYmluZGluZyBzdHlsZQp3 aXRoIG5ldyBtZXRob2QgbGlrZSBvZl9ncmFwaC4gQWN0dWFsbHksIEkgZG9uJ3Qga25vdyB0aGUg Y29ycmVjdCBtZXRob2QuCgoKT24gMTkuIDkuIDE5LiDsmKTtm4QgMTE6MjIsIEFydHVyIMWad2ln b8WEIHdyb3RlOgo+IEZyb206IEFydHVyIMWad2lnb8WEIDxhLnN3aWdvbkBwYXJ0bmVyLnNhbXN1 bmcuY29tPgo+IAo+IFRoaXMgcGF0Y2ggYWRkcyBpbnRlcmNvbm5lY3QgZnVuY3Rpb25hbGl0eSB0 byB0aGUgZXh5bm9zLWJ1cyBkZXZmcmVxCj4gZHJpdmVyLgo+IAo+IFRoZSBTb0MgdG9wb2xvZ3kg aXMgYSBncmFwaCAob3IsIG1vcmUgc3BlY2lmaWNhbGx5LCBhIHRyZWUpIGFuZCBtb3N0IG9mCj4g aXRzIGVkZ2VzIGFyZSB0YWtlbiBmcm9tIHRoZSBkZXZmcmVxIHBhcmVudC1jaGlsZCBoaWVyYXJj aHkgKGNmLgo+IERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kZXZmcmVxL2V4eW5v cy1idXMudHh0KS4gRHVlIHRvCj4gdW5zcGVjaWZpZWQgcmVsYXRpdmUgcHJvYmluZyBvcmRlciwg LUVQUk9CRV9ERUZFUiBtYXkgYmUgcHJvcGFnYXRlZCB0bwo+IGd1YXJhbnRlZSB0aGF0IGEgY2hp bGQgaXMgcHJvYmVkIGJlZm9yZSBpdHMgcGFyZW50Lgo+IAo+IEVhY2ggYnVzIGlzIG5vdyBhbiBp bnRlcmNvbm5lY3QgcHJvdmlkZXIgYW5kIGFuIGludGVyY29ubmVjdCBub2RlIGFzIHdlbGwKPiAo Y2YuIERvY3VtZW50YXRpb24vaW50ZXJjb25uZWN0L2ludGVyY29ubmVjdC5yc3QpLCBpLmUuIGV2 ZXJ5IGJ1cyByZWdpc3RlcnMKPiBpdHNlbGYgYXMgYSBub2RlLiBOb2RlIElEcyBhcmUgbm90IGhh cmRjb2RlZCBidXQgcmF0aGVyIGFzc2lnbmVkIGF0Cj4gcnVudGltZSwgaW4gcHJvYmluZyBvcmRl ciAoc3ViamVjdCB0byB0aGUgYWJvdmUtbWVudGlvbmVkIGV4Y2VwdGlvbgo+IHJlZ2FyZGluZyBy ZWxhdGl2ZSBvcmRlcikuIFRoaXMgYXBwcm9hY2ggYWxsb3dzIGZvciB1c2luZyB0aGlzIGRyaXZl ciB3aXRoCj4gdmFyaW91cyBFeHlub3MgU29Dcy4KPiAKPiBGcmVxdWVuY2llcyByZXF1ZXN0ZWQg dmlhIHRoZSBpbnRlcmNvbm5lY3QgQVBJIGZvciBhIGdpdmVuIG5vZGUgYXJlCj4gcHJvcGFnYXRl ZCB0byBkZXZmcmVxIHVzaW5nIGRldl9wbV9xb3NfdXBkYXRlX3JlcXVlc3QoKS4gUGxlYXNlIG5v dGUgdGhhdAo+IGl0IGlzIG5vdCBhbiBlcnJvciB3aGVuIENPTkZJR19JTlRFUkNPTk5FQ1QgaXMg J24nLCBpbiB3aGljaCBjYXNlIGFsbAo+IGludGVyY29ubmVjdCBBUEkgZnVuY3Rpb25zIGFyZSBu by1vcC4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBBcnR1ciDFmndpZ2/FhCA8YS5zd2lnb25AcGFydG5l ci5zYW1zdW5nLmNvbT4KPiAtLS0KPiAgZHJpdmVycy9kZXZmcmVxL2V4eW5vcy1idXMuYyB8IDE1 MyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ICAxIGZpbGUgY2hhbmdlZCwg MTUzIGluc2VydGlvbnMoKykKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL2V4eW5v cy1idXMuYyBiL2RyaXZlcnMvZGV2ZnJlcS9leHlub3MtYnVzLmMKPiBpbmRleCA4ZDQ0ODEwY2Fj NjkuLmUwMjMyMjAyNzIwZCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2RldmZyZXEvZXh5bm9zLWJ1 cy5jCj4gKysrIGIvZHJpdmVycy9kZXZmcmVxL2V4eW5vcy1idXMuYwo+IEBAIC0xNCwxNCArMTQs MTkgQEAKPiAgI2luY2x1ZGUgPGxpbnV4L2RldmZyZXEtZXZlbnQuaD4KPiAgI2luY2x1ZGUgPGxp bnV4L2RldmljZS5oPgo+ICAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Cj4gKyNpbmNsdWRlIDxs aW51eC9pZHIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2ludGVyY29ubmVjdC1wcm92aWRlci5oPgo+ ICAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9vZi5oPgo+ICAj aW5jbHVkZSA8bGludXgvcG1fb3BwLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KPiAg I2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ICAjaW5jbHVkZSA8bGludXgvcmVn dWxhdG9yL2NvbnN1bWVyLmg+Cj4gIAo+ICAjZGVmaW5lIERFRkFVTFRfU0FUVVJBVElPTl9SQVRJ Twk0MAo+ICAKPiArI2RlZmluZSBpY2NfdW5pdHNfdG9fa2h6KHgpICgoeCkgLyA4KQo+ICsKPiAg c3RydWN0IGV4eW5vc19idXMgewo+ICAJc3RydWN0IGRldmljZSAqZGV2Owo+ICAKPiBAQCAtMzUs NiArNDAsMTIgQEAgc3RydWN0IGV4eW5vc19idXMgewo+ICAJc3RydWN0IG9wcF90YWJsZSAqb3Bw X3RhYmxlOwo+ICAJc3RydWN0IGNsayAqY2xrOwo+ICAJdW5zaWduZWQgaW50IHJhdGlvOwo+ICsK PiArCS8qIE9uZSBwcm92aWRlciBwZXIgYnVzLCBvbmUgbm9kZSBwZXIgcHJvdmlkZXIgKi8KPiAr CXN0cnVjdCBpY2NfcHJvdmlkZXIgcHJvdmlkZXI7Cj4gKwlzdHJ1Y3QgaWNjX25vZGUgKm5vZGU7 Cj4gKwo+ICsJc3RydWN0IGRldl9wbV9xb3NfcmVxdWVzdCBxb3NfcmVxOwo+ICB9Owo+ICAKPiAg LyoKPiBAQCAtNTksNiArNzAsMTMgQEAgZXh5bm9zX2J1c19vcHNfZWRldihlbmFibGVfZWRldik7 Cj4gIGV4eW5vc19idXNfb3BzX2VkZXYoZGlzYWJsZV9lZGV2KTsKPiAgZXh5bm9zX2J1c19vcHNf ZWRldihzZXRfZXZlbnQpOwo+ICAKPiArc3RhdGljIGludCBleHlub3NfYnVzX25leHRfaWQodm9p ZCkKPiArewo+ICsJc3RhdGljIERFRklORV9JREEoZXh5bm9zX2J1c19pY2NfaWRhKTsKPiArCj4g KwlyZXR1cm4gaWRhX2FsbG9jKCZleHlub3NfYnVzX2ljY19pZGEsIEdGUF9LRVJORUwpOwo+ICt9 Cj4gKwo+ICBzdGF0aWMgaW50IGV4eW5vc19idXNfZ2V0X2V2ZW50KHN0cnVjdCBleHlub3NfYnVz ICpidXMsCj4gIAkJCQlzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kYXRhICplZGF0YSkKPiAgewo+IEBA IC0xNzEsNiArMTg5LDM4IEBAIHN0YXRpYyB2b2lkIGV4eW5vc19idXNfcGFzc2l2ZV9leGl0KHN0 cnVjdCBkZXZpY2UgKmRldikKPiAgCWNsa19kaXNhYmxlX3VucHJlcGFyZShidXMtPmNsayk7Cj4g IH0KPiAgCj4gK3N0YXRpYyBpbnQgZXh5bm9zX2J1c19pY2Nfc2V0KHN0cnVjdCBpY2Nfbm9kZSAq c3JjLCBzdHJ1Y3QgaWNjX25vZGUgKmRzdCkKPiArewo+ICsJc3RydWN0IGV4eW5vc19idXMgKnNy Y19idXMgPSBzcmMtPmRhdGEsICpkc3RfYnVzID0gZHN0LT5kYXRhOwo+ICsJczMyIHNyY19mcmVx ID0gaWNjX3VuaXRzX3RvX2toeihzcmMtPmF2Z19idyk7Cj4gKwlzMzIgZHN0X2ZyZXEgPSBpY2Nf dW5pdHNfdG9fa2h6KGRzdC0+YXZnX2J3KTsKPiArCj4gKwlkZXZfcG1fcW9zX3VwZGF0ZV9yZXF1 ZXN0KCZzcmNfYnVzLT5xb3NfcmVxLCBzcmNfZnJlcSk7Cj4gKwlkZXZfcG1fcW9zX3VwZGF0ZV9y ZXF1ZXN0KCZkc3RfYnVzLT5xb3NfcmVxLCBkc3RfZnJlcSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgZXh5bm9zX2J1c19pY2NfYWdncmVnYXRlKHN0cnVjdCBpY2Nf bm9kZSAqbm9kZSwgdTMyIHRhZywgdTMyIGF2Z19idywKPiArCQkJCSAgICB1MzIgcGVha19idywg dTMyICphZ2dfYXZnLCB1MzIgKmFnZ19wZWFrKQo+ICt7Cj4gKwkqYWdnX2F2ZyArPSBhdmdfYnc7 Cj4gKwkqYWdnX3BlYWsgPSBtYXgoKmFnZ19wZWFrLCBwZWFrX2J3KTsKPiArCj4gKwlyZXR1cm4g MDsKPiArfQo+ICsKPiArc3RhdGljIHN0cnVjdCBpY2Nfbm9kZSAqZXh5bm9zX2J1c19pY2NfeGxh dGUoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqc3BlYywKPiArCQkJCQkgICAgIHZvaWQgKmRhdGEp Cj4gK3sKPiArCXN0cnVjdCBleHlub3NfYnVzICpidXMgPSBkYXRhOwo+ICsKPiArCWlmIChzcGVj LT5ucCAhPSBidXMtPmRldi0+b2Zfbm9kZSkKPiArCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsK PiArCj4gKwlyZXR1cm4gYnVzLT5ub2RlOwo+ICt9Cj4gKwo+ICBzdGF0aWMgaW50IGV4eW5vc19i dXNfcGFyZW50X3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCj4gIAkJCQkJc3RydWN0 IGV4eW5vc19idXMgKmJ1cykKPiAgewo+IEBAIC0zNjYsNiArNDE2LDEwMSBAQCBzdGF0aWMgaW50 IGV4eW5vc19idXNfcHJvZmlsZV9pbml0X3Bhc3NpdmUoc3RydWN0IGV4eW5vc19idXMgKmJ1cywK PiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ICtzdGF0aWMgaW50IGV4eW5vc19idXNfaWNjX2Nvbm5l Y3Qoc3RydWN0IGV4eW5vc19idXMgKmJ1cykKPiArewo+ICsJc3RydWN0IGRldmljZV9ub2RlICpu cCA9IGJ1cy0+ZGV2LT5vZl9ub2RlOwo+ICsJc3RydWN0IGRldmZyZXEgKnBhcmVudF9kZXZmcmVx Owo+ICsJc3RydWN0IGljY19ub2RlICpwYXJlbnRfbm9kZSA9IE5VTEw7Cj4gKwlzdHJ1Y3Qgb2Zf cGhhbmRsZV9hcmdzIGFyZ3M7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCj4gKwlwYXJlbnRfZGV2ZnJl cSA9IGRldmZyZXFfZ2V0X2RldmZyZXFfYnlfcGhhbmRsZShidXMtPmRldiwgMCk7Cj4gKwlpZiAo IUlTX0VSUihwYXJlbnRfZGV2ZnJlcSkpIHsKPiArCQlzdHJ1Y3QgZXh5bm9zX2J1cyAqcGFyZW50 X2J1czsKPiArCj4gKwkJcGFyZW50X2J1cyA9IGRldl9nZXRfZHJ2ZGF0YShwYXJlbnRfZGV2ZnJl cS0+ZGV2LnBhcmVudCk7Cj4gKwkJcGFyZW50X25vZGUgPSBwYXJlbnRfYnVzLT5ub2RlOwo+ICsJ fSBlbHNlIHsKPiArCQkvKiBMb29rIGZvciBwYXJlbnQgaW4gRFQgKi8KPiArCQlpbnQgbnVtID0g b2ZfY291bnRfcGhhbmRsZV93aXRoX2FyZ3MobnAsICJwYXJlbnQiLAo+ICsJCQkJCQkgICAgICIj aW50ZXJjb25uZWN0LWNlbGxzIik7Cj4gKwkJaWYgKG51bSAhPSAxKQo+ICsJCQlnb3RvIG91dDsg LyogJ3BhcmVudCcgaXMgb3B0aW9uYWwgKi8KPiArCj4gKwkJcmV0ID0gb2ZfcGFyc2VfcGhhbmRs ZV93aXRoX2FyZ3MobnAsICJwYXJlbnQiLAo+ICsJCQkJCQkgIiNpbnRlcmNvbm5lY3QtY2VsbHMi LAo+ICsJCQkJCQkgMCwgJmFyZ3MpOwo+ICsJCWlmIChyZXQgPCAwKQo+ICsJCQlnb3RvIG91dDsK PiArCj4gKwkJb2Zfbm9kZV9wdXQoYXJncy5ucCk7Cj4gKwo+ICsJCXBhcmVudF9ub2RlID0gb2Zf aWNjX2dldF9mcm9tX3Byb3ZpZGVyKCZhcmdzKTsKPiArCQlpZiAoSVNfRVJSKHBhcmVudF9ub2Rl KSkgewo+ICsJCQkvKiBNYXkgYmUgLUVQUk9CRV9ERUZFUiAqLwo+ICsJCQlyZXQgPSBQVFJfRVJS KHBhcmVudF9ub2RlKTsKPiArCQkJZ290byBvdXQ7Cj4gKwkJfQo+ICsJfQoKCgo+ICsKPiArCXJl dCA9IGljY19saW5rX2NyZWF0ZShidXMtPm5vZGUsIHBhcmVudF9ub2RlLT5pZCk7Cj4gKwo+ICtv dXQ6Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGV4eW5vc19idXNfaWNj X2luaXQoc3RydWN0IGV4eW5vc19idXMgKmJ1cykKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2 ID0gYnVzLT5kZXY7Cj4gKwlzdHJ1Y3QgaWNjX3Byb3ZpZGVyICpwcm92aWRlciA9ICZidXMtPnBy b3ZpZGVyOwo+ICsJc3RydWN0IGljY19ub2RlICpub2RlOwo+ICsJaW50IGlkLCByZXQ7Cj4gKwo+ ICsJLyogSW5pdGlhbGl6ZSB0aGUgaW50ZXJjb25uZWN0IHByb3ZpZGVyICovCj4gKwlwcm92aWRl ci0+c2V0ID0gZXh5bm9zX2J1c19pY2Nfc2V0Owo+ICsJcHJvdmlkZXItPmFnZ3JlZ2F0ZSA9IGV4 eW5vc19idXNfaWNjX2FnZ3JlZ2F0ZTsKPiArCXByb3ZpZGVyLT54bGF0ZSA9IGV4eW5vc19idXNf aWNjX3hsYXRlOwo+ICsJcHJvdmlkZXItPmRldiA9IGRldjsKPiArCXByb3ZpZGVyLT5kYXRhID0g YnVzOwo+ICsKPiArCXJldCA9IGljY19wcm92aWRlcl9hZGQocHJvdmlkZXIpOwo+ICsJaWYgKHJl dCA8IDApCj4gKwkJZ290byBvdXQ7Cj4gKwo+ICsJcmV0ID0gaWQgPSBleHlub3NfYnVzX25leHRf aWQoKTsKPiArCWlmIChyZXQgPCAwKQo+ICsJCWdvdG8gZXJyX25vZGU7Cj4gKwo+ICsJbm9kZSA9 IGljY19ub2RlX2NyZWF0ZShpZCk7Cj4gKwlpZiAoSVNfRVJSKG5vZGUpKSB7Cj4gKwkJcmV0ID0g UFRSX0VSUihub2RlKTsKPiArCQlnb3RvIGVycl9ub2RlOwo+ICsJfQo+ICsKPiArCWJ1cy0+bm9k ZSA9IG5vZGU7Cj4gKwlub2RlLT5uYW1lID0gZGV2LT5vZl9ub2RlLT5uYW1lOwo+ICsJbm9kZS0+ ZGF0YSA9IGJ1czsKPiArCWljY19ub2RlX2FkZChub2RlLCBwcm92aWRlcik7Cj4gKwo+ICsJcmV0 ID0gZXh5bm9zX2J1c19pY2NfY29ubmVjdChidXMpOwo+ICsJaWYgKHJldCA8IDApCj4gKwkJZ290 byBlcnJfY29ubmVjdDsKPiArCj4gKwlyZXQgPSBkZXZfcG1fcW9zX2FkZF9yZXF1ZXN0KGJ1cy0+ ZGV2ZnJlcS0+ZGV2LnBhcmVudCwgJmJ1cy0+cW9zX3JlcSwKPiArCQkJCSAgICAgREVWX1BNX1FP U19NSU5fRlJFUVVFTkNZLCAwKTsKPiArCj4gK291dDoKPiArCXJldHVybiByZXQ7Cj4gKwo+ICtl cnJfY29ubmVjdDoKPiArCWljY19ub2RlX2RlbChub2RlKTsKPiArCWljY19ub2RlX2Rlc3Ryb3ko aWQpOwo+ICtlcnJfbm9kZToKPiArCWljY19wcm92aWRlcl9kZWwocHJvdmlkZXIpOwo+ICsKPiAr CXJldHVybiByZXQ7Cj4gK30KPiArCj4gIHN0YXRpYyBpbnQgZXh5bm9zX2J1c19wcm9iZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICB7Cj4gIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAm cGRldi0+ZGV2Owo+IEBAIC00MTUsNiArNTYwLDE0IEBAIHN0YXRpYyBpbnQgZXh5bm9zX2J1c19w cm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICAJaWYgKHJldCA8IDApCj4gIAkJ Z290byBlcnI7Cj4gIAo+ICsJLyoKPiArCSAqIEluaXRpYWxpemUgaW50ZXJjb25uZWN0IHByb3Zp ZGVyLiBBIHJldHVybiB2YWx1ZSBvZiAtRU5PVFNVUFAgbWVhbnMKPiArCSAqIHRoYXQgQ09ORklH X0lOVEVSQ09OTkVDVCBpcyBkaXNhYmxlZC4KPiArCSAqLwo+ICsJcmV0ID0gZXh5bm9zX2J1c19p Y2NfaW5pdChidXMpOwo+ICsJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9UU1VQUCkKPiArCQln b3RvIGVycjsKPiArCj4gIAltYXhfc3RhdGUgPSBidXMtPmRldmZyZXEtPnByb2ZpbGUtPm1heF9z dGF0ZTsKPiAgCW1pbl9mcmVxID0gKGJ1cy0+ZGV2ZnJlcS0+cHJvZmlsZS0+ZnJlcV90YWJsZVsw XSAvIDEwMDApOwo+ICAJbWF4X2ZyZXEgPSAoYnVzLT5kZXZmcmVxLT5wcm9maWxlLT5mcmVxX3Rh YmxlW21heF9zdGF0ZSAtIDFdIC8gMTAwMCk7Cj4gCgoKLS0gCkJlc3QgUmVnYXJkcywKQ2hhbndv byBDaG9pClNhbXN1bmcgRWxlY3Ryb25pY3MKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFy bS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK