From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 79FF73FAE11; Thu, 30 Jul 2026 10:29:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785407369; cv=none; b=sonV5ScrAM5hHEBl4zDNeHqflNdudg7gPwa+1g6yuItOTkn9ngMnPPGoGbIMnHazDYE5tlzGP7HZGyj5/A+AMWjZ65RThwHC42DydYd8E71wanqnjDuPfMzCASk9XoDD8FME1X7CHmnGQhK17oou0A+giiZAiVwqgIsNHTJq9/s= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785407369; c=relaxed/simple; bh=MJkvIetUngvkuSfySJviioWmUC4ex1YG7W6BInm928E=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=Z9s9VQIDnm0QRARDMlO6oxSFgr1YXW01THQ9uiWConKCcVC/U+tayd8sDZL9+F3IK9+nbnQudGegCY3m8ROuDAQFFA9p9ifJ+h+BihBidwHgHWuJdb0uJQ09ZadcahvfO4NOhD7blx73Gda3tQGDK/1+DUvD+HC1oclDplowf3s= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ahoODyhw; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ahoODyhw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1DED51F00A3A; Thu, 30 Jul 2026 10:29:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785407366; bh=lxDGpSGRyFg88rMPrLKpcIfpJzZSjbomdsMgil7+wac=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=ahoODyhwFF7QOyJst2LKreNcTlXhHFMdkbwH08SFKFrD9J0BK1Y8A4Q/vx1XrP1Id 1STIGsiMykvgalatBeL9bbQbSwcTJGJJnR41Su2w60gbpM4kqXqaPcqz2a2JhebWIe eC57mBVqU8UA6bbOvKTGa4T/rbMb/v4lO1ozFNAhUzdCWNs+EVL3LbvzlKhrFXsDfi ToC0eMSRB80uxGxjiqKz3RdTHFLnyyUsdo9dX/Li+V10fllNNiQ9Ci329knrigdIq4 2F6166+yPV/Q42bVRcCWT3LnYwiYzjBIEXskkcH5WtfSJ9PSusvNyYgcHg13N5rKj0 Phly+/Q8GhQVg== From: sashiko-bot@kernel.org Subject: Re: [PATCH v10 06/26] scsi: ufs: mediatek: Rework resets Reply-To: sashiko-reviews@lists.linux.dev To: "Louis-Alexis Eyraud" Cc: conor+dt@kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, devicetree@vger.kernel.org, olteanv@gmail.com, linux-phy@lists.infradead.org, linux-scsi@vger.kernel.org, robh@kernel.org In-Reply-To: <20260730-mt8196-ufs-v10-6-bc5ecef202dc@collabora.com> References: <20260730-mt8196-ufs-v10-0-bc5ecef202dc@collabora.com> <20260730-mt8196-ufs-v10-6-bc5ecef202dc@collabora.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Thu, 30 Jul 2026 10:29:25 +0000 Message-Id: <20260730102926.1DED51F00A3A@smtp.kernel.org> Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Thank you for your contribution! Sashiko AI review found 2 potential issue(= s) to consider: - [High] Hardware Reset Sequence Violation due to inverted bulk reset array= order and improper PHY synchronization. - [High] Missing mandatory hardware reset delay when UFS MPHY is unbound. -- --- Patch [6]: [PATCH v10 06/26] scsi: ufs: mediatek: Rework resets --- commit 6e1eee5b92733c43e2ae7add5906da2c59fbe389 Author: Nicolas Frattaroli scsi: ufs: mediatek: Rework resets This commit reworks the reset control getting in the driver's probe function to use the bulk reset APIs instead of getting resets individually. It also removes all remnants of the MPHY reset from this driver. > diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-media= tek.c > --- a/drivers/ufs/host/ufs-mediatek.c > +++ b/drivers/ufs/host/ufs-mediatek.c > @@ -93,6 +93,12 @@ static const char *const ufs_uic_dl_err_str[] =3D { > "PA_INIT" > }; > =20 > +static const char *const ufs_reset_names[] =3D { > + "unipro", > + "crypto", > + "hci", > +}; [Severity: High] Does this array ordering accidentally reverse the original hardware reset sequence? The original code explicitly asserted resets in the order: HCI, Crypto, UniPro, and deasserted them in the order: UniPro, Crypto, HCI. Because reset_control_bulk_assert() iterates forwards and reset_control_bulk_deassert() iterates backwards, this new array ordering will assert UniPro, Crypto, HCI, and deassert HCI, Crypto, UniPro. [ ... ] > @@ -203,49 +209,45 @@ static void ufs_mtk_crypto_enable(struct ufs_hba *h= ba) > static void ufs_mtk_host_reset(struct ufs_hba *hba) > { > struct ufs_mtk_host *host =3D ufshcd_get_variant(hba); > - struct arm_smccc_res res; > - > - reset_control_assert(host->hci_reset); > - reset_control_assert(host->crypto_reset); > - reset_control_assert(host->unipro_reset); > - reset_control_assert(host->mphy_reset); > - > - usleep_range(100, 110); > =20 > - reset_control_deassert(host->unipro_reset); > - reset_control_deassert(host->crypto_reset); > - reset_control_deassert(host->hci_reset); > - reset_control_deassert(host->mphy_reset); > + int ret; > =20 > - /* restore mphy setting aftre mphy reset */ > - if (host->mphy_reset) > - ufs_mtk_mphy_ctrl(UFS_MPHY_RESTORE, res); > -} > + ret =3D reset_control_bulk_assert(MTK_UFS_NUM_RESETS, host->resets); > + if (ret) > + dev_warn(hba->dev, "Host reset assert failed: %pe\n", ERR_PTR(ret)); > =20 > + ret =3D phy_reset(host->mphy); [Severity: High] Are we restoring the PHY while the MAC/host controller blocks are still held in reset? In the original code, the MPHY SMC restore was called after all controller blocks were deasserted. Here, phy_reset() executes the full MPHY reset and restore before reset_control_bulk_deassert() is called. > + > + /* > + * Only sleep if MPHY doesn't have a reset implemented (which already > + * sleeps) or the PHY reset function failed somehow, just to be safe > + */ > + if (ret) { > + usleep_range(100, 110); > + if (ret !=3D -EOPNOTSUPP) > + dev_warn(hba->dev, "PHY reset failed: %pe\n", ERR_PTR(ret)); > } [Severity: High] Does this skip the mandatory hardware reset delay when the UFS MPHY is unbound? If host->mphy is NULL, phy_reset(NULL) will return 0. This causes the if (r= et) condition to evaluate to false, bypassing the usleep_range(100, 110) fallback. This would result in the MAC/HCI resets being asserted and deasserted instantaneously back-to-back, which can cause the controller IP block to fail to reset. --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260730-mt8196-ufs= -v10-0-bc5ecef202dc@collabora.com?part=3D6 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 D0D71C54FDF for ; Thu, 30 Jul 2026 10:29:31 +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:MIME-Version:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: References:In-Reply-To:Cc:To:Subject:From:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=ms/UkQJUFoSPsKZr5/svDnw+NjYg3DVjm7x/ZbKPBBM=; b=d704esc0eEiDc6 1p1KuDU/+MfbeNMG1K1zsQm4UrMEdv0IxuFbXI9fkWx8/a7bO9LPlXQRAIrHQ1PAIerdivta1dBli KFPefwRL3kC6ivJTYZzhrBscyWTixNNU+6zw0FuCgBrgmJCXdo/Wtm7sOpC3aUYHMCV+J/hcrqY5i XdvDAsyeTah523ATpnIXsJi5O3WxmmOW2jre/XtWXysQTSSNcD79MpDmnTDVbi+btYvwmfQHIiALy hAk0ktAmuz6k3HbiteYSm2Vx6UiLbZbbLHNTTCxk4bAaK9aZ9/+zRnu4GAXIN6JN6RUieot7AD2VO fmIkVIckg8E7rnVAPTNw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wpO15-0000000ADKc-2JVS; Thu, 30 Jul 2026 10:29:31 +0000 Received: from tor.source.kernel.org ([2600:3c04:e001:324:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wpO11-0000000ADKA-3CQe for linux-phy@lists.infradead.org; Thu, 30 Jul 2026 10:29:27 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id 37DE9600B1; Thu, 30 Jul 2026 10:29:27 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1DED51F00A3A; Thu, 30 Jul 2026 10:29:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785407366; bh=lxDGpSGRyFg88rMPrLKpcIfpJzZSjbomdsMgil7+wac=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=ahoODyhwFF7QOyJst2LKreNcTlXhHFMdkbwH08SFKFrD9J0BK1Y8A4Q/vx1XrP1Id 1STIGsiMykvgalatBeL9bbQbSwcTJGJJnR41Su2w60gbpM4kqXqaPcqz2a2JhebWIe eC57mBVqU8UA6bbOvKTGa4T/rbMb/v4lO1ozFNAhUzdCWNs+EVL3LbvzlKhrFXsDfi ToC0eMSRB80uxGxjiqKz3RdTHFLnyyUsdo9dX/Li+V10fllNNiQ9Ci329knrigdIq4 2F6166+yPV/Q42bVRcCWT3LnYwiYzjBIEXskkcH5WtfSJ9PSusvNyYgcHg13N5rKj0 Phly+/Q8GhQVg== From: sashiko-bot@kernel.org Subject: Re: [PATCH v10 06/26] scsi: ufs: mediatek: Rework resets To: "Louis-Alexis Eyraud" Cc: conor+dt@kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, devicetree@vger.kernel.org, olteanv@gmail.com, linux-phy@lists.infradead.org, linux-scsi@vger.kernel.org, robh@kernel.org In-Reply-To: <20260730-mt8196-ufs-v10-6-bc5ecef202dc@collabora.com> References: <20260730-mt8196-ufs-v10-0-bc5ecef202dc@collabora.com> <20260730-mt8196-ufs-v10-6-bc5ecef202dc@collabora.com> Date: Thu, 30 Jul 2026 10:29:25 +0000 Message-Id: <20260730102926.1DED51F00A3A@smtp.kernel.org> X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg MiBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIEhhcmR3YXJlIFJlc2V0 IFNlcXVlbmNlIFZpb2xhdGlvbiBkdWUgdG8gaW52ZXJ0ZWQgYnVsayByZXNldCBhcnJheSBvcmRl ciBhbmQgaW1wcm9wZXIgUEhZIHN5bmNocm9uaXphdGlvbi4KLSBbSGlnaF0gTWlzc2luZyBtYW5k YXRvcnkgaGFyZHdhcmUgcmVzZXQgZGVsYXkgd2hlbiBVRlMgTVBIWSBpcyB1bmJvdW5kLgotLQoK LS0tIFBhdGNoIFs2XTogW1BBVENIIHYxMCAwNi8yNl0gc2NzaTogdWZzOiBtZWRpYXRlazogUmV3 b3JrIHJlc2V0cyAtLS0KY29tbWl0IDZlMWVlZTViOTI3MzNjNDNlMmFlN2FkZDU5MDZkYTJjNTlm YmUzODkKQXV0aG9yOiBOaWNvbGFzIEZyYXR0YXJvbGkgPG5pY29sYXMuZnJhdHRhcm9saUBjb2xs YWJvcmEuY29tPgoKc2NzaTogdWZzOiBtZWRpYXRlazogUmV3b3JrIHJlc2V0cwoKVGhpcyBjb21t aXQgcmV3b3JrcyB0aGUgcmVzZXQgY29udHJvbCBnZXR0aW5nIGluIHRoZSBkcml2ZXIncyBwcm9i ZQpmdW5jdGlvbiB0byB1c2UgdGhlIGJ1bGsgcmVzZXQgQVBJcyBpbnN0ZWFkIG9mIGdldHRpbmcg cmVzZXRzIGluZGl2aWR1YWxseS4KSXQgYWxzbyByZW1vdmVzIGFsbCByZW1uYW50cyBvZiB0aGUg TVBIWSByZXNldCBmcm9tIHRoaXMgZHJpdmVyLgoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91ZnMv aG9zdC91ZnMtbWVkaWF0ZWsuYyBiL2RyaXZlcnMvdWZzL2hvc3QvdWZzLW1lZGlhdGVrLmMKPiAt LS0gYS9kcml2ZXJzL3Vmcy9ob3N0L3Vmcy1tZWRpYXRlay5jCj4gKysrIGIvZHJpdmVycy91ZnMv aG9zdC91ZnMtbWVkaWF0ZWsuYwo+IEBAIC05Myw2ICs5MywxMiBAQCBzdGF0aWMgY29uc3QgY2hh ciAqY29uc3QgdWZzX3VpY19kbF9lcnJfc3RyW10gPSB7Cj4gIAkiUEFfSU5JVCIKPiAgfTsKPiAg Cj4gK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB1ZnNfcmVzZXRfbmFtZXNbXSA9IHsKPiArCSJ1 bmlwcm8iLAo+ICsJImNyeXB0byIsCj4gKwkiaGNpIiwKPiArfTsKCltTZXZlcml0eTogSGlnaF0K RG9lcyB0aGlzIGFycmF5IG9yZGVyaW5nIGFjY2lkZW50YWxseSByZXZlcnNlIHRoZSBvcmlnaW5h bCBoYXJkd2FyZSByZXNldApzZXF1ZW5jZT8KClRoZSBvcmlnaW5hbCBjb2RlIGV4cGxpY2l0bHkg YXNzZXJ0ZWQgcmVzZXRzIGluIHRoZSBvcmRlcjogSENJLCBDcnlwdG8sClVuaVBybywgYW5kIGRl YXNzZXJ0ZWQgdGhlbSBpbiB0aGUgb3JkZXI6IFVuaVBybywgQ3J5cHRvLCBIQ0kuCgpCZWNhdXNl IHJlc2V0X2NvbnRyb2xfYnVsa19hc3NlcnQoKSBpdGVyYXRlcyBmb3J3YXJkcyBhbmQKcmVzZXRf Y29udHJvbF9idWxrX2RlYXNzZXJ0KCkgaXRlcmF0ZXMgYmFja3dhcmRzLCB0aGlzIG5ldyBhcnJh eSBvcmRlcmluZwp3aWxsIGFzc2VydCBVbmlQcm8sIENyeXB0bywgSENJLCBhbmQgZGVhc3NlcnQg SENJLCBDcnlwdG8sIFVuaVByby4KClsgLi4uIF0KCj4gQEAgLTIwMyw0OSArMjA5LDQ1IEBAIHN0 YXRpYyB2b2lkIHVmc19tdGtfY3J5cHRvX2VuYWJsZShzdHJ1Y3QgdWZzX2hiYSAqaGJhKQo+ICBz dGF0aWMgdm9pZCB1ZnNfbXRrX2hvc3RfcmVzZXQoc3RydWN0IHVmc19oYmEgKmhiYSkKPiAgewo+ ICAJc3RydWN0IHVmc19tdGtfaG9zdCAqaG9zdCA9IHVmc2hjZF9nZXRfdmFyaWFudChoYmEpOwo+ IC0Jc3RydWN0IGFybV9zbWNjY19yZXMgcmVzOwo+IC0KPiAtCXJlc2V0X2NvbnRyb2xfYXNzZXJ0 KGhvc3QtPmhjaV9yZXNldCk7Cj4gLQlyZXNldF9jb250cm9sX2Fzc2VydChob3N0LT5jcnlwdG9f cmVzZXQpOwo+IC0JcmVzZXRfY29udHJvbF9hc3NlcnQoaG9zdC0+dW5pcHJvX3Jlc2V0KTsKPiAt CXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGhvc3QtPm1waHlfcmVzZXQpOwo+IC0KPiAtCXVzbGVlcF9y YW5nZSgxMDAsIDExMCk7Cj4gIAo+IC0JcmVzZXRfY29udHJvbF9kZWFzc2VydChob3N0LT51bmlw cm9fcmVzZXQpOwo+IC0JcmVzZXRfY29udHJvbF9kZWFzc2VydChob3N0LT5jcnlwdG9fcmVzZXQp Owo+IC0JcmVzZXRfY29udHJvbF9kZWFzc2VydChob3N0LT5oY2lfcmVzZXQpOwo+IC0JcmVzZXRf Y29udHJvbF9kZWFzc2VydChob3N0LT5tcGh5X3Jlc2V0KTsKPiArCWludCByZXQ7Cj4gIAo+IC0J LyogcmVzdG9yZSBtcGh5IHNldHRpbmcgYWZ0cmUgbXBoeSByZXNldCAqLwo+IC0JaWYgKGhvc3Qt Pm1waHlfcmVzZXQpCj4gLQkJdWZzX210a19tcGh5X2N0cmwoVUZTX01QSFlfUkVTVE9SRSwgcmVz KTsKPiAtfQo+ICsJcmV0ID0gcmVzZXRfY29udHJvbF9idWxrX2Fzc2VydChNVEtfVUZTX05VTV9S RVNFVFMsIGhvc3QtPnJlc2V0cyk7Cj4gKwlpZiAocmV0KQo+ICsJCWRldl93YXJuKGhiYS0+ZGV2 LCAiSG9zdCByZXNldCBhc3NlcnQgZmFpbGVkOiAlcGVcbiIsIEVSUl9QVFIocmV0KSk7Cj4gIAo+ ICsJcmV0ID0gcGh5X3Jlc2V0KGhvc3QtPm1waHkpOwoKW1NldmVyaXR5OiBIaWdoXQpBcmUgd2Ug cmVzdG9yaW5nIHRoZSBQSFkgd2hpbGUgdGhlIE1BQy9ob3N0IGNvbnRyb2xsZXIgYmxvY2tzIGFy ZSBzdGlsbCBoZWxkCmluIHJlc2V0PwoKSW4gdGhlIG9yaWdpbmFsIGNvZGUsIHRoZSBNUEhZIFNN QyByZXN0b3JlIHdhcyBjYWxsZWQgYWZ0ZXIgYWxsIGNvbnRyb2xsZXIKYmxvY2tzIHdlcmUgZGVh c3NlcnRlZC4gSGVyZSwgcGh5X3Jlc2V0KCkgZXhlY3V0ZXMgdGhlIGZ1bGwgTVBIWSByZXNldCBh bmQKcmVzdG9yZSBiZWZvcmUgcmVzZXRfY29udHJvbF9idWxrX2RlYXNzZXJ0KCkgaXMgY2FsbGVk LgoKPiArCj4gKwkvKgo+ICsJICogT25seSBzbGVlcCBpZiBNUEhZIGRvZXNuJ3QgaGF2ZSBhIHJl c2V0IGltcGxlbWVudGVkICh3aGljaCBhbHJlYWR5Cj4gKwkgKiBzbGVlcHMpIG9yIHRoZSBQSFkg cmVzZXQgZnVuY3Rpb24gZmFpbGVkIHNvbWVob3csIGp1c3QgdG8gYmUgc2FmZQo+ICsJICovCj4g KwlpZiAocmV0KSB7Cj4gKwkJdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKPiArCQlpZiAocmV0ICE9 IC1FT1BOT1RTVVBQKQo+ICsJCQlkZXZfd2FybihoYmEtPmRldiwgIlBIWSByZXNldCBmYWlsZWQ6 ICVwZVxuIiwgRVJSX1BUUihyZXQpKTsKPiAgCX0KCltTZXZlcml0eTogSGlnaF0KRG9lcyB0aGlz IHNraXAgdGhlIG1hbmRhdG9yeSBoYXJkd2FyZSByZXNldCBkZWxheSB3aGVuIHRoZSBVRlMgTVBI WSBpcwp1bmJvdW5kPwoKSWYgaG9zdC0+bXBoeSBpcyBOVUxMLCBwaHlfcmVzZXQoTlVMTCkgd2ls bCByZXR1cm4gMC4gVGhpcyBjYXVzZXMgdGhlIGlmIChyZXQpCmNvbmRpdGlvbiB0byBldmFsdWF0 ZSB0byBmYWxzZSwgYnlwYXNzaW5nIHRoZSB1c2xlZXBfcmFuZ2UoMTAwLCAxMTApCmZhbGxiYWNr LgoKVGhpcyB3b3VsZCByZXN1bHQgaW4gdGhlIE1BQy9IQ0kgcmVzZXRzIGJlaW5nIGFzc2VydGVk IGFuZCBkZWFzc2VydGVkCmluc3RhbnRhbmVvdXNseSBiYWNrLXRvLWJhY2ssIHdoaWNoIGNhbiBj YXVzZSB0aGUgY29udHJvbGxlciBJUCBibG9jayB0bwpmYWlsIHRvIHJlc2V0LgoKLS0gClNhc2hp a28gQUkgcmV2aWV3IMK3IGh0dHBzOi8vc2FzaGlrby5kZXYvIy9wYXRjaHNldC8yMDI2MDczMC1t dDgxOTYtdWZzLXYxMC0wLWJjNWVjZWYyMDJkY0Bjb2xsYWJvcmEuY29tP3BhcnQ9NgoKLS0gCmxp bnV4LXBoeSBtYWlsaW5nIGxpc3QKbGludXgtcGh5QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cHM6 Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcGh5Cg==