From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 962FC50A77 for ; Tue, 23 Jan 2024 10:33:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706006030; cv=none; b=tpR2pMFxE94CPeu0j55Unslq5qKS5Zih0t1oBLNX2vr2XMeiAUs5OF52Y1sf0gi9cS8tcCpBAk+1SeQempPD0eEW0MvfHbjG/cY/QiXzRr3thUQ+cnDJ8BAhd8X5fUd6FKNh5j55AhEkOq0fM+hgNNYm+RFm/RmwO85hkr8PgZ4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706006030; c=relaxed/simple; bh=+VwbuQ5RMqO/5eyhvD9p+fu+hN6uLjI6W//d4Lnp4Cs=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=Mka97QzQoaIKksKjuoXABMHualLifc4kojTnnEq3RxQQnJB6wFQ2X9PlYiljzjT0mgt4TXY/U6cNkjXtXyb/0uIcR+/QewPn6Pj4PWyB9lJHcIyYV4ug9Zjpzr8lFE26Ur/4q31IOx+I8XYHpYcdHvCTLmYWpJJKeP46H9ykwko= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 77D8F1FB; Tue, 23 Jan 2024 02:34:33 -0800 (PST) Received: from bogus (e103737-lin.cambridge.arm.com [10.1.197.49]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DB3D83F5A1; Tue, 23 Jan 2024 02:33:46 -0800 (PST) Date: Tue, 23 Jan 2024 10:33:44 +0000 From: Sudeep Holla To: Ben Horgan Cc: "linux-arm-kernel@lists.infradead.org" , nd , Vishnu Banavath , Florent Tomasin , Sudeep Holla , Cristian Marussi , Ulf Hansson , "linux-pm@vger.kernel.org" Subject: Re: Using scmi performance domains and scmi power domains together Message-ID: References: Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: (+ Cristian) On Mon, Jan 22, 2024 at 08:27:03PM +0000, Ben Horgan wrote: > Hi, > > I've been looking at adding support in total compute, an arm reference > platform, to control the gpu operating points and gpu power on/off via scmi. > This was previously done for the juno platform but involved hacks. I would > like to make sure this is cleaner going forward. > > For device driver simplicity it would be good if a device with a single > power domain and a single performance domain could just use a single PM > domain. Do you have any other technical reason for this other than simplicity ? We can't always have to so simple when managing to support wide variety of platforms with standards like SCMI. You need to justify why it is hard for the driver if there are 2 genpd domains associated with a device(power and perf genpds). > Using a single PM domain means this can be on the platform device > and you don't need to create virtual devices. The drivers scmi_pm_domain and > scmi_perf_domain both initialize a separate 'struct generic_pm_domain genpd' > for each of the corresponding scmi domains. Possibly, there could be some > way to bring these together under a single genpd domain. Possible options > are: > > A. Parent power domains with a helper driver that just uses an empty genpd > domain as the child of both the genpd performance domain and the genpd power > domain. > B. Combine the scmi_pm_domain and scmi_perf_domain driver and create a > 'struct generic_pm_domain genpd' for every pair of power domain and > performance domain. This is purely software implementation and expect no change in the firmware (DT) representation of these domains and association with the device. > C. Combine the scmi_pm_domain and scmi_perf_domain driver but only create > the 'struct generic_pm_domain genpd' for the power domain combinations that > are used. Not possible unless the specification assures the power domain and the performance domain IDs match. > D. Keep things as they are and use separate PM domains for performance and > power when using scmi. +1, it was designed this way to ensure it addresses all the possible implementations using SCMI. > > Examples of possible ways of expressing these options in the device tree, > the scmi performance domain is 3 and the scmi power domain is 8. > > A. > > scmi_devpd: protocol@11 { > reg = <0x11>; > #power-domain-cells = <1>; > }; > > scmi_dvfs: protocol@13 { > reg = <0x13>; > #power-domain-cells = <1>; > }; > > perf_and_performance: perf_and_performance { > power-domain-names = "perf", "power"; > power-domain = <&scmi_dvfs 3>, <&scmi_devpd 8>; > }; > > my_device : my_device { > power-domain = <&perf_and_performance> > }; > NACK as I mentioned, we need to keep DT representation as minimal as possible, adding nodes for this virtual domain is a no go IMO. Just use the existing binding to create this virtual genpd at which point you may realise handling 2 genpd in the driver may not be so hard 😄. > B. Combine on every pair > > scmi_pm_perf: protocol@11_13 { > reg = <0x11>, <0x13>; > #power-domain-cells = <2>; > }; > > my_device : my_device { > power-domain = <&scmi_pm_perf 8 3> > }; > Again big fat NACK as above. No change in the binding to make it confusing. > C. Combine on used pairs > > scmi_pm_perf: protocol@11_13 { > reg = <0x11>, <0x13>; > #power-domain-cells = <2>; > used-domains = <8, 3>, <9, 4>; > }; > > my_device : my_device { > power-domain = <&scmi_pm_perf 8 3> > }; > At this point I give up and will just say I would expect no change in the DT bindings to achieve whatever you are terming as "simple" here. We are not going to add any bindings to make it easy or simple for OS to implement it's policy. > It seems wasteful that the scmi_pm_domain sets up and makes scmi calls for > all possibly usable domains at start up even those that aren't controllable > by linux. E.g. cpus may use scmi power domain controlled via psci. > Not an OS issue. If the power domain is purely controlled by PSCI agent, why is it even present to OS as SCMI power domain. We have examples where it is correctly presented as PSCI power domain. So this issue doesn't exist, fix the SCMI platform firmware. It needs to present per agent view correctly and not present a global system view to all the agents. Unless I hear strong technical reasons to this approach other than simplicity, I am inclined towards opposing this proposal. -- Regards, Sudeep 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id A6B62C47DDB for ; Tue, 23 Jan 2024 10:34:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=VkH1n1zdMWLVfNXATx7s+OjbyD3uPOX9He1C7qLo2+s=; b=QIZutkmbDKhrmC xcjGXNzKnYTo7mFFhEYTNt0LcFIYLNA75N5/k/OavFye0Gxpv1x2w4XBu64mioKWg83ozmHuiEjiS sZx6RmGMrJg7WvlGTHM26o0dg0mcobj9p2ipgH9qjjUaf+4rfD2YM8gn1PNcw8Yufs02S+Fu6TasF VdOW/57l1caC66qExI+KJJ/wwt092BRsrJ3Zy5V7tzO2kPYktr282lWjso7y97u/QgeJfux86ZuLs K8/qg3iuCyvx5jGRdZ7305GYJqGxRXDMMeXeIgLi1eN2nl953pjq2G9+enLr+s9zRC37ExYfKUNXP 0cBYwHDR7YHYIjaF5yVA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rSE6L-00FxGS-2f; Tue, 23 Jan 2024 10:33:53 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rSE6I-00FxEb-1V for linux-arm-kernel@lists.infradead.org; Tue, 23 Jan 2024 10:33:52 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 77D8F1FB; Tue, 23 Jan 2024 02:34:33 -0800 (PST) Received: from bogus (e103737-lin.cambridge.arm.com [10.1.197.49]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DB3D83F5A1; Tue, 23 Jan 2024 02:33:46 -0800 (PST) Date: Tue, 23 Jan 2024 10:33:44 +0000 From: Sudeep Holla To: Ben Horgan Cc: "linux-arm-kernel@lists.infradead.org" , nd , Vishnu Banavath , Florent Tomasin , Sudeep Holla , Cristian Marussi , Ulf Hansson , "linux-pm@vger.kernel.org" Subject: Re: Using scmi performance domains and scmi power domains together Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240123_023350_601004_13DDBEC3 X-CRM114-Status: GOOD ( 31.61 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org KCsgQ3Jpc3RpYW4pCgpPbiBNb24sIEphbiAyMiwgMjAyNCBhdCAwODoyNzowM1BNICswMDAwLCBC ZW4gSG9yZ2FuIHdyb3RlOgo+IEhpLAo+Cj4gSSd2ZSBiZWVuIGxvb2tpbmcgYXQgYWRkaW5nIHN1 cHBvcnQgaW4gdG90YWwgY29tcHV0ZSwgYW4gYXJtIHJlZmVyZW5jZQo+IHBsYXRmb3JtLCB0byBj b250cm9sIHRoZSBncHUgb3BlcmF0aW5nIHBvaW50cyBhbmQgZ3B1IHBvd2VyIG9uL29mZiB2aWEg c2NtaS4KPiBUaGlzIHdhcyBwcmV2aW91c2x5IGRvbmUgZm9yIHRoZSBqdW5vIHBsYXRmb3JtIGJ1 dCBpbnZvbHZlZCBoYWNrcy4gSSB3b3VsZAo+IGxpa2UgdG8gbWFrZSBzdXJlIHRoaXMgaXMgY2xl YW5lciBnb2luZyBmb3J3YXJkLgo+Cj4gRm9yIGRldmljZSBkcml2ZXIgc2ltcGxpY2l0eSBpdCB3 b3VsZCBiZSBnb29kIGlmIGEgZGV2aWNlIHdpdGggYSBzaW5nbGUKPiBwb3dlciBkb21haW4gYW5k IGEgc2luZ2xlIHBlcmZvcm1hbmNlIGRvbWFpbiBjb3VsZCBqdXN0IHVzZSBhIHNpbmdsZSBQTQo+ IGRvbWFpbi4KCkRvIHlvdSBoYXZlIGFueSBvdGhlciB0ZWNobmljYWwgcmVhc29uIGZvciB0aGlz IG90aGVyIHRoYW4gc2ltcGxpY2l0eSA/CldlIGNhbid0IGFsd2F5cyBoYXZlIHRvIHNvIHNpbXBs ZSB3aGVuIG1hbmFnaW5nIHRvIHN1cHBvcnQgd2lkZSB2YXJpZXR5Cm9mIHBsYXRmb3JtcyB3aXRo IHN0YW5kYXJkcyBsaWtlIFNDTUkuCgpZb3UgbmVlZCB0byBqdXN0aWZ5IHdoeSBpdCBpcyBoYXJk IGZvciB0aGUgZHJpdmVyIGlmIHRoZXJlIGFyZSAyIGdlbnBkCmRvbWFpbnMgYXNzb2NpYXRlZCB3 aXRoIGEgZGV2aWNlKHBvd2VyIGFuZCBwZXJmIGdlbnBkcykuCgo+IFVzaW5nIGEgc2luZ2xlIFBN IGRvbWFpbiBtZWFucyB0aGlzIGNhbiBiZSBvbiB0aGUgcGxhdGZvcm0gZGV2aWNlCj4gYW5kIHlv dSBkb24ndCBuZWVkIHRvIGNyZWF0ZSB2aXJ0dWFsIGRldmljZXMuIFRoZSBkcml2ZXJzIHNjbWlf cG1fZG9tYWluIGFuZAo+IHNjbWlfcGVyZl9kb21haW4gYm90aCBpbml0aWFsaXplIGEgc2VwYXJh dGUgJ3N0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiBnZW5wZCcKPiBmb3IgZWFjaCBvZiB0aGUgY29y cmVzcG9uZGluZyBzY21pIGRvbWFpbnMuIFBvc3NpYmx5LCB0aGVyZSBjb3VsZCBiZSBzb21lCj4g d2F5IHRvIGJyaW5nIHRoZXNlIHRvZ2V0aGVyIHVuZGVyIGEgc2luZ2xlIGdlbnBkIGRvbWFpbi4g UG9zc2libGUgb3B0aW9ucwo+IGFyZToKPiAKPiBBLiBQYXJlbnQgcG93ZXIgZG9tYWlucyB3aXRo IGEgaGVscGVyIGRyaXZlciB0aGF0IGp1c3QgdXNlcyBhbiBlbXB0eSBnZW5wZAo+IGRvbWFpbiBh cyB0aGUgY2hpbGQgb2YgYm90aCB0aGUgZ2VucGQgcGVyZm9ybWFuY2UgZG9tYWluIGFuZCB0aGUg Z2VucGQgcG93ZXIKPiBkb21haW4uCj4gQi4gQ29tYmluZSB0aGUgc2NtaV9wbV9kb21haW4gYW5k IHNjbWlfcGVyZl9kb21haW4gZHJpdmVyIGFuZCBjcmVhdGUgYQo+ICdzdHJ1Y3QgZ2VuZXJpY19w bV9kb21haW4gZ2VucGQnIGZvciBldmVyeSBwYWlyIG9mIHBvd2VyIGRvbWFpbiBhbmQKPiBwZXJm b3JtYW5jZSBkb21haW4uCgpUaGlzIGlzIHB1cmVseSBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbiBh bmQgZXhwZWN0IG5vIGNoYW5nZSBpbiB0aGUgZmlybXdhcmUKKERUKSByZXByZXNlbnRhdGlvbiBv ZiB0aGVzZSBkb21haW5zIGFuZCBhc3NvY2lhdGlvbiB3aXRoIHRoZSBkZXZpY2UuCgo+IEMuIENv bWJpbmUgdGhlIHNjbWlfcG1fZG9tYWluIGFuZCBzY21pX3BlcmZfZG9tYWluIGRyaXZlciBidXQg b25seSBjcmVhdGUKPiB0aGUgJ3N0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiBnZW5wZCcgZm9yIHRo ZSBwb3dlciBkb21haW4gY29tYmluYXRpb25zIHRoYXQKPiBhcmUgdXNlZC4KCk5vdCBwb3NzaWJs ZSB1bmxlc3MgdGhlIHNwZWNpZmljYXRpb24gYXNzdXJlcyB0aGUgcG93ZXIgZG9tYWluIGFuZCB0 aGUKcGVyZm9ybWFuY2UgZG9tYWluIElEcyBtYXRjaC4KCj4gRC4gS2VlcCB0aGluZ3MgYXMgdGhl eSBhcmUgYW5kIHVzZSBzZXBhcmF0ZSBQTSBkb21haW5zIGZvciBwZXJmb3JtYW5jZSBhbmQKPiBw b3dlciB3aGVuIHVzaW5nIHNjbWkuCgorMSwgaXQgd2FzIGRlc2lnbmVkIHRoaXMgd2F5IHRvIGVu c3VyZSBpdCBhZGRyZXNzZXMgYWxsIHRoZSBwb3NzaWJsZQppbXBsZW1lbnRhdGlvbnMgdXNpbmcg U0NNSS4KCj4KPiBFeGFtcGxlcyBvZiBwb3NzaWJsZSB3YXlzIG9mIGV4cHJlc3NpbmcgdGhlc2Ug b3B0aW9ucyBpbiB0aGUgZGV2aWNlIHRyZWUsCj4gdGhlIHNjbWkgcGVyZm9ybWFuY2UgZG9tYWlu IGlzIDMgYW5kIHRoZSBzY21pIHBvd2VyIGRvbWFpbiBpcyA4Lgo+Cj4gQS4KPgo+IHNjbWlfZGV2 cGQ6IHByb3RvY29sQDExIHsKPiAgICAgICAgIHJlZyA9IDwweDExPjsKPiAgICAgICAgICNwb3dl ci1kb21haW4tY2VsbHMgPSA8MT47Cj4gfTsKPgo+IHNjbWlfZHZmczogcHJvdG9jb2xAMTMgewo+ ICAgICAgICAgcmVnID0gPDB4MTM+Owo+ICAgICAgICAgI3Bvd2VyLWRvbWFpbi1jZWxscyA9IDwx PjsKPiB9Owo+Cj4gcGVyZl9hbmRfcGVyZm9ybWFuY2U6IHBlcmZfYW5kX3BlcmZvcm1hbmNlIHsK PiAgICAgICAgIHBvd2VyLWRvbWFpbi1uYW1lcyA9ICJwZXJmIiwgInBvd2VyIjsKPiAgICAgICAg IHBvd2VyLWRvbWFpbiA9IDwmc2NtaV9kdmZzIDM+LCA8JnNjbWlfZGV2cGQgOD47Cj4gfTsKPgo+ IG15X2RldmljZSA6IG15X2RldmljZSAgewo+ICAgICAgICAgcG93ZXItZG9tYWluID0gPCZwZXJm X2FuZF9wZXJmb3JtYW5jZT4KPiB9Owo+CgpOQUNLIGFzIEkgbWVudGlvbmVkLCB3ZSBuZWVkIHRv IGtlZXAgRFQgcmVwcmVzZW50YXRpb24gYXMgbWluaW1hbCBhcwpwb3NzaWJsZSwgYWRkaW5nIG5v ZGVzIGZvciB0aGlzIHZpcnR1YWwgZG9tYWluIGlzIGEgbm8gZ28gSU1PLiBKdXN0CnVzZSB0aGUg ZXhpc3RpbmcgYmluZGluZyB0byBjcmVhdGUgdGhpcyB2aXJ0dWFsIGdlbnBkIGF0IHdoaWNoIHBv aW50IHlvdQptYXkgcmVhbGlzZSBoYW5kbGluZyAyIGdlbnBkIGluIHRoZSBkcml2ZXIgbWF5IG5v dCBiZSBzbyBoYXJkIPCfmIQuCgo+IEIuIENvbWJpbmUgb24gZXZlcnkgcGFpcgo+Cj4gc2NtaV9w bV9wZXJmOiBwcm90b2NvbEAxMV8xMyB7Cj4gICAgICAgICByZWcgPSA8MHgxMT4sIDwweDEzPjsK PiAgICAgICAgICNwb3dlci1kb21haW4tY2VsbHMgPSA8Mj47Cj4gfTsKPgo+IG15X2RldmljZSA6 IG15X2RldmljZSB7Cj4gICAgICAgICBwb3dlci1kb21haW4gPSA8JnNjbWlfcG1fcGVyZiA4IDM+ Cj4gfTsKPgoKQWdhaW4gYmlnIGZhdCBOQUNLIGFzIGFib3ZlLiBObyBjaGFuZ2UgaW4gdGhlIGJp bmRpbmcgdG8gbWFrZSBpdCBjb25mdXNpbmcuCgo+IEMuIENvbWJpbmUgb24gdXNlZCBwYWlycwo+ Cj4gc2NtaV9wbV9wZXJmOiBwcm90b2NvbEAxMV8xMyB7Cj4gICAgICAgICByZWcgPSA8MHgxMT4s IDwweDEzPjsKPiAgICAgICAgICNwb3dlci1kb21haW4tY2VsbHMgPSA8Mj47Cj4gICAgICAgIHVz ZWQtZG9tYWlucyA9IDw4LCAzPiwgPDksIDQ+Owo+IH07Cj4KPiBteV9kZXZpY2UgOiBteV9kZXZp Y2Ugewo+ICAgICAgICAgcG93ZXItZG9tYWluID0gPCZzY21pX3BtX3BlcmYgOCAzPgo+IH07Cj4K CkF0IHRoaXMgcG9pbnQgSSBnaXZlIHVwIGFuZCB3aWxsIGp1c3Qgc2F5IEkgd291bGQgZXhwZWN0 IG5vIGNoYW5nZSBpbiB0aGUKRFQgYmluZGluZ3MgdG8gYWNoaWV2ZSB3aGF0ZXZlciB5b3UgYXJl IHRlcm1pbmcgYXMgInNpbXBsZSIgaGVyZS4gV2UgYXJlCm5vdCBnb2luZyB0byBhZGQgYW55IGJp bmRpbmdzIHRvIG1ha2UgaXQgZWFzeSBvciBzaW1wbGUgZm9yIE9TIHRvIGltcGxlbWVudAppdCdz IHBvbGljeS4KCj4gSXQgc2VlbXMgd2FzdGVmdWwgdGhhdCB0aGUgc2NtaV9wbV9kb21haW4gc2V0 cyB1cCBhbmQgbWFrZXMgc2NtaSBjYWxscyBmb3IKPiBhbGwgcG9zc2libHkgdXNhYmxlIGRvbWFp bnMgYXQgc3RhcnQgdXAgZXZlbiB0aG9zZSB0aGF0IGFyZW4ndCBjb250cm9sbGFibGUKPiBieSBs aW51eC4gRS5nLiBjcHVzIG1heSB1c2Ugc2NtaSBwb3dlciBkb21haW4gY29udHJvbGxlZCB2aWEg cHNjaS4KPgoKCk5vdCBhbiBPUyBpc3N1ZS4gSWYgdGhlIHBvd2VyIGRvbWFpbiBpcyBwdXJlbHkg Y29udHJvbGxlZCBieSBQU0NJIGFnZW50LCB3aHkKaXMgaXQgZXZlbiBwcmVzZW50IHRvIE9TIGFz IFNDTUkgcG93ZXIgZG9tYWluLiBXZSBoYXZlIGV4YW1wbGVzIHdoZXJlIGl0CmlzIGNvcnJlY3Rs eSBwcmVzZW50ZWQgYXMgUFNDSSBwb3dlciBkb21haW4uIFNvIHRoaXMgaXNzdWUgZG9lc24ndCBl eGlzdCwKZml4IHRoZSBTQ01JIHBsYXRmb3JtIGZpcm13YXJlLiBJdCBuZWVkcyB0byBwcmVzZW50 IHBlciBhZ2VudCB2aWV3IGNvcnJlY3RseQphbmQgbm90IHByZXNlbnQgYSBnbG9iYWwgc3lzdGVt IHZpZXcgdG8gYWxsIHRoZSBhZ2VudHMuCgpVbmxlc3MgSSBoZWFyIHN0cm9uZyB0ZWNobmljYWwg cmVhc29ucyB0byB0aGlzIGFwcHJvYWNoIG90aGVyIHRoYW4gc2ltcGxpY2l0eSwKSSBhbSBpbmNs aW5lZCB0b3dhcmRzIG9wcG9zaW5nIHRoaXMgcHJvcG9zYWwuCgotLSAKUmVnYXJkcywKU3VkZWVw CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1h cm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5v cmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0t a2VybmVsCg==