From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 79B3424B2A for ; Fri, 8 Mar 2024 21:58:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.180 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709935110; cv=none; b=Z1HjwBb5XUhoXIsNfWKP/j9zuhD5CHGnUiCgexJ9xiDFWEDZndYxmbpPzARjIyBlc9uO5Ljx8cBNBuuSDZaQ+xyr5ixFXwVmRxwMDN9ujTm1YbHiZcBUI72MlOKOScJH/QyNzmPbmKvnbZWm8GP7FqQLfNnS7Gdw5q4XB7Vy/p4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709935110; c=relaxed/simple; bh=jdRp3ycnJ2inLRjB5QbGRF0M5UnIWgjy+M+stLJdElI=; h=From:To:Cc:Subject:In-Reply-To:References:Date:Message-ID: MIME-Version:Content-Type; b=ANDCbwqW9fMzMdbo3d+I9bvj1mEp1i/eMMIqDaRESX+BBwm+uzM/4Fb0n2q4GsZR7j23j3spEzZqXNs96r6PukTbdp+nWGzIgt3qkaAUAuMr07tQBJ7Ao5mmNgyZFg+tH+GuMch5n1jhj/RD3que1QkMhgbCsUDldBvQw2jJ/4c= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org; spf=pass smtp.mailfrom=baylibre.com; arc=none smtp.client-ip=209.85.215.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-5dca1efad59so2041906a12.2 for ; Fri, 08 Mar 2024 13:58:27 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709935107; x=1710539907; h=content-transfer-encoding:mime-version:message-id:date:references :in-reply-to:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ssskNoWRSgCf0JIsEmdc/9vm6xbNQG/h290+Hjyy4Ms=; b=TD/lLVa8PwJMBrwrxiA2KfhiCRSt5O6FFKkz+DCkkmjj7SptTcNSeI4zi2q7h3VNkJ OdEFevbQQq6/rb5u/uRHgzCBoLUKkHI7+PezD2Lio0aPfmsKrNvazGSBjOrTcKIQgtlE +woIsL6149h2nAcgdYFVbKzdLjtTffcxTflPPnLzhdEnZssPlca33rno9jyDBx2rn0WG XGzXCaIfNmV3AZSWe7tPBmCa9JG8oZTt/zXFucyicxMtR0OW3BcGH+7JJuzbOZgqamUY LaIh0GuOWXOs5Y1BgVPIp4blNhs5GhvpntQGfrKoc5mjTJcqJUOneqp9iWzFOojM/uT8 ovUg== X-Forwarded-Encrypted: i=1; AJvYcCXigaQmWMEzJwOW4vmJ9VxexQjxfobGl73A1HkJNe3AJRwpaFFqeHdzhXnvTM6za7AWjt5d/JCHejSXOklEpUFKhYffwUuvNJhr X-Gm-Message-State: AOJu0YztRb86tSdCbOqfhNKJNadgcDrs3ZcauBcacArLZxq1RIYQfXQC 0LN/gDBggJZTXf5udpUhykKpJLfRcwSyc9hLOb5aDGiYX8S802l7L/Oa7avQXphmdY2vQEGSyoZ un2M= X-Google-Smtp-Source: AGHT+IFZ/B9Q9BM4+JaRrVPqYSOZwZirEIB9Olp87R9nCLM6pykqEyS178FOw4nQALVX/Vp33qnx1A== X-Received: by 2002:a05:6a20:1454:b0:1a0:e944:15b7 with SMTP id a20-20020a056a20145400b001a0e94415b7mr357270pzi.5.1709935106742; Fri, 08 Mar 2024 13:58:26 -0800 (PST) Received: from localhost (71-212-63-227.tukw.qwest.net. [71.212.63.227]) by smtp.gmail.com with ESMTPSA id g19-20020a631113000000b005cd8044c6fesm167442pgl.23.2024.03.08.13.58.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 Mar 2024 13:58:26 -0800 (PST) From: Kevin Hilman To: =?utf-8?Q?Th=C3=A9o?= Lebrun , Greg Kroah-Hartman , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Roger Quadros , Peter Chen , Pawel Laszczak , Nishanth Menon , Vignesh Raghavendra , Tero Kristo Cc: Thomas Petazzoni , =?utf-8?Q?Gr=C3=A9gor?= =?utf-8?Q?y?= Clement , Alan Stern , linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, =?utf-8?Q?Th=C3=A9o?= Lebrun Subject: Re: [PATCH v4 4/9] usb: cdns3-ti: support reset-on-resume behavior In-Reply-To: <20240307-j7200-usb-suspend-v4-4-5ec7615431f3@bootlin.com> References: <20240307-j7200-usb-suspend-v4-0-5ec7615431f3@bootlin.com> <20240307-j7200-usb-suspend-v4-4-5ec7615431f3@bootlin.com> Date: Fri, 08 Mar 2024 13:58:25 -0800 Message-ID: <7h4jdgperi.fsf@baylibre.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Th=C3=A9o Lebrun writes: > Add match data support, with one boolean to indicate whether the > hardware resets after a system-wide suspend. If hardware resets, we > force execute ->runtime_resume() at system-wide resume to run the > hardware init sequence. Is "whether the hardware resets after a system-wide suspend" really a function of the IP itself, or rather whether the IP is in a power domain that might power down? > No compatible exploits this functionality, just yet. > > Signed-off-by: Th=C3=A9o Lebrun > --- > drivers/usb/cdns3/cdns3-ti.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/drivers/usb/cdns3/cdns3-ti.c b/drivers/usb/cdns3/cdns3-ti.c > index 4c8a557e6a6f..f76327566798 100644 > --- a/drivers/usb/cdns3/cdns3-ti.c > +++ b/drivers/usb/cdns3/cdns3-ti.c > @@ -57,9 +57,14 @@ struct cdns_ti { > unsigned vbus_divider:1; > struct clk *usb2_refclk; > struct clk *lpm_clk; > + const struct cdns_ti_match_data *match_data; > int usb2_refclk_rate_code; > }; >=20=20 > +struct cdns_ti_match_data { > + bool reset_on_resume; > +}; > + > static const int cdns_ti_rate_table[] =3D { /* in KHZ */ > 9600, > 10000, > @@ -101,6 +106,7 @@ static int cdns_ti_probe(struct platform_device *pdev) > platform_set_drvdata(pdev, data); >=20=20 > data->dev =3D dev; > + data->match_data =3D device_get_match_data(dev); >=20=20 > data->usbss =3D devm_platform_ioremap_resource(pdev, 0); > if (IS_ERR(data->usbss)) { > @@ -220,8 +226,29 @@ static int cdns_ti_runtime_resume(struct device *dev) > return 0; > } >=20=20 > +static int cdns_ti_suspend(struct device *dev) > +{ > + struct cdns_ti *data =3D dev_get_drvdata(dev); > + > + if (data->match_data && data->match_data->reset_on_resume) > + return pm_runtime_force_suspend(dev); > + else > + return 0; > +} > + > +static int cdns_ti_resume(struct device *dev) > +{ > + struct cdns_ti *data =3D dev_get_drvdata(dev); > + > + if (data->match_data && data->match_data->reset_on_resume) > + return pm_runtime_force_resume(dev); > + else > + return 0; > +} Conditionally forcing runtime suspend/resume based on a property of the IP doesn't feel right to me. IMO, the device should always runtime suspend/resume, and in the runtime PM hooks is where the conditional logic should be. And speaking of the conditional logic... let's go back to whether "resets_on_resume" is a property of the IP or the enclosing power domain. Instead of having an IP-specific flag, another way of approaching this when ->runtime_resume() is called every time is simply for that hook to check if a reset has happend. Sometimes you can tell this simply by reading a register that has been previously programmed by the driver but has a known reset. Simply check that regisister and you can tell whether context has been lost. Doing it this way makes the driver "smart" and then you don't have to rely on bool flag based on the IP and dependent on the DT compatible. Kevin 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 20C2AC54E41 for ; Fri, 8 Mar 2024 21:58:49 +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:MIME-Version:Message-ID:Date:References :In-Reply-To:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=JZTF/ZYPha4fYxpI1+rBSQc6eW/U56A4FXKIc8pzukQ=; b=3P/wgq91fk55hO aOjS9mT0vy1hc9sItMXYxDT1IkKyYyvuZr4iv1yzyYVmWqnGj2LqzwGnKWwPbLPnJfEkD8jLvrQvz MIPnWFvBQjhfl7gaVcWlpCYHFFEA7RFYZK9RH4AwHKE5JKdBfuJCGSQcDayZslQsb4hQkEa++HwuP caSA1pXZFf+Iv6MwG7YGDx9lTGD8kmb1wSCISjRoCaPrzuSfmgMSFOZ5YTzRYRMIvPpYnTofxKMYy vHrxtFqDyXCdsu5BLc1rhp1X6fe8t3kBusQCKcmlx8uZROv7SmKtHaRpL1wHpo+vbE0Uctke98kHd JVuba0BLLLBv5NvgjqDA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1riiEb-0000000BPzY-1KOT; Fri, 08 Mar 2024 21:58:33 +0000 Received: from mail-pf1-f176.google.com ([209.85.210.176]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1riiEX-0000000BPyu-3sPa for linux-arm-kernel@lists.infradead.org; Fri, 08 Mar 2024 21:58:31 +0000 Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-6e61851dbaeso1649848b3a.2 for ; Fri, 08 Mar 2024 13:58:27 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709935107; x=1710539907; h=content-transfer-encoding:mime-version:message-id:date:references :in-reply-to:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ssskNoWRSgCf0JIsEmdc/9vm6xbNQG/h290+Hjyy4Ms=; b=n/RMHI7nWUiQojhxfi/Svw1CEGJmhsh6DsTfPo80D2bJORmMiROJ44yLV3PtVQmiTm OCUuGTc5+XUt3O62BtAF3kuQQoFmlk599c+p/E8rOiE8juPHCSoC1YMhokQFzz/j4Wid erI2xOPveBirWRio0PQnwE0cNU64/cUAmU5zrUkSAaxiJrpVekvNXFNpxBDW6oM04Xqk PmO+aK7eyJN3wnPnYmuXodbcOOiING1JkNPzHOvRLFhqfWDUHjZ94aMVpoQvxMSLQQBZ nYrZH7lkjNSv5ku5A4ZFHRNEhmM+1aYBhfQ2THWtBlgIYqCbRxKz0Pg7T0XkAFFKrnGf /73g== X-Forwarded-Encrypted: i=1; AJvYcCWzL/mnJmrVl/QSq8WB6OXIJMzfRTLBfFvUpQ/7iIJmiLgJiH7zDz18y/dC6j2QfHo0O+BgOsMg3lES4ozCjEEKvNf6FI2QY8jk5GPn9GoCfM3N6Lg= X-Gm-Message-State: AOJu0YwTSKNuHkpBWAWoX23sn8O30Dt2A1zfzbtuuCFA88knvvMp9vIF +jGEXgP3krCtFp2TmHQee07PG5MEH7EZBAdhttP5gjRa5ectxKsB4AsgelOER/w= X-Google-Smtp-Source: AGHT+IFZ/B9Q9BM4+JaRrVPqYSOZwZirEIB9Olp87R9nCLM6pykqEyS178FOw4nQALVX/Vp33qnx1A== X-Received: by 2002:a05:6a20:1454:b0:1a0:e944:15b7 with SMTP id a20-20020a056a20145400b001a0e94415b7mr357270pzi.5.1709935106742; Fri, 08 Mar 2024 13:58:26 -0800 (PST) Received: from localhost (71-212-63-227.tukw.qwest.net. [71.212.63.227]) by smtp.gmail.com with ESMTPSA id g19-20020a631113000000b005cd8044c6fesm167442pgl.23.2024.03.08.13.58.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 Mar 2024 13:58:26 -0800 (PST) From: Kevin Hilman To: =?utf-8?Q?Th=C3=A9o?= Lebrun , Greg Kroah-Hartman , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Roger Quadros , Peter Chen , Pawel Laszczak , Nishanth Menon , Vignesh Raghavendra , Tero Kristo Cc: Thomas Petazzoni , =?utf-8?Q?Gr=C3=A9gor?= =?utf-8?Q?y?= Clement , Alan Stern , linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, =?utf-8?Q?Th=C3=A9o?= Lebrun Subject: Re: [PATCH v4 4/9] usb: cdns3-ti: support reset-on-resume behavior In-Reply-To: <20240307-j7200-usb-suspend-v4-4-5ec7615431f3@bootlin.com> References: <20240307-j7200-usb-suspend-v4-0-5ec7615431f3@bootlin.com> <20240307-j7200-usb-suspend-v4-4-5ec7615431f3@bootlin.com> Date: Fri, 08 Mar 2024 13:58:25 -0800 Message-ID: <7h4jdgperi.fsf@baylibre.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240308_135830_091877_787782BC X-CRM114-Status: GOOD ( 26.80 ) 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 VGjDqW8gTGVicnVuIDx0aGVvLmxlYnJ1bkBib290bGluLmNvbT4gd3JpdGVzOgoKPiBBZGQgbWF0 Y2ggZGF0YSBzdXBwb3J0LCB3aXRoIG9uZSBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgdGhl Cj4gaGFyZHdhcmUgcmVzZXRzIGFmdGVyIGEgc3lzdGVtLXdpZGUgc3VzcGVuZC4gSWYgaGFyZHdh cmUgcmVzZXRzLCB3ZQo+IGZvcmNlIGV4ZWN1dGUgLT5ydW50aW1lX3Jlc3VtZSgpIGF0IHN5c3Rl bS13aWRlIHJlc3VtZSB0byBydW4gdGhlCj4gaGFyZHdhcmUgaW5pdCBzZXF1ZW5jZS4KCklzICJ3 aGV0aGVyIHRoZSBoYXJkd2FyZSByZXNldHMgYWZ0ZXIgYSBzeXN0ZW0td2lkZSBzdXNwZW5kIiBy ZWFsbHkgYQpmdW5jdGlvbiBvZiB0aGUgSVAgaXRzZWxmLCBvciByYXRoZXIgd2hldGhlciB0aGUg SVAgaXMgaW4gYSBwb3dlciBkb21haW4KdGhhdCBtaWdodCBwb3dlciBkb3duPwoKPiBObyBjb21w YXRpYmxlIGV4cGxvaXRzIHRoaXMgZnVuY3Rpb25hbGl0eSwganVzdCB5ZXQuCj4KPiBTaWduZWQt b2ZmLWJ5OiBUaMOpbyBMZWJydW4gPHRoZW8ubGVicnVuQGJvb3RsaW4uY29tPgo+IC0tLQo+ICBk cml2ZXJzL3VzYi9jZG5zMy9jZG5zMy10aS5jIHwgMjcgKysrKysrKysrKysrKysrKysrKysrKysr KysrCj4gIDEgZmlsZSBjaGFuZ2VkLCAyNyBpbnNlcnRpb25zKCspCj4KPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy91c2IvY2RuczMvY2RuczMtdGkuYyBiL2RyaXZlcnMvdXNiL2NkbnMzL2NkbnMzLXRp LmMKPiBpbmRleCA0YzhhNTU3ZTZhNmYuLmY3NjMyNzU2Njc5OCAxMDA2NDQKPiAtLS0gYS9kcml2 ZXJzL3VzYi9jZG5zMy9jZG5zMy10aS5jCj4gKysrIGIvZHJpdmVycy91c2IvY2RuczMvY2RuczMt dGkuYwo+IEBAIC01Nyw5ICs1NywxNCBAQCBzdHJ1Y3QgY2Ruc190aSB7Cj4gIAl1bnNpZ25lZCB2 YnVzX2RpdmlkZXI6MTsKPiAgCXN0cnVjdCBjbGsgKnVzYjJfcmVmY2xrOwo+ICAJc3RydWN0IGNs ayAqbHBtX2NsazsKPiArCWNvbnN0IHN0cnVjdCBjZG5zX3RpX21hdGNoX2RhdGEgKm1hdGNoX2Rh dGE7Cj4gIAlpbnQgdXNiMl9yZWZjbGtfcmF0ZV9jb2RlOwo+ICB9Owo+ICAKPiArc3RydWN0IGNk bnNfdGlfbWF0Y2hfZGF0YSB7Cj4gKwlib29sIHJlc2V0X29uX3Jlc3VtZTsKPiArfTsKPiArCj4g IHN0YXRpYyBjb25zdCBpbnQgY2Ruc190aV9yYXRlX3RhYmxlW10gPSB7CS8qIGluIEtIWiAqLwo+ ICAJOTYwMCwKPiAgCTEwMDAwLAo+IEBAIC0xMDEsNiArMTA2LDcgQEAgc3RhdGljIGludCBjZG5z X3RpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gIAlwbGF0Zm9ybV9zZXRf ZHJ2ZGF0YShwZGV2LCBkYXRhKTsKPiAgCj4gIAlkYXRhLT5kZXYgPSBkZXY7Cj4gKwlkYXRhLT5t YXRjaF9kYXRhID0gZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7Cj4gIAo+ICAJZGF0YS0+dXNi c3MgPSBkZXZtX3BsYXRmb3JtX2lvcmVtYXBfcmVzb3VyY2UocGRldiwgMCk7Cj4gIAlpZiAoSVNf RVJSKGRhdGEtPnVzYnNzKSkgewo+IEBAIC0yMjAsOCArMjI2LDI5IEBAIHN0YXRpYyBpbnQgY2Ru c190aV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gIAlyZXR1cm4gMDsKPiAg fQo+ICAKPiArc3RhdGljIGludCBjZG5zX3RpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+ ICt7Cj4gKwlzdHJ1Y3QgY2Ruc190aSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsK PiArCWlmIChkYXRhLT5tYXRjaF9kYXRhICYmIGRhdGEtPm1hdGNoX2RhdGEtPnJlc2V0X29uX3Jl c3VtZSkKPiArCQlyZXR1cm4gcG1fcnVudGltZV9mb3JjZV9zdXNwZW5kKGRldik7Cj4gKwllbHNl Cj4gKwkJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgY2Ruc190aV9yZXN1bWUoc3Ry dWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgY2Ruc190aSAqZGF0YSA9IGRldl9nZXRf ZHJ2ZGF0YShkZXYpOwo+ICsKPiArCWlmIChkYXRhLT5tYXRjaF9kYXRhICYmIGRhdGEtPm1hdGNo X2RhdGEtPnJlc2V0X29uX3Jlc3VtZSkKPiArCQlyZXR1cm4gcG1fcnVudGltZV9mb3JjZV9yZXN1 bWUoZGV2KTsKPiArCWVsc2UKPiArCQlyZXR1cm4gMDsKPiArfQoKQ29uZGl0aW9uYWxseSBmb3Jj aW5nIHJ1bnRpbWUgc3VzcGVuZC9yZXN1bWUgYmFzZWQgb24gYSBwcm9wZXJ0eSBvZiB0aGUKSVAg ZG9lc24ndCBmZWVsIHJpZ2h0IHRvIG1lLgoKSU1PLCB0aGUgZGV2aWNlIHNob3VsZCBhbHdheXMg cnVudGltZSBzdXNwZW5kL3Jlc3VtZSwgYW5kIGluIHRoZQpydW50aW1lIFBNIGhvb2tzIGlzIHdo ZXJlIHRoZSBjb25kaXRpb25hbCBsb2dpYyBzaG91bGQgYmUuCgpBbmQgc3BlYWtpbmcgb2YgdGhl IGNvbmRpdGlvbmFsIGxvZ2ljLi4uIGxldCdzIGdvIGJhY2sgdG8gd2hldGhlcgoicmVzZXRzX29u X3Jlc3VtZSIgaXMgYSBwcm9wZXJ0eSBvZiB0aGUgSVAgb3IgdGhlIGVuY2xvc2luZyBwb3dlcgpk b21haW4uCgpJbnN0ZWFkIG9mIGhhdmluZyBhbiBJUC1zcGVjaWZpYyBmbGFnLCBhbm90aGVyIHdh eSBvZiBhcHByb2FjaGluZyB0aGlzCndoZW4gLT5ydW50aW1lX3Jlc3VtZSgpIGlzIGNhbGxlZCBl dmVyeSB0aW1lIGlzIHNpbXBseSBmb3IgdGhhdCBob29rIHRvCmNoZWNrIGlmIGEgcmVzZXQgaGFz IGhhcHBlbmQuICBTb21ldGltZXMgeW91IGNhbiB0ZWxsIHRoaXMgc2ltcGx5IGJ5CnJlYWRpbmcg YSByZWdpc3RlciB0aGF0IGhhcyBiZWVuIHByZXZpb3VzbHkgcHJvZ3JhbW1lZCBieSB0aGUgZHJp dmVyIGJ1dApoYXMgYSBrbm93biByZXNldC4gIFNpbXBseSBjaGVjayB0aGF0IHJlZ2lzaXN0ZXIg YW5kIHlvdSBjYW4gdGVsbAp3aGV0aGVyIGNvbnRleHQgaGFzIGJlZW4gbG9zdC4KCkRvaW5nIGl0 IHRoaXMgd2F5IG1ha2VzIHRoZSBkcml2ZXIgInNtYXJ0IiBhbmQgdGhlbiB5b3UgZG9uJ3QgaGF2 ZSB0bwpyZWx5IG9uIGJvb2wgZmxhZyBiYXNlZCBvbiB0aGUgSVAgYW5kIGRlcGVuZGVudCBvbiB0 aGUgRFQgY29tcGF0aWJsZS4KCktldmluCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0t a2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==