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 E5263EB64DD for ; Wed, 21 Jun 2023 11:24:24 +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=CtAeFmhKqBXkquV5/Dd0rP2qOD9zUcVyTEOyOWJbYc8=; b=4qLtHs6FiW2bE3 FpOJ+6Yl1vNYBgiGbgqIhWH2bAf2H8F2Qe9wRoGiMo7LM5GKnMuWkztEHBShcmJImjvgBKHW+OMpU 4Y4NaIkhESU1UeLdVX+kOLOsysb1Fn3PKu+k8zbwwBcgqBMvm3zhEIxM5ODmSkQs1Q0IrkQXLj184 NamhfHkyPB7Z/p71nv2L/EQIlQ9i4NnMVGE5T5ZCIDDzP8T4eoXI03tPEtkpSYZ9B5F0m24aE3jE/ BTK04XIM8c2WEokQsVOcTwGrNQAysd20mXlYn+9FXVxbqHkbliXrGSPPOsQJj1FayCZWoiCNcYtcY GFUI9Q/Lrl8ABn2sBipA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qBvwm-00ENm2-1i; Wed, 21 Jun 2023 11:24:24 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qBvwh-00ENk8-2J; Wed, 21 Jun 2023 11:24:22 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id D4F846150D; Wed, 21 Jun 2023 11:24:18 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 156F9C433C8; Wed, 21 Jun 2023 11:24:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1687346658; bh=NwH5V30lS5yuvPManxFLnChOCMB0DORyGUvgs2Zr6UY=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=mWSxcoEVRWxNXGI/Oek4fG9sGHqE5jWxuxZOFaQMXVXGKN1XsNZO3NlLaK9s6Herx GmfpnFQNfDkvBywz9NzTRfontZLY7od2W4ScJoS7D2To1kTEAyZcpmDJz0KevH/wJ6 K13KDRSRl2T54GYWvGB7loExRsBoqSU4JRAGldNqzOkNLruz0JNculEKqr2kmjx4MD Py7fJD11FEjjIfdYgtl01yNM3ZORsYgyByw4uIcY+F8ENOQmPmeA+p5JSy0ojKTX+Y x1s6FbK4STvasCzBUMYvoG2Fv43pFjDb7uQQKHQwNTvLaKNci46IuMCRtKjVhOMW8B uIBQnS2ZQMsPA== Date: Wed, 21 Jun 2023 16:54:13 +0530 From: Vinod Koul To: Sandor Yu Cc: andrzej.hajda@intel.com, neil.armstrong@linaro.org, robert.foss@linaro.org, Laurent.pinchart@ideasonboard.com, jonas@kwiboo.se, jernej.skrabec@gmail.com, airlied@gmail.com, daniel@ffwll.ch, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, kernel@pengutronix.de, linux-imx@nxp.com, oliver.brown@nxp.com Subject: Re: [PATCH v6 7/8] phy: freescale: Add DisplayPort PHY driver for i.MX8MQ Message-ID: References: <279d6d605656a7ca1bbee6270d66aa218a1b7d3d.1686729444.git.Sandor.yu@nxp.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <279d6d605656a7ca1bbee6270d66aa218a1b7d3d.1686729444.git.Sandor.yu@nxp.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230621_042419_842075_7BBE82FD X-CRM114-Status: GOOD ( 29.10 ) 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: , 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 T24gMTUtMDYtMjMsIDA5OjM4LCBTYW5kb3IgWXUgd3JvdGU6Cj4gQWRkIENhZGVuY2UgSERQLVRY IERpc3BsYXlQb3J0IFBIWSBkcml2ZXIgZm9yIGkuTVg4TVEKPiAKPiBDYWRlbmNlIEhEUC1UWCBQ SFkgY291bGQgYmUgcHV0IGluIGVpdGhlciBEUCBtb2RlIG9yCj4gSERNSSBtb2RlIGJhc2Ugb24g dGhlIGNvbmZpZ3VyYXRpb24gY2hvc2VuLgo+IERpc3BsYXlQb3J0IFBIWSBtb2RlIGlzIGNvbmZp Z3VyYXRlZCBpbiB0aGUgZHJpdmVyLgo+IAo+IFNpZ25lZC1vZmYtYnk6IFNhbmRvciBZdSA8U2Fu ZG9yLnl1QG54cC5jb20+Cj4gLS0tCj4gIGRyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29uZmlnICAg ICAgICAgICAgIHwgICA5ICsKPiAgZHJpdmVycy9waHkvZnJlZXNjYWxlL01ha2VmaWxlICAgICAg ICAgICAgfCAgIDEgKwo+ICBkcml2ZXJzL3BoeS9mcmVlc2NhbGUvcGh5LWZzbC1pbXg4bXEtZHAu YyB8IDY5NyArKysrKysrKysrKysrKysrKysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgNzA3IGlu c2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcGh5L2ZyZWVzY2FsZS9w aHktZnNsLWlteDhtcS1kcC5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L2ZyZWVzY2Fs ZS9LY29uZmlnIGIvZHJpdmVycy9waHkvZnJlZXNjYWxlL0tjb25maWcKPiBpbmRleCA4NTM5NThm YjJjMDYuLmE5OWVlMzcwZWRhNiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BoeS9mcmVlc2NhbGUv S2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29uZmlnCj4gQEAgLTM1LDYg KzM1LDE1IEBAIGNvbmZpZyBQSFlfRlNMX0lNWDhNX1BDSUUKPiAgCSAgRW5hYmxlIHRoaXMgdG8g YWRkIHN1cHBvcnQgZm9yIHRoZSBQQ0lFIFBIWSBhcyBmb3VuZCBvbgo+ICAJICBpLk1YOE0gZmFt aWx5IG9mIFNPQ3MuCj4gIAo+ICtjb25maWcgUEhZX0NBREVOQ0VfRFBfUEhZCj4gKwl0cmlzdGF0 ZSAiQ2FkZW5jZSBIRFBUWCBEUCBQSFkgc3VwcG9ydCIKPiArCWRlcGVuZHMgb24gT0YgJiYgSEFT X0lPTUVNCj4gKwlkZXBlbmRzIG9uIENPTU1PTl9DTEsKPiArCXNlbGVjdCBHRU5FUklDX1BIWQo+ ICsJaGVscAo+ICsJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSBDYWRlbmNlIEhEUFRYIERQ IFBIWSBkcml2ZXIKPiArCSAgb24gTlhQJ3MgaS5NWDhNUSBTT0MuCj4gKwo+ICBlbmRpZgo+ICAK PiAgY29uZmlnIFBIWV9GU0xfTFlOWF8yOEcKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvZnJl ZXNjYWxlL01ha2VmaWxlIGIvZHJpdmVycy9waHkvZnJlZXNjYWxlL01ha2VmaWxlCj4gaW5kZXgg Y2VkYjMyOGJjNGQyLi5jM2JkZjNmYTJlNzIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9waHkvZnJl ZXNjYWxlL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9waHkvZnJlZXNjYWxlL01ha2VmaWxlCj4g QEAgLTQsMyArNCw0IEBAIG9iai0kKENPTkZJR19QSFlfTUlYRUxfTFZEU19QSFkpCSs9IHBoeS1m c2wtaW14OHFtLWx2ZHMtcGh5Lm8KPiAgb2JqLSQoQ09ORklHX1BIWV9NSVhFTF9NSVBJX0RQSFkp CSs9IHBoeS1mc2wtaW14OC1taXBpLWRwaHkubwo+ICBvYmotJChDT05GSUdfUEhZX0ZTTF9JTVg4 TV9QQ0lFKQkrPSBwaHktZnNsLWlteDhtLXBjaWUubwo+ICBvYmotJChDT05GSUdfUEhZX0ZTTF9M WU5YXzI4RykJCSs9IHBoeS1mc2wtbHlueC0yOGcubwo+ICtvYmotJChDT05GSUdfUEhZX0NBREVO Q0VfRFBfUEhZKQkrPSBwaHktZnNsLWlteDhtcS1kcC5vCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv cGh5L2ZyZWVzY2FsZS9waHktZnNsLWlteDhtcS1kcC5jIGIvZHJpdmVycy9waHkvZnJlZXNjYWxl L3BoeS1mc2wtaW14OG1xLWRwLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAw MDAwMDAwMC4uMmJkNjc3MmE1ZDNiCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvcGh5 L2ZyZWVzY2FsZS9waHktZnNsLWlteDhtcS1kcC5jCj4gQEAgLTAsMCArMSw2OTcgQEAKPiArLy8g U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQo+ICsvKgo+ICsgKiBDYWRlbmNl IEhEUC1UWCBEaXNwbGF5IFBvcnQgSW50ZXJmYWNlIChEUCkgUEhZIGRyaXZlcgo+ICsgKgo+ICsg KiBDb3B5cmlnaHQgKEMpIDIwMjIgTlhQIFNlbWljb25kdWN0b3IsIEluYy4KPiArICovCj4gKyNp bmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiArI2lu Y2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgo+ICsj aW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pby5o Pgo+ICsjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+Cj4gKwo+ICsjaW5jbHVkZSA8ZHJtL2JyaWRn ZS9jZG5zLW1oZHAtbWFpbGJveC5oPgo+ICsKPiArI2RlZmluZSBBRERSX1BIWV9BRkUJMHg4MDAw MAoKSXMgdGhpcyBhbHdheXMgZml4ZWQgZm9yIGV2ZXJ5IHBoeSBnZW5lcmF0aW9uPwo+ICsKPiAr LyogUEhZIHJlZ2lzdGVycyAqLwo+ICsjZGVmaW5lIENNTl9TU01fQklBU19UTVIgICAgICAgICAg ICAgICAgMHgwMDIyCj4gKyNkZWZpbmUgQ01OX1BMTFNNMF9QTExFTl9UTVIgICAgICAgICAgICAw eDAwMjkKPiArI2RlZmluZSBDTU5fUExMU00wX1BMTFBSRV9UTVIgICAgICAgICAgIDB4MDAyQQo+ ICsjZGVmaW5lIENNTl9QTExTTTBfUExMVlJFRl9UTVIgICAgICAgICAgMHgwMDJCCj4gKyNkZWZp bmUgQ01OX1BMTFNNMF9QTExMT0NLX1RNUiAgICAgICAgICAweDAwMkMKPiArI2RlZmluZSBDTU5f UExMU00wX1VTRVJfREVGX0NUUkwgICAgICAgIDB4MDAyRgo+ICsjZGVmaW5lIENNTl9QU01fQ0xL X0NUUkwgICAgICAgICAgICAgICAgMHgwMDYxCj4gKyNkZWZpbmUgQ01OX1BMTDBfVkNPQ0FMX1NU QVJUICAgICAgICAgICAweDAwODEKPiArI2RlZmluZSBDTU5fUExMMF9WQ09DQUxfSU5JVF9UTVIg ICAgICAgIDB4MDA4NAo+ICsjZGVmaW5lIENNTl9QTEwwX1ZDT0NBTF9JVEVSX1RNUiAgICAgICAg MHgwMDg1Cj4gKyNkZWZpbmUgQ01OX1BMTDBfSU5URElWICAgICAgICAgICAgICAgICAweDAwOTQK PiArI2RlZmluZSBDTU5fUExMMF9GUkFDRElWICAgICAgICAgICAgICAgIDB4MDA5NQo+ICsjZGVm aW5lIENNTl9QTEwwX0hJR0hfVEhSICAgICAgICAgICAgICAgMHgwMDk2Cj4gKyNkZWZpbmUgQ01O X1BMTDBfRFNNX0RJQUcgICAgICAgICAgICAgICAweDAwOTcKPiArI2RlZmluZSBDTU5fUExMMF9T U19DVFJMMiAgICAgICAgICAgICAgIDB4MDA5OQo+ICsjZGVmaW5lIENNTl9JQ0FMX0lOSVRfVE1S ICAgICAgICAgICAgICAgMHgwMEM0Cj4gKyNkZWZpbmUgQ01OX0lDQUxfSVRFUl9UTVIgICAgICAg ICAgICAgICAweDAwQzUKPiArI2RlZmluZSBDTU5fUlhDQUxfSU5JVF9UTVIgICAgICAgICAgICAg IDB4MDBENAo+ICsjZGVmaW5lIENNTl9SWENBTF9JVEVSX1RNUiAgICAgICAgICAgICAgMHgwMEQ1 Cj4gKyNkZWZpbmUgQ01OX1RYUFVDQUxfSU5JVF9UTVIgICAgICAgICAgICAweDAwRTQKPiArI2Rl ZmluZSBDTU5fVFhQVUNBTF9JVEVSX1RNUiAgICAgICAgICAgIDB4MDBFNQo+ICsjZGVmaW5lIENN Tl9UWFBEQ0FMX0lOSVRfVE1SICAgICAgICAgICAgMHgwMEY0Cj4gKyNkZWZpbmUgQ01OX1RYUERD QUxfSVRFUl9UTVIgICAgICAgICAgICAweDAwRjUKPiArI2RlZmluZSBDTU5fSUNBTF9BREpfSU5J VF9UTVIgICAgICAgICAgIDB4MDEwMgo+ICsjZGVmaW5lIENNTl9JQ0FMX0FESl9JVEVSX1RNUiAg ICAgICAgICAgMHgwMTAzCj4gKyNkZWZpbmUgQ01OX1JYX0FESl9JTklUX1RNUiAgICAgICAgICAg ICAweDAxMDYKPiArI2RlZmluZSBDTU5fUlhfQURKX0lURVJfVE1SICAgICAgICAgICAgIDB4MDEw Nwo+ICsjZGVmaW5lIENNTl9UWFBVX0FESl9JTklUX1RNUiAgICAgICAgICAgMHgwMTBBCj4gKyNk ZWZpbmUgQ01OX1RYUFVfQURKX0lURVJfVE1SICAgICAgICAgICAweDAxMEIKPiArI2RlZmluZSBD TU5fVFhQRF9BREpfSU5JVF9UTVIgICAgICAgICAgIDB4MDEwRQo+ICsjZGVmaW5lIENNTl9UWFBE X0FESl9JVEVSX1RNUiAgICAgICAgICAgMHgwMTBGCj4gKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9G QkhfT1ZSRCAgICAgICAgICAweDAxQzAKPiArI2RlZmluZSBDTU5fRElBR19QTEwwX0ZCTF9PVlJE ICAgICAgICAgIDB4MDFDMQo+ICsjZGVmaW5lIENNTl9ESUFHX1BMTDBfT1ZSRCAgICAgICAgICAg ICAgMHgwMUMyCj4gKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9URVNUX01PREUgICAgICAgICAweDAx QzQKPiArI2RlZmluZSBDTU5fRElBR19QTEwwX1YySV9UVU5FICAgICAgICAgIDB4MDFDNQo+ICsj ZGVmaW5lIENNTl9ESUFHX1BMTDBfQ1BfVFVORSAgICAgICAgICAgMHgwMUM2Cj4gKyNkZWZpbmUg Q01OX0RJQUdfUExMMF9MRl9QUk9HICAgICAgICAgICAweDAxQzcKPiArI2RlZmluZSBDTU5fRElB R19QTEwwX1BUQVRJU19UVU5FMSAgICAgIDB4MDFDOAo+ICsjZGVmaW5lIENNTl9ESUFHX1BMTDBf UFRBVElTX1RVTkUyICAgICAgMHgwMUM5Cj4gKyNkZWZpbmUgQ01OX0RJQUdfSFNDTEtfU0VMICAg ICAgICAgICAgICAweDAxRTAKPiArI2RlZmluZSBDTU5fRElBR19QRVJfQ0FMX0FESiAgICAgICAg ICAgIDB4MDFFQwo+ICsjZGVmaW5lIENNTl9ESUFHX0NBTF9DVFJMICAgICAgICAgICAgICAgMHgw MUVECj4gKyNkZWZpbmUgQ01OX0RJQUdfQUNZQSAgICAgICAgICAgICAgICAgICAweDAxRkYKPiAr I2RlZmluZSBYQ1ZSX1BTTV9SQ1RSTCAgICAgICAgICAgICAgICAgIDB4NDAwMQo+ICsjZGVmaW5l IFhDVlJfUFNNX0NBTF9UTVIgICAgICAgICAgICAgICAgMHg0MDAyCj4gKyNkZWZpbmUgWENWUl9Q U01fQTBJTl9UTVIgICAgICAgICAgICAgICAweDQwMDMKPiArI2RlZmluZSBUWF9UWENDX0NBTF9T Q0xSX01VTFRfMCAgICAgICAgIDB4NDA0Nwo+ICsjZGVmaW5lIFRYX1RYQ0NfQ1BPU1RfTVVMVF8w MF8wICAgICAgICAgMHg0MDRDCj4gKyNkZWZpbmUgWENWUl9ESUFHX1BMTERSQ19DVFJMICAgICAg ICAgICAweDQwRTAKPiArI2RlZmluZSBYQ1ZSX0RJQUdfUExMRFJDX0NUUkwgICAgICAgICAgIDB4 NDBFMAo+ICsjZGVmaW5lIFhDVlJfRElBR19IU0NMS19TRUwgICAgICAgICAgICAgMHg0MEUxCj4g KyNkZWZpbmUgWENWUl9ESUFHX0xBTkVfRkNNX0VOX01HTl9UTVIgICAweDQwRjIKPiArI2RlZmlu ZSBUWF9QU0NfQTAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwMAo+ICsjZGVmaW5lIFRYX1BT Q19BMSAgICAgICAgICAgICAgICAgICAgICAgMHg0MTAxCj4gKyNkZWZpbmUgVFhfUFNDX0EyICAg ICAgICAgICAgICAgICAgICAgICAweDQxMDIKPiArI2RlZmluZSBUWF9QU0NfQTMgICAgICAgICAg ICAgICAgICAgICAgIDB4NDEwMwo+ICsjZGVmaW5lIFRYX1JDVkRFVF9FTl9UTVIgICAgICAgICAg ICAgICAgMHg0MTIyCj4gKyNkZWZpbmUgVFhfUkNWREVUX1NUX1RNUiAgICAgICAgICAgICAgICAw eDQxMjMKPiArI2RlZmluZSBUWF9ESUFHX0JHUkVGX1BSRURSVl9ERUxBWSAgICAgIDB4NDFFNwo+ ICsjZGVmaW5lIFRYX0RJQUdfQkdSRUZfUFJFRFJWX0RFTEFZICAgICAgMHg0MUU3Cj4gKyNkZWZp bmUgVFhfRElBR19BQ1lBXzAgICAgICAgICAgICAgICAgICAweDQxRkYKPiArI2RlZmluZSBUWF9E SUFHX0FDWUFfMSAgICAgICAgICAgICAgICAgIDB4NDNGRgo+ICsjZGVmaW5lIFRYX0RJQUdfQUNZ QV8yICAgICAgICAgICAgICAgICAgMHg0NUZGCj4gKyNkZWZpbmUgVFhfRElBR19BQ1lBXzMgICAg ICAgICAgICAgICAgICAweDQ3RkYKPiArI2RlZmluZSBUWF9BTkFfQ1RSTF9SRUdfMSAgICAgICAg ICAgICAgIDB4NTAyMAo+ICsjZGVmaW5lIFRYX0FOQV9DVFJMX1JFR18yICAgICAgICAgICAgICAg MHg1MDIxCj4gKyNkZWZpbmUgVFhfRElHX0NUUkxfUkVHXzEgICAgICAgICAgICAgICAweDUwMjMK PiArI2RlZmluZSBUWF9ESUdfQ1RSTF9SRUdfMiAgICAgICAgICAgICAgIDB4NTAyNAo+ICsjZGVm aW5lIFRYREFfQ1lBX0FVWERBX0NZQSAgICAgICAgICAgICAgMHg1MDI1Cj4gKyNkZWZpbmUgVFhf QU5BX0NUUkxfUkVHXzMgICAgICAgICAgICAgICAweDUwMjYKPiArI2RlZmluZSBUWF9BTkFfQ1RS TF9SRUdfNCAgICAgICAgICAgICAgIDB4NTAyNwo+ICsjZGVmaW5lIFRYX0FOQV9DVFJMX1JFR181 ICAgICAgICAgICAgICAgMHg1MDI5Cj4gKyNkZWZpbmUgUlhfUFNDX0EwICAgICAgICAgICAgICAg ICAgICAgICAweDgwMDAKPiArI2RlZmluZSBSWF9QU0NfQ0FMICAgICAgICAgICAgICAgICAgICAg IDB4ODAwNgo+ICsjZGVmaW5lIFBIWV9IRFBfTU9ERV9DVFJMICAgICAgICAgICAgICAgMHhDMDA4 Cj4gKyNkZWZpbmUgUEhZX0hEUF9DTEtfQ1RMICAgICAgICAgICAgICAgICAweEMwMDkKPiArI2Rl ZmluZSBQSFlfUE1BX0NNTl9DVFJMMSAgICAgICAgICAgICAgIDB4QzgwMAoKTG93ZXIgY2FzZSBo ZXggdmFsdWVzIHBsZWFzZQoKPiArCj4gKyNkZWZpbmUgUkVGX0NMS18yN01IWgkJMjcwMDAwMDAK PiArCj4gK2VudW0gZHBfbGlua19yYXRlIHsKPiArCVJBVEVfMV82ID0gMTYyMDAwLAo+ICsJUkFU RV8yXzEgPSAyMTYwMDAsCj4gKwlSQVRFXzJfNCA9IDI0MzAwMCwKPiArCVJBVEVfMl83ID0gMjcw MDAwLAo+ICsJUkFURV8zXzIgPSAzMjQwMDAsCj4gKwlSQVRFXzRfMyA9IDQzMjAwMCwKPiArCVJB VEVfNV80ID0gNTQwMDAwLAo+ICsJUkFURV84XzEgPSA4MTAwMDAsCj4gK307Cj4gKwo+ICsjZGVm aW5lIE1BWF9MSU5LX1JBVEUgUkFURV81XzQKPiArCj4gK3N0cnVjdCBwaHlfcGxsX3JlZyB7Cj4g Kwl1MTYgdmFsWzddOwo+ICsJdTMyIGFkZHI7Cj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IHBoeV9wbGxfcmVnIHBoeV9wbGxfMjdtX2NmZ1tdID0gewo+ICsJLyogIDEuNjIgICAgMi4x NiAgICAyLjQzICAgIDIuNyAgICAgMy4yNCAgICA0LjMyICAgIDUuNCAgICAgIHJlZ2lzdGVyIGFk ZHJlc3MgKi8KPiArCXt7IDB4MDEwRSwgMHgwMTBFLCAweDAxMEUsIDB4MDEwRSwgMHgwMTBFLCAw eDAxMEUsIDB4MDEwRSB9LCBDTU5fUExMMF9WQ09DQUxfSU5JVF9UTVIgfSwKPiArCXt7IDB4MDAx QiwgMHgwMDFCLCAweDAwMUIsIDB4MDAxQiwgMHgwMDFCLCAweDAwMUIsIDB4MDAxQiB9LCBDTU5f UExMMF9WQ09DQUxfSVRFUl9UTVIgfSwKPiArCXt7IDB4MzBCOSwgMHgzMDg3LCAweDMwOTYsIDB4 MzBCNCwgMHgzMEI5LCAweDMwODcsIDB4MzBCNCB9LCBDTU5fUExMMF9WQ09DQUxfU1RBUlQgfSwK PiArCXt7IDB4MDA3NywgMHgwMDlGLCAweDAwQjMsIDB4MDBDNywgMHgwMDc3LCAweDAwOUYsIDB4 MDBDNyB9LCBDTU5fUExMMF9JTlRESVYgfSwKPiArCXt7IDB4RjlEQSwgMHhGN0NELCAweEY2Qzcs IDB4RjVDMSwgMHhGOURBLCAweEY3Q0QsIDB4RjVDMSB9LCBDTU5fUExMMF9GUkFDRElWIH0sCj4g Kwl7eyAweDAwMUUsIDB4MDAyOCwgMHgwMDJELCAweDAwMzIsIDB4MDAxRSwgMHgwMDI4LCAweDAw MzIgfSwgQ01OX1BMTDBfSElHSF9USFIgfSwKPiArCXt7IDB4MDAyMCwgMHgwMDIwLCAweDAwMjAs IDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCB9LCBDTU5fUExMMF9EU01fRElBRyB9LAo+ ICsJe3sgMHgwMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDAwMDAsIDB4MTAwMCwgMHgx MDAwIH0sIENNTl9QTExTTTBfVVNFUl9ERUZfQ1RSTCB9LAo+ICsJe3sgMHgwMDAwLCAweDAwMDAs IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIENNTl9ESUFHX1BMTDBf T1ZSRCB9LAo+ICsJe3sgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4 MDAwMCwgMHgwMDAwIH0sIENNTl9ESUFHX1BMTDBfRkJIX09WUkQgfSwKPiArCXt7IDB4MDAwMCwg MHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCBDTU5fRElB R19QTEwwX0ZCTF9PVlJEIH0sCj4gKwl7eyAweDAwMDYsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcs IDB4MDAwNiwgMHgwMDA3LCAweDAwMDcgfSwgQ01OX0RJQUdfUExMMF9WMklfVFVORSB9LAo+ICsJ e3sgMHgwMDQzLCAweDAwNDMsIDB4MDA0MywgMHgwMDQyLCAweDAwNDMsIDB4MDA0MywgMHgwMDQy IH0sIENNTl9ESUFHX1BMTDBfQ1BfVFVORSB9LAo+ICsJe3sgMHgwMDA4LCAweDAwMDgsIDB4MDAw OCwgMHgwMDA4LCAweDAwMDgsIDB4MDAwOCwgMHgwMDA4IH0sIENNTl9ESUFHX1BMTDBfTEZfUFJP RyB9LAo+ICsJe3sgMHgwMTAwLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAxMDAsIDB4MDAw MSwgMHgwMDAxIH0sIENNTl9ESUFHX1BMTDBfUFRBVElTX1RVTkUxIH0sCj4gKwl7eyAweDAwMDcs IDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwNywgMHgwMDAxLCAweDAwMDEgfSwgQ01OX0RJ QUdfUExMMF9QVEFUSVNfVFVORTIgfSwKPiArCXt7IDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4 MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCB9LCBDTU5fRElBR19QTEwwX1RFU1RfTU9ERX0s Cj4gKwl7eyAweDAwMTYsIDB4MDAxNiwgMHgwMDE2LCAweDAwMTYsIDB4MDAxNiwgMHgwMDE2LCAw eDAwMTYgfSwgQ01OX1BTTV9DTEtfQ1RSTCB9CgphZ2FpbiwgbG93ZXIgY2FzZSBwbGVhc2UKCj4g K307Cj4gKwo+ICtzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgewo+ICsJdm9pZCBfX2lvbWVtICpy ZWdzOwkvKiBEUFRYIHJlZ2lzdGVycyBiYXNlICovCj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4g KwlzdHJ1Y3QgcGh5ICpwaHk7Cj4gKwlzdHJ1Y3QgbXV0ZXggbWJveF9tdXRleDsgLyogbXV0ZXgg dG8gcHJvdGVjdCBtYWlsYm94ICovCj4gKwlzdHJ1Y3QgY2xrICpyZWZfY2xrLCAqYXBiX2NsazsK PiArCXUzMiByZWZfY2xrX3JhdGU7Cj4gKwl1MzIgbnVtX2xhbmVzOwo+ICsJdTMyIGxpbmtfcmF0 ZTsKPiArCWJvb2wgcG93ZXJfdXA7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IGNkbnNfcGh5X3Jl Z193cml0ZShzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5LCB1MzIgYWRkciwgdTMy IHZhbCkKPiArewo+ICsJcmV0dXJuIGNkbnNfbWhkcF9yZWdfd3JpdGUoY2Ruc19waHksIEFERFJf UEhZX0FGRSArIChhZGRyIDw8IDIpLCB2YWwpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdTMyIGNkbnNf cGh5X3JlZ19yZWFkKHN0cnVjdCBjZG5zX2hkcHR4X2RwX3BoeSAqY2Ruc19waHksIHUzMiBhZGRy KQo+ICt7Cj4gKwl1MzIgcmVnMzI7Cj4gKwo+ICsJY2Ruc19taGRwX3JlZ19yZWFkKGNkbnNfcGh5 LCBBRERSX1BIWV9BRkUgKyAoYWRkciA8PCAyKSwgJnJlZzMyKTsKPiArCXJldHVybiByZWczMjsK PiArfQo+ICsKPiArc3RhdGljIGludCBsaW5rX3JhdGVfaW5kZXgodTMyIHJhdGUpCj4gK3sKPiAr CXN3aXRjaCAocmF0ZSkgewo+ICsJY2FzZSBSQVRFXzFfNjoKPiArCQlyZXR1cm4gMDsKPiArCWNh c2UgUkFURV8yXzE6Cj4gKwkJcmV0dXJuIDE7Cj4gKwljYXNlIFJBVEVfMl80Ogo+ICsJCXJldHVy biAyOwo+ICsJY2FzZSBSQVRFXzJfNzoKPiArCQlyZXR1cm4gMzsKPiArCWNhc2UgUkFURV8zXzI6 Cj4gKwkJcmV0dXJuIDQ7Cj4gKwljYXNlIFJBVEVfNF8zOgo+ICsJCXJldHVybiA1Owo+ICsJY2Fz ZSBSQVRFXzVfNDoKPiArCQlyZXR1cm4gNjsKPiArCWRlZmF1bHQ6Cj4gKwkJcmV0dXJuIC0xOwo+ ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGhkcHR4X2RwX2Nsa19lbmFibGUoc3RydWN0IGNk bnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSkKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0g Y2Ruc19waHktPmRldjsKPiArCXUzMiByZWZfY2xrX3JhdGU7Cj4gKwlpbnQgcmV0Owo+ICsKPiAr CWNkbnNfcGh5LT5yZWZfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInJlZiIpOwo+ICsJaWYgKElT X0VSUihjZG5zX3BoeS0+cmVmX2NsaykpIHsKPiArCQlkZXZfZXJyKGRldiwgInBoeSByZWYgY2xv Y2sgbm90IGZvdW5kXG4iKTsKPiArCQlyZXR1cm4gUFRSX0VSUihjZG5zX3BoeS0+cmVmX2Nsayk7 Cj4gKwl9Cj4gKwo+ICsJY2Ruc19waHktPmFwYl9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiYXBi Iik7Cj4gKwlpZiAoSVNfRVJSKGNkbnNfcGh5LT5hcGJfY2xrKSkgewo+ICsJCWRldl9lcnIoZGV2 LCAicGh5IGFwYiBjbG9jayBub3QgZm91bmRcbiIpOwo+ICsJCXJldHVybiBQVFJfRVJSKGNkbnNf cGh5LT5hcGJfY2xrKTsKPiArCX0KPiArCj4gKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoY2Ru c19waHktPnJlZl9jbGspOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoY2Ruc19waHktPmRl diwgIkZhaWxlZCB0byBwcmVwYXJlIHJlZiBjbG9ja1xuIik7Cj4gKwkJcmV0dXJuIHJldDsKPiAr CX0KPiArCj4gKwlyZWZfY2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2Ruc19waHktPnJlZl9jbGsp Owo+ICsJaWYgKCFyZWZfY2xrX3JhdGUpIHsKPiArCQlkZXZfZXJyKGNkbnNfcGh5LT5kZXYsICJG YWlsZWQgdG8gZ2V0IHJlZiBjbG9jayByYXRlXG4iKTsKPiArCQlnb3RvIGVycl9yZWZfY2xrOwo+ ICsJfQo+ICsKPiArCWlmIChyZWZfY2xrX3JhdGUgPT0gUkVGX0NMS18yN01IWikKPiArCQljZG5z X3BoeS0+cmVmX2Nsa19yYXRlID0gcmVmX2Nsa19yYXRlOwo+ICsJZWxzZSB7Cj4gKwkJZGV2X2Vy cihjZG5zX3BoeS0+ZGV2LCAiTm90IHN1cHBvcnQgUmVmIENsb2NrIFJhdGUoJWRIeilcbiIsIHJl Zl9jbGtfcmF0ZSk7Cj4gKwkJZ290byBlcnJfcmVmX2NsazsKPiArCX0KPiArCj4gKwlyZXQgPSBj bGtfcHJlcGFyZV9lbmFibGUoY2Ruc19waHktPmFwYl9jbGspOwo+ICsJaWYgKHJldCkgewo+ICsJ CWRldl9lcnIoY2Ruc19waHktPmRldiwgIkZhaWxlZCB0byBwcmVwYXJlIGFwYiBjbG9ja1xuIik7 Cj4gKwkJZ290byBlcnJfcmVmX2NsazsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArCj4gK2Vy cl9yZWZfY2xrOgo+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNkbnNfcGh5LT5yZWZfY2xrKTsK PiArCXJldHVybiAtRUlOVkFMOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBoZHB0eF9kcF9jbGtf ZGlzYWJsZShzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5KQo+ICt7Cj4gKwljbGtf ZGlzYWJsZV91bnByZXBhcmUoY2Ruc19waHktPnJlZl9jbGspOwo+ICsJY2xrX2Rpc2FibGVfdW5w cmVwYXJlKGNkbnNfcGh5LT5hcGJfY2xrKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaGRwdHhf ZHBfYXV4X2NmZyhzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5KQo+ICt7Cj4gKwkv KiBQb3dlciB1cCBBdXggKi8KPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhEQV9D WUFfQVVYREFfQ1lBLCAxKTsKPiArCj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIFRY X0RJR19DVFJMX1JFR18xLCAweDMpOwo+ICsJbmRlbGF5KDE1MCk7Cj4gKwljZG5zX3BoeV9yZWdf d3JpdGUoY2Ruc19waHksIFRYX0RJR19DVFJMX1JFR18yLCAzNik7Cj4gKwluZGVsYXkoMTUwKTsK PiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzIsIDB4MDEw MCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhf QU5BX0NUUkxfUkVHXzIsIDB4MDMwMCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3Jl Z193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzMsIDB4MDAwMCk7Cj4gKwluZGVsYXko MTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzEs IDB4MjAwOCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3Bo eSwgVFhfQU5BX0NUUkxfUkVHXzEsIDB4MjAxOCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzEsIDB4QTAxOCk7Cj4gKwlu ZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxf UkVHXzIsIDB4MDMwQyk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShj ZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzUsIDB4MDAwMCk7Cj4gKwluZGVsYXkoMTUwKTsKPiAr CWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzQsIDB4MTAwMSk7 Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5B X0NUUkxfUkVHXzEsIDB4QTA5OCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193 cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzEsIDB4QTE5OCk7Cj4gKwluZGVsYXkoMTUw KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzIsIDB4 MDMwZCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwg VFhfQU5BX0NUUkxfUkVHXzIsIDB4MDMwZik7Cj4gK30KPiArCj4gKy8qIFBNQSBjb21tb24gY29u ZmlndXJhdGlvbiBmb3IgMjdNSHogKi8KPiArc3RhdGljIHZvaWQgaGRwdHhfZHBfcGh5X3BtYV9j bW5fY2ZnXzI3bWh6KHN0cnVjdCBjZG5zX2hkcHR4X2RwX3BoeSAqY2Ruc19waHkpCj4gK3sKPiAr CXUzMiBudW1fbGFuZXMgPSBjZG5zX3BoeS0+bnVtX2xhbmVzOwo+ICsJdTE2IHZhbDsKPiArCWlu dCBrOwo+ICsKPiArCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfUE1BX0NN Tl9DVFJMMSk7Cj4gKwl2YWwgJj0gMHhGRkY3Owo+ICsJdmFsIHw9IDB4MDAwODsKPiArCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX1BNQV9DTU5fQ1RSTDEsIHZhbCk7Cj4gKwo+ICsJ LyogU3RhcnR1cCBzdGF0ZSBtYWNoaW5lIHJlZ2lzdGVycyAqLwo+ICsJY2Ruc19waHlfcmVnX3dy aXRlKGNkbnNfcGh5LCBDTU5fU1NNX0JJQVNfVE1SLCAweDAwODcpOwo+ICsJY2Ruc19waHlfcmVn X3dyaXRlKGNkbnNfcGh5LCBDTU5fUExMU00wX1BMTEVOX1RNUiwgMHgwMDFCKTsKPiArCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgQ01OX1BMTFNNMF9QTExQUkVfVE1SLCAweDAwMzYpOwo+ ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fUExMU00wX1BMTFZSRUZfVE1SLCAw eDAwMUIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fUExMU00wX1BMTExP Q0tfVE1SLCAweDAwNkMpOwo+ICsKPiArCS8qIEN1cnJlbnQgY2FsaWJyYXRpb24gcmVnaXN0ZXJz ICovCj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9JQ0FMX0lOSVRfVE1SLCAw eDAwNDQpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fSUNBTF9JVEVSX1RN UiwgMHgwMDA2KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgQ01OX0lDQUxfQURK X0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5f SUNBTF9BREpfSVRFUl9UTVIsIDB4MDAwNik7Cj4gKwo+ICsJLyogUmVzaXN0b3IgY2FsaWJyYXRp b24gcmVnaXN0ZXJzICovCj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9UWFBV Q0FMX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBD TU5fVFhQVUNBTF9JVEVSX1RNUiwgMHgwMDA2KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5z X3BoeSwgQ01OX1RYUFVfQURKX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dy aXRlKGNkbnNfcGh5LCBDTU5fVFhQVV9BREpfSVRFUl9UTVIsIDB4MDAwNik7Cj4gKwljZG5zX3Bo eV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9UWFBEQ0FMX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJ Y2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fVFhQRENBTF9JVEVSX1RNUiwgMHgwMDA2 KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgQ01OX1RYUERfQURKX0lOSVRfVE1S LCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fVFhQRF9BREpf SVRFUl9UTVIsIDB4MDAwNik7Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9S WENBTF9JTklUX1RNUiwgMHgwMDIyKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwg Q01OX1JYQ0FMX0lURVJfVE1SLCAweDAwMDYpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNf cGh5LCBDTU5fUlhfQURKX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRl KGNkbnNfcGh5LCBDTU5fUlhfQURKX0lURVJfVE1SLCAweDAwMDYpOwo+ICsKPiArCWZvciAoayA9 IDA7IGsgPCBudW1fbGFuZXM7IGsgPSBrICsgMSkgewo+ICsJCS8qIFBvd2VyIHN0YXRlIG1hY2hp bmUgcmVnaXN0ZXJzICovCj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBYQ1ZSX1BT TV9DQUxfVE1SICB8IChrIDw8IDkpLCAweDAxNkQpOwo+ICsJCWNkbnNfcGh5X3JlZ193cml0ZShj ZG5zX3BoeSwgWENWUl9QU01fQTBJTl9UTVIgfCAoayA8PCA5KSwgMHgwMTZEKTsKPiArCQkvKiBU cmFuc2NlaXZlciBjb250cm9sIGFuZCBkaWFnbm9zdGljIHJlZ2lzdGVycyAqLwo+ICsJCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgWENWUl9ESUFHX0xBTkVfRkNNX0VOX01HTl9UTVIgfCAo ayA8PCA5KSwgMHgwMEEyKTsKPiArCQljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIFRYX0RJ QUdfQkdSRUZfUFJFRFJWX0RFTEFZICAgIHwgKGsgPDwgOSksIDB4MDA5Nyk7Cj4gKwkJLyogVHJh bnNtaXR0ZXIgcmVjZWl2ZXIgZGV0ZWN0IHJlZ2lzdGVycyAqLwo+ICsJCWNkbnNfcGh5X3JlZ193 cml0ZShjZG5zX3BoeSwgVFhfUkNWREVUX0VOX1RNUiB8IChrIDw8IDkpLCAweDBBOEMpOwo+ICsJ CWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfUkNWREVUX1NUX1RNUiB8IChrIDw8IDkp LCAweDAwMzYpOwo+ICsJfQo+ICsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhf RElBR19BQ1lBXzAsIDEpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBUWF9ESUFH X0FDWUFfMSwgMSk7Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIFRYX0RJQUdfQUNZ QV8yLCAxKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfRElBR19BQ1lBXzMs IDEpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBoZHB0eF9kcF9waHlfcG1hX2Ntbl9wbGwwXzI3 bWh6KHN0cnVjdCBjZG5zX2hkcHR4X2RwX3BoeSAqY2Ruc19waHkpCj4gK3sKPiArCXUzMiBudW1f bGFuZXMgPSBjZG5zX3BoeS0+bnVtX2xhbmVzOwo+ICsJdTMyIGxpbmtfcmF0ZSA9IGNkbnNfcGh5 LT5saW5rX3JhdGU7Cj4gKwl1MTYgdmFsOwo+ICsJaW50IGluZGV4LCBpLCBrOwo+ICsKPiArCS8q IERQIFBMTCBkYXRhIHJhdGUgMC8xIGNsb2NrIGRpdmlkZXIgdmFsdWUgKi8KPiArCXZhbCA9IGNk bnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJdmFsICY9IDB4 MDBGRjsKPiArCWlmIChsaW5rX3JhdGUgPD0gUkFURV8yXzcpCj4gKwkJdmFsIHw9IDB4MjQwMDsK PiArCWVsc2UKPiArCQl2YWwgfD0gMHgxMjAwOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNf cGh5LCBQSFlfSERQX0NMS19DVEwsIHZhbCk7Cj4gKwo+ICsJLyogSGlnaCBzcGVlZCBjbG9jayAw LzEgZGl2ICovCj4gKwl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgQ01OX0RJQUdf SFNDTEtfU0VMKTsKPiArCXZhbCAmPSAweEZGQ0M7Cj4gKwlpZiAobGlua19yYXRlIDw9IFJBVEVf Ml83KQo+ICsJCXZhbCB8PSAweDAwMTE7Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHks IENNTl9ESUFHX0hTQ0xLX1NFTCwgdmFsKTsKPiArCj4gKwlmb3IgKGsgPSAwOyBrIDwgbnVtX2xh bmVzOyBrKyspIHsKPiArCQl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgKFhDVlJf RElBR19IU0NMS19TRUwgfCAoayA8PCA5KSkpOwo+ICsJCXZhbCA9IHZhbCAmIDB4Q0ZGRjsKPiAr CQlpZiAobGlua19yYXRlIDw9IFJBVEVfMl83KQo+ICsJCQl2YWwgfD0gMHgxMDAwOwo+ICsJCWNk bnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgKFhDVlJfRElBR19IU0NMS19TRUwgfCAoayA8PCA5 KSksIHZhbCk7Cj4gKwl9Cj4gKwo+ICsJLyogRFAgUEhZIFBMTCAyN01IeiBjb25maWd1cmF0aW9u ICovCj4gKwlpbmRleCA9IGxpbmtfcmF0ZV9pbmRleChsaW5rX3JhdGUpOwo+ICsJZm9yIChpID0g MDsgaSA8IEFSUkFZX1NJWkUocGh5X3BsbF8yN21fY2ZnKTsgaSsrKQo+ICsJCWNkbnNfcGh5X3Jl Z193cml0ZShjZG5zX3BoeSwgcGh5X3BsbF8yN21fY2ZnW2ldLmFkZHIsCj4gKwkJCQlwaHlfcGxs XzI3bV9jZmdbaV0udmFsW2luZGV4XSk7Cj4gKwo+ICsJLyogVHJhbnNjZWl2ZXIgY29udHJvbCBh bmQgZGlhZ25vc3RpYyByZWdpc3RlcnMgKi8KPiArCWZvciAoayA9IDA7IGsgPCBudW1fbGFuZXM7 IGsrKykgewo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCAoWENWUl9ESUFH X1BMTERSQ19DVFJMIHwgKGsgPDwgOSkpKTsKPiArCQl2YWwgPSB2YWwgJiAweDhGRkY7Cj4gKwkJ aWYgKGxpbmtfcmF0ZSA8PSBSQVRFXzJfNykKPiArCQkJdmFsIHw9IDB4MjAwMDsKPiArCQllbHNl Cj4gKwkJCXZhbCB8PSAweDEwMDA7Cj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCAo WENWUl9ESUFHX1BMTERSQ19DVFJMIHwgKGsgPDwgOSkpLCB2YWwpOwo+ICsJfQo+ICsKPiArCWZv ciAoayA9IDA7IGsgPCBudW1fbGFuZXM7IGsgPSBrICsgMSkgewo+ICsJCS8qIFBvd2VyIHN0YXRl IG1hY2hpbmUgcmVnaXN0ZXJzICovCj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCAo WENWUl9QU01fUkNUUkwgfCAoayA8PCA5KSksICAweEJFRkMpOwo+ICsJCWNkbnNfcGh5X3JlZ193 cml0ZShjZG5zX3BoeSwgKFRYX1BTQ19BMCB8IChrIDw8IDkpKSwgMHg2Nzk5KTsKPiArCQljZG5z X3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIChUWF9QU0NfQTEgfCAoayA8PCA5KSksIDB4Njc5OCk7 Cj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCAoVFhfUFNDX0EyIHwgKGsgPDwgOSkp LCAweDAwOTgpOwo+ICsJCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgKFRYX1BTQ19BMyB8 IChrIDw8IDkpKSwgMHgwMDk4KTsKPiArCQkvKiBSZWNlaXZlciBjYWxpYnJhdGlvbiBwb3dlciBz dGF0ZSBkZWZpbml0aW9uIHJlZ2lzdGVyICovCj4gKwkJdmFsID0gY2Ruc19waHlfcmVnX3JlYWQo Y2Ruc19waHksIFJYX1BTQ19DQUwgfCAoayA8PCA5KSk7Cj4gKwkJdmFsICY9IDB4RkZCQjsKPiAr CQljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIChSWF9QU0NfQ0FMIHwgKGsgPDwgOSkpLCB2 YWwpOwo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBSWF9QU0NfQTAgIHwg KGsgPDwgOSkpOwo+ICsJCXZhbCAmPSAweEZGQkI7Cj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNk bnNfcGh5LCAoUlhfUFNDX0EwICB8IChrIDw8IDkpKSwgdmFsKTsKPiArCX0KPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgaGRwdHhfZHBfcGh5X3JlZl9jbG9ja190eXBlKHN0cnVjdCBjZG5zX2hkcHR4 X2RwX3BoeSAqY2Ruc19waHkpCj4gK3sKPiArCXUzMiB2YWw7Cj4gKwo+ICsJdmFsID0gY2Ruc19w aHlfcmVnX3JlYWQoY2Ruc19waHksIFBIWV9QTUFfQ01OX0NUUkwxKTsKPiArCXZhbCAmPSAweEZG OEY7Cj4gKwkvKgo+ICsJICogc2luZ2xlIGVuZGVkIHJlZmVyZW5jZSBjbG9jayAodmFsIHw9IDB4 MDAzMCk7Cj4gKwkgKiBkaWZmZXJlbnRpYWwgY2xvY2sgICh2YWwgfD0gMHgwMDAwKTsKPiArCSAq Cj4gKwkgKiBmb3IgZGlmZmVyZW50aWFsIGNsb2NrIG9uIHRoZSByZWZjbGtfcCBhbmQKPiArCSAq IHJlZmNsa19tIG9mZiBjaGlwIHBpbnM6IENNTl9ESUFHX0FDWUFbOF09MSdiMQo+ICsJICogY2Ru c19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fRElBR19BQ1lBLCAweDAxMDApOwo+ICsJICov Cj4gKwl2YWwgfD0gMHgwMDMwOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBQSFlf UE1BX0NNTl9DVFJMMSwgdmFsKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBoZHB0eF9kcF9waHlf cG93ZXJfdXAoc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSkKPiArewo+ICsJdTMy IHZhbCwgaTsKPiArCj4gKwkvKiBFbmFibGUgSERQIFBMTOKAmXMgZm9yIGhpZ2ggc3BlZWQgY2xv Y2tzICovCj4gKwl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9DTEtf Q1RMKTsKPiArCXZhbCB8PSAoMSA8PCAwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3Bo eSwgUEhZX0hEUF9DTEtfQ1RMLCB2YWwpOwo+ICsJLyogV2FpdCBmb3IgUExMIHJlYWR5IEFDSyAq Lwo+ICsJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKPiArCQl2YWwgPSBjZG5zX3BoeV9yZWdf cmVhZChjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMKTsKPiArCQlpZiAodmFsICYgKDEgPDwgMSkp Cj4gKwkJCWJyZWFrOwo+ICsJCW1zbGVlcCgyMCk7Cj4gKwl9Cj4gKwlpZiAoaSA9PSAxMCkgewo+ ICsJCWRldl9lcnIoY2Ruc19waHktPmRldiwgIldhaXQgUExMIEFjayBmYWlsZWRcbiIpOwo+ICsJ CXJldHVybiAtMTsKPiArCX0KPiArCj4gKwkvKiBFbmFibGUgSERQIFBMTOKAmXMgZGF0YSByYXRl IGFuZCBmdWxsIHJhdGUgY2xvY2tzIG91dCBvZiBQTUEuICovCj4gKwl2YWwgPSBjZG5zX3BoeV9y ZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMKTsKPiArCXZhbCB8PSAoMSA8PCAyKTsK PiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMLCB2YWwpOwo+ ICsJLyogV2FpdCBmb3IgUExMIGNsb2NrIGVuYWJsZSBBQ0sgKi8KPiArCWZvciAoaSA9IDA7IGkg PCAxMDsgaSsrKSB7Cj4gKwkJdmFsID0gY2Ruc19waHlfcmVnX3JlYWQoY2Ruc19waHksIFBIWV9I RFBfQ0xLX0NUTCk7Cj4gKwkJaWYgKHZhbCAmICgxIDw8IDMpKQo+ICsJCQlicmVhazsKPiArCQlt c2xlZXAoMjApOwo+ICsJfQo+ICsJaWYgKGkgPT0gMTApIHsKPiArCQlkZXZfZXJyKGNkbnNfcGh5 LT5kZXYsICJXYWl0IFBMTCBjbG9jayBlbmFibGUgQUNrIGZhaWxlZFxuIik7Cj4gKwkJcmV0dXJu IC0xOwo+ICsJfQo+ICsKPiArCS8qIENvbmZpZ3VyZSBQSFkgaW4gQTIgTW9kZSAqLwo+ICsJY2Ru c19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBQSFlfSERQX01PREVfQ1RSTCwgMHgwMDA0KTsKPiAr CS8qIFdhaXQgZm9yIFBvd2VyIFN0YXRlIEEyIEFjayAqLwo+ICsJZm9yIChpID0gMDsgaSA8IDEw OyBpKyspIHsKPiArCQl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9N T0RFX0NUUkwpOwo+ICsJCWlmICh2YWwgJiAoMSA8PCA2KSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNs ZWVwKDIwKTsKPiArCX0KPiArCWlmIChpID09IDEwKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ ZGV2LCAiV2FpdCBBMiBBY2sgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm4gLTE7Cj4gKwl9Cj4gKwo+ ICsJLyogQ29uZmlndXJlIFBIWSBpbiBBMCBtb2RlIChQSFkgbXVzdCBiZSBpbiB0aGUgQTAgcG93 ZXIKPiArCSAqIHN0YXRlIGluIG9yZGVyIHRvIHRyYW5zbWl0IGRhdGEpCj4gKwkgKi8KPiArCWNk bnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hEUF9NT0RFX0NUUkwsIDB4MDEwMSk7Cj4g Kwo+ICsJLyogV2FpdCBmb3IgUG93ZXIgU3RhdGUgQTAgQWNrICovCj4gKwlmb3IgKGkgPSAwOyBp IDwgMTA7IGkrKykgewo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlf SERQX01PREVfQ1RSTCk7Cj4gKwkJaWYgKHZhbCAmICgxIDw8IDQpKQo+ICsJCQlicmVhazsKPiAr CQltc2xlZXAoMjApOwo+ICsJfQo+ICsJaWYgKGkgPT0gMTApIHsKPiArCQlkZXZfZXJyKGNkbnNf cGh5LT5kZXYsICJXYWl0IEEwIEFjayBmYWlsZWRcbiIpOwo+ICsJCXJldHVybiAtMTsKPiArCX0K PiArCj4gKwljZG5zX3BoeS0+cG93ZXJfdXAgPSB0cnVlOwo+ICsKPiArCXJldHVybiAwOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCBoZHB0eF9kcF9waHlfcG93ZXJfZG93bihzdHJ1Y3QgY2Ruc19o ZHB0eF9kcF9waHkgKmNkbnNfcGh5KQo+ICt7Cj4gKwl1MTYgdmFsOwo+ICsJaW50IGk7Cj4gKwo+ ICsJaWYgKCFjZG5zX3BoeS0+cG93ZXJfdXApCj4gKwkJcmV0dXJuOwo+ICsKPiArCS8qIFBsYWNl IHRoZSBQSFkgbGFuZXMgaW4gdGhlIEEzIHBvd2VyIHN0YXRlLiAqLwo+ICsJY2Ruc19waHlfcmVn X3dyaXRlKGNkbnNfcGh5LCBQSFlfSERQX01PREVfQ1RSTCwgMHg4KTsKPiArCS8qIFdhaXQgZm9y IFBvd2VyIFN0YXRlIEEzIEFjayAqLwo+ICsJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKPiAr CQl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9NT0RFX0NUUkwpOwo+ ICsJCWlmICh2YWwgJiAoMSA8PCA3KSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVwKDIwKTsKPiAr CX0KPiArCWlmIChpID09IDEwKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiV2FpdCBB MyBBY2sgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJLyogRGlzYWJsZSBI RFAgUExM4oCZcyBkYXRhIHJhdGUgYW5kIGZ1bGwgcmF0ZSBjbG9ja3Mgb3V0IG9mIFBNQS4gKi8K PiArCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ ICsJdmFsICY9IH4oMSA8PCAyKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZ X0hEUF9DTEtfQ1RMLCB2YWwpOwo+ICsJLyogV2FpdCBmb3IgUExMIGNsb2NrIGdhdGUgQUNLICov Cj4gKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19y ZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJCWlmICghKHZhbCAmICgxIDw8IDMp KSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVwKDIwKTsKPiArCX0KPiArCWlmIChpID09IDEwKSB7 Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiV2FpdCBQTEwgY2xvY2sgZ2F0ZSBBY2sgZmFp bGVkXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJLyogRGlzYWJsZSBIRFAgUExM4oCZ cyBmb3IgaGlnaCBzcGVlZCBjbG9ja3MgKi8KPiArCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNk bnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJdmFsICY9IH4oMSA8PCAwKTsKPiArCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMLCB2YWwpOwo+ICsJLyogV2Fp dCBmb3IgUExMIGRpc2FibGUgQUNLICovCj4gKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewo+ ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ ICsJCWlmICghKHZhbCAmICgxIDw8IDEpKSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVwKDIwKTsK PiArCX0KPiArCWlmIChpID09IDEwKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiV2Fp dCBQTEwgZGlzYWJsZSBBY2sgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgY2Ruc19oZHB0eF9kcF9waHlfb24oc3RydWN0IHBoeSAqcGh5KQo+ICt7 Cj4gKwlzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5ID0gcGh5X2dldF9kcnZkYXRh KHBoeSk7Cj4gKwo+ICsJcmV0dXJuIGhkcHR4X2RwX3BoeV9wb3dlcl91cChjZG5zX3BoeSk7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgY2Ruc19oZHB0eF9kcF9waHlfb2ZmKHN0cnVjdCBwaHkgKnBo eSkKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSA9IHBoeV9nZXRf ZHJ2ZGF0YShwaHkpOwo+ICsKPiArCWhkcHR4X2RwX3BoeV9wb3dlcl9kb3duKGNkbnNfcGh5KTsK PiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBjZG5zX2hkcHR4X2RwX3Bo eV9pbml0KHN0cnVjdCBwaHkgKnBoeSkKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5 ICpjZG5zX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ICsJaW50IHJldDsKPiArCj4gKwlo ZHB0eF9kcF9waHlfcmVmX2Nsb2NrX3R5cGUoY2Ruc19waHkpOwo+ICsKPiArCS8qIFBIWSBwb3dl ciB1cCAqLwo+ICsJcmV0ID0gaGRwdHhfZHBfcGh5X3Bvd2VyX3VwKGNkbnNfcGh5KTsKPiArCWlm IChyZXQgPCAwKQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJaGRwdHhfZHBfYXV4X2NmZyhjZG5z X3BoeSk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBjZG5zX2hk cHR4X2RwX2NvbmZpZ3VyZShzdHJ1Y3QgcGh5ICpwaHksCj4gKwkJCQkgICAgIHVuaW9uIHBoeV9j b25maWd1cmVfb3B0cyAqb3B0cykKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpj ZG5zX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ICsJaW50IHJldDsKPiArCj4gKwljZG5z X3BoeS0+bGlua19yYXRlID0gb3B0cy0+ZHAubGlua19yYXRlOwo+ICsJY2Ruc19waHktPm51bV9s YW5lcyA9IG9wdHMtPmRwLmxhbmVzOwo+ICsKPiArCWlmIChjZG5zX3BoeS0+bGlua19yYXRlID4g TUFYX0xJTktfUkFURSkgewo+ICsJCWRldl9lcnIoY2Ruc19waHktPmRldiwgIkxpbmsgUmF0ZSgl ZCkgTm90IHN1cHBvcnRlZFxuIiwgY2Ruc19waHktPmxpbmtfcmF0ZSk7Cj4gKwkJcmV0dXJuIGZh bHNlOwo+ICsJfQo+ICsKPiArCS8qIERpc2FibGUgcGh5IGNsb2NrIGlmIFBIWSBpbiBwb3dlciB1 cCBzdGF0ZSAqLwo+ICsJaGRwdHhfZHBfcGh5X3Bvd2VyX2Rvd24oY2Ruc19waHkpOwo+ICsKPiAr CWlmIChjZG5zX3BoeS0+cmVmX2Nsa19yYXRlID09IFJFRl9DTEtfMjdNSFopIHsKPiArCQloZHB0 eF9kcF9waHlfcG1hX2Ntbl9jZmdfMjdtaHooY2Ruc19waHkpOwo+ICsJCWhkcHR4X2RwX3BoeV9w bWFfY21uX3BsbDBfMjdtaHooY2Ruc19waHkpOwo+ICsJfSBlbHNlCj4gKwkJZGV2X2VycihjZG5z X3BoeS0+ZGV2LCAiTm90IHN1cHBvcnQgcmVmIGNsb2NrIHJhdGVcbiIpOwo+ICsKPiArCS8qIFBI WSBwb3dlciB1cCAqLwo+ICsJcmV0ID0gaGRwdHhfZHBfcGh5X3Bvd2VyX3VwKGNkbnNfcGh5KTsK PiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9v cHMgY2Ruc19oZHB0eF9kcF9waHlfb3BzID0gewo+ICsJLmluaXQJCT0gY2Ruc19oZHB0eF9kcF9w aHlfaW5pdCwKPiArCS5jb25maWd1cmUJPSBjZG5zX2hkcHR4X2RwX2NvbmZpZ3VyZSwKPiArCS5w b3dlcl9vbgk9IGNkbnNfaGRwdHhfZHBfcGh5X29uLAo+ICsJLnBvd2VyX29mZgk9IGNkbnNfaGRw dHhfZHBfcGh5X29mZiwKPiArCS5vd25lcgkJPSBUSElTX01PRFVMRSwKPiArfTsKPiArCj4gK3N0 YXRpYyBpbnQgY2Ruc19oZHB0eF9kcF9waHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeTsKPiArCXN0 cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5v ZGUgPSBkZXYtPm9mX25vZGU7Cj4gKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7 Cj4gKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKPiArCXN0cnVjdCBwaHkgKnBoeTsKPiArCWludCBy ZXQ7Cj4gKwo+ICsJY2Ruc19waHkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmNkbnNfcGh5 KSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWNkbnNfcGh5KQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ ICsKPiArCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGNkbnNfcGh5KTsKPiArCWNkbnNfcGh5LT5kZXYg PSBkZXY7Cj4gKwltdXRleF9pbml0KCZjZG5zX3BoeS0+bWJveF9tdXRleCk7Cj4gKwo+ICsJcmVz ID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKPiArCWlm ICghcmVzKQo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJY2Ruc19waHktPnJlZ3MgPSBkZXZtX2lv cmVtYXAoZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwo+ICsJaWYgKElTX0VS UihjZG5zX3BoeS0+cmVncykpCj4gKwkJcmV0dXJuIFBUUl9FUlIoY2Ruc19waHktPnJlZ3MpOwo+ ICsKPiArCXBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsIG5vZGUsICZjZG5zX2hkcHR4X2RwX3Bo eV9vcHMpOwo+ICsJaWYgKElTX0VSUihwaHkpKQo+ICsJCXJldHVybiBQVFJfRVJSKHBoeSk7Cj4g Kwo+ICsJcGh5LT5hdHRycy5tb2RlID0gUEhZX01PREVfRFA7Cj4gKwljZG5zX3BoeS0+cGh5ID0g cGh5Owo+ICsJcGh5X3NldF9kcnZkYXRhKHBoeSwgY2Ruc19waHkpOwo+ICsKPiArCXJldCA9IGhk cHR4X2RwX2Nsa19lbmFibGUoY2Ruc19waHkpOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIo ZGV2LCAiSW5pdCBjbGsgZmFpbFxuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ ICsJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBvZl9w aHlfc2ltcGxlX3hsYXRlKTsKPiArCWlmIChJU19FUlIocGh5X3Byb3ZpZGVyKSkgewo+ICsJCXJl dCA9ICBQVFJfRVJSKHBoeV9wcm92aWRlcik7Cj4gKwkJZ290byBjbGtfZGlzYWJsZTsKPiArCX0K PiArCj4gKwlyZXR1cm4gMDsKPiArCj4gK2Nsa19kaXNhYmxlOgo+ICsJaGRwdHhfZHBfY2xrX2Rp c2FibGUoY2Ruc19waHkpOwo+ICsKPiArCXJldHVybiAtRUlOVkFMOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IGNkbnNfaGRwdHhfZHBfcGh5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5ID0gcGxhdGZv cm1fZ2V0X2RydmRhdGEocGRldik7Cj4gKwo+ICsJaGRwdHhfZHBfY2xrX2Rpc2FibGUoY2Ruc19w aHkpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9m X2RldmljZV9pZCBjZG5zX2hkcHR4X2RwX3BoeV9vZl9tYXRjaFtdID0gewo+ICsJey5jb21wYXRp YmxlID0gImZzbCxpbXg4bXEtZHAtcGh5IiB9LAo+ICsJeyAvKiBzZW50aW5lbCAqLyB9Cj4gK307 Cj4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGNkbnNfaGRwdHhfZHBfcGh5X29mX21hdGNoKTsK PiArCj4gK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNkbnNfaGRwdHhfZHBfcGh5X2Ry aXZlciA9IHsKPiArCS5wcm9iZQk9IGNkbnNfaGRwdHhfZHBfcGh5X3Byb2JlLAo+ICsJLnJlbW92 ZSA9IGNkbnNfaGRwdHhfZHBfcGh5X3JlbW92ZSwKPiArCS5kcml2ZXIgPSB7Cj4gKwkJLm5hbWUJ PSAiY2Rucy1oZHB0eC1kcC1waHkiLAo+ICsJCS5vZl9tYXRjaF90YWJsZQk9IGNkbnNfaGRwdHhf ZHBfcGh5X29mX21hdGNoLAo+ICsJfQo+ICt9Owo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGNk bnNfaGRwdHhfZHBfcGh5X2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJTYW5kb3IgWXUg PHNhbmRvci55dUBueHAuY29tPiIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIkNhZGVuY2UgSERQ LVRYIERpc3BsYXlQb3J0IFBIWSBkcml2ZXIiKTsKPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+ IC0tIAo+IDIuMzQuMQoKLS0gCn5WaW5vZAoKLS0gCmxpbnV4LXBoeSBtYWlsaW5nIGxpc3QKbGlu dXgtcGh5QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cHM6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21h aWxtYW4vbGlzdGluZm8vbGludXgtcGh5Cg== 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 04C4DEB64D8 for ; Wed, 21 Jun 2023 11:24:50 +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=Gm1YdMJ6g4g0Vu+mjj98nFx0UbMsVpkZwrb+FjmC0P4=; b=Q5n02LZ+FDZhOE DQMBGLVOpciUtAcH48u00Ibw7G54WWBjtIDng9Zqvhe1JaB2mp+Ty2e8VLABmn9L52qXZQbNUlzVk F8/vbtsXON40aoLycCsxexBYdMw/tpp73OfwLv/8CeBcrONh+xmXGo9vDd+j9sQv10jdKTbNKhdMJ YVaJfiBcI4bEaY5UQmlOeaBtHqTpYX9nu2R1otSBaMDxAurmDWSTV+5ooDn9RXpL8GqrKVEFV/sx3 zsmj4uSnaLqPeuKjKBdwQfTg+xb3jjE39DALwi3psx2dAL40IhO6XuheSe83jhIw99kwXDIJlJv+C +REvcsb9VOo7be0grFaw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qBvwm-00ENlS-0G; Wed, 21 Jun 2023 11:24:24 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qBvwh-00ENk8-2J; Wed, 21 Jun 2023 11:24:22 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id D4F846150D; Wed, 21 Jun 2023 11:24:18 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 156F9C433C8; Wed, 21 Jun 2023 11:24:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1687346658; bh=NwH5V30lS5yuvPManxFLnChOCMB0DORyGUvgs2Zr6UY=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=mWSxcoEVRWxNXGI/Oek4fG9sGHqE5jWxuxZOFaQMXVXGKN1XsNZO3NlLaK9s6Herx GmfpnFQNfDkvBywz9NzTRfontZLY7od2W4ScJoS7D2To1kTEAyZcpmDJz0KevH/wJ6 K13KDRSRl2T54GYWvGB7loExRsBoqSU4JRAGldNqzOkNLruz0JNculEKqr2kmjx4MD Py7fJD11FEjjIfdYgtl01yNM3ZORsYgyByw4uIcY+F8ENOQmPmeA+p5JSy0ojKTX+Y x1s6FbK4STvasCzBUMYvoG2Fv43pFjDb7uQQKHQwNTvLaKNci46IuMCRtKjVhOMW8B uIBQnS2ZQMsPA== Date: Wed, 21 Jun 2023 16:54:13 +0530 From: Vinod Koul To: Sandor Yu Cc: andrzej.hajda@intel.com, neil.armstrong@linaro.org, robert.foss@linaro.org, Laurent.pinchart@ideasonboard.com, jonas@kwiboo.se, jernej.skrabec@gmail.com, airlied@gmail.com, daniel@ffwll.ch, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, kernel@pengutronix.de, linux-imx@nxp.com, oliver.brown@nxp.com Subject: Re: [PATCH v6 7/8] phy: freescale: Add DisplayPort PHY driver for i.MX8MQ Message-ID: References: <279d6d605656a7ca1bbee6270d66aa218a1b7d3d.1686729444.git.Sandor.yu@nxp.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <279d6d605656a7ca1bbee6270d66aa218a1b7d3d.1686729444.git.Sandor.yu@nxp.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230621_042419_842075_7BBE82FD X-CRM114-Status: GOOD ( 29.10 ) 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 T24gMTUtMDYtMjMsIDA5OjM4LCBTYW5kb3IgWXUgd3JvdGU6Cj4gQWRkIENhZGVuY2UgSERQLVRY IERpc3BsYXlQb3J0IFBIWSBkcml2ZXIgZm9yIGkuTVg4TVEKPiAKPiBDYWRlbmNlIEhEUC1UWCBQ SFkgY291bGQgYmUgcHV0IGluIGVpdGhlciBEUCBtb2RlIG9yCj4gSERNSSBtb2RlIGJhc2Ugb24g dGhlIGNvbmZpZ3VyYXRpb24gY2hvc2VuLgo+IERpc3BsYXlQb3J0IFBIWSBtb2RlIGlzIGNvbmZp Z3VyYXRlZCBpbiB0aGUgZHJpdmVyLgo+IAo+IFNpZ25lZC1vZmYtYnk6IFNhbmRvciBZdSA8U2Fu ZG9yLnl1QG54cC5jb20+Cj4gLS0tCj4gIGRyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29uZmlnICAg ICAgICAgICAgIHwgICA5ICsKPiAgZHJpdmVycy9waHkvZnJlZXNjYWxlL01ha2VmaWxlICAgICAg ICAgICAgfCAgIDEgKwo+ICBkcml2ZXJzL3BoeS9mcmVlc2NhbGUvcGh5LWZzbC1pbXg4bXEtZHAu YyB8IDY5NyArKysrKysrKysrKysrKysrKysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgNzA3IGlu c2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcGh5L2ZyZWVzY2FsZS9w aHktZnNsLWlteDhtcS1kcC5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L2ZyZWVzY2Fs ZS9LY29uZmlnIGIvZHJpdmVycy9waHkvZnJlZXNjYWxlL0tjb25maWcKPiBpbmRleCA4NTM5NThm YjJjMDYuLmE5OWVlMzcwZWRhNiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BoeS9mcmVlc2NhbGUv S2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29uZmlnCj4gQEAgLTM1LDYg KzM1LDE1IEBAIGNvbmZpZyBQSFlfRlNMX0lNWDhNX1BDSUUKPiAgCSAgRW5hYmxlIHRoaXMgdG8g YWRkIHN1cHBvcnQgZm9yIHRoZSBQQ0lFIFBIWSBhcyBmb3VuZCBvbgo+ICAJICBpLk1YOE0gZmFt aWx5IG9mIFNPQ3MuCj4gIAo+ICtjb25maWcgUEhZX0NBREVOQ0VfRFBfUEhZCj4gKwl0cmlzdGF0 ZSAiQ2FkZW5jZSBIRFBUWCBEUCBQSFkgc3VwcG9ydCIKPiArCWRlcGVuZHMgb24gT0YgJiYgSEFT X0lPTUVNCj4gKwlkZXBlbmRzIG9uIENPTU1PTl9DTEsKPiArCXNlbGVjdCBHRU5FUklDX1BIWQo+ ICsJaGVscAo+ICsJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSBDYWRlbmNlIEhEUFRYIERQ IFBIWSBkcml2ZXIKPiArCSAgb24gTlhQJ3MgaS5NWDhNUSBTT0MuCj4gKwo+ICBlbmRpZgo+ICAK PiAgY29uZmlnIFBIWV9GU0xfTFlOWF8yOEcKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvZnJl ZXNjYWxlL01ha2VmaWxlIGIvZHJpdmVycy9waHkvZnJlZXNjYWxlL01ha2VmaWxlCj4gaW5kZXgg Y2VkYjMyOGJjNGQyLi5jM2JkZjNmYTJlNzIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9waHkvZnJl ZXNjYWxlL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9waHkvZnJlZXNjYWxlL01ha2VmaWxlCj4g QEAgLTQsMyArNCw0IEBAIG9iai0kKENPTkZJR19QSFlfTUlYRUxfTFZEU19QSFkpCSs9IHBoeS1m c2wtaW14OHFtLWx2ZHMtcGh5Lm8KPiAgb2JqLSQoQ09ORklHX1BIWV9NSVhFTF9NSVBJX0RQSFkp CSs9IHBoeS1mc2wtaW14OC1taXBpLWRwaHkubwo+ICBvYmotJChDT05GSUdfUEhZX0ZTTF9JTVg4 TV9QQ0lFKQkrPSBwaHktZnNsLWlteDhtLXBjaWUubwo+ICBvYmotJChDT05GSUdfUEhZX0ZTTF9M WU5YXzI4RykJCSs9IHBoeS1mc2wtbHlueC0yOGcubwo+ICtvYmotJChDT05GSUdfUEhZX0NBREVO Q0VfRFBfUEhZKQkrPSBwaHktZnNsLWlteDhtcS1kcC5vCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv cGh5L2ZyZWVzY2FsZS9waHktZnNsLWlteDhtcS1kcC5jIGIvZHJpdmVycy9waHkvZnJlZXNjYWxl L3BoeS1mc2wtaW14OG1xLWRwLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAw MDAwMDAwMC4uMmJkNjc3MmE1ZDNiCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvcGh5 L2ZyZWVzY2FsZS9waHktZnNsLWlteDhtcS1kcC5jCj4gQEAgLTAsMCArMSw2OTcgQEAKPiArLy8g U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQo+ICsvKgo+ICsgKiBDYWRlbmNl IEhEUC1UWCBEaXNwbGF5IFBvcnQgSW50ZXJmYWNlIChEUCkgUEhZIGRyaXZlcgo+ICsgKgo+ICsg KiBDb3B5cmlnaHQgKEMpIDIwMjIgTlhQIFNlbWljb25kdWN0b3IsIEluYy4KPiArICovCj4gKyNp bmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiArI2lu Y2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgo+ICsj aW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pby5o Pgo+ICsjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+Cj4gKwo+ICsjaW5jbHVkZSA8ZHJtL2JyaWRn ZS9jZG5zLW1oZHAtbWFpbGJveC5oPgo+ICsKPiArI2RlZmluZSBBRERSX1BIWV9BRkUJMHg4MDAw MAoKSXMgdGhpcyBhbHdheXMgZml4ZWQgZm9yIGV2ZXJ5IHBoeSBnZW5lcmF0aW9uPwo+ICsKPiAr LyogUEhZIHJlZ2lzdGVycyAqLwo+ICsjZGVmaW5lIENNTl9TU01fQklBU19UTVIgICAgICAgICAg ICAgICAgMHgwMDIyCj4gKyNkZWZpbmUgQ01OX1BMTFNNMF9QTExFTl9UTVIgICAgICAgICAgICAw eDAwMjkKPiArI2RlZmluZSBDTU5fUExMU00wX1BMTFBSRV9UTVIgICAgICAgICAgIDB4MDAyQQo+ ICsjZGVmaW5lIENNTl9QTExTTTBfUExMVlJFRl9UTVIgICAgICAgICAgMHgwMDJCCj4gKyNkZWZp bmUgQ01OX1BMTFNNMF9QTExMT0NLX1RNUiAgICAgICAgICAweDAwMkMKPiArI2RlZmluZSBDTU5f UExMU00wX1VTRVJfREVGX0NUUkwgICAgICAgIDB4MDAyRgo+ICsjZGVmaW5lIENNTl9QU01fQ0xL X0NUUkwgICAgICAgICAgICAgICAgMHgwMDYxCj4gKyNkZWZpbmUgQ01OX1BMTDBfVkNPQ0FMX1NU QVJUICAgICAgICAgICAweDAwODEKPiArI2RlZmluZSBDTU5fUExMMF9WQ09DQUxfSU5JVF9UTVIg ICAgICAgIDB4MDA4NAo+ICsjZGVmaW5lIENNTl9QTEwwX1ZDT0NBTF9JVEVSX1RNUiAgICAgICAg MHgwMDg1Cj4gKyNkZWZpbmUgQ01OX1BMTDBfSU5URElWICAgICAgICAgICAgICAgICAweDAwOTQK PiArI2RlZmluZSBDTU5fUExMMF9GUkFDRElWICAgICAgICAgICAgICAgIDB4MDA5NQo+ICsjZGVm aW5lIENNTl9QTEwwX0hJR0hfVEhSICAgICAgICAgICAgICAgMHgwMDk2Cj4gKyNkZWZpbmUgQ01O X1BMTDBfRFNNX0RJQUcgICAgICAgICAgICAgICAweDAwOTcKPiArI2RlZmluZSBDTU5fUExMMF9T U19DVFJMMiAgICAgICAgICAgICAgIDB4MDA5OQo+ICsjZGVmaW5lIENNTl9JQ0FMX0lOSVRfVE1S ICAgICAgICAgICAgICAgMHgwMEM0Cj4gKyNkZWZpbmUgQ01OX0lDQUxfSVRFUl9UTVIgICAgICAg ICAgICAgICAweDAwQzUKPiArI2RlZmluZSBDTU5fUlhDQUxfSU5JVF9UTVIgICAgICAgICAgICAg IDB4MDBENAo+ICsjZGVmaW5lIENNTl9SWENBTF9JVEVSX1RNUiAgICAgICAgICAgICAgMHgwMEQ1 Cj4gKyNkZWZpbmUgQ01OX1RYUFVDQUxfSU5JVF9UTVIgICAgICAgICAgICAweDAwRTQKPiArI2Rl ZmluZSBDTU5fVFhQVUNBTF9JVEVSX1RNUiAgICAgICAgICAgIDB4MDBFNQo+ICsjZGVmaW5lIENN Tl9UWFBEQ0FMX0lOSVRfVE1SICAgICAgICAgICAgMHgwMEY0Cj4gKyNkZWZpbmUgQ01OX1RYUERD QUxfSVRFUl9UTVIgICAgICAgICAgICAweDAwRjUKPiArI2RlZmluZSBDTU5fSUNBTF9BREpfSU5J VF9UTVIgICAgICAgICAgIDB4MDEwMgo+ICsjZGVmaW5lIENNTl9JQ0FMX0FESl9JVEVSX1RNUiAg ICAgICAgICAgMHgwMTAzCj4gKyNkZWZpbmUgQ01OX1JYX0FESl9JTklUX1RNUiAgICAgICAgICAg ICAweDAxMDYKPiArI2RlZmluZSBDTU5fUlhfQURKX0lURVJfVE1SICAgICAgICAgICAgIDB4MDEw Nwo+ICsjZGVmaW5lIENNTl9UWFBVX0FESl9JTklUX1RNUiAgICAgICAgICAgMHgwMTBBCj4gKyNk ZWZpbmUgQ01OX1RYUFVfQURKX0lURVJfVE1SICAgICAgICAgICAweDAxMEIKPiArI2RlZmluZSBD TU5fVFhQRF9BREpfSU5JVF9UTVIgICAgICAgICAgIDB4MDEwRQo+ICsjZGVmaW5lIENNTl9UWFBE X0FESl9JVEVSX1RNUiAgICAgICAgICAgMHgwMTBGCj4gKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9G QkhfT1ZSRCAgICAgICAgICAweDAxQzAKPiArI2RlZmluZSBDTU5fRElBR19QTEwwX0ZCTF9PVlJE ICAgICAgICAgIDB4MDFDMQo+ICsjZGVmaW5lIENNTl9ESUFHX1BMTDBfT1ZSRCAgICAgICAgICAg ICAgMHgwMUMyCj4gKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9URVNUX01PREUgICAgICAgICAweDAx QzQKPiArI2RlZmluZSBDTU5fRElBR19QTEwwX1YySV9UVU5FICAgICAgICAgIDB4MDFDNQo+ICsj ZGVmaW5lIENNTl9ESUFHX1BMTDBfQ1BfVFVORSAgICAgICAgICAgMHgwMUM2Cj4gKyNkZWZpbmUg Q01OX0RJQUdfUExMMF9MRl9QUk9HICAgICAgICAgICAweDAxQzcKPiArI2RlZmluZSBDTU5fRElB R19QTEwwX1BUQVRJU19UVU5FMSAgICAgIDB4MDFDOAo+ICsjZGVmaW5lIENNTl9ESUFHX1BMTDBf UFRBVElTX1RVTkUyICAgICAgMHgwMUM5Cj4gKyNkZWZpbmUgQ01OX0RJQUdfSFNDTEtfU0VMICAg ICAgICAgICAgICAweDAxRTAKPiArI2RlZmluZSBDTU5fRElBR19QRVJfQ0FMX0FESiAgICAgICAg ICAgIDB4MDFFQwo+ICsjZGVmaW5lIENNTl9ESUFHX0NBTF9DVFJMICAgICAgICAgICAgICAgMHgw MUVECj4gKyNkZWZpbmUgQ01OX0RJQUdfQUNZQSAgICAgICAgICAgICAgICAgICAweDAxRkYKPiAr I2RlZmluZSBYQ1ZSX1BTTV9SQ1RSTCAgICAgICAgICAgICAgICAgIDB4NDAwMQo+ICsjZGVmaW5l IFhDVlJfUFNNX0NBTF9UTVIgICAgICAgICAgICAgICAgMHg0MDAyCj4gKyNkZWZpbmUgWENWUl9Q U01fQTBJTl9UTVIgICAgICAgICAgICAgICAweDQwMDMKPiArI2RlZmluZSBUWF9UWENDX0NBTF9T Q0xSX01VTFRfMCAgICAgICAgIDB4NDA0Nwo+ICsjZGVmaW5lIFRYX1RYQ0NfQ1BPU1RfTVVMVF8w MF8wICAgICAgICAgMHg0MDRDCj4gKyNkZWZpbmUgWENWUl9ESUFHX1BMTERSQ19DVFJMICAgICAg ICAgICAweDQwRTAKPiArI2RlZmluZSBYQ1ZSX0RJQUdfUExMRFJDX0NUUkwgICAgICAgICAgIDB4 NDBFMAo+ICsjZGVmaW5lIFhDVlJfRElBR19IU0NMS19TRUwgICAgICAgICAgICAgMHg0MEUxCj4g KyNkZWZpbmUgWENWUl9ESUFHX0xBTkVfRkNNX0VOX01HTl9UTVIgICAweDQwRjIKPiArI2RlZmlu ZSBUWF9QU0NfQTAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwMAo+ICsjZGVmaW5lIFRYX1BT Q19BMSAgICAgICAgICAgICAgICAgICAgICAgMHg0MTAxCj4gKyNkZWZpbmUgVFhfUFNDX0EyICAg ICAgICAgICAgICAgICAgICAgICAweDQxMDIKPiArI2RlZmluZSBUWF9QU0NfQTMgICAgICAgICAg ICAgICAgICAgICAgIDB4NDEwMwo+ICsjZGVmaW5lIFRYX1JDVkRFVF9FTl9UTVIgICAgICAgICAg ICAgICAgMHg0MTIyCj4gKyNkZWZpbmUgVFhfUkNWREVUX1NUX1RNUiAgICAgICAgICAgICAgICAw eDQxMjMKPiArI2RlZmluZSBUWF9ESUFHX0JHUkVGX1BSRURSVl9ERUxBWSAgICAgIDB4NDFFNwo+ ICsjZGVmaW5lIFRYX0RJQUdfQkdSRUZfUFJFRFJWX0RFTEFZICAgICAgMHg0MUU3Cj4gKyNkZWZp bmUgVFhfRElBR19BQ1lBXzAgICAgICAgICAgICAgICAgICAweDQxRkYKPiArI2RlZmluZSBUWF9E SUFHX0FDWUFfMSAgICAgICAgICAgICAgICAgIDB4NDNGRgo+ICsjZGVmaW5lIFRYX0RJQUdfQUNZ QV8yICAgICAgICAgICAgICAgICAgMHg0NUZGCj4gKyNkZWZpbmUgVFhfRElBR19BQ1lBXzMgICAg ICAgICAgICAgICAgICAweDQ3RkYKPiArI2RlZmluZSBUWF9BTkFfQ1RSTF9SRUdfMSAgICAgICAg ICAgICAgIDB4NTAyMAo+ICsjZGVmaW5lIFRYX0FOQV9DVFJMX1JFR18yICAgICAgICAgICAgICAg MHg1MDIxCj4gKyNkZWZpbmUgVFhfRElHX0NUUkxfUkVHXzEgICAgICAgICAgICAgICAweDUwMjMK PiArI2RlZmluZSBUWF9ESUdfQ1RSTF9SRUdfMiAgICAgICAgICAgICAgIDB4NTAyNAo+ICsjZGVm aW5lIFRYREFfQ1lBX0FVWERBX0NZQSAgICAgICAgICAgICAgMHg1MDI1Cj4gKyNkZWZpbmUgVFhf QU5BX0NUUkxfUkVHXzMgICAgICAgICAgICAgICAweDUwMjYKPiArI2RlZmluZSBUWF9BTkFfQ1RS TF9SRUdfNCAgICAgICAgICAgICAgIDB4NTAyNwo+ICsjZGVmaW5lIFRYX0FOQV9DVFJMX1JFR181 ICAgICAgICAgICAgICAgMHg1MDI5Cj4gKyNkZWZpbmUgUlhfUFNDX0EwICAgICAgICAgICAgICAg ICAgICAgICAweDgwMDAKPiArI2RlZmluZSBSWF9QU0NfQ0FMICAgICAgICAgICAgICAgICAgICAg IDB4ODAwNgo+ICsjZGVmaW5lIFBIWV9IRFBfTU9ERV9DVFJMICAgICAgICAgICAgICAgMHhDMDA4 Cj4gKyNkZWZpbmUgUEhZX0hEUF9DTEtfQ1RMICAgICAgICAgICAgICAgICAweEMwMDkKPiArI2Rl ZmluZSBQSFlfUE1BX0NNTl9DVFJMMSAgICAgICAgICAgICAgIDB4QzgwMAoKTG93ZXIgY2FzZSBo ZXggdmFsdWVzIHBsZWFzZQoKPiArCj4gKyNkZWZpbmUgUkVGX0NMS18yN01IWgkJMjcwMDAwMDAK PiArCj4gK2VudW0gZHBfbGlua19yYXRlIHsKPiArCVJBVEVfMV82ID0gMTYyMDAwLAo+ICsJUkFU RV8yXzEgPSAyMTYwMDAsCj4gKwlSQVRFXzJfNCA9IDI0MzAwMCwKPiArCVJBVEVfMl83ID0gMjcw MDAwLAo+ICsJUkFURV8zXzIgPSAzMjQwMDAsCj4gKwlSQVRFXzRfMyA9IDQzMjAwMCwKPiArCVJB VEVfNV80ID0gNTQwMDAwLAo+ICsJUkFURV84XzEgPSA4MTAwMDAsCj4gK307Cj4gKwo+ICsjZGVm aW5lIE1BWF9MSU5LX1JBVEUgUkFURV81XzQKPiArCj4gK3N0cnVjdCBwaHlfcGxsX3JlZyB7Cj4g Kwl1MTYgdmFsWzddOwo+ICsJdTMyIGFkZHI7Cj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IHBoeV9wbGxfcmVnIHBoeV9wbGxfMjdtX2NmZ1tdID0gewo+ICsJLyogIDEuNjIgICAgMi4x NiAgICAyLjQzICAgIDIuNyAgICAgMy4yNCAgICA0LjMyICAgIDUuNCAgICAgIHJlZ2lzdGVyIGFk ZHJlc3MgKi8KPiArCXt7IDB4MDEwRSwgMHgwMTBFLCAweDAxMEUsIDB4MDEwRSwgMHgwMTBFLCAw eDAxMEUsIDB4MDEwRSB9LCBDTU5fUExMMF9WQ09DQUxfSU5JVF9UTVIgfSwKPiArCXt7IDB4MDAx QiwgMHgwMDFCLCAweDAwMUIsIDB4MDAxQiwgMHgwMDFCLCAweDAwMUIsIDB4MDAxQiB9LCBDTU5f UExMMF9WQ09DQUxfSVRFUl9UTVIgfSwKPiArCXt7IDB4MzBCOSwgMHgzMDg3LCAweDMwOTYsIDB4 MzBCNCwgMHgzMEI5LCAweDMwODcsIDB4MzBCNCB9LCBDTU5fUExMMF9WQ09DQUxfU1RBUlQgfSwK PiArCXt7IDB4MDA3NywgMHgwMDlGLCAweDAwQjMsIDB4MDBDNywgMHgwMDc3LCAweDAwOUYsIDB4 MDBDNyB9LCBDTU5fUExMMF9JTlRESVYgfSwKPiArCXt7IDB4RjlEQSwgMHhGN0NELCAweEY2Qzcs IDB4RjVDMSwgMHhGOURBLCAweEY3Q0QsIDB4RjVDMSB9LCBDTU5fUExMMF9GUkFDRElWIH0sCj4g Kwl7eyAweDAwMUUsIDB4MDAyOCwgMHgwMDJELCAweDAwMzIsIDB4MDAxRSwgMHgwMDI4LCAweDAw MzIgfSwgQ01OX1BMTDBfSElHSF9USFIgfSwKPiArCXt7IDB4MDAyMCwgMHgwMDIwLCAweDAwMjAs IDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCB9LCBDTU5fUExMMF9EU01fRElBRyB9LAo+ ICsJe3sgMHgwMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDAwMDAsIDB4MTAwMCwgMHgx MDAwIH0sIENNTl9QTExTTTBfVVNFUl9ERUZfQ1RSTCB9LAo+ICsJe3sgMHgwMDAwLCAweDAwMDAs IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIENNTl9ESUFHX1BMTDBf T1ZSRCB9LAo+ICsJe3sgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4 MDAwMCwgMHgwMDAwIH0sIENNTl9ESUFHX1BMTDBfRkJIX09WUkQgfSwKPiArCXt7IDB4MDAwMCwg MHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCBDTU5fRElB R19QTEwwX0ZCTF9PVlJEIH0sCj4gKwl7eyAweDAwMDYsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcs IDB4MDAwNiwgMHgwMDA3LCAweDAwMDcgfSwgQ01OX0RJQUdfUExMMF9WMklfVFVORSB9LAo+ICsJ e3sgMHgwMDQzLCAweDAwNDMsIDB4MDA0MywgMHgwMDQyLCAweDAwNDMsIDB4MDA0MywgMHgwMDQy IH0sIENNTl9ESUFHX1BMTDBfQ1BfVFVORSB9LAo+ICsJe3sgMHgwMDA4LCAweDAwMDgsIDB4MDAw OCwgMHgwMDA4LCAweDAwMDgsIDB4MDAwOCwgMHgwMDA4IH0sIENNTl9ESUFHX1BMTDBfTEZfUFJP RyB9LAo+ICsJe3sgMHgwMTAwLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAxMDAsIDB4MDAw MSwgMHgwMDAxIH0sIENNTl9ESUFHX1BMTDBfUFRBVElTX1RVTkUxIH0sCj4gKwl7eyAweDAwMDcs IDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwNywgMHgwMDAxLCAweDAwMDEgfSwgQ01OX0RJ QUdfUExMMF9QVEFUSVNfVFVORTIgfSwKPiArCXt7IDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4 MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCB9LCBDTU5fRElBR19QTEwwX1RFU1RfTU9ERX0s Cj4gKwl7eyAweDAwMTYsIDB4MDAxNiwgMHgwMDE2LCAweDAwMTYsIDB4MDAxNiwgMHgwMDE2LCAw eDAwMTYgfSwgQ01OX1BTTV9DTEtfQ1RSTCB9CgphZ2FpbiwgbG93ZXIgY2FzZSBwbGVhc2UKCj4g K307Cj4gKwo+ICtzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgewo+ICsJdm9pZCBfX2lvbWVtICpy ZWdzOwkvKiBEUFRYIHJlZ2lzdGVycyBiYXNlICovCj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4g KwlzdHJ1Y3QgcGh5ICpwaHk7Cj4gKwlzdHJ1Y3QgbXV0ZXggbWJveF9tdXRleDsgLyogbXV0ZXgg dG8gcHJvdGVjdCBtYWlsYm94ICovCj4gKwlzdHJ1Y3QgY2xrICpyZWZfY2xrLCAqYXBiX2NsazsK PiArCXUzMiByZWZfY2xrX3JhdGU7Cj4gKwl1MzIgbnVtX2xhbmVzOwo+ICsJdTMyIGxpbmtfcmF0 ZTsKPiArCWJvb2wgcG93ZXJfdXA7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IGNkbnNfcGh5X3Jl Z193cml0ZShzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5LCB1MzIgYWRkciwgdTMy IHZhbCkKPiArewo+ICsJcmV0dXJuIGNkbnNfbWhkcF9yZWdfd3JpdGUoY2Ruc19waHksIEFERFJf UEhZX0FGRSArIChhZGRyIDw8IDIpLCB2YWwpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdTMyIGNkbnNf cGh5X3JlZ19yZWFkKHN0cnVjdCBjZG5zX2hkcHR4X2RwX3BoeSAqY2Ruc19waHksIHUzMiBhZGRy KQo+ICt7Cj4gKwl1MzIgcmVnMzI7Cj4gKwo+ICsJY2Ruc19taGRwX3JlZ19yZWFkKGNkbnNfcGh5 LCBBRERSX1BIWV9BRkUgKyAoYWRkciA8PCAyKSwgJnJlZzMyKTsKPiArCXJldHVybiByZWczMjsK PiArfQo+ICsKPiArc3RhdGljIGludCBsaW5rX3JhdGVfaW5kZXgodTMyIHJhdGUpCj4gK3sKPiAr CXN3aXRjaCAocmF0ZSkgewo+ICsJY2FzZSBSQVRFXzFfNjoKPiArCQlyZXR1cm4gMDsKPiArCWNh c2UgUkFURV8yXzE6Cj4gKwkJcmV0dXJuIDE7Cj4gKwljYXNlIFJBVEVfMl80Ogo+ICsJCXJldHVy biAyOwo+ICsJY2FzZSBSQVRFXzJfNzoKPiArCQlyZXR1cm4gMzsKPiArCWNhc2UgUkFURV8zXzI6 Cj4gKwkJcmV0dXJuIDQ7Cj4gKwljYXNlIFJBVEVfNF8zOgo+ICsJCXJldHVybiA1Owo+ICsJY2Fz ZSBSQVRFXzVfNDoKPiArCQlyZXR1cm4gNjsKPiArCWRlZmF1bHQ6Cj4gKwkJcmV0dXJuIC0xOwo+ ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGhkcHR4X2RwX2Nsa19lbmFibGUoc3RydWN0IGNk bnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSkKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0g Y2Ruc19waHktPmRldjsKPiArCXUzMiByZWZfY2xrX3JhdGU7Cj4gKwlpbnQgcmV0Owo+ICsKPiAr CWNkbnNfcGh5LT5yZWZfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInJlZiIpOwo+ICsJaWYgKElT X0VSUihjZG5zX3BoeS0+cmVmX2NsaykpIHsKPiArCQlkZXZfZXJyKGRldiwgInBoeSByZWYgY2xv Y2sgbm90IGZvdW5kXG4iKTsKPiArCQlyZXR1cm4gUFRSX0VSUihjZG5zX3BoeS0+cmVmX2Nsayk7 Cj4gKwl9Cj4gKwo+ICsJY2Ruc19waHktPmFwYl9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiYXBi Iik7Cj4gKwlpZiAoSVNfRVJSKGNkbnNfcGh5LT5hcGJfY2xrKSkgewo+ICsJCWRldl9lcnIoZGV2 LCAicGh5IGFwYiBjbG9jayBub3QgZm91bmRcbiIpOwo+ICsJCXJldHVybiBQVFJfRVJSKGNkbnNf cGh5LT5hcGJfY2xrKTsKPiArCX0KPiArCj4gKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoY2Ru c19waHktPnJlZl9jbGspOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoY2Ruc19waHktPmRl diwgIkZhaWxlZCB0byBwcmVwYXJlIHJlZiBjbG9ja1xuIik7Cj4gKwkJcmV0dXJuIHJldDsKPiAr CX0KPiArCj4gKwlyZWZfY2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2Ruc19waHktPnJlZl9jbGsp Owo+ICsJaWYgKCFyZWZfY2xrX3JhdGUpIHsKPiArCQlkZXZfZXJyKGNkbnNfcGh5LT5kZXYsICJG YWlsZWQgdG8gZ2V0IHJlZiBjbG9jayByYXRlXG4iKTsKPiArCQlnb3RvIGVycl9yZWZfY2xrOwo+ ICsJfQo+ICsKPiArCWlmIChyZWZfY2xrX3JhdGUgPT0gUkVGX0NMS18yN01IWikKPiArCQljZG5z X3BoeS0+cmVmX2Nsa19yYXRlID0gcmVmX2Nsa19yYXRlOwo+ICsJZWxzZSB7Cj4gKwkJZGV2X2Vy cihjZG5zX3BoeS0+ZGV2LCAiTm90IHN1cHBvcnQgUmVmIENsb2NrIFJhdGUoJWRIeilcbiIsIHJl Zl9jbGtfcmF0ZSk7Cj4gKwkJZ290byBlcnJfcmVmX2NsazsKPiArCX0KPiArCj4gKwlyZXQgPSBj bGtfcHJlcGFyZV9lbmFibGUoY2Ruc19waHktPmFwYl9jbGspOwo+ICsJaWYgKHJldCkgewo+ICsJ CWRldl9lcnIoY2Ruc19waHktPmRldiwgIkZhaWxlZCB0byBwcmVwYXJlIGFwYiBjbG9ja1xuIik7 Cj4gKwkJZ290byBlcnJfcmVmX2NsazsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArCj4gK2Vy cl9yZWZfY2xrOgo+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNkbnNfcGh5LT5yZWZfY2xrKTsK PiArCXJldHVybiAtRUlOVkFMOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBoZHB0eF9kcF9jbGtf ZGlzYWJsZShzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5KQo+ICt7Cj4gKwljbGtf ZGlzYWJsZV91bnByZXBhcmUoY2Ruc19waHktPnJlZl9jbGspOwo+ICsJY2xrX2Rpc2FibGVfdW5w cmVwYXJlKGNkbnNfcGh5LT5hcGJfY2xrKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaGRwdHhf ZHBfYXV4X2NmZyhzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5KQo+ICt7Cj4gKwkv KiBQb3dlciB1cCBBdXggKi8KPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhEQV9D WUFfQVVYREFfQ1lBLCAxKTsKPiArCj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIFRY X0RJR19DVFJMX1JFR18xLCAweDMpOwo+ICsJbmRlbGF5KDE1MCk7Cj4gKwljZG5zX3BoeV9yZWdf d3JpdGUoY2Ruc19waHksIFRYX0RJR19DVFJMX1JFR18yLCAzNik7Cj4gKwluZGVsYXkoMTUwKTsK PiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzIsIDB4MDEw MCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhf QU5BX0NUUkxfUkVHXzIsIDB4MDMwMCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3Jl Z193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzMsIDB4MDAwMCk7Cj4gKwluZGVsYXko MTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzEs IDB4MjAwOCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3Bo eSwgVFhfQU5BX0NUUkxfUkVHXzEsIDB4MjAxOCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzEsIDB4QTAxOCk7Cj4gKwlu ZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxf UkVHXzIsIDB4MDMwQyk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShj ZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzUsIDB4MDAwMCk7Cj4gKwluZGVsYXkoMTUwKTsKPiAr CWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzQsIDB4MTAwMSk7 Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5B X0NUUkxfUkVHXzEsIDB4QTA5OCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193 cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzEsIDB4QTE5OCk7Cj4gKwluZGVsYXkoMTUw KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzIsIDB4 MDMwZCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwg VFhfQU5BX0NUUkxfUkVHXzIsIDB4MDMwZik7Cj4gK30KPiArCj4gKy8qIFBNQSBjb21tb24gY29u ZmlndXJhdGlvbiBmb3IgMjdNSHogKi8KPiArc3RhdGljIHZvaWQgaGRwdHhfZHBfcGh5X3BtYV9j bW5fY2ZnXzI3bWh6KHN0cnVjdCBjZG5zX2hkcHR4X2RwX3BoeSAqY2Ruc19waHkpCj4gK3sKPiAr CXUzMiBudW1fbGFuZXMgPSBjZG5zX3BoeS0+bnVtX2xhbmVzOwo+ICsJdTE2IHZhbDsKPiArCWlu dCBrOwo+ICsKPiArCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfUE1BX0NN Tl9DVFJMMSk7Cj4gKwl2YWwgJj0gMHhGRkY3Owo+ICsJdmFsIHw9IDB4MDAwODsKPiArCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX1BNQV9DTU5fQ1RSTDEsIHZhbCk7Cj4gKwo+ICsJ LyogU3RhcnR1cCBzdGF0ZSBtYWNoaW5lIHJlZ2lzdGVycyAqLwo+ICsJY2Ruc19waHlfcmVnX3dy aXRlKGNkbnNfcGh5LCBDTU5fU1NNX0JJQVNfVE1SLCAweDAwODcpOwo+ICsJY2Ruc19waHlfcmVn X3dyaXRlKGNkbnNfcGh5LCBDTU5fUExMU00wX1BMTEVOX1RNUiwgMHgwMDFCKTsKPiArCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgQ01OX1BMTFNNMF9QTExQUkVfVE1SLCAweDAwMzYpOwo+ ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fUExMU00wX1BMTFZSRUZfVE1SLCAw eDAwMUIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fUExMU00wX1BMTExP Q0tfVE1SLCAweDAwNkMpOwo+ICsKPiArCS8qIEN1cnJlbnQgY2FsaWJyYXRpb24gcmVnaXN0ZXJz ICovCj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9JQ0FMX0lOSVRfVE1SLCAw eDAwNDQpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fSUNBTF9JVEVSX1RN UiwgMHgwMDA2KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgQ01OX0lDQUxfQURK X0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5f SUNBTF9BREpfSVRFUl9UTVIsIDB4MDAwNik7Cj4gKwo+ICsJLyogUmVzaXN0b3IgY2FsaWJyYXRp b24gcmVnaXN0ZXJzICovCj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9UWFBV Q0FMX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBD TU5fVFhQVUNBTF9JVEVSX1RNUiwgMHgwMDA2KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5z X3BoeSwgQ01OX1RYUFVfQURKX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dy aXRlKGNkbnNfcGh5LCBDTU5fVFhQVV9BREpfSVRFUl9UTVIsIDB4MDAwNik7Cj4gKwljZG5zX3Bo eV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9UWFBEQ0FMX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJ Y2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fVFhQRENBTF9JVEVSX1RNUiwgMHgwMDA2 KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgQ01OX1RYUERfQURKX0lOSVRfVE1S LCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fVFhQRF9BREpf SVRFUl9UTVIsIDB4MDAwNik7Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9S WENBTF9JTklUX1RNUiwgMHgwMDIyKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwg Q01OX1JYQ0FMX0lURVJfVE1SLCAweDAwMDYpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNf cGh5LCBDTU5fUlhfQURKX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRl KGNkbnNfcGh5LCBDTU5fUlhfQURKX0lURVJfVE1SLCAweDAwMDYpOwo+ICsKPiArCWZvciAoayA9 IDA7IGsgPCBudW1fbGFuZXM7IGsgPSBrICsgMSkgewo+ICsJCS8qIFBvd2VyIHN0YXRlIG1hY2hp bmUgcmVnaXN0ZXJzICovCj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBYQ1ZSX1BT TV9DQUxfVE1SICB8IChrIDw8IDkpLCAweDAxNkQpOwo+ICsJCWNkbnNfcGh5X3JlZ193cml0ZShj ZG5zX3BoeSwgWENWUl9QU01fQTBJTl9UTVIgfCAoayA8PCA5KSwgMHgwMTZEKTsKPiArCQkvKiBU cmFuc2NlaXZlciBjb250cm9sIGFuZCBkaWFnbm9zdGljIHJlZ2lzdGVycyAqLwo+ICsJCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgWENWUl9ESUFHX0xBTkVfRkNNX0VOX01HTl9UTVIgfCAo ayA8PCA5KSwgMHgwMEEyKTsKPiArCQljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIFRYX0RJ QUdfQkdSRUZfUFJFRFJWX0RFTEFZICAgIHwgKGsgPDwgOSksIDB4MDA5Nyk7Cj4gKwkJLyogVHJh bnNtaXR0ZXIgcmVjZWl2ZXIgZGV0ZWN0IHJlZ2lzdGVycyAqLwo+ICsJCWNkbnNfcGh5X3JlZ193 cml0ZShjZG5zX3BoeSwgVFhfUkNWREVUX0VOX1RNUiB8IChrIDw8IDkpLCAweDBBOEMpOwo+ICsJ CWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfUkNWREVUX1NUX1RNUiB8IChrIDw8IDkp LCAweDAwMzYpOwo+ICsJfQo+ICsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhf RElBR19BQ1lBXzAsIDEpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBUWF9ESUFH X0FDWUFfMSwgMSk7Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIFRYX0RJQUdfQUNZ QV8yLCAxKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfRElBR19BQ1lBXzMs IDEpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBoZHB0eF9kcF9waHlfcG1hX2Ntbl9wbGwwXzI3 bWh6KHN0cnVjdCBjZG5zX2hkcHR4X2RwX3BoeSAqY2Ruc19waHkpCj4gK3sKPiArCXUzMiBudW1f bGFuZXMgPSBjZG5zX3BoeS0+bnVtX2xhbmVzOwo+ICsJdTMyIGxpbmtfcmF0ZSA9IGNkbnNfcGh5 LT5saW5rX3JhdGU7Cj4gKwl1MTYgdmFsOwo+ICsJaW50IGluZGV4LCBpLCBrOwo+ICsKPiArCS8q IERQIFBMTCBkYXRhIHJhdGUgMC8xIGNsb2NrIGRpdmlkZXIgdmFsdWUgKi8KPiArCXZhbCA9IGNk bnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJdmFsICY9IDB4 MDBGRjsKPiArCWlmIChsaW5rX3JhdGUgPD0gUkFURV8yXzcpCj4gKwkJdmFsIHw9IDB4MjQwMDsK PiArCWVsc2UKPiArCQl2YWwgfD0gMHgxMjAwOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNf cGh5LCBQSFlfSERQX0NMS19DVEwsIHZhbCk7Cj4gKwo+ICsJLyogSGlnaCBzcGVlZCBjbG9jayAw LzEgZGl2ICovCj4gKwl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgQ01OX0RJQUdf SFNDTEtfU0VMKTsKPiArCXZhbCAmPSAweEZGQ0M7Cj4gKwlpZiAobGlua19yYXRlIDw9IFJBVEVf Ml83KQo+ICsJCXZhbCB8PSAweDAwMTE7Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHks IENNTl9ESUFHX0hTQ0xLX1NFTCwgdmFsKTsKPiArCj4gKwlmb3IgKGsgPSAwOyBrIDwgbnVtX2xh bmVzOyBrKyspIHsKPiArCQl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgKFhDVlJf RElBR19IU0NMS19TRUwgfCAoayA8PCA5KSkpOwo+ICsJCXZhbCA9IHZhbCAmIDB4Q0ZGRjsKPiAr CQlpZiAobGlua19yYXRlIDw9IFJBVEVfMl83KQo+ICsJCQl2YWwgfD0gMHgxMDAwOwo+ICsJCWNk bnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgKFhDVlJfRElBR19IU0NMS19TRUwgfCAoayA8PCA5 KSksIHZhbCk7Cj4gKwl9Cj4gKwo+ICsJLyogRFAgUEhZIFBMTCAyN01IeiBjb25maWd1cmF0aW9u ICovCj4gKwlpbmRleCA9IGxpbmtfcmF0ZV9pbmRleChsaW5rX3JhdGUpOwo+ICsJZm9yIChpID0g MDsgaSA8IEFSUkFZX1NJWkUocGh5X3BsbF8yN21fY2ZnKTsgaSsrKQo+ICsJCWNkbnNfcGh5X3Jl Z193cml0ZShjZG5zX3BoeSwgcGh5X3BsbF8yN21fY2ZnW2ldLmFkZHIsCj4gKwkJCQlwaHlfcGxs XzI3bV9jZmdbaV0udmFsW2luZGV4XSk7Cj4gKwo+ICsJLyogVHJhbnNjZWl2ZXIgY29udHJvbCBh bmQgZGlhZ25vc3RpYyByZWdpc3RlcnMgKi8KPiArCWZvciAoayA9IDA7IGsgPCBudW1fbGFuZXM7 IGsrKykgewo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCAoWENWUl9ESUFH X1BMTERSQ19DVFJMIHwgKGsgPDwgOSkpKTsKPiArCQl2YWwgPSB2YWwgJiAweDhGRkY7Cj4gKwkJ aWYgKGxpbmtfcmF0ZSA8PSBSQVRFXzJfNykKPiArCQkJdmFsIHw9IDB4MjAwMDsKPiArCQllbHNl Cj4gKwkJCXZhbCB8PSAweDEwMDA7Cj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCAo WENWUl9ESUFHX1BMTERSQ19DVFJMIHwgKGsgPDwgOSkpLCB2YWwpOwo+ICsJfQo+ICsKPiArCWZv ciAoayA9IDA7IGsgPCBudW1fbGFuZXM7IGsgPSBrICsgMSkgewo+ICsJCS8qIFBvd2VyIHN0YXRl IG1hY2hpbmUgcmVnaXN0ZXJzICovCj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCAo WENWUl9QU01fUkNUUkwgfCAoayA8PCA5KSksICAweEJFRkMpOwo+ICsJCWNkbnNfcGh5X3JlZ193 cml0ZShjZG5zX3BoeSwgKFRYX1BTQ19BMCB8IChrIDw8IDkpKSwgMHg2Nzk5KTsKPiArCQljZG5z X3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIChUWF9QU0NfQTEgfCAoayA8PCA5KSksIDB4Njc5OCk7 Cj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCAoVFhfUFNDX0EyIHwgKGsgPDwgOSkp LCAweDAwOTgpOwo+ICsJCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgKFRYX1BTQ19BMyB8 IChrIDw8IDkpKSwgMHgwMDk4KTsKPiArCQkvKiBSZWNlaXZlciBjYWxpYnJhdGlvbiBwb3dlciBz dGF0ZSBkZWZpbml0aW9uIHJlZ2lzdGVyICovCj4gKwkJdmFsID0gY2Ruc19waHlfcmVnX3JlYWQo Y2Ruc19waHksIFJYX1BTQ19DQUwgfCAoayA8PCA5KSk7Cj4gKwkJdmFsICY9IDB4RkZCQjsKPiAr CQljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIChSWF9QU0NfQ0FMIHwgKGsgPDwgOSkpLCB2 YWwpOwo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBSWF9QU0NfQTAgIHwg KGsgPDwgOSkpOwo+ICsJCXZhbCAmPSAweEZGQkI7Cj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNk bnNfcGh5LCAoUlhfUFNDX0EwICB8IChrIDw8IDkpKSwgdmFsKTsKPiArCX0KPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgaGRwdHhfZHBfcGh5X3JlZl9jbG9ja190eXBlKHN0cnVjdCBjZG5zX2hkcHR4 X2RwX3BoeSAqY2Ruc19waHkpCj4gK3sKPiArCXUzMiB2YWw7Cj4gKwo+ICsJdmFsID0gY2Ruc19w aHlfcmVnX3JlYWQoY2Ruc19waHksIFBIWV9QTUFfQ01OX0NUUkwxKTsKPiArCXZhbCAmPSAweEZG OEY7Cj4gKwkvKgo+ICsJICogc2luZ2xlIGVuZGVkIHJlZmVyZW5jZSBjbG9jayAodmFsIHw9IDB4 MDAzMCk7Cj4gKwkgKiBkaWZmZXJlbnRpYWwgY2xvY2sgICh2YWwgfD0gMHgwMDAwKTsKPiArCSAq Cj4gKwkgKiBmb3IgZGlmZmVyZW50aWFsIGNsb2NrIG9uIHRoZSByZWZjbGtfcCBhbmQKPiArCSAq IHJlZmNsa19tIG9mZiBjaGlwIHBpbnM6IENNTl9ESUFHX0FDWUFbOF09MSdiMQo+ICsJICogY2Ru c19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fRElBR19BQ1lBLCAweDAxMDApOwo+ICsJICov Cj4gKwl2YWwgfD0gMHgwMDMwOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBQSFlf UE1BX0NNTl9DVFJMMSwgdmFsKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBoZHB0eF9kcF9waHlf cG93ZXJfdXAoc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSkKPiArewo+ICsJdTMy IHZhbCwgaTsKPiArCj4gKwkvKiBFbmFibGUgSERQIFBMTOKAmXMgZm9yIGhpZ2ggc3BlZWQgY2xv Y2tzICovCj4gKwl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9DTEtf Q1RMKTsKPiArCXZhbCB8PSAoMSA8PCAwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3Bo eSwgUEhZX0hEUF9DTEtfQ1RMLCB2YWwpOwo+ICsJLyogV2FpdCBmb3IgUExMIHJlYWR5IEFDSyAq Lwo+ICsJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKPiArCQl2YWwgPSBjZG5zX3BoeV9yZWdf cmVhZChjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMKTsKPiArCQlpZiAodmFsICYgKDEgPDwgMSkp Cj4gKwkJCWJyZWFrOwo+ICsJCW1zbGVlcCgyMCk7Cj4gKwl9Cj4gKwlpZiAoaSA9PSAxMCkgewo+ ICsJCWRldl9lcnIoY2Ruc19waHktPmRldiwgIldhaXQgUExMIEFjayBmYWlsZWRcbiIpOwo+ICsJ CXJldHVybiAtMTsKPiArCX0KPiArCj4gKwkvKiBFbmFibGUgSERQIFBMTOKAmXMgZGF0YSByYXRl IGFuZCBmdWxsIHJhdGUgY2xvY2tzIG91dCBvZiBQTUEuICovCj4gKwl2YWwgPSBjZG5zX3BoeV9y ZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMKTsKPiArCXZhbCB8PSAoMSA8PCAyKTsK PiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMLCB2YWwpOwo+ ICsJLyogV2FpdCBmb3IgUExMIGNsb2NrIGVuYWJsZSBBQ0sgKi8KPiArCWZvciAoaSA9IDA7IGkg PCAxMDsgaSsrKSB7Cj4gKwkJdmFsID0gY2Ruc19waHlfcmVnX3JlYWQoY2Ruc19waHksIFBIWV9I RFBfQ0xLX0NUTCk7Cj4gKwkJaWYgKHZhbCAmICgxIDw8IDMpKQo+ICsJCQlicmVhazsKPiArCQlt c2xlZXAoMjApOwo+ICsJfQo+ICsJaWYgKGkgPT0gMTApIHsKPiArCQlkZXZfZXJyKGNkbnNfcGh5 LT5kZXYsICJXYWl0IFBMTCBjbG9jayBlbmFibGUgQUNrIGZhaWxlZFxuIik7Cj4gKwkJcmV0dXJu IC0xOwo+ICsJfQo+ICsKPiArCS8qIENvbmZpZ3VyZSBQSFkgaW4gQTIgTW9kZSAqLwo+ICsJY2Ru c19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBQSFlfSERQX01PREVfQ1RSTCwgMHgwMDA0KTsKPiAr CS8qIFdhaXQgZm9yIFBvd2VyIFN0YXRlIEEyIEFjayAqLwo+ICsJZm9yIChpID0gMDsgaSA8IDEw OyBpKyspIHsKPiArCQl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9N T0RFX0NUUkwpOwo+ICsJCWlmICh2YWwgJiAoMSA8PCA2KSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNs ZWVwKDIwKTsKPiArCX0KPiArCWlmIChpID09IDEwKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ ZGV2LCAiV2FpdCBBMiBBY2sgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm4gLTE7Cj4gKwl9Cj4gKwo+ ICsJLyogQ29uZmlndXJlIFBIWSBpbiBBMCBtb2RlIChQSFkgbXVzdCBiZSBpbiB0aGUgQTAgcG93 ZXIKPiArCSAqIHN0YXRlIGluIG9yZGVyIHRvIHRyYW5zbWl0IGRhdGEpCj4gKwkgKi8KPiArCWNk bnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hEUF9NT0RFX0NUUkwsIDB4MDEwMSk7Cj4g Kwo+ICsJLyogV2FpdCBmb3IgUG93ZXIgU3RhdGUgQTAgQWNrICovCj4gKwlmb3IgKGkgPSAwOyBp IDwgMTA7IGkrKykgewo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlf SERQX01PREVfQ1RSTCk7Cj4gKwkJaWYgKHZhbCAmICgxIDw8IDQpKQo+ICsJCQlicmVhazsKPiAr CQltc2xlZXAoMjApOwo+ICsJfQo+ICsJaWYgKGkgPT0gMTApIHsKPiArCQlkZXZfZXJyKGNkbnNf cGh5LT5kZXYsICJXYWl0IEEwIEFjayBmYWlsZWRcbiIpOwo+ICsJCXJldHVybiAtMTsKPiArCX0K PiArCj4gKwljZG5zX3BoeS0+cG93ZXJfdXAgPSB0cnVlOwo+ICsKPiArCXJldHVybiAwOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCBoZHB0eF9kcF9waHlfcG93ZXJfZG93bihzdHJ1Y3QgY2Ruc19o ZHB0eF9kcF9waHkgKmNkbnNfcGh5KQo+ICt7Cj4gKwl1MTYgdmFsOwo+ICsJaW50IGk7Cj4gKwo+ ICsJaWYgKCFjZG5zX3BoeS0+cG93ZXJfdXApCj4gKwkJcmV0dXJuOwo+ICsKPiArCS8qIFBsYWNl IHRoZSBQSFkgbGFuZXMgaW4gdGhlIEEzIHBvd2VyIHN0YXRlLiAqLwo+ICsJY2Ruc19waHlfcmVn X3dyaXRlKGNkbnNfcGh5LCBQSFlfSERQX01PREVfQ1RSTCwgMHg4KTsKPiArCS8qIFdhaXQgZm9y IFBvd2VyIFN0YXRlIEEzIEFjayAqLwo+ICsJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKPiAr CQl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9NT0RFX0NUUkwpOwo+ ICsJCWlmICh2YWwgJiAoMSA8PCA3KSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVwKDIwKTsKPiAr CX0KPiArCWlmIChpID09IDEwKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiV2FpdCBB MyBBY2sgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJLyogRGlzYWJsZSBI RFAgUExM4oCZcyBkYXRhIHJhdGUgYW5kIGZ1bGwgcmF0ZSBjbG9ja3Mgb3V0IG9mIFBNQS4gKi8K PiArCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ ICsJdmFsICY9IH4oMSA8PCAyKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZ X0hEUF9DTEtfQ1RMLCB2YWwpOwo+ICsJLyogV2FpdCBmb3IgUExMIGNsb2NrIGdhdGUgQUNLICov Cj4gKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19y ZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJCWlmICghKHZhbCAmICgxIDw8IDMp KSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVwKDIwKTsKPiArCX0KPiArCWlmIChpID09IDEwKSB7 Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiV2FpdCBQTEwgY2xvY2sgZ2F0ZSBBY2sgZmFp bGVkXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJLyogRGlzYWJsZSBIRFAgUExM4oCZ cyBmb3IgaGlnaCBzcGVlZCBjbG9ja3MgKi8KPiArCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNk bnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJdmFsICY9IH4oMSA8PCAwKTsKPiArCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMLCB2YWwpOwo+ICsJLyogV2Fp dCBmb3IgUExMIGRpc2FibGUgQUNLICovCj4gKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewo+ ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ ICsJCWlmICghKHZhbCAmICgxIDw8IDEpKSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVwKDIwKTsK PiArCX0KPiArCWlmIChpID09IDEwKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiV2Fp dCBQTEwgZGlzYWJsZSBBY2sgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgY2Ruc19oZHB0eF9kcF9waHlfb24oc3RydWN0IHBoeSAqcGh5KQo+ICt7 Cj4gKwlzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5ID0gcGh5X2dldF9kcnZkYXRh KHBoeSk7Cj4gKwo+ICsJcmV0dXJuIGhkcHR4X2RwX3BoeV9wb3dlcl91cChjZG5zX3BoeSk7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgY2Ruc19oZHB0eF9kcF9waHlfb2ZmKHN0cnVjdCBwaHkgKnBo eSkKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSA9IHBoeV9nZXRf ZHJ2ZGF0YShwaHkpOwo+ICsKPiArCWhkcHR4X2RwX3BoeV9wb3dlcl9kb3duKGNkbnNfcGh5KTsK PiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBjZG5zX2hkcHR4X2RwX3Bo eV9pbml0KHN0cnVjdCBwaHkgKnBoeSkKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5 ICpjZG5zX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ICsJaW50IHJldDsKPiArCj4gKwlo ZHB0eF9kcF9waHlfcmVmX2Nsb2NrX3R5cGUoY2Ruc19waHkpOwo+ICsKPiArCS8qIFBIWSBwb3dl ciB1cCAqLwo+ICsJcmV0ID0gaGRwdHhfZHBfcGh5X3Bvd2VyX3VwKGNkbnNfcGh5KTsKPiArCWlm IChyZXQgPCAwKQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJaGRwdHhfZHBfYXV4X2NmZyhjZG5z X3BoeSk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBjZG5zX2hk cHR4X2RwX2NvbmZpZ3VyZShzdHJ1Y3QgcGh5ICpwaHksCj4gKwkJCQkgICAgIHVuaW9uIHBoeV9j b25maWd1cmVfb3B0cyAqb3B0cykKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpj ZG5zX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ICsJaW50IHJldDsKPiArCj4gKwljZG5z X3BoeS0+bGlua19yYXRlID0gb3B0cy0+ZHAubGlua19yYXRlOwo+ICsJY2Ruc19waHktPm51bV9s YW5lcyA9IG9wdHMtPmRwLmxhbmVzOwo+ICsKPiArCWlmIChjZG5zX3BoeS0+bGlua19yYXRlID4g TUFYX0xJTktfUkFURSkgewo+ICsJCWRldl9lcnIoY2Ruc19waHktPmRldiwgIkxpbmsgUmF0ZSgl ZCkgTm90IHN1cHBvcnRlZFxuIiwgY2Ruc19waHktPmxpbmtfcmF0ZSk7Cj4gKwkJcmV0dXJuIGZh bHNlOwo+ICsJfQo+ICsKPiArCS8qIERpc2FibGUgcGh5IGNsb2NrIGlmIFBIWSBpbiBwb3dlciB1 cCBzdGF0ZSAqLwo+ICsJaGRwdHhfZHBfcGh5X3Bvd2VyX2Rvd24oY2Ruc19waHkpOwo+ICsKPiAr CWlmIChjZG5zX3BoeS0+cmVmX2Nsa19yYXRlID09IFJFRl9DTEtfMjdNSFopIHsKPiArCQloZHB0 eF9kcF9waHlfcG1hX2Ntbl9jZmdfMjdtaHooY2Ruc19waHkpOwo+ICsJCWhkcHR4X2RwX3BoeV9w bWFfY21uX3BsbDBfMjdtaHooY2Ruc19waHkpOwo+ICsJfSBlbHNlCj4gKwkJZGV2X2VycihjZG5z X3BoeS0+ZGV2LCAiTm90IHN1cHBvcnQgcmVmIGNsb2NrIHJhdGVcbiIpOwo+ICsKPiArCS8qIFBI WSBwb3dlciB1cCAqLwo+ICsJcmV0ID0gaGRwdHhfZHBfcGh5X3Bvd2VyX3VwKGNkbnNfcGh5KTsK PiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9v cHMgY2Ruc19oZHB0eF9kcF9waHlfb3BzID0gewo+ICsJLmluaXQJCT0gY2Ruc19oZHB0eF9kcF9w aHlfaW5pdCwKPiArCS5jb25maWd1cmUJPSBjZG5zX2hkcHR4X2RwX2NvbmZpZ3VyZSwKPiArCS5w b3dlcl9vbgk9IGNkbnNfaGRwdHhfZHBfcGh5X29uLAo+ICsJLnBvd2VyX29mZgk9IGNkbnNfaGRw dHhfZHBfcGh5X29mZiwKPiArCS5vd25lcgkJPSBUSElTX01PRFVMRSwKPiArfTsKPiArCj4gK3N0 YXRpYyBpbnQgY2Ruc19oZHB0eF9kcF9waHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeTsKPiArCXN0 cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5v ZGUgPSBkZXYtPm9mX25vZGU7Cj4gKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7 Cj4gKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKPiArCXN0cnVjdCBwaHkgKnBoeTsKPiArCWludCBy ZXQ7Cj4gKwo+ICsJY2Ruc19waHkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmNkbnNfcGh5 KSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWNkbnNfcGh5KQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ ICsKPiArCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGNkbnNfcGh5KTsKPiArCWNkbnNfcGh5LT5kZXYg PSBkZXY7Cj4gKwltdXRleF9pbml0KCZjZG5zX3BoeS0+bWJveF9tdXRleCk7Cj4gKwo+ICsJcmVz ID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKPiArCWlm ICghcmVzKQo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJY2Ruc19waHktPnJlZ3MgPSBkZXZtX2lv cmVtYXAoZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwo+ICsJaWYgKElTX0VS UihjZG5zX3BoeS0+cmVncykpCj4gKwkJcmV0dXJuIFBUUl9FUlIoY2Ruc19waHktPnJlZ3MpOwo+ ICsKPiArCXBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsIG5vZGUsICZjZG5zX2hkcHR4X2RwX3Bo eV9vcHMpOwo+ICsJaWYgKElTX0VSUihwaHkpKQo+ICsJCXJldHVybiBQVFJfRVJSKHBoeSk7Cj4g Kwo+ICsJcGh5LT5hdHRycy5tb2RlID0gUEhZX01PREVfRFA7Cj4gKwljZG5zX3BoeS0+cGh5ID0g cGh5Owo+ICsJcGh5X3NldF9kcnZkYXRhKHBoeSwgY2Ruc19waHkpOwo+ICsKPiArCXJldCA9IGhk cHR4X2RwX2Nsa19lbmFibGUoY2Ruc19waHkpOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIo ZGV2LCAiSW5pdCBjbGsgZmFpbFxuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ ICsJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBvZl9w aHlfc2ltcGxlX3hsYXRlKTsKPiArCWlmIChJU19FUlIocGh5X3Byb3ZpZGVyKSkgewo+ICsJCXJl dCA9ICBQVFJfRVJSKHBoeV9wcm92aWRlcik7Cj4gKwkJZ290byBjbGtfZGlzYWJsZTsKPiArCX0K PiArCj4gKwlyZXR1cm4gMDsKPiArCj4gK2Nsa19kaXNhYmxlOgo+ICsJaGRwdHhfZHBfY2xrX2Rp c2FibGUoY2Ruc19waHkpOwo+ICsKPiArCXJldHVybiAtRUlOVkFMOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IGNkbnNfaGRwdHhfZHBfcGh5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5ID0gcGxhdGZv cm1fZ2V0X2RydmRhdGEocGRldik7Cj4gKwo+ICsJaGRwdHhfZHBfY2xrX2Rpc2FibGUoY2Ruc19w aHkpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9m X2RldmljZV9pZCBjZG5zX2hkcHR4X2RwX3BoeV9vZl9tYXRjaFtdID0gewo+ICsJey5jb21wYXRp YmxlID0gImZzbCxpbXg4bXEtZHAtcGh5IiB9LAo+ICsJeyAvKiBzZW50aW5lbCAqLyB9Cj4gK307 Cj4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGNkbnNfaGRwdHhfZHBfcGh5X29mX21hdGNoKTsK PiArCj4gK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNkbnNfaGRwdHhfZHBfcGh5X2Ry aXZlciA9IHsKPiArCS5wcm9iZQk9IGNkbnNfaGRwdHhfZHBfcGh5X3Byb2JlLAo+ICsJLnJlbW92 ZSA9IGNkbnNfaGRwdHhfZHBfcGh5X3JlbW92ZSwKPiArCS5kcml2ZXIgPSB7Cj4gKwkJLm5hbWUJ PSAiY2Rucy1oZHB0eC1kcC1waHkiLAo+ICsJCS5vZl9tYXRjaF90YWJsZQk9IGNkbnNfaGRwdHhf ZHBfcGh5X29mX21hdGNoLAo+ICsJfQo+ICt9Owo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGNk bnNfaGRwdHhfZHBfcGh5X2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJTYW5kb3IgWXUg PHNhbmRvci55dUBueHAuY29tPiIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIkNhZGVuY2UgSERQ LVRYIERpc3BsYXlQb3J0IFBIWSBkcml2ZXIiKTsKPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+ IC0tIAo+IDIuMzQuMQoKLS0gCn5WaW5vZAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJt LWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21h aWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo= 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A2C7AEB64DC for ; Wed, 21 Jun 2023 11:24:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232713AbjFULYZ (ORCPT ); Wed, 21 Jun 2023 07:24:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49034 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232721AbjFULYX (ORCPT ); Wed, 21 Jun 2023 07:24:23 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6D6AF10FE; Wed, 21 Jun 2023 04:24:19 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id D6E2D6150E; Wed, 21 Jun 2023 11:24:18 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 156F9C433C8; Wed, 21 Jun 2023 11:24:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1687346658; bh=NwH5V30lS5yuvPManxFLnChOCMB0DORyGUvgs2Zr6UY=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=mWSxcoEVRWxNXGI/Oek4fG9sGHqE5jWxuxZOFaQMXVXGKN1XsNZO3NlLaK9s6Herx GmfpnFQNfDkvBywz9NzTRfontZLY7od2W4ScJoS7D2To1kTEAyZcpmDJz0KevH/wJ6 K13KDRSRl2T54GYWvGB7loExRsBoqSU4JRAGldNqzOkNLruz0JNculEKqr2kmjx4MD Py7fJD11FEjjIfdYgtl01yNM3ZORsYgyByw4uIcY+F8ENOQmPmeA+p5JSy0ojKTX+Y x1s6FbK4STvasCzBUMYvoG2Fv43pFjDb7uQQKHQwNTvLaKNci46IuMCRtKjVhOMW8B uIBQnS2ZQMsPA== Date: Wed, 21 Jun 2023 16:54:13 +0530 From: Vinod Koul To: Sandor Yu Cc: andrzej.hajda@intel.com, neil.armstrong@linaro.org, robert.foss@linaro.org, Laurent.pinchart@ideasonboard.com, jonas@kwiboo.se, jernej.skrabec@gmail.com, airlied@gmail.com, daniel@ffwll.ch, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, kernel@pengutronix.de, linux-imx@nxp.com, oliver.brown@nxp.com Subject: Re: [PATCH v6 7/8] phy: freescale: Add DisplayPort PHY driver for i.MX8MQ Message-ID: References: <279d6d605656a7ca1bbee6270d66aa218a1b7d3d.1686729444.git.Sandor.yu@nxp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <279d6d605656a7ca1bbee6270d66aa218a1b7d3d.1686729444.git.Sandor.yu@nxp.com> Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org On 15-06-23, 09:38, Sandor Yu wrote: > Add Cadence HDP-TX DisplayPort PHY driver for i.MX8MQ > > Cadence HDP-TX PHY could be put in either DP mode or > HDMI mode base on the configuration chosen. > DisplayPort PHY mode is configurated in the driver. > > Signed-off-by: Sandor Yu > --- > drivers/phy/freescale/Kconfig | 9 + > drivers/phy/freescale/Makefile | 1 + > drivers/phy/freescale/phy-fsl-imx8mq-dp.c | 697 ++++++++++++++++++++++ > 3 files changed, 707 insertions(+) > create mode 100644 drivers/phy/freescale/phy-fsl-imx8mq-dp.c > > diff --git a/drivers/phy/freescale/Kconfig b/drivers/phy/freescale/Kconfig > index 853958fb2c06..a99ee370eda6 100644 > --- a/drivers/phy/freescale/Kconfig > +++ b/drivers/phy/freescale/Kconfig > @@ -35,6 +35,15 @@ config PHY_FSL_IMX8M_PCIE > Enable this to add support for the PCIE PHY as found on > i.MX8M family of SOCs. > > +config PHY_CADENCE_DP_PHY > + tristate "Cadence HDPTX DP PHY support" > + depends on OF && HAS_IOMEM > + depends on COMMON_CLK > + select GENERIC_PHY > + help > + Enable this to support the Cadence HDPTX DP PHY driver > + on NXP's i.MX8MQ SOC. > + > endif > > config PHY_FSL_LYNX_28G > diff --git a/drivers/phy/freescale/Makefile b/drivers/phy/freescale/Makefile > index cedb328bc4d2..c3bdf3fa2e72 100644 > --- a/drivers/phy/freescale/Makefile > +++ b/drivers/phy/freescale/Makefile > @@ -4,3 +4,4 @@ obj-$(CONFIG_PHY_MIXEL_LVDS_PHY) += phy-fsl-imx8qm-lvds-phy.o > obj-$(CONFIG_PHY_MIXEL_MIPI_DPHY) += phy-fsl-imx8-mipi-dphy.o > obj-$(CONFIG_PHY_FSL_IMX8M_PCIE) += phy-fsl-imx8m-pcie.o > obj-$(CONFIG_PHY_FSL_LYNX_28G) += phy-fsl-lynx-28g.o > +obj-$(CONFIG_PHY_CADENCE_DP_PHY) += phy-fsl-imx8mq-dp.o > diff --git a/drivers/phy/freescale/phy-fsl-imx8mq-dp.c b/drivers/phy/freescale/phy-fsl-imx8mq-dp.c > new file mode 100644 > index 000000000000..2bd6772a5d3b > --- /dev/null > +++ b/drivers/phy/freescale/phy-fsl-imx8mq-dp.c > @@ -0,0 +1,697 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Cadence HDP-TX Display Port Interface (DP) PHY driver > + * > + * Copyright (C) 2022 NXP Semiconductor, Inc. > + */ > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#define ADDR_PHY_AFE 0x80000 Is this always fixed for every phy generation? > + > +/* PHY registers */ > +#define CMN_SSM_BIAS_TMR 0x0022 > +#define CMN_PLLSM0_PLLEN_TMR 0x0029 > +#define CMN_PLLSM0_PLLPRE_TMR 0x002A > +#define CMN_PLLSM0_PLLVREF_TMR 0x002B > +#define CMN_PLLSM0_PLLLOCK_TMR 0x002C > +#define CMN_PLLSM0_USER_DEF_CTRL 0x002F > +#define CMN_PSM_CLK_CTRL 0x0061 > +#define CMN_PLL0_VCOCAL_START 0x0081 > +#define CMN_PLL0_VCOCAL_INIT_TMR 0x0084 > +#define CMN_PLL0_VCOCAL_ITER_TMR 0x0085 > +#define CMN_PLL0_INTDIV 0x0094 > +#define CMN_PLL0_FRACDIV 0x0095 > +#define CMN_PLL0_HIGH_THR 0x0096 > +#define CMN_PLL0_DSM_DIAG 0x0097 > +#define CMN_PLL0_SS_CTRL2 0x0099 > +#define CMN_ICAL_INIT_TMR 0x00C4 > +#define CMN_ICAL_ITER_TMR 0x00C5 > +#define CMN_RXCAL_INIT_TMR 0x00D4 > +#define CMN_RXCAL_ITER_TMR 0x00D5 > +#define CMN_TXPUCAL_INIT_TMR 0x00E4 > +#define CMN_TXPUCAL_ITER_TMR 0x00E5 > +#define CMN_TXPDCAL_INIT_TMR 0x00F4 > +#define CMN_TXPDCAL_ITER_TMR 0x00F5 > +#define CMN_ICAL_ADJ_INIT_TMR 0x0102 > +#define CMN_ICAL_ADJ_ITER_TMR 0x0103 > +#define CMN_RX_ADJ_INIT_TMR 0x0106 > +#define CMN_RX_ADJ_ITER_TMR 0x0107 > +#define CMN_TXPU_ADJ_INIT_TMR 0x010A > +#define CMN_TXPU_ADJ_ITER_TMR 0x010B > +#define CMN_TXPD_ADJ_INIT_TMR 0x010E > +#define CMN_TXPD_ADJ_ITER_TMR 0x010F > +#define CMN_DIAG_PLL0_FBH_OVRD 0x01C0 > +#define CMN_DIAG_PLL0_FBL_OVRD 0x01C1 > +#define CMN_DIAG_PLL0_OVRD 0x01C2 > +#define CMN_DIAG_PLL0_TEST_MODE 0x01C4 > +#define CMN_DIAG_PLL0_V2I_TUNE 0x01C5 > +#define CMN_DIAG_PLL0_CP_TUNE 0x01C6 > +#define CMN_DIAG_PLL0_LF_PROG 0x01C7 > +#define CMN_DIAG_PLL0_PTATIS_TUNE1 0x01C8 > +#define CMN_DIAG_PLL0_PTATIS_TUNE2 0x01C9 > +#define CMN_DIAG_HSCLK_SEL 0x01E0 > +#define CMN_DIAG_PER_CAL_ADJ 0x01EC > +#define CMN_DIAG_CAL_CTRL 0x01ED > +#define CMN_DIAG_ACYA 0x01FF > +#define XCVR_PSM_RCTRL 0x4001 > +#define XCVR_PSM_CAL_TMR 0x4002 > +#define XCVR_PSM_A0IN_TMR 0x4003 > +#define TX_TXCC_CAL_SCLR_MULT_0 0x4047 > +#define TX_TXCC_CPOST_MULT_00_0 0x404C > +#define XCVR_DIAG_PLLDRC_CTRL 0x40E0 > +#define XCVR_DIAG_PLLDRC_CTRL 0x40E0 > +#define XCVR_DIAG_HSCLK_SEL 0x40E1 > +#define XCVR_DIAG_LANE_FCM_EN_MGN_TMR 0x40F2 > +#define TX_PSC_A0 0x4100 > +#define TX_PSC_A1 0x4101 > +#define TX_PSC_A2 0x4102 > +#define TX_PSC_A3 0x4103 > +#define TX_RCVDET_EN_TMR 0x4122 > +#define TX_RCVDET_ST_TMR 0x4123 > +#define TX_DIAG_BGREF_PREDRV_DELAY 0x41E7 > +#define TX_DIAG_BGREF_PREDRV_DELAY 0x41E7 > +#define TX_DIAG_ACYA_0 0x41FF > +#define TX_DIAG_ACYA_1 0x43FF > +#define TX_DIAG_ACYA_2 0x45FF > +#define TX_DIAG_ACYA_3 0x47FF > +#define TX_ANA_CTRL_REG_1 0x5020 > +#define TX_ANA_CTRL_REG_2 0x5021 > +#define TX_DIG_CTRL_REG_1 0x5023 > +#define TX_DIG_CTRL_REG_2 0x5024 > +#define TXDA_CYA_AUXDA_CYA 0x5025 > +#define TX_ANA_CTRL_REG_3 0x5026 > +#define TX_ANA_CTRL_REG_4 0x5027 > +#define TX_ANA_CTRL_REG_5 0x5029 > +#define RX_PSC_A0 0x8000 > +#define RX_PSC_CAL 0x8006 > +#define PHY_HDP_MODE_CTRL 0xC008 > +#define PHY_HDP_CLK_CTL 0xC009 > +#define PHY_PMA_CMN_CTRL1 0xC800 Lower case hex values please > + > +#define REF_CLK_27MHZ 27000000 > + > +enum dp_link_rate { > + RATE_1_6 = 162000, > + RATE_2_1 = 216000, > + RATE_2_4 = 243000, > + RATE_2_7 = 270000, > + RATE_3_2 = 324000, > + RATE_4_3 = 432000, > + RATE_5_4 = 540000, > + RATE_8_1 = 810000, > +}; > + > +#define MAX_LINK_RATE RATE_5_4 > + > +struct phy_pll_reg { > + u16 val[7]; > + u32 addr; > +}; > + > +static const struct phy_pll_reg phy_pll_27m_cfg[] = { > + /* 1.62 2.16 2.43 2.7 3.24 4.32 5.4 register address */ > + {{ 0x010E, 0x010E, 0x010E, 0x010E, 0x010E, 0x010E, 0x010E }, CMN_PLL0_VCOCAL_INIT_TMR }, > + {{ 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B }, CMN_PLL0_VCOCAL_ITER_TMR }, > + {{ 0x30B9, 0x3087, 0x3096, 0x30B4, 0x30B9, 0x3087, 0x30B4 }, CMN_PLL0_VCOCAL_START }, > + {{ 0x0077, 0x009F, 0x00B3, 0x00C7, 0x0077, 0x009F, 0x00C7 }, CMN_PLL0_INTDIV }, > + {{ 0xF9DA, 0xF7CD, 0xF6C7, 0xF5C1, 0xF9DA, 0xF7CD, 0xF5C1 }, CMN_PLL0_FRACDIV }, > + {{ 0x001E, 0x0028, 0x002D, 0x0032, 0x001E, 0x0028, 0x0032 }, CMN_PLL0_HIGH_THR }, > + {{ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020 }, CMN_PLL0_DSM_DIAG }, > + {{ 0x0000, 0x1000, 0x1000, 0x1000, 0x0000, 0x1000, 0x1000 }, CMN_PLLSM0_USER_DEF_CTRL }, > + {{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, CMN_DIAG_PLL0_OVRD }, > + {{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, CMN_DIAG_PLL0_FBH_OVRD }, > + {{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, CMN_DIAG_PLL0_FBL_OVRD }, > + {{ 0x0006, 0x0007, 0x0007, 0x0007, 0x0006, 0x0007, 0x0007 }, CMN_DIAG_PLL0_V2I_TUNE }, > + {{ 0x0043, 0x0043, 0x0043, 0x0042, 0x0043, 0x0043, 0x0042 }, CMN_DIAG_PLL0_CP_TUNE }, > + {{ 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008 }, CMN_DIAG_PLL0_LF_PROG }, > + {{ 0x0100, 0x0001, 0x0001, 0x0001, 0x0100, 0x0001, 0x0001 }, CMN_DIAG_PLL0_PTATIS_TUNE1 }, > + {{ 0x0007, 0x0001, 0x0001, 0x0001, 0x0007, 0x0001, 0x0001 }, CMN_DIAG_PLL0_PTATIS_TUNE2 }, > + {{ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020 }, CMN_DIAG_PLL0_TEST_MODE}, > + {{ 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016 }, CMN_PSM_CLK_CTRL } again, lower case please > +}; > + > +struct cdns_hdptx_dp_phy { > + void __iomem *regs; /* DPTX registers base */ > + struct device *dev; > + struct phy *phy; > + struct mutex mbox_mutex; /* mutex to protect mailbox */ > + struct clk *ref_clk, *apb_clk; > + u32 ref_clk_rate; > + u32 num_lanes; > + u32 link_rate; > + bool power_up; > +}; > + > +static int cdns_phy_reg_write(struct cdns_hdptx_dp_phy *cdns_phy, u32 addr, u32 val) > +{ > + return cdns_mhdp_reg_write(cdns_phy, ADDR_PHY_AFE + (addr << 2), val); > +} > + > +static u32 cdns_phy_reg_read(struct cdns_hdptx_dp_phy *cdns_phy, u32 addr) > +{ > + u32 reg32; > + > + cdns_mhdp_reg_read(cdns_phy, ADDR_PHY_AFE + (addr << 2), ®32); > + return reg32; > +} > + > +static int link_rate_index(u32 rate) > +{ > + switch (rate) { > + case RATE_1_6: > + return 0; > + case RATE_2_1: > + return 1; > + case RATE_2_4: > + return 2; > + case RATE_2_7: > + return 3; > + case RATE_3_2: > + return 4; > + case RATE_4_3: > + return 5; > + case RATE_5_4: > + return 6; > + default: > + return -1; > + } > +} > + > +static int hdptx_dp_clk_enable(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + struct device *dev = cdns_phy->dev; > + u32 ref_clk_rate; > + int ret; > + > + cdns_phy->ref_clk = devm_clk_get(dev, "ref"); > + if (IS_ERR(cdns_phy->ref_clk)) { > + dev_err(dev, "phy ref clock not found\n"); > + return PTR_ERR(cdns_phy->ref_clk); > + } > + > + cdns_phy->apb_clk = devm_clk_get(dev, "apb"); > + if (IS_ERR(cdns_phy->apb_clk)) { > + dev_err(dev, "phy apb clock not found\n"); > + return PTR_ERR(cdns_phy->apb_clk); > + } > + > + ret = clk_prepare_enable(cdns_phy->ref_clk); > + if (ret) { > + dev_err(cdns_phy->dev, "Failed to prepare ref clock\n"); > + return ret; > + } > + > + ref_clk_rate = clk_get_rate(cdns_phy->ref_clk); > + if (!ref_clk_rate) { > + dev_err(cdns_phy->dev, "Failed to get ref clock rate\n"); > + goto err_ref_clk; > + } > + > + if (ref_clk_rate == REF_CLK_27MHZ) > + cdns_phy->ref_clk_rate = ref_clk_rate; > + else { > + dev_err(cdns_phy->dev, "Not support Ref Clock Rate(%dHz)\n", ref_clk_rate); > + goto err_ref_clk; > + } > + > + ret = clk_prepare_enable(cdns_phy->apb_clk); > + if (ret) { > + dev_err(cdns_phy->dev, "Failed to prepare apb clock\n"); > + goto err_ref_clk; > + } > + > + return 0; > + > +err_ref_clk: > + clk_disable_unprepare(cdns_phy->ref_clk); > + return -EINVAL; > +} > + > +static void hdptx_dp_clk_disable(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + clk_disable_unprepare(cdns_phy->ref_clk); > + clk_disable_unprepare(cdns_phy->apb_clk); > +} > + > +static void hdptx_dp_aux_cfg(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + /* Power up Aux */ > + cdns_phy_reg_write(cdns_phy, TXDA_CYA_AUXDA_CYA, 1); > + > + cdns_phy_reg_write(cdns_phy, TX_DIG_CTRL_REG_1, 0x3); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_DIG_CTRL_REG_2, 36); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_2, 0x0100); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_2, 0x0300); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_3, 0x0000); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_1, 0x2008); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_1, 0x2018); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_1, 0xA018); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_2, 0x030C); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_5, 0x0000); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_4, 0x1001); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_1, 0xA098); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_1, 0xA198); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_2, 0x030d); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_2, 0x030f); > +} > + > +/* PMA common configuration for 27MHz */ > +static void hdptx_dp_phy_pma_cmn_cfg_27mhz(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + u32 num_lanes = cdns_phy->num_lanes; > + u16 val; > + int k; > + > + val = cdns_phy_reg_read(cdns_phy, PHY_PMA_CMN_CTRL1); > + val &= 0xFFF7; > + val |= 0x0008; > + cdns_phy_reg_write(cdns_phy, PHY_PMA_CMN_CTRL1, val); > + > + /* Startup state machine registers */ > + cdns_phy_reg_write(cdns_phy, CMN_SSM_BIAS_TMR, 0x0087); > + cdns_phy_reg_write(cdns_phy, CMN_PLLSM0_PLLEN_TMR, 0x001B); > + cdns_phy_reg_write(cdns_phy, CMN_PLLSM0_PLLPRE_TMR, 0x0036); > + cdns_phy_reg_write(cdns_phy, CMN_PLLSM0_PLLVREF_TMR, 0x001B); > + cdns_phy_reg_write(cdns_phy, CMN_PLLSM0_PLLLOCK_TMR, 0x006C); > + > + /* Current calibration registers */ > + cdns_phy_reg_write(cdns_phy, CMN_ICAL_INIT_TMR, 0x0044); > + cdns_phy_reg_write(cdns_phy, CMN_ICAL_ITER_TMR, 0x0006); > + cdns_phy_reg_write(cdns_phy, CMN_ICAL_ADJ_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_ICAL_ADJ_ITER_TMR, 0x0006); > + > + /* Resistor calibration registers */ > + cdns_phy_reg_write(cdns_phy, CMN_TXPUCAL_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_TXPUCAL_ITER_TMR, 0x0006); > + cdns_phy_reg_write(cdns_phy, CMN_TXPU_ADJ_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_TXPU_ADJ_ITER_TMR, 0x0006); > + cdns_phy_reg_write(cdns_phy, CMN_TXPDCAL_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_TXPDCAL_ITER_TMR, 0x0006); > + cdns_phy_reg_write(cdns_phy, CMN_TXPD_ADJ_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_TXPD_ADJ_ITER_TMR, 0x0006); > + cdns_phy_reg_write(cdns_phy, CMN_RXCAL_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_RXCAL_ITER_TMR, 0x0006); > + cdns_phy_reg_write(cdns_phy, CMN_RX_ADJ_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_RX_ADJ_ITER_TMR, 0x0006); > + > + for (k = 0; k < num_lanes; k = k + 1) { > + /* Power state machine registers */ > + cdns_phy_reg_write(cdns_phy, XCVR_PSM_CAL_TMR | (k << 9), 0x016D); > + cdns_phy_reg_write(cdns_phy, XCVR_PSM_A0IN_TMR | (k << 9), 0x016D); > + /* Transceiver control and diagnostic registers */ > + cdns_phy_reg_write(cdns_phy, XCVR_DIAG_LANE_FCM_EN_MGN_TMR | (k << 9), 0x00A2); > + cdns_phy_reg_write(cdns_phy, TX_DIAG_BGREF_PREDRV_DELAY | (k << 9), 0x0097); > + /* Transmitter receiver detect registers */ > + cdns_phy_reg_write(cdns_phy, TX_RCVDET_EN_TMR | (k << 9), 0x0A8C); > + cdns_phy_reg_write(cdns_phy, TX_RCVDET_ST_TMR | (k << 9), 0x0036); > + } > + > + cdns_phy_reg_write(cdns_phy, TX_DIAG_ACYA_0, 1); > + cdns_phy_reg_write(cdns_phy, TX_DIAG_ACYA_1, 1); > + cdns_phy_reg_write(cdns_phy, TX_DIAG_ACYA_2, 1); > + cdns_phy_reg_write(cdns_phy, TX_DIAG_ACYA_3, 1); > +} > + > +static void hdptx_dp_phy_pma_cmn_pll0_27mhz(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + u32 num_lanes = cdns_phy->num_lanes; > + u32 link_rate = cdns_phy->link_rate; > + u16 val; > + int index, i, k; > + > + /* DP PLL data rate 0/1 clock divider value */ > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + val &= 0x00FF; > + if (link_rate <= RATE_2_7) > + val |= 0x2400; > + else > + val |= 0x1200; > + cdns_phy_reg_write(cdns_phy, PHY_HDP_CLK_CTL, val); > + > + /* High speed clock 0/1 div */ > + val = cdns_phy_reg_read(cdns_phy, CMN_DIAG_HSCLK_SEL); > + val &= 0xFFCC; > + if (link_rate <= RATE_2_7) > + val |= 0x0011; > + cdns_phy_reg_write(cdns_phy, CMN_DIAG_HSCLK_SEL, val); > + > + for (k = 0; k < num_lanes; k++) { > + val = cdns_phy_reg_read(cdns_phy, (XCVR_DIAG_HSCLK_SEL | (k << 9))); > + val = val & 0xCFFF; > + if (link_rate <= RATE_2_7) > + val |= 0x1000; > + cdns_phy_reg_write(cdns_phy, (XCVR_DIAG_HSCLK_SEL | (k << 9)), val); > + } > + > + /* DP PHY PLL 27MHz configuration */ > + index = link_rate_index(link_rate); > + for (i = 0; i < ARRAY_SIZE(phy_pll_27m_cfg); i++) > + cdns_phy_reg_write(cdns_phy, phy_pll_27m_cfg[i].addr, > + phy_pll_27m_cfg[i].val[index]); > + > + /* Transceiver control and diagnostic registers */ > + for (k = 0; k < num_lanes; k++) { > + val = cdns_phy_reg_read(cdns_phy, (XCVR_DIAG_PLLDRC_CTRL | (k << 9))); > + val = val & 0x8FFF; > + if (link_rate <= RATE_2_7) > + val |= 0x2000; > + else > + val |= 0x1000; > + cdns_phy_reg_write(cdns_phy, (XCVR_DIAG_PLLDRC_CTRL | (k << 9)), val); > + } > + > + for (k = 0; k < num_lanes; k = k + 1) { > + /* Power state machine registers */ > + cdns_phy_reg_write(cdns_phy, (XCVR_PSM_RCTRL | (k << 9)), 0xBEFC); > + cdns_phy_reg_write(cdns_phy, (TX_PSC_A0 | (k << 9)), 0x6799); > + cdns_phy_reg_write(cdns_phy, (TX_PSC_A1 | (k << 9)), 0x6798); > + cdns_phy_reg_write(cdns_phy, (TX_PSC_A2 | (k << 9)), 0x0098); > + cdns_phy_reg_write(cdns_phy, (TX_PSC_A3 | (k << 9)), 0x0098); > + /* Receiver calibration power state definition register */ > + val = cdns_phy_reg_read(cdns_phy, RX_PSC_CAL | (k << 9)); > + val &= 0xFFBB; > + cdns_phy_reg_write(cdns_phy, (RX_PSC_CAL | (k << 9)), val); > + val = cdns_phy_reg_read(cdns_phy, RX_PSC_A0 | (k << 9)); > + val &= 0xFFBB; > + cdns_phy_reg_write(cdns_phy, (RX_PSC_A0 | (k << 9)), val); > + } > +} > + > +static void hdptx_dp_phy_ref_clock_type(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + u32 val; > + > + val = cdns_phy_reg_read(cdns_phy, PHY_PMA_CMN_CTRL1); > + val &= 0xFF8F; > + /* > + * single ended reference clock (val |= 0x0030); > + * differential clock (val |= 0x0000); > + * > + * for differential clock on the refclk_p and > + * refclk_m off chip pins: CMN_DIAG_ACYA[8]=1'b1 > + * cdns_phy_reg_write(cdns_phy, CMN_DIAG_ACYA, 0x0100); > + */ > + val |= 0x0030; > + cdns_phy_reg_write(cdns_phy, PHY_PMA_CMN_CTRL1, val); > +} > + > +static int hdptx_dp_phy_power_up(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + u32 val, i; > + > + /* Enable HDP PLL’s for high speed clocks */ > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + val |= (1 << 0); > + cdns_phy_reg_write(cdns_phy, PHY_HDP_CLK_CTL, val); > + /* Wait for PLL ready ACK */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + if (val & (1 << 1)) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait PLL Ack failed\n"); > + return -1; > + } > + > + /* Enable HDP PLL’s data rate and full rate clocks out of PMA. */ > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + val |= (1 << 2); > + cdns_phy_reg_write(cdns_phy, PHY_HDP_CLK_CTL, val); > + /* Wait for PLL clock enable ACK */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + if (val & (1 << 3)) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait PLL clock enable ACk failed\n"); > + return -1; > + } > + > + /* Configure PHY in A2 Mode */ > + cdns_phy_reg_write(cdns_phy, PHY_HDP_MODE_CTRL, 0x0004); > + /* Wait for Power State A2 Ack */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_MODE_CTRL); > + if (val & (1 << 6)) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait A2 Ack failed\n"); > + return -1; > + } > + > + /* Configure PHY in A0 mode (PHY must be in the A0 power > + * state in order to transmit data) > + */ > + cdns_phy_reg_write(cdns_phy, PHY_HDP_MODE_CTRL, 0x0101); > + > + /* Wait for Power State A0 Ack */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_MODE_CTRL); > + if (val & (1 << 4)) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait A0 Ack failed\n"); > + return -1; > + } > + > + cdns_phy->power_up = true; > + > + return 0; > +} > + > +static void hdptx_dp_phy_power_down(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + u16 val; > + int i; > + > + if (!cdns_phy->power_up) > + return; > + > + /* Place the PHY lanes in the A3 power state. */ > + cdns_phy_reg_write(cdns_phy, PHY_HDP_MODE_CTRL, 0x8); > + /* Wait for Power State A3 Ack */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_MODE_CTRL); > + if (val & (1 << 7)) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait A3 Ack failed\n"); > + return; > + } > + > + /* Disable HDP PLL’s data rate and full rate clocks out of PMA. */ > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + val &= ~(1 << 2); > + cdns_phy_reg_write(cdns_phy, PHY_HDP_CLK_CTL, val); > + /* Wait for PLL clock gate ACK */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + if (!(val & (1 << 3))) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait PLL clock gate Ack failed\n"); > + return; > + } > + > + /* Disable HDP PLL’s for high speed clocks */ > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + val &= ~(1 << 0); > + cdns_phy_reg_write(cdns_phy, PHY_HDP_CLK_CTL, val); > + /* Wait for PLL disable ACK */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + if (!(val & (1 << 1))) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait PLL disable Ack failed\n"); > + return; > + } > +} > + > +static int cdns_hdptx_dp_phy_on(struct phy *phy) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy = phy_get_drvdata(phy); > + > + return hdptx_dp_phy_power_up(cdns_phy); > +} > + > +static int cdns_hdptx_dp_phy_off(struct phy *phy) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy = phy_get_drvdata(phy); > + > + hdptx_dp_phy_power_down(cdns_phy); > + > + return 0; > +} > + > +static int cdns_hdptx_dp_phy_init(struct phy *phy) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy = phy_get_drvdata(phy); > + int ret; > + > + hdptx_dp_phy_ref_clock_type(cdns_phy); > + > + /* PHY power up */ > + ret = hdptx_dp_phy_power_up(cdns_phy); > + if (ret < 0) > + return ret; > + > + hdptx_dp_aux_cfg(cdns_phy); > + > + return ret; > +} > + > +static int cdns_hdptx_dp_configure(struct phy *phy, > + union phy_configure_opts *opts) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy = phy_get_drvdata(phy); > + int ret; > + > + cdns_phy->link_rate = opts->dp.link_rate; > + cdns_phy->num_lanes = opts->dp.lanes; > + > + if (cdns_phy->link_rate > MAX_LINK_RATE) { > + dev_err(cdns_phy->dev, "Link Rate(%d) Not supported\n", cdns_phy->link_rate); > + return false; > + } > + > + /* Disable phy clock if PHY in power up state */ > + hdptx_dp_phy_power_down(cdns_phy); > + > + if (cdns_phy->ref_clk_rate == REF_CLK_27MHZ) { > + hdptx_dp_phy_pma_cmn_cfg_27mhz(cdns_phy); > + hdptx_dp_phy_pma_cmn_pll0_27mhz(cdns_phy); > + } else > + dev_err(cdns_phy->dev, "Not support ref clock rate\n"); > + > + /* PHY power up */ > + ret = hdptx_dp_phy_power_up(cdns_phy); > + > + return ret; > +} > + > +static const struct phy_ops cdns_hdptx_dp_phy_ops = { > + .init = cdns_hdptx_dp_phy_init, > + .configure = cdns_hdptx_dp_configure, > + .power_on = cdns_hdptx_dp_phy_on, > + .power_off = cdns_hdptx_dp_phy_off, > + .owner = THIS_MODULE, > +}; > + > +static int cdns_hdptx_dp_phy_probe(struct platform_device *pdev) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy; > + struct device *dev = &pdev->dev; > + struct device_node *node = dev->of_node; > + struct phy_provider *phy_provider; > + struct resource *res; > + struct phy *phy; > + int ret; > + > + cdns_phy = devm_kzalloc(dev, sizeof(*cdns_phy), GFP_KERNEL); > + if (!cdns_phy) > + return -ENOMEM; > + > + dev_set_drvdata(dev, cdns_phy); > + cdns_phy->dev = dev; > + mutex_init(&cdns_phy->mbox_mutex); > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + if (!res) > + return -ENODEV; > + cdns_phy->regs = devm_ioremap(dev, res->start, resource_size(res)); > + if (IS_ERR(cdns_phy->regs)) > + return PTR_ERR(cdns_phy->regs); > + > + phy = devm_phy_create(dev, node, &cdns_hdptx_dp_phy_ops); > + if (IS_ERR(phy)) > + return PTR_ERR(phy); > + > + phy->attrs.mode = PHY_MODE_DP; > + cdns_phy->phy = phy; > + phy_set_drvdata(phy, cdns_phy); > + > + ret = hdptx_dp_clk_enable(cdns_phy); > + if (ret) { > + dev_err(dev, "Init clk fail\n"); > + return -EINVAL; > + } > + > + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); > + if (IS_ERR(phy_provider)) { > + ret = PTR_ERR(phy_provider); > + goto clk_disable; > + } > + > + return 0; > + > +clk_disable: > + hdptx_dp_clk_disable(cdns_phy); > + > + return -EINVAL; > +} > + > +static int cdns_hdptx_dp_phy_remove(struct platform_device *pdev) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy = platform_get_drvdata(pdev); > + > + hdptx_dp_clk_disable(cdns_phy); > + > + return 0; > +} > + > +static const struct of_device_id cdns_hdptx_dp_phy_of_match[] = { > + {.compatible = "fsl,imx8mq-dp-phy" }, > + { /* sentinel */ } > +}; > +MODULE_DEVICE_TABLE(of, cdns_hdptx_dp_phy_of_match); > + > +static struct platform_driver cdns_hdptx_dp_phy_driver = { > + .probe = cdns_hdptx_dp_phy_probe, > + .remove = cdns_hdptx_dp_phy_remove, > + .driver = { > + .name = "cdns-hdptx-dp-phy", > + .of_match_table = cdns_hdptx_dp_phy_of_match, > + } > +}; > +module_platform_driver(cdns_hdptx_dp_phy_driver); > + > +MODULE_AUTHOR("Sandor Yu "); > +MODULE_DESCRIPTION("Cadence HDP-TX DisplayPort PHY driver"); > +MODULE_LICENSE("GPL"); > -- > 2.34.1 -- ~Vinod 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 8EBA3EB64D7 for ; Wed, 21 Jun 2023 11:24:23 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 76B3C10E441; Wed, 21 Jun 2023 11:24:22 +0000 (UTC) Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7C67210E441 for ; Wed, 21 Jun 2023 11:24:19 +0000 (UTC) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id D4F846150D; Wed, 21 Jun 2023 11:24:18 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 156F9C433C8; Wed, 21 Jun 2023 11:24:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1687346658; bh=NwH5V30lS5yuvPManxFLnChOCMB0DORyGUvgs2Zr6UY=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=mWSxcoEVRWxNXGI/Oek4fG9sGHqE5jWxuxZOFaQMXVXGKN1XsNZO3NlLaK9s6Herx GmfpnFQNfDkvBywz9NzTRfontZLY7od2W4ScJoS7D2To1kTEAyZcpmDJz0KevH/wJ6 K13KDRSRl2T54GYWvGB7loExRsBoqSU4JRAGldNqzOkNLruz0JNculEKqr2kmjx4MD Py7fJD11FEjjIfdYgtl01yNM3ZORsYgyByw4uIcY+F8ENOQmPmeA+p5JSy0ojKTX+Y x1s6FbK4STvasCzBUMYvoG2Fv43pFjDb7uQQKHQwNTvLaKNci46IuMCRtKjVhOMW8B uIBQnS2ZQMsPA== Date: Wed, 21 Jun 2023 16:54:13 +0530 From: Vinod Koul To: Sandor Yu Subject: Re: [PATCH v6 7/8] phy: freescale: Add DisplayPort PHY driver for i.MX8MQ Message-ID: References: <279d6d605656a7ca1bbee6270d66aa218a1b7d3d.1686729444.git.Sandor.yu@nxp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <279d6d605656a7ca1bbee6270d66aa218a1b7d3d.1686729444.git.Sandor.yu@nxp.com> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: dri-devel@lists.freedesktop.org, neil.armstrong@linaro.org, oliver.brown@nxp.com, krzysztof.kozlowski+dt@linaro.org, jonas@kwiboo.se, shawnguo@kernel.org, s.hauer@pengutronix.de, linux-kernel@vger.kernel.org, jernej.skrabec@gmail.com, devicetree@vger.kernel.org, robh+dt@kernel.org, robert.foss@linaro.org, andrzej.hajda@intel.com, linux-phy@lists.infradead.org, linux-imx@nxp.com, kernel@pengutronix.de, linux-arm-kernel@lists.infradead.org, Laurent.pinchart@ideasonboard.com Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On 15-06-23, 09:38, Sandor Yu wrote: > Add Cadence HDP-TX DisplayPort PHY driver for i.MX8MQ > > Cadence HDP-TX PHY could be put in either DP mode or > HDMI mode base on the configuration chosen. > DisplayPort PHY mode is configurated in the driver. > > Signed-off-by: Sandor Yu > --- > drivers/phy/freescale/Kconfig | 9 + > drivers/phy/freescale/Makefile | 1 + > drivers/phy/freescale/phy-fsl-imx8mq-dp.c | 697 ++++++++++++++++++++++ > 3 files changed, 707 insertions(+) > create mode 100644 drivers/phy/freescale/phy-fsl-imx8mq-dp.c > > diff --git a/drivers/phy/freescale/Kconfig b/drivers/phy/freescale/Kconfig > index 853958fb2c06..a99ee370eda6 100644 > --- a/drivers/phy/freescale/Kconfig > +++ b/drivers/phy/freescale/Kconfig > @@ -35,6 +35,15 @@ config PHY_FSL_IMX8M_PCIE > Enable this to add support for the PCIE PHY as found on > i.MX8M family of SOCs. > > +config PHY_CADENCE_DP_PHY > + tristate "Cadence HDPTX DP PHY support" > + depends on OF && HAS_IOMEM > + depends on COMMON_CLK > + select GENERIC_PHY > + help > + Enable this to support the Cadence HDPTX DP PHY driver > + on NXP's i.MX8MQ SOC. > + > endif > > config PHY_FSL_LYNX_28G > diff --git a/drivers/phy/freescale/Makefile b/drivers/phy/freescale/Makefile > index cedb328bc4d2..c3bdf3fa2e72 100644 > --- a/drivers/phy/freescale/Makefile > +++ b/drivers/phy/freescale/Makefile > @@ -4,3 +4,4 @@ obj-$(CONFIG_PHY_MIXEL_LVDS_PHY) += phy-fsl-imx8qm-lvds-phy.o > obj-$(CONFIG_PHY_MIXEL_MIPI_DPHY) += phy-fsl-imx8-mipi-dphy.o > obj-$(CONFIG_PHY_FSL_IMX8M_PCIE) += phy-fsl-imx8m-pcie.o > obj-$(CONFIG_PHY_FSL_LYNX_28G) += phy-fsl-lynx-28g.o > +obj-$(CONFIG_PHY_CADENCE_DP_PHY) += phy-fsl-imx8mq-dp.o > diff --git a/drivers/phy/freescale/phy-fsl-imx8mq-dp.c b/drivers/phy/freescale/phy-fsl-imx8mq-dp.c > new file mode 100644 > index 000000000000..2bd6772a5d3b > --- /dev/null > +++ b/drivers/phy/freescale/phy-fsl-imx8mq-dp.c > @@ -0,0 +1,697 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Cadence HDP-TX Display Port Interface (DP) PHY driver > + * > + * Copyright (C) 2022 NXP Semiconductor, Inc. > + */ > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#define ADDR_PHY_AFE 0x80000 Is this always fixed for every phy generation? > + > +/* PHY registers */ > +#define CMN_SSM_BIAS_TMR 0x0022 > +#define CMN_PLLSM0_PLLEN_TMR 0x0029 > +#define CMN_PLLSM0_PLLPRE_TMR 0x002A > +#define CMN_PLLSM0_PLLVREF_TMR 0x002B > +#define CMN_PLLSM0_PLLLOCK_TMR 0x002C > +#define CMN_PLLSM0_USER_DEF_CTRL 0x002F > +#define CMN_PSM_CLK_CTRL 0x0061 > +#define CMN_PLL0_VCOCAL_START 0x0081 > +#define CMN_PLL0_VCOCAL_INIT_TMR 0x0084 > +#define CMN_PLL0_VCOCAL_ITER_TMR 0x0085 > +#define CMN_PLL0_INTDIV 0x0094 > +#define CMN_PLL0_FRACDIV 0x0095 > +#define CMN_PLL0_HIGH_THR 0x0096 > +#define CMN_PLL0_DSM_DIAG 0x0097 > +#define CMN_PLL0_SS_CTRL2 0x0099 > +#define CMN_ICAL_INIT_TMR 0x00C4 > +#define CMN_ICAL_ITER_TMR 0x00C5 > +#define CMN_RXCAL_INIT_TMR 0x00D4 > +#define CMN_RXCAL_ITER_TMR 0x00D5 > +#define CMN_TXPUCAL_INIT_TMR 0x00E4 > +#define CMN_TXPUCAL_ITER_TMR 0x00E5 > +#define CMN_TXPDCAL_INIT_TMR 0x00F4 > +#define CMN_TXPDCAL_ITER_TMR 0x00F5 > +#define CMN_ICAL_ADJ_INIT_TMR 0x0102 > +#define CMN_ICAL_ADJ_ITER_TMR 0x0103 > +#define CMN_RX_ADJ_INIT_TMR 0x0106 > +#define CMN_RX_ADJ_ITER_TMR 0x0107 > +#define CMN_TXPU_ADJ_INIT_TMR 0x010A > +#define CMN_TXPU_ADJ_ITER_TMR 0x010B > +#define CMN_TXPD_ADJ_INIT_TMR 0x010E > +#define CMN_TXPD_ADJ_ITER_TMR 0x010F > +#define CMN_DIAG_PLL0_FBH_OVRD 0x01C0 > +#define CMN_DIAG_PLL0_FBL_OVRD 0x01C1 > +#define CMN_DIAG_PLL0_OVRD 0x01C2 > +#define CMN_DIAG_PLL0_TEST_MODE 0x01C4 > +#define CMN_DIAG_PLL0_V2I_TUNE 0x01C5 > +#define CMN_DIAG_PLL0_CP_TUNE 0x01C6 > +#define CMN_DIAG_PLL0_LF_PROG 0x01C7 > +#define CMN_DIAG_PLL0_PTATIS_TUNE1 0x01C8 > +#define CMN_DIAG_PLL0_PTATIS_TUNE2 0x01C9 > +#define CMN_DIAG_HSCLK_SEL 0x01E0 > +#define CMN_DIAG_PER_CAL_ADJ 0x01EC > +#define CMN_DIAG_CAL_CTRL 0x01ED > +#define CMN_DIAG_ACYA 0x01FF > +#define XCVR_PSM_RCTRL 0x4001 > +#define XCVR_PSM_CAL_TMR 0x4002 > +#define XCVR_PSM_A0IN_TMR 0x4003 > +#define TX_TXCC_CAL_SCLR_MULT_0 0x4047 > +#define TX_TXCC_CPOST_MULT_00_0 0x404C > +#define XCVR_DIAG_PLLDRC_CTRL 0x40E0 > +#define XCVR_DIAG_PLLDRC_CTRL 0x40E0 > +#define XCVR_DIAG_HSCLK_SEL 0x40E1 > +#define XCVR_DIAG_LANE_FCM_EN_MGN_TMR 0x40F2 > +#define TX_PSC_A0 0x4100 > +#define TX_PSC_A1 0x4101 > +#define TX_PSC_A2 0x4102 > +#define TX_PSC_A3 0x4103 > +#define TX_RCVDET_EN_TMR 0x4122 > +#define TX_RCVDET_ST_TMR 0x4123 > +#define TX_DIAG_BGREF_PREDRV_DELAY 0x41E7 > +#define TX_DIAG_BGREF_PREDRV_DELAY 0x41E7 > +#define TX_DIAG_ACYA_0 0x41FF > +#define TX_DIAG_ACYA_1 0x43FF > +#define TX_DIAG_ACYA_2 0x45FF > +#define TX_DIAG_ACYA_3 0x47FF > +#define TX_ANA_CTRL_REG_1 0x5020 > +#define TX_ANA_CTRL_REG_2 0x5021 > +#define TX_DIG_CTRL_REG_1 0x5023 > +#define TX_DIG_CTRL_REG_2 0x5024 > +#define TXDA_CYA_AUXDA_CYA 0x5025 > +#define TX_ANA_CTRL_REG_3 0x5026 > +#define TX_ANA_CTRL_REG_4 0x5027 > +#define TX_ANA_CTRL_REG_5 0x5029 > +#define RX_PSC_A0 0x8000 > +#define RX_PSC_CAL 0x8006 > +#define PHY_HDP_MODE_CTRL 0xC008 > +#define PHY_HDP_CLK_CTL 0xC009 > +#define PHY_PMA_CMN_CTRL1 0xC800 Lower case hex values please > + > +#define REF_CLK_27MHZ 27000000 > + > +enum dp_link_rate { > + RATE_1_6 = 162000, > + RATE_2_1 = 216000, > + RATE_2_4 = 243000, > + RATE_2_7 = 270000, > + RATE_3_2 = 324000, > + RATE_4_3 = 432000, > + RATE_5_4 = 540000, > + RATE_8_1 = 810000, > +}; > + > +#define MAX_LINK_RATE RATE_5_4 > + > +struct phy_pll_reg { > + u16 val[7]; > + u32 addr; > +}; > + > +static const struct phy_pll_reg phy_pll_27m_cfg[] = { > + /* 1.62 2.16 2.43 2.7 3.24 4.32 5.4 register address */ > + {{ 0x010E, 0x010E, 0x010E, 0x010E, 0x010E, 0x010E, 0x010E }, CMN_PLL0_VCOCAL_INIT_TMR }, > + {{ 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B, 0x001B }, CMN_PLL0_VCOCAL_ITER_TMR }, > + {{ 0x30B9, 0x3087, 0x3096, 0x30B4, 0x30B9, 0x3087, 0x30B4 }, CMN_PLL0_VCOCAL_START }, > + {{ 0x0077, 0x009F, 0x00B3, 0x00C7, 0x0077, 0x009F, 0x00C7 }, CMN_PLL0_INTDIV }, > + {{ 0xF9DA, 0xF7CD, 0xF6C7, 0xF5C1, 0xF9DA, 0xF7CD, 0xF5C1 }, CMN_PLL0_FRACDIV }, > + {{ 0x001E, 0x0028, 0x002D, 0x0032, 0x001E, 0x0028, 0x0032 }, CMN_PLL0_HIGH_THR }, > + {{ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020 }, CMN_PLL0_DSM_DIAG }, > + {{ 0x0000, 0x1000, 0x1000, 0x1000, 0x0000, 0x1000, 0x1000 }, CMN_PLLSM0_USER_DEF_CTRL }, > + {{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, CMN_DIAG_PLL0_OVRD }, > + {{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, CMN_DIAG_PLL0_FBH_OVRD }, > + {{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, CMN_DIAG_PLL0_FBL_OVRD }, > + {{ 0x0006, 0x0007, 0x0007, 0x0007, 0x0006, 0x0007, 0x0007 }, CMN_DIAG_PLL0_V2I_TUNE }, > + {{ 0x0043, 0x0043, 0x0043, 0x0042, 0x0043, 0x0043, 0x0042 }, CMN_DIAG_PLL0_CP_TUNE }, > + {{ 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008 }, CMN_DIAG_PLL0_LF_PROG }, > + {{ 0x0100, 0x0001, 0x0001, 0x0001, 0x0100, 0x0001, 0x0001 }, CMN_DIAG_PLL0_PTATIS_TUNE1 }, > + {{ 0x0007, 0x0001, 0x0001, 0x0001, 0x0007, 0x0001, 0x0001 }, CMN_DIAG_PLL0_PTATIS_TUNE2 }, > + {{ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020 }, CMN_DIAG_PLL0_TEST_MODE}, > + {{ 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016 }, CMN_PSM_CLK_CTRL } again, lower case please > +}; > + > +struct cdns_hdptx_dp_phy { > + void __iomem *regs; /* DPTX registers base */ > + struct device *dev; > + struct phy *phy; > + struct mutex mbox_mutex; /* mutex to protect mailbox */ > + struct clk *ref_clk, *apb_clk; > + u32 ref_clk_rate; > + u32 num_lanes; > + u32 link_rate; > + bool power_up; > +}; > + > +static int cdns_phy_reg_write(struct cdns_hdptx_dp_phy *cdns_phy, u32 addr, u32 val) > +{ > + return cdns_mhdp_reg_write(cdns_phy, ADDR_PHY_AFE + (addr << 2), val); > +} > + > +static u32 cdns_phy_reg_read(struct cdns_hdptx_dp_phy *cdns_phy, u32 addr) > +{ > + u32 reg32; > + > + cdns_mhdp_reg_read(cdns_phy, ADDR_PHY_AFE + (addr << 2), ®32); > + return reg32; > +} > + > +static int link_rate_index(u32 rate) > +{ > + switch (rate) { > + case RATE_1_6: > + return 0; > + case RATE_2_1: > + return 1; > + case RATE_2_4: > + return 2; > + case RATE_2_7: > + return 3; > + case RATE_3_2: > + return 4; > + case RATE_4_3: > + return 5; > + case RATE_5_4: > + return 6; > + default: > + return -1; > + } > +} > + > +static int hdptx_dp_clk_enable(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + struct device *dev = cdns_phy->dev; > + u32 ref_clk_rate; > + int ret; > + > + cdns_phy->ref_clk = devm_clk_get(dev, "ref"); > + if (IS_ERR(cdns_phy->ref_clk)) { > + dev_err(dev, "phy ref clock not found\n"); > + return PTR_ERR(cdns_phy->ref_clk); > + } > + > + cdns_phy->apb_clk = devm_clk_get(dev, "apb"); > + if (IS_ERR(cdns_phy->apb_clk)) { > + dev_err(dev, "phy apb clock not found\n"); > + return PTR_ERR(cdns_phy->apb_clk); > + } > + > + ret = clk_prepare_enable(cdns_phy->ref_clk); > + if (ret) { > + dev_err(cdns_phy->dev, "Failed to prepare ref clock\n"); > + return ret; > + } > + > + ref_clk_rate = clk_get_rate(cdns_phy->ref_clk); > + if (!ref_clk_rate) { > + dev_err(cdns_phy->dev, "Failed to get ref clock rate\n"); > + goto err_ref_clk; > + } > + > + if (ref_clk_rate == REF_CLK_27MHZ) > + cdns_phy->ref_clk_rate = ref_clk_rate; > + else { > + dev_err(cdns_phy->dev, "Not support Ref Clock Rate(%dHz)\n", ref_clk_rate); > + goto err_ref_clk; > + } > + > + ret = clk_prepare_enable(cdns_phy->apb_clk); > + if (ret) { > + dev_err(cdns_phy->dev, "Failed to prepare apb clock\n"); > + goto err_ref_clk; > + } > + > + return 0; > + > +err_ref_clk: > + clk_disable_unprepare(cdns_phy->ref_clk); > + return -EINVAL; > +} > + > +static void hdptx_dp_clk_disable(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + clk_disable_unprepare(cdns_phy->ref_clk); > + clk_disable_unprepare(cdns_phy->apb_clk); > +} > + > +static void hdptx_dp_aux_cfg(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + /* Power up Aux */ > + cdns_phy_reg_write(cdns_phy, TXDA_CYA_AUXDA_CYA, 1); > + > + cdns_phy_reg_write(cdns_phy, TX_DIG_CTRL_REG_1, 0x3); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_DIG_CTRL_REG_2, 36); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_2, 0x0100); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_2, 0x0300); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_3, 0x0000); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_1, 0x2008); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_1, 0x2018); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_1, 0xA018); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_2, 0x030C); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_5, 0x0000); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_4, 0x1001); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_1, 0xA098); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_1, 0xA198); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_2, 0x030d); > + ndelay(150); > + cdns_phy_reg_write(cdns_phy, TX_ANA_CTRL_REG_2, 0x030f); > +} > + > +/* PMA common configuration for 27MHz */ > +static void hdptx_dp_phy_pma_cmn_cfg_27mhz(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + u32 num_lanes = cdns_phy->num_lanes; > + u16 val; > + int k; > + > + val = cdns_phy_reg_read(cdns_phy, PHY_PMA_CMN_CTRL1); > + val &= 0xFFF7; > + val |= 0x0008; > + cdns_phy_reg_write(cdns_phy, PHY_PMA_CMN_CTRL1, val); > + > + /* Startup state machine registers */ > + cdns_phy_reg_write(cdns_phy, CMN_SSM_BIAS_TMR, 0x0087); > + cdns_phy_reg_write(cdns_phy, CMN_PLLSM0_PLLEN_TMR, 0x001B); > + cdns_phy_reg_write(cdns_phy, CMN_PLLSM0_PLLPRE_TMR, 0x0036); > + cdns_phy_reg_write(cdns_phy, CMN_PLLSM0_PLLVREF_TMR, 0x001B); > + cdns_phy_reg_write(cdns_phy, CMN_PLLSM0_PLLLOCK_TMR, 0x006C); > + > + /* Current calibration registers */ > + cdns_phy_reg_write(cdns_phy, CMN_ICAL_INIT_TMR, 0x0044); > + cdns_phy_reg_write(cdns_phy, CMN_ICAL_ITER_TMR, 0x0006); > + cdns_phy_reg_write(cdns_phy, CMN_ICAL_ADJ_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_ICAL_ADJ_ITER_TMR, 0x0006); > + > + /* Resistor calibration registers */ > + cdns_phy_reg_write(cdns_phy, CMN_TXPUCAL_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_TXPUCAL_ITER_TMR, 0x0006); > + cdns_phy_reg_write(cdns_phy, CMN_TXPU_ADJ_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_TXPU_ADJ_ITER_TMR, 0x0006); > + cdns_phy_reg_write(cdns_phy, CMN_TXPDCAL_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_TXPDCAL_ITER_TMR, 0x0006); > + cdns_phy_reg_write(cdns_phy, CMN_TXPD_ADJ_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_TXPD_ADJ_ITER_TMR, 0x0006); > + cdns_phy_reg_write(cdns_phy, CMN_RXCAL_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_RXCAL_ITER_TMR, 0x0006); > + cdns_phy_reg_write(cdns_phy, CMN_RX_ADJ_INIT_TMR, 0x0022); > + cdns_phy_reg_write(cdns_phy, CMN_RX_ADJ_ITER_TMR, 0x0006); > + > + for (k = 0; k < num_lanes; k = k + 1) { > + /* Power state machine registers */ > + cdns_phy_reg_write(cdns_phy, XCVR_PSM_CAL_TMR | (k << 9), 0x016D); > + cdns_phy_reg_write(cdns_phy, XCVR_PSM_A0IN_TMR | (k << 9), 0x016D); > + /* Transceiver control and diagnostic registers */ > + cdns_phy_reg_write(cdns_phy, XCVR_DIAG_LANE_FCM_EN_MGN_TMR | (k << 9), 0x00A2); > + cdns_phy_reg_write(cdns_phy, TX_DIAG_BGREF_PREDRV_DELAY | (k << 9), 0x0097); > + /* Transmitter receiver detect registers */ > + cdns_phy_reg_write(cdns_phy, TX_RCVDET_EN_TMR | (k << 9), 0x0A8C); > + cdns_phy_reg_write(cdns_phy, TX_RCVDET_ST_TMR | (k << 9), 0x0036); > + } > + > + cdns_phy_reg_write(cdns_phy, TX_DIAG_ACYA_0, 1); > + cdns_phy_reg_write(cdns_phy, TX_DIAG_ACYA_1, 1); > + cdns_phy_reg_write(cdns_phy, TX_DIAG_ACYA_2, 1); > + cdns_phy_reg_write(cdns_phy, TX_DIAG_ACYA_3, 1); > +} > + > +static void hdptx_dp_phy_pma_cmn_pll0_27mhz(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + u32 num_lanes = cdns_phy->num_lanes; > + u32 link_rate = cdns_phy->link_rate; > + u16 val; > + int index, i, k; > + > + /* DP PLL data rate 0/1 clock divider value */ > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + val &= 0x00FF; > + if (link_rate <= RATE_2_7) > + val |= 0x2400; > + else > + val |= 0x1200; > + cdns_phy_reg_write(cdns_phy, PHY_HDP_CLK_CTL, val); > + > + /* High speed clock 0/1 div */ > + val = cdns_phy_reg_read(cdns_phy, CMN_DIAG_HSCLK_SEL); > + val &= 0xFFCC; > + if (link_rate <= RATE_2_7) > + val |= 0x0011; > + cdns_phy_reg_write(cdns_phy, CMN_DIAG_HSCLK_SEL, val); > + > + for (k = 0; k < num_lanes; k++) { > + val = cdns_phy_reg_read(cdns_phy, (XCVR_DIAG_HSCLK_SEL | (k << 9))); > + val = val & 0xCFFF; > + if (link_rate <= RATE_2_7) > + val |= 0x1000; > + cdns_phy_reg_write(cdns_phy, (XCVR_DIAG_HSCLK_SEL | (k << 9)), val); > + } > + > + /* DP PHY PLL 27MHz configuration */ > + index = link_rate_index(link_rate); > + for (i = 0; i < ARRAY_SIZE(phy_pll_27m_cfg); i++) > + cdns_phy_reg_write(cdns_phy, phy_pll_27m_cfg[i].addr, > + phy_pll_27m_cfg[i].val[index]); > + > + /* Transceiver control and diagnostic registers */ > + for (k = 0; k < num_lanes; k++) { > + val = cdns_phy_reg_read(cdns_phy, (XCVR_DIAG_PLLDRC_CTRL | (k << 9))); > + val = val & 0x8FFF; > + if (link_rate <= RATE_2_7) > + val |= 0x2000; > + else > + val |= 0x1000; > + cdns_phy_reg_write(cdns_phy, (XCVR_DIAG_PLLDRC_CTRL | (k << 9)), val); > + } > + > + for (k = 0; k < num_lanes; k = k + 1) { > + /* Power state machine registers */ > + cdns_phy_reg_write(cdns_phy, (XCVR_PSM_RCTRL | (k << 9)), 0xBEFC); > + cdns_phy_reg_write(cdns_phy, (TX_PSC_A0 | (k << 9)), 0x6799); > + cdns_phy_reg_write(cdns_phy, (TX_PSC_A1 | (k << 9)), 0x6798); > + cdns_phy_reg_write(cdns_phy, (TX_PSC_A2 | (k << 9)), 0x0098); > + cdns_phy_reg_write(cdns_phy, (TX_PSC_A3 | (k << 9)), 0x0098); > + /* Receiver calibration power state definition register */ > + val = cdns_phy_reg_read(cdns_phy, RX_PSC_CAL | (k << 9)); > + val &= 0xFFBB; > + cdns_phy_reg_write(cdns_phy, (RX_PSC_CAL | (k << 9)), val); > + val = cdns_phy_reg_read(cdns_phy, RX_PSC_A0 | (k << 9)); > + val &= 0xFFBB; > + cdns_phy_reg_write(cdns_phy, (RX_PSC_A0 | (k << 9)), val); > + } > +} > + > +static void hdptx_dp_phy_ref_clock_type(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + u32 val; > + > + val = cdns_phy_reg_read(cdns_phy, PHY_PMA_CMN_CTRL1); > + val &= 0xFF8F; > + /* > + * single ended reference clock (val |= 0x0030); > + * differential clock (val |= 0x0000); > + * > + * for differential clock on the refclk_p and > + * refclk_m off chip pins: CMN_DIAG_ACYA[8]=1'b1 > + * cdns_phy_reg_write(cdns_phy, CMN_DIAG_ACYA, 0x0100); > + */ > + val |= 0x0030; > + cdns_phy_reg_write(cdns_phy, PHY_PMA_CMN_CTRL1, val); > +} > + > +static int hdptx_dp_phy_power_up(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + u32 val, i; > + > + /* Enable HDP PLL’s for high speed clocks */ > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + val |= (1 << 0); > + cdns_phy_reg_write(cdns_phy, PHY_HDP_CLK_CTL, val); > + /* Wait for PLL ready ACK */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + if (val & (1 << 1)) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait PLL Ack failed\n"); > + return -1; > + } > + > + /* Enable HDP PLL’s data rate and full rate clocks out of PMA. */ > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + val |= (1 << 2); > + cdns_phy_reg_write(cdns_phy, PHY_HDP_CLK_CTL, val); > + /* Wait for PLL clock enable ACK */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + if (val & (1 << 3)) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait PLL clock enable ACk failed\n"); > + return -1; > + } > + > + /* Configure PHY in A2 Mode */ > + cdns_phy_reg_write(cdns_phy, PHY_HDP_MODE_CTRL, 0x0004); > + /* Wait for Power State A2 Ack */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_MODE_CTRL); > + if (val & (1 << 6)) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait A2 Ack failed\n"); > + return -1; > + } > + > + /* Configure PHY in A0 mode (PHY must be in the A0 power > + * state in order to transmit data) > + */ > + cdns_phy_reg_write(cdns_phy, PHY_HDP_MODE_CTRL, 0x0101); > + > + /* Wait for Power State A0 Ack */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_MODE_CTRL); > + if (val & (1 << 4)) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait A0 Ack failed\n"); > + return -1; > + } > + > + cdns_phy->power_up = true; > + > + return 0; > +} > + > +static void hdptx_dp_phy_power_down(struct cdns_hdptx_dp_phy *cdns_phy) > +{ > + u16 val; > + int i; > + > + if (!cdns_phy->power_up) > + return; > + > + /* Place the PHY lanes in the A3 power state. */ > + cdns_phy_reg_write(cdns_phy, PHY_HDP_MODE_CTRL, 0x8); > + /* Wait for Power State A3 Ack */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_MODE_CTRL); > + if (val & (1 << 7)) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait A3 Ack failed\n"); > + return; > + } > + > + /* Disable HDP PLL’s data rate and full rate clocks out of PMA. */ > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + val &= ~(1 << 2); > + cdns_phy_reg_write(cdns_phy, PHY_HDP_CLK_CTL, val); > + /* Wait for PLL clock gate ACK */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + if (!(val & (1 << 3))) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait PLL clock gate Ack failed\n"); > + return; > + } > + > + /* Disable HDP PLL’s for high speed clocks */ > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + val &= ~(1 << 0); > + cdns_phy_reg_write(cdns_phy, PHY_HDP_CLK_CTL, val); > + /* Wait for PLL disable ACK */ > + for (i = 0; i < 10; i++) { > + val = cdns_phy_reg_read(cdns_phy, PHY_HDP_CLK_CTL); > + if (!(val & (1 << 1))) > + break; > + msleep(20); > + } > + if (i == 10) { > + dev_err(cdns_phy->dev, "Wait PLL disable Ack failed\n"); > + return; > + } > +} > + > +static int cdns_hdptx_dp_phy_on(struct phy *phy) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy = phy_get_drvdata(phy); > + > + return hdptx_dp_phy_power_up(cdns_phy); > +} > + > +static int cdns_hdptx_dp_phy_off(struct phy *phy) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy = phy_get_drvdata(phy); > + > + hdptx_dp_phy_power_down(cdns_phy); > + > + return 0; > +} > + > +static int cdns_hdptx_dp_phy_init(struct phy *phy) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy = phy_get_drvdata(phy); > + int ret; > + > + hdptx_dp_phy_ref_clock_type(cdns_phy); > + > + /* PHY power up */ > + ret = hdptx_dp_phy_power_up(cdns_phy); > + if (ret < 0) > + return ret; > + > + hdptx_dp_aux_cfg(cdns_phy); > + > + return ret; > +} > + > +static int cdns_hdptx_dp_configure(struct phy *phy, > + union phy_configure_opts *opts) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy = phy_get_drvdata(phy); > + int ret; > + > + cdns_phy->link_rate = opts->dp.link_rate; > + cdns_phy->num_lanes = opts->dp.lanes; > + > + if (cdns_phy->link_rate > MAX_LINK_RATE) { > + dev_err(cdns_phy->dev, "Link Rate(%d) Not supported\n", cdns_phy->link_rate); > + return false; > + } > + > + /* Disable phy clock if PHY in power up state */ > + hdptx_dp_phy_power_down(cdns_phy); > + > + if (cdns_phy->ref_clk_rate == REF_CLK_27MHZ) { > + hdptx_dp_phy_pma_cmn_cfg_27mhz(cdns_phy); > + hdptx_dp_phy_pma_cmn_pll0_27mhz(cdns_phy); > + } else > + dev_err(cdns_phy->dev, "Not support ref clock rate\n"); > + > + /* PHY power up */ > + ret = hdptx_dp_phy_power_up(cdns_phy); > + > + return ret; > +} > + > +static const struct phy_ops cdns_hdptx_dp_phy_ops = { > + .init = cdns_hdptx_dp_phy_init, > + .configure = cdns_hdptx_dp_configure, > + .power_on = cdns_hdptx_dp_phy_on, > + .power_off = cdns_hdptx_dp_phy_off, > + .owner = THIS_MODULE, > +}; > + > +static int cdns_hdptx_dp_phy_probe(struct platform_device *pdev) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy; > + struct device *dev = &pdev->dev; > + struct device_node *node = dev->of_node; > + struct phy_provider *phy_provider; > + struct resource *res; > + struct phy *phy; > + int ret; > + > + cdns_phy = devm_kzalloc(dev, sizeof(*cdns_phy), GFP_KERNEL); > + if (!cdns_phy) > + return -ENOMEM; > + > + dev_set_drvdata(dev, cdns_phy); > + cdns_phy->dev = dev; > + mutex_init(&cdns_phy->mbox_mutex); > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + if (!res) > + return -ENODEV; > + cdns_phy->regs = devm_ioremap(dev, res->start, resource_size(res)); > + if (IS_ERR(cdns_phy->regs)) > + return PTR_ERR(cdns_phy->regs); > + > + phy = devm_phy_create(dev, node, &cdns_hdptx_dp_phy_ops); > + if (IS_ERR(phy)) > + return PTR_ERR(phy); > + > + phy->attrs.mode = PHY_MODE_DP; > + cdns_phy->phy = phy; > + phy_set_drvdata(phy, cdns_phy); > + > + ret = hdptx_dp_clk_enable(cdns_phy); > + if (ret) { > + dev_err(dev, "Init clk fail\n"); > + return -EINVAL; > + } > + > + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); > + if (IS_ERR(phy_provider)) { > + ret = PTR_ERR(phy_provider); > + goto clk_disable; > + } > + > + return 0; > + > +clk_disable: > + hdptx_dp_clk_disable(cdns_phy); > + > + return -EINVAL; > +} > + > +static int cdns_hdptx_dp_phy_remove(struct platform_device *pdev) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy = platform_get_drvdata(pdev); > + > + hdptx_dp_clk_disable(cdns_phy); > + > + return 0; > +} > + > +static const struct of_device_id cdns_hdptx_dp_phy_of_match[] = { > + {.compatible = "fsl,imx8mq-dp-phy" }, > + { /* sentinel */ } > +}; > +MODULE_DEVICE_TABLE(of, cdns_hdptx_dp_phy_of_match); > + > +static struct platform_driver cdns_hdptx_dp_phy_driver = { > + .probe = cdns_hdptx_dp_phy_probe, > + .remove = cdns_hdptx_dp_phy_remove, > + .driver = { > + .name = "cdns-hdptx-dp-phy", > + .of_match_table = cdns_hdptx_dp_phy_of_match, > + } > +}; > +module_platform_driver(cdns_hdptx_dp_phy_driver); > + > +MODULE_AUTHOR("Sandor Yu "); > +MODULE_DESCRIPTION("Cadence HDP-TX DisplayPort PHY driver"); > +MODULE_LICENSE("GPL"); > -- > 2.34.1 -- ~Vinod