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 C9A87C433FE for ; Thu, 10 Nov 2022 07:41:03 +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=891oaB8ezX7qBNaXhNBq9bDMGjdkIDeXCJ/cneYHTTI=; b=Cd9029ZBWhWeEa 2CHtk9zEsQeBVU3j09kWjlJVzjAu5YXVrKffnrZ6n1PIXfLKqhx4rycF8wiTulaeU/hAYDj/+uc5J /U4wYNsS6hiXEaJqlOHIp9JQwl+BwDaIMfMfKCCywbv1INv0VPOUGVINHCqTK7UKc6PFDPicvaBZi lgQ2JKl9Dy5pIjun+UvR9ec62CRAR34W4AETfEcxBSn3T00BYGpMlD8w7huIkzLzQNf4XJR0Qkxy4 TbnT6FsAxoOTPpbFOs0yCFA/pzanESC9MBAOmLkKfaDT4jR5gFE4uiST2DqMjlEz9LAHMsWfc88Od iY3KHUy5WLLyoNbBsgdw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ot2BL-003wNE-8W; Thu, 10 Nov 2022 07:41:03 +0000 Received: from ams.source.kernel.org ([145.40.68.75]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1ot2B7-003w2v-CY; Thu, 10 Nov 2022 07:40:52 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 84F1CB82052; Thu, 10 Nov 2022 07:40:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 24433C433D6; Thu, 10 Nov 2022 07:40:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1668066046; bh=xOehpA7GaLY+h39F/Pnz3gq81tX/dJk6RV4MSFTtWHc=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=R6tzxmZ61Y6VXoaCUDUQzz75sIWsRTAASsEuOfDedj4PaJdYq0FkeW1lrPtRBvvMY UffPdvc1M8+9E7HvHHF3UTVyPCeYa+ALPrzUVl3IYKtTqTnnXvo+2Z0+xgV0tnOVkv Hm1RZm2pDmlRJKlOXdKrVuZiRz57tZTGKwooKQic8KWjvM/4sikceTSHO+Au3uwyUU e/18SXXmcR1PTniuEMzevXFN3nhOithFdYA0mW1eupzG/qnE/MKqsHPUfrXdHcmb2Q jnRVPq32nn+ihmYFbd2ylb20D+YR4dInUyWUpxMABFFN7RLvWPZl0peq3/cccNwPVF jmJ6h6Bo8ObSg== Date: Thu, 10 Nov 2022 13:10:42 +0530 From: Vinod Koul To: Sandor Yu Cc: 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, andrzej.hajda@intel.com, neil.armstrong@linaro.org, robert.foss@linaro.org, Laurent.pinchart@ideasonboard.com, jonas@kwiboo.se, jernej.skrabec@gmail.com, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, linux-imx@nxp.com, tzimmermann@suse.de, lyude@redhat.com, javierm@redhat.com, ville.syrjala@linux.intel.com, sam@ravnborg.org, jani.nikula@intel.com, maxime@cerno.tech, penguin-kernel@i-love.sakura.ne.jp, oliver.brown@nxp.com Subject: Re: [PATCH v3 08/10] phy: cadence: Add driver for HDP-TX DisplyPort PHY Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221109_234049_772981_F4C45D4D X-CRM114-Status: GOOD ( 29.27 ) 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 T24gMDgtMTEtMjIsIDIxOjAwLCBTYW5kb3IgWXUgd3JvdGU6Cj4gQWRkIENhZGVuY2UgSERQLVRY IERpc3BsYXlQb3J0IFBIWSBkcml2ZXIuCj4gCj4gQ2FkZW5jZSBIRFAtVFggUEhZIGNvdWxkIGJl IHB1dCBpbiBlaXRoZXIgRFAgbW9kZSBvcgo+IEhETUkgbW9kZSBiYXNlIG9uIHRoZSBjb25maWd1 cmF0aW9uIGNob3Nlbi4KPiBEaXNwbGF5UG9ydCBQSFkgbW9kZSBpcyBjb25maWd1cmF0ZWQgaW4g dGhlIGRyaXZlci4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBTYW5kb3IgWXUgPFNhbmRvci55dUBueHAu Y29tPgo+IC0tLQo+ICBkcml2ZXJzL3BoeS9jYWRlbmNlL0tjb25maWcgICAgICAgICAgICAgICAg fCAgIDggKwo+ICBkcml2ZXJzL3BoeS9jYWRlbmNlL01ha2VmaWxlICAgICAgICAgICAgICAgfCAg IDEgKwo+ICBkcml2ZXJzL3BoeS9jYWRlbmNlL3BoeS1jYWRlbmNlLWhkcHR4LWRwLmMgfCA3NzQg KysrKysrKysrKysrKysrKysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgNzgzIGluc2VydGlvbnMo KykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcGh5L2NhZGVuY2UvcGh5LWNhZGVuY2Ut aGRwdHgtZHAuYwo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9jYWRlbmNlL0tjb25maWcg Yi9kcml2ZXJzL3BoeS9jYWRlbmNlL0tjb25maWcKPiBpbmRleCAxYWRkZTJkOTlhZTcuLjFlMTkx NGQzYWZkYyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BoeS9jYWRlbmNlL0tjb25maWcKPiArKysg Yi9kcml2ZXJzL3BoeS9jYWRlbmNlL0tjb25maWcKPiBAQCAtNDYsMyArNDYsMTEgQEAgY29uZmln IFBIWV9DQURFTkNFX1NBTFZPCj4gIAkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIENhZGVu Y2UgU0FMVk8gUEhZIGRyaXZlciwKPiAgCSAgdGhpcyBQSFkgaXMgYSBsZWdhY3kgUEhZLCBhbmQg b25seSBhcmUgdXNlZCBmb3IgVVNCMwo+ICAJICBhbmQgVVNCMi4KPiArCj4gK2NvbmZpZyBQSFlf Q0FERU5DRV9IRFBUWF9EUAoKYWxwaGFiZXRpY2FsbHkgc29ydGVkIHBsZWFzZQoKPiArCXRyaXN0 YXRlICJDYWRlbmNlIEhEUFRYIERQIFBIWSBEcml2ZXIiCj4gKwlkZXBlbmRzIG9uIE9GICYmIEhB U19JT01FTQo+ICsJZGVwZW5kcyBvbiBDT01NT05fQ0xLCj4gKwlzZWxlY3QgR0VORVJJQ19QSFkK PiArCWhlbHAKPiArCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgQ2FkZW5jZSBIRFBUWCBE UCBQSFkgZHJpdmVyCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L2NhZGVuY2UvTWFrZWZpbGUg Yi9kcml2ZXJzL3BoeS9jYWRlbmNlL01ha2VmaWxlCj4gaW5kZXggZTE3ZjAzNWRkZWNlLi5mYmRi MGJjNWZmMTEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9waHkvY2FkZW5jZS9NYWtlZmlsZQo+ICsr KyBiL2RyaXZlcnMvcGh5L2NhZGVuY2UvTWFrZWZpbGUKPiBAQCAtNCwzICs0LDQgQEAgb2JqLSQo Q09ORklHX1BIWV9DQURFTkNFX0RQSFkpCSs9IGNkbnMtZHBoeS5vCj4gIG9iai0kKENPTkZJR19Q SFlfQ0FERU5DRV9EUEhZX1JYKQkrPSBjZG5zLWRwaHktcngubwo+ICBvYmotJChDT05GSUdfUEhZ X0NBREVOQ0VfU0lFUlJBKQkrPSBwaHktY2FkZW5jZS1zaWVycmEubwo+ICBvYmotJChDT05GSUdf UEhZX0NBREVOQ0VfU0FMVk8pCSs9IHBoeS1jYWRlbmNlLXNhbHZvLm8KPiArb2JqLSQoQ09ORklH X1BIWV9DQURFTkNFX0hEUFRYX0RQKQkrPSBwaHktY2FkZW5jZS1oZHB0eC1kcC5vCgpoZXJlIHRv bwoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvY2FkZW5jZS9waHktY2FkZW5jZS1oZHB0eC1k cC5jIGIvZHJpdmVycy9waHkvY2FkZW5jZS9waHktY2FkZW5jZS1oZHB0eC1kcC5jCj4gbmV3IGZp bGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjA3OWQ0Mzc3MmQxZAo+IC0tLSAv ZGV2L251bGwKPiArKysgYi9kcml2ZXJzL3BoeS9jYWRlbmNlL3BoeS1jYWRlbmNlLWhkcHR4LWRw LmMKPiBAQCAtMCwwICsxLDc3NCBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMC1vbmx5Cj4gKy8qCj4gKyAqIENhZGVuY2UgSERQLVRYIERpc3BsYXkgUG9ydCBJbnRlcmZh Y2UgKERQKSBQSFkgZHJpdmVyCj4gKyAqCj4gKyAqIENvcHlyaWdodCAoQykgMjAyMiBOWFAgU2Vt aWNvbmR1Y3RvciwgSW5jLgo+ICsgKi8KPiArI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KPiAr I2luY2x1ZGUgPGxpbnV4L2Nsay5oPgo+ICsjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Cj4gKyNp bmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZp Y2UuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lvLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pb3BvbGwu aD4KPiArCj4gKyNpbmNsdWRlIDxkcm0vYnJpZGdlL2NkbnMtbWhkcC1tYWlsYm94Lmg+Cj4gKwo+ ICsjZGVmaW5lIEFERFJfUEhZX0FGRQkweDgwMDAwCj4gKwo+ICsvKiBQSFkgcmVnaXN0ZXJzICov Cj4gKyNkZWZpbmUgQ01OX1NTTV9CSUFTX1RNUiAgICAgICAgICAgICAgICAweDAwMjIKPiArI2Rl ZmluZSBDTU5fUExMU00wX1BMTEVOX1RNUiAgICAgICAgICAgIDB4MDAyOQo+ICsjZGVmaW5lIENN Tl9QTExTTTBfUExMUFJFX1RNUiAgICAgICAgICAgMHgwMDJBCj4gKyNkZWZpbmUgQ01OX1BMTFNN MF9QTExWUkVGX1RNUiAgICAgICAgICAweDAwMkIKPiArI2RlZmluZSBDTU5fUExMU00wX1BMTExP Q0tfVE1SICAgICAgICAgIDB4MDAyQwo+ICsjZGVmaW5lIENNTl9QTExTTTBfVVNFUl9ERUZfQ1RS TCAgICAgICAgMHgwMDJGCj4gKyNkZWZpbmUgQ01OX1BTTV9DTEtfQ1RSTCAgICAgICAgICAgICAg ICAweDAwNjEKPiArI2RlZmluZSBDTU5fQ0RJQUdfUkVGQ0xLX0NUUkwgICAgICAgICAgIDB4MDA2 Mgo+ICsjZGVmaW5lIENNTl9QTEwwX1ZDT0NBTF9TVEFSVCAgICAgICAgICAgMHgwMDgxCj4gKyNk ZWZpbmUgQ01OX1BMTDBfVkNPQ0FMX0lOSVRfVE1SICAgICAgICAweDAwODQKPiArI2RlZmluZSBD TU5fUExMMF9WQ09DQUxfSVRFUl9UTVIgICAgICAgIDB4MDA4NQo+ICsjZGVmaW5lIENNTl9QTEww X0lOVERJViAgICAgICAgICAgICAgICAgMHgwMDk0Cj4gKyNkZWZpbmUgQ01OX1BMTDBfRlJBQ0RJ ViAgICAgICAgICAgICAgICAweDAwOTUKPiArI2RlZmluZSBDTU5fUExMMF9ISUdIX1RIUiAgICAg ICAgICAgICAgIDB4MDA5Ngo+ICsjZGVmaW5lIENNTl9QTEwwX0RTTV9ESUFHICAgICAgICAgICAg ICAgMHgwMDk3Cj4gKyNkZWZpbmUgQ01OX1BMTDBfU1NfQ1RSTDEgICAgICAgICAgICAgICAweDAw OTgKPiArI2RlZmluZSBDTU5fUExMMF9TU19DVFJMMiAgICAgICAgICAgICAgIDB4MDA5OQo+ICsj ZGVmaW5lIENNTl9JQ0FMX0lOSVRfVE1SICAgICAgICAgICAgICAgMHgwMEM0Cj4gKyNkZWZpbmUg Q01OX0lDQUxfSVRFUl9UTVIgICAgICAgICAgICAgICAweDAwQzUKPiArI2RlZmluZSBDTU5fUlhD QUxfSU5JVF9UTVIgICAgICAgICAgICAgIDB4MDBENAo+ICsjZGVmaW5lIENNTl9SWENBTF9JVEVS X1RNUiAgICAgICAgICAgICAgMHgwMEQ1Cj4gKyNkZWZpbmUgQ01OX1RYUFVDQUxfQ1RSTCAgICAg ICAgICAgICAgICAweDAwRTAKPiArI2RlZmluZSBDTU5fVFhQVUNBTF9JTklUX1RNUiAgICAgICAg ICAgIDB4MDBFNAo+ICsjZGVmaW5lIENNTl9UWFBVQ0FMX0lURVJfVE1SICAgICAgICAgICAgMHgw MEU1Cj4gKyNkZWZpbmUgQ01OX1RYUERDQUxfQ1RSTCAgICAgICAgICAgICAgICAweDAwRjAKPiAr I2RlZmluZSBDTU5fVFhQRENBTF9JTklUX1RNUiAgICAgICAgICAgIDB4MDBGNAo+ICsjZGVmaW5l IENNTl9UWFBEQ0FMX0lURVJfVE1SICAgICAgICAgICAgMHgwMEY1Cj4gKyNkZWZpbmUgQ01OX0lD QUxfQURKX0lOSVRfVE1SICAgICAgICAgICAweDAxMDIKPiArI2RlZmluZSBDTU5fSUNBTF9BREpf SVRFUl9UTVIgICAgICAgICAgIDB4MDEwMwo+ICsjZGVmaW5lIENNTl9SWF9BREpfSU5JVF9UTVIg ICAgICAgICAgICAgMHgwMTA2Cj4gKyNkZWZpbmUgQ01OX1JYX0FESl9JVEVSX1RNUiAgICAgICAg ICAgICAweDAxMDcKPiArI2RlZmluZSBDTU5fVFhQVV9BREpfQ1RSTCAgICAgICAgICAgICAgIDB4 MDEwOAo+ICsjZGVmaW5lIENNTl9UWFBVX0FESl9JTklUX1RNUiAgICAgICAgICAgMHgwMTBBCj4g KyNkZWZpbmUgQ01OX1RYUFVfQURKX0lURVJfVE1SICAgICAgICAgICAweDAxMEIKPiArI2RlZmlu ZSBDTU5fVFhQRF9BREpfQ1RSTCAgICAgICAgICAgICAgIDB4MDEwYwo+ICsjZGVmaW5lIENNTl9U WFBEX0FESl9JTklUX1RNUiAgICAgICAgICAgMHgwMTBFCj4gKyNkZWZpbmUgQ01OX1RYUERfQURK X0lURVJfVE1SICAgICAgICAgICAweDAxMEYKPiArI2RlZmluZSBDTU5fRElBR19QTEwwX0ZCSF9P VlJEICAgICAgICAgIDB4MDFDMAo+ICsjZGVmaW5lIENNTl9ESUFHX1BMTDBfRkJMX09WUkQgICAg ICAgICAgMHgwMUMxCj4gKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9PVlJEICAgICAgICAgICAgICAw eDAxQzIKPiArI2RlZmluZSBDTU5fRElBR19QTEwwX1RFU1RfTU9ERSAgICAgICAgIDB4MDFDNAo+ ICsjZGVmaW5lIENNTl9ESUFHX1BMTDBfVjJJX1RVTkUgICAgICAgICAgMHgwMUM1Cj4gKyNkZWZp bmUgQ01OX0RJQUdfUExMMF9DUF9UVU5FICAgICAgICAgICAweDAxQzYKPiArI2RlZmluZSBDTU5f RElBR19QTEwwX0xGX1BST0cgICAgICAgICAgIDB4MDFDNwo+ICsjZGVmaW5lIENNTl9ESUFHX1BM TDBfUFRBVElTX1RVTkUxICAgICAgMHgwMUM4Cj4gKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9QVEFU SVNfVFVORTIgICAgICAweDAxQzkKPiArI2RlZmluZSBDTU5fRElBR19QTEwwX0lOQ0xLX0NUUkwg ICAgICAgIDB4MDFDQQo+ICsjZGVmaW5lIENNTl9ESUFHX1BMTDBfUFhMX0RJVkggICAgICAgICAg MHgwMUNCCj4gKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9QWExfRElWTCAgICAgICAgICAweDAxQ0MK PiArI2RlZmluZSBDTU5fRElBR19IU0NMS19TRUwgICAgICAgICAgICAgIDB4MDFFMAo+ICsjZGVm aW5lIENNTl9ESUFHX1BFUl9DQUxfQURKICAgICAgICAgICAgMHgwMUVDCj4gKyNkZWZpbmUgQ01O X0RJQUdfQ0FMX0NUUkwgICAgICAgICAgICAgICAweDAxRUQKPiArI2RlZmluZSBDTU5fRElBR19B Q1lBICAgICAgICAgICAgICAgICAgIDB4MDFGRgo+ICsjZGVmaW5lIFhDVlJfUFNNX1JDVFJMICAg ICAgICAgICAgICAgICAgMHg0MDAxCj4gKyNkZWZpbmUgWENWUl9QU01fQ0FMX1RNUiAgICAgICAg ICAgICAgICAweDQwMDIKPiArI2RlZmluZSBYQ1ZSX1BTTV9BMElOX1RNUiAgICAgICAgICAgICAg IDB4NDAwMwo+ICsjZGVmaW5lIFRYX1RYQ0NfQ0FMX1NDTFJfTVVMVF8wICAgICAgICAgMHg0MDQ3 Cj4gKyNkZWZpbmUgVFhfVFhDQ19DUE9TVF9NVUxUXzAwXzAgICAgICAgICAweDQwNEMKPiArI2Rl ZmluZSBUWF9UWENDX01HTkZTX01VTFRfMDAwXzAgICAgICAgIDB4NDA1MAo+ICsjZGVmaW5lIFhD VlJfRElBR19QTExEUkNfQ1RSTCAgICAgICAgICAgMHg0MEUwCj4gKyNkZWZpbmUgWENWUl9ESUFH X1BMTERSQ19DVFJMICAgICAgICAgICAweDQwRTAKPiArI2RlZmluZSBYQ1ZSX0RJQUdfSFNDTEtf U0VMICAgICAgICAgICAgIDB4NDBFMQo+ICsjZGVmaW5lIFhDVlJfRElBR19CSURJX0NUUkwgICAg ICAgICAgICAgMHg0MEU4Cj4gKyNkZWZpbmUgWENWUl9ESUFHX0xBTkVfRkNNX0VOX01HTl9UTVIg ICAweDQwRjIKPiArI2RlZmluZSBYQ1ZSX0RJQUdfTEFORV9GQ01fRU5fTUdOICAgICAgIDB4NDBG Mgo+ICsjZGVmaW5lIFRYX1BTQ19BMCAgICAgICAgICAgICAgICAgICAgICAgMHg0MTAwCj4gKyNk ZWZpbmUgVFhfUFNDX0ExICAgICAgICAgICAgICAgICAgICAgICAweDQxMDEKPiArI2RlZmluZSBU WF9QU0NfQTIgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwMgo+ICsjZGVmaW5lIFRYX1BTQ19B MyAgICAgICAgICAgICAgICAgICAgICAgMHg0MTAzCj4gKyNkZWZpbmUgVFhfUkNWREVUX0NUUkwg ICAgICAgICAgICAgICAgICAweDQxMjAKPiArI2RlZmluZSBUWF9SQ1ZERVRfRU5fVE1SICAgICAg ICAgICAgICAgIDB4NDEyMgo+ICsjZGVmaW5lIFRYX1JDVkRFVF9FTl9UTVIgICAgICAgICAgICAg ICAgMHg0MTIyCj4gKyNkZWZpbmUgVFhfUkNWREVUX1NUX1RNUiAgICAgICAgICAgICAgICAweDQx MjMKPiArI2RlZmluZSBUWF9SQ1ZERVRfU1RfVE1SICAgICAgICAgICAgICAgIDB4NDEyMwo+ICsj ZGVmaW5lIFRYX0JJU1RfQ1RSTCAgICAgICAgICAgICAgICAgICAgMHg0MTQwCj4gKyNkZWZpbmUg VFhfQklTVF9VRERXUiAgICAgICAgICAgICAgICAgICAweDQxNDEKPiArI2RlZmluZSBUWF9ESUFH X1RYX0NUUkwgICAgICAgICAgICAgICAgIDB4NDFFMAo+ICsjZGVmaW5lIFRYX0RJQUdfVFhfRFJW ICAgICAgICAgICAgICAgICAgMHg0MUUxCj4gKyNkZWZpbmUgVFhfRElBR19CR1JFRl9QUkVEUlZf REVMQVkgICAgICAweDQxRTcKPiArI2RlZmluZSBUWF9ESUFHX0JHUkVGX1BSRURSVl9ERUxBWSAg ICAgIDB4NDFFNwo+ICsjZGVmaW5lIFhDVlJfUFNNX1JDVFJMXzEgICAgICAgICAgICAgICAgMHg0 MjAxCj4gKyNkZWZpbmUgVFhfVFhDQ19DQUxfU0NMUl9NVUxUXzEgICAgICAgICAweDQyNDcKPiAr I2RlZmluZSBUWF9UWENDX0NQT1NUX01VTFRfMDBfMSAgICAgICAgIDB4NDI0Qwo+ICsjZGVmaW5l IFRYX1RYQ0NfTUdORlNfTVVMVF8wMDBfMSAgICAgICAgMHg0MjUwCj4gKyNkZWZpbmUgWENWUl9E SUFHX1BMTERSQ19DVFJMXzEgICAgICAgICAweDQyRTAKPiArI2RlZmluZSBYQ1ZSX0RJQUdfSFND TEtfU0VMXzEgICAgICAgICAgIDB4NDJFMQo+ICsjZGVmaW5lIFhDVlJfRElBR19MQU5FX0ZDTV9F Tl9NR05fVE1SXzEgMHg0MkYyCj4gKyNkZWZpbmUgVFhfUkNWREVUX0VOX1RNUl8xICAgICAgICAg ICAgICAweDQzMjIKPiArI2RlZmluZSBUWF9SQ1ZERVRfU1RfVE1SXzEgICAgICAgICAgICAgIDB4 NDMyMwo+ICsjZGVmaW5lIFRYX0RJQUdfQUNZQV8wICAgICAgICAgICAgICAgICAgMHg0MUZGCj4g KyNkZWZpbmUgVFhfRElBR19BQ1lBXzEgICAgICAgICAgICAgICAgICAweDQzRkYKPiArI2RlZmlu ZSBUWF9ESUFHX0FDWUFfMiAgICAgICAgICAgICAgICAgIDB4NDVGRgo+ICsjZGVmaW5lIFRYX0RJ QUdfQUNZQV8zICAgICAgICAgICAgICAgICAgMHg0N0ZGCj4gKyNkZWZpbmUgVFhfQU5BX0NUUkxf UkVHXzEgICAgICAgICAgICAgICAweDUwMjAKPiArI2RlZmluZSBUWF9BTkFfQ1RSTF9SRUdfMiAg ICAgICAgICAgICAgIDB4NTAyMQo+ICsjZGVmaW5lIFRYREFfQ09FRkZfQ0FMQyAgICAgICAgICAg ICAgICAgMHg1MDIyCj4gKyNkZWZpbmUgVFhfRElHX0NUUkxfUkVHXzEgICAgICAgICAgICAgICAw eDUwMjMKPiArI2RlZmluZSBUWF9ESUdfQ1RSTF9SRUdfMiAgICAgICAgICAgICAgIDB4NTAyNAo+ ICsjZGVmaW5lIFRYREFfQ1lBX0FVWERBX0NZQSAgICAgICAgICAgICAgMHg1MDI1Cj4gKyNkZWZp bmUgVFhfQU5BX0NUUkxfUkVHXzMgICAgICAgICAgICAgICAweDUwMjYKPiArI2RlZmluZSBUWF9B TkFfQ1RSTF9SRUdfNCAgICAgICAgICAgICAgIDB4NTAyNwo+ICsjZGVmaW5lIFRYX0FOQV9DVFJM X1JFR181ICAgICAgICAgICAgICAgMHg1MDI5Cj4gKyNkZWZpbmUgUlhfUFNDX0EwICAgICAgICAg ICAgICAgICAgICAgICAweDgwMDAKPiArI2RlZmluZSBSWF9QU0NfQ0FMICAgICAgICAgICAgICAg ICAgICAgIDB4ODAwNgo+ICsjZGVmaW5lIFBNQV9MQU5FX0NGRyAgICAgICAgICAgICAgICAgICAg MHhDMDAwCj4gKyNkZWZpbmUgUElQRV9DTU5fQ1RSTDEgICAgICAgICAgICAgICAgICAweEMwMDEK PiArI2RlZmluZSBQSVBFX0NNTl9DVFJMMiAgICAgICAgICAgICAgICAgIDB4QzAwMgo+ICsjZGVm aW5lIFBJUEVfQ09NX0xPQ0tfQ0ZHMSAgICAgICAgICAgICAgMHhDMDAzCj4gKyNkZWZpbmUgUElQ RV9DT01fTE9DS19DRkcyICAgICAgICAgICAgICAweEMwMDQKPiArI2RlZmluZSBQSVBFX1JDVl9E RVRfSU5IICAgICAgICAgICAgICAgIDB4QzAwNQo+ICsjZGVmaW5lIFBIWV9IRFBfTU9ERV9DVFJM ICAgICAgICAgICAgICAgMHhDMDA4Cj4gKyNkZWZpbmUgUEhZX0hEUF9DTEtfQ1RMICAgICAgICAg ICAgICAgICAweEMwMDkKPiArI2RlZmluZSBTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDB4QzAwRgo+ICsjZGVmaW5lIFBIWV9JU09fQ01OX0NUUkwgICAgICAgICAgICAgICAgMHhDMDEw Cj4gKyNkZWZpbmUgUEhZX0lTT19DTU5fQ1RSTCAgICAgICAgICAgICAgICAweEMwMTAKPiArI2Rl ZmluZSBQSFlfSERQX1RYX0NUTF9MMCAgICAgICAgICAgICAgIDB4QzQwOAo+ICsjZGVmaW5lIFBI WV9EUF9UWF9DVEwgICAgICAgICAgICAgICAgICAgMHhDNDA4Cj4gKyNkZWZpbmUgUEhZX0hEUF9U WF9DVExfTDEgICAgICAgICAgICAgICAweEM0NDgKPiArI2RlZmluZSBQSFlfSERQX1RYX0NUTF9M MiAgICAgICAgICAgICAgIDB4QzQ4OAo+ICsjZGVmaW5lIFBIWV9IRFBfVFhfQ1RMX0wzICAgICAg ICAgICAgICAgMHhDNEM4Cj4gKyNkZWZpbmUgUEhZX1BNQV9DTU5fQ1RSTDEgICAgICAgICAgICAg ICAweEM4MDAKPiArI2RlZmluZSBQTUFfQ01OX0NUUkwxICAgICAgICAgICAgICAgICAgIDB4Qzgw MAo+ICsjZGVmaW5lIFBIWV9QTUFfSVNPX0NNTl9DVFJMICAgICAgICAgICAgMHhDODEwCj4gKyNk ZWZpbmUgUEhZX1BNQV9JU09fUExMX0NUUkwxICAgICAgICAgICAweEM4MTIKPiArI2RlZmluZSBQ SFlfUE1BX0lTT0xBVElPTl9DVFJMICAgICAgICAgIDB4QzgxRgo+ICsjZGVmaW5lIFBIWV9JU09M QVRJT05fQ1RSTCAgICAgICAgICAgICAgMHhDODFGCj4gKyNkZWZpbmUgUEhZX1BNQV9JU09fWENW Ul9DVFJMICAgICAgICAgICAweENDMTEKPiArI2RlZmluZSBQSFlfUE1BX0lTT19MSU5LX01PREUg ICAgICAgICAgIDB4Q0MxMgo+ICsjZGVmaW5lIFBIWV9QTUFfSVNPX1BXUlNUX0NUUkwgICAgICAg ICAgMHhDQzEzCj4gKyNkZWZpbmUgUEhZX1BNQV9JU09fVFhfREFUQV9MTyAgICAgICAgICAweEND MTQKPiArI2RlZmluZSBQSFlfUE1BX0lTT19UWF9EQVRBX0hJICAgICAgICAgIDB4Q0MxNQo+ICsj ZGVmaW5lIFBIWV9QTUFfSVNPX1JYX0RBVEFfTE8gICAgICAgICAgMHhDQzE2Cj4gKyNkZWZpbmUg UEhZX1BNQV9JU09fUlhfREFUQV9ISSAgICAgICAgICAweENDMTcKCmRvIHlvdSB1c2UgYWxsIHRo ZXNlPwoKPiArCj4gKyNkZWZpbmUgTUFYX05VTV9MQU5FUwkJNAo+ICsjZGVmaW5lIERFRkFVTFRf TUFYX0JJVF9SQVRFCTU0MDAgLyogaW4gTWJwcyAqLwo+ICsKPiArI2RlZmluZSBSRUZfQ0xLXzI3 TUhaCQkyNzAwMDAwMAo+ICsKPiArZW51bSBkcF9saW5rX3JhdGUgewo+ICsJUkFURV8xXzYgPSAx NjIwMDAsCj4gKwlSQVRFXzJfMSA9IDIxNjAwMCwKPiArCVJBVEVfMl80ID0gMjQzMDAwLAo+ICsJ UkFURV8yXzcgPSAyNzAwMDAsCj4gKwlSQVRFXzNfMiA9IDMyNDAwMCwKPiArCVJBVEVfNF8zID0g NDMyMDAwLAo+ICsJUkFURV81XzQgPSA1NDAwMDAsCj4gKwlSQVRFXzhfMSA9IDgxMDAwMCwKPiAr fTsKPiArCj4gK3N0cnVjdCBwaHlfcGxsX3JlZyB7Cj4gKwl1MTYgdmFsWzddOwo+ICsJdTMyIGFk ZHI7Cj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9wbGxfcmVnIHBoeV9wbGxf MjdtX2NmZ1tdID0gewo+ICsJLyogIDEuNjIgICAgMi4xNiAgICAyLjQzICAgIDIuNyAgICAgMy4y NCAgICA0LjMyICAgIDUuNCAgICAgIHJlZ2lzdGVyIGFkZHJlc3MgKi8KPiArCXt7IDB4MDEwRSwg MHgwMTBFLCAweDAxMEUsIDB4MDEwRSwgMHgwMTBFLCAweDAxMEUsIDB4MDEwRSB9LCBDTU5fUExM MF9WQ09DQUxfSU5JVF9UTVIgfSwKPiArCXt7IDB4MDAxQiwgMHgwMDFCLCAweDAwMUIsIDB4MDAx QiwgMHgwMDFCLCAweDAwMUIsIDB4MDAxQiB9LCBDTU5fUExMMF9WQ09DQUxfSVRFUl9UTVIgfSwK PiArCXt7IDB4MzBCOSwgMHgzMDg3LCAweDMwOTYsIDB4MzBCNCwgMHgzMEI5LCAweDMwODcsIDB4 MzBCNCB9LCBDTU5fUExMMF9WQ09DQUxfU1RBUlQgfSwKPiArCXt7IDB4MDA3NywgMHgwMDlGLCAw eDAwQjMsIDB4MDBDNywgMHgwMDc3LCAweDAwOUYsIDB4MDBDNyB9LCBDTU5fUExMMF9JTlRESVYg fSwKPiArCXt7IDB4RjlEQSwgMHhGN0NELCAweEY2QzcsIDB4RjVDMSwgMHhGOURBLCAweEY3Q0Qs IDB4RjVDMSB9LCBDTU5fUExMMF9GUkFDRElWIH0sCj4gKwl7eyAweDAwMUUsIDB4MDAyOCwgMHgw MDJELCAweDAwMzIsIDB4MDAxRSwgMHgwMDI4LCAweDAwMzIgfSwgQ01OX1BMTDBfSElHSF9USFIg fSwKPiArCXt7IDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAs IDB4MDAyMCB9LCBDTU5fUExMMF9EU01fRElBRyB9LAo+ICsJe3sgMHgwMDAwLCAweDEwMDAsIDB4 MTAwMCwgMHgxMDAwLCAweDAwMDAsIDB4MTAwMCwgMHgxMDAwIH0sIENNTl9QTExTTTBfVVNFUl9E RUZfQ1RSTCB9LAo+ICsJe3sgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAs IDB4MDAwMCwgMHgwMDAwIH0sIENNTl9ESUFHX1BMTDBfT1ZSRCB9LAo+ICsJe3sgMHgwMDAwLCAw eDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIENNTl9ESUFH X1BMTDBfRkJIX09WUkQgfSwKPiArCXt7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwg MHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCBDTU5fRElBR19QTEwwX0ZCTF9PVlJEIH0sCj4gKwl7 eyAweDAwMDYsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNiwgMHgwMDA3LCAweDAwMDcg fSwgQ01OX0RJQUdfUExMMF9WMklfVFVORSB9LAo+ICsJe3sgMHgwMDQzLCAweDAwNDMsIDB4MDA0 MywgMHgwMDQyLCAweDAwNDMsIDB4MDA0MywgMHgwMDQyIH0sIENNTl9ESUFHX1BMTDBfQ1BfVFVO RSB9LAo+ICsJe3sgMHgwMDA4LCAweDAwMDgsIDB4MDAwOCwgMHgwMDA4LCAweDAwMDgsIDB4MDAw OCwgMHgwMDA4IH0sIENNTl9ESUFHX1BMTDBfTEZfUFJPRyB9LAo+ICsJe3sgMHgwMTAwLCAweDAw MDEsIDB4MDAwMSwgMHgwMDAxLCAweDAxMDAsIDB4MDAwMSwgMHgwMDAxIH0sIENNTl9ESUFHX1BM TDBfUFRBVElTX1RVTkUxIH0sCj4gKwl7eyAweDAwMDcsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEs IDB4MDAwNywgMHgwMDAxLCAweDAwMDEgfSwgQ01OX0RJQUdfUExMMF9QVEFUSVNfVFVORTIgfSwK PiArCXt7IDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4 MDAyMCB9LCBDTU5fRElBR19QTEwwX1RFU1RfTU9ERX0sCj4gKwl7eyAweDAwMTYsIDB4MDAxNiwg MHgwMDE2LCAweDAwMTYsIDB4MDAxNiwgMHgwMDE2LCAweDAwMTYgfSwgQ01OX1BTTV9DTEtfQ1RS TCB9Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgewo+ICsJdm9pZCBfX2lv bWVtICpyZWdzOwkvKiBEUFRYIHJlZ2lzdGVycyBiYXNlICovCj4gKwlzdHJ1Y3QgZGV2aWNlICpk ZXY7Cj4gKwlzdHJ1Y3QgcGh5ICpwaHk7Cj4gKwlzdHJ1Y3QgbXV0ZXggbWJveF9tdXRleDsgLyog bXV0ZXggdG8gcHJvdGVjdCBtYWlsYm94ICovCj4gKwlzdHJ1Y3QgY2xrICpyZWZfY2xrOwo+ICsJ dTMyIHJlZl9jbGtfcmF0ZTsKPiArCXUzMiBudW1fbGFuZXM7Cj4gKwl1MzIgbWF4X2JpdF9yYXRl OyAvKiBNYXhpbXVtIGxpbmsgYml0IHJhdGUgdG8gdXNlIChpbiBNYnBzKSAqLwo+ICsJdTMyIGxp bmtfcmF0ZTsKPiArCWJvb2wgcG93ZXJfdXA7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IGNkbnNf cGh5X3JlZ193cml0ZShzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5LCB1MzIgYWRk ciwgdTMyIHZhbCkKPiArewo+ICsJcmV0dXJuIGNkbnNfbWhkcF9yZWdfd3JpdGUoY2Ruc19waHks IEFERFJfUEhZX0FGRSArIChhZGRyIDw8IDIpLCB2YWwpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdTMy IGNkbnNfcGh5X3JlZ19yZWFkKHN0cnVjdCBjZG5zX2hkcHR4X2RwX3BoeSAqY2Ruc19waHksIHUz MiBhZGRyKQo+ICt7Cj4gKwl1MzIgcmVnMzI7Cj4gKwo+ICsJY2Ruc19taGRwX3JlZ19yZWFkKGNk bnNfcGh5LCBBRERSX1BIWV9BRkUgKyAoYWRkciA8PCAyKSwgJnJlZzMyKTsKPiArCXJldHVybiBy ZWczMjsKPiArfQo+ICsKPiArc3RhdGljIGludCBsaW5rX3JhdGVfaW5kZXgodTMyIHJhdGUpCj4g K3sKPiArCXN3aXRjaCAocmF0ZSkgewo+ICsJY2FzZSBSQVRFXzFfNjoKPiArCQlyZXR1cm4gMDsK PiArCWNhc2UgUkFURV8yXzE6Cj4gKwkJcmV0dXJuIDE7Cj4gKwljYXNlIFJBVEVfMl80Ogo+ICsJ CXJldHVybiAyOwo+ICsJY2FzZSBSQVRFXzJfNzoKPiArCQlyZXR1cm4gMzsKPiArCWNhc2UgUkFU RV8zXzI6Cj4gKwkJcmV0dXJuIDQ7Cj4gKwljYXNlIFJBVEVfNF8zOgo+ICsJCXJldHVybiA1Owo+ ICsJY2FzZSBSQVRFXzVfNDoKPiArCQlyZXR1cm4gNjsKPiArCWRlZmF1bHQ6Cj4gKwkJcmV0dXJu IC0xOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGhkcHR4X2RwX3JlZl9jbGsoc3RydWN0 IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSkKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2 ID0gY2Ruc19waHktPmRldjsKPiArCXUzMiByZWZfY2xrX3JhdGU7Cj4gKwlpbnQgcmV0Owo+ICsK PiArCWNkbnNfcGh5LT5yZWZfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInJlZmNsayIpOwo+ICsJ aWYgKElTX0VSUihjZG5zX3BoeS0+cmVmX2NsaykpIHsKPiArCQlkZXZfZXJyKGRldiwgInBoeSBy ZWYgY2xvY2sgbm90IGZvdW5kXG4iKTsKPiArCQlyZXR1cm4gUFRSX0VSUihjZG5zX3BoeS0+cmVm X2Nsayk7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNkbnNfcGh5LT5y ZWZfY2xrKTsKPiArCWlmIChyZXQpIHsKPiArCQlkZXZfZXJyKGNkbnNfcGh5LT5kZXYsICJGYWls ZWQgdG8gcHJlcGFyZSByZWYgY2xvY2tcbiIpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ ICsJcmVmX2Nsa19yYXRlID0gY2xrX2dldF9yYXRlKGNkbnNfcGh5LT5yZWZfY2xrKTsKPiArCWlm ICghcmVmX2Nsa19yYXRlKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiRmFpbGVkIHRv IGdldCByZWYgY2xvY2sgcmF0ZVxuIik7Cj4gKwkJZ290byBlcnJfcmVmX2NsazsKPiArCX0KPiAr Cj4gKwlpZiAocmVmX2Nsa19yYXRlID09IFJFRl9DTEtfMjdNSFopCj4gKwkJY2Ruc19waHktPnJl Zl9jbGtfcmF0ZSA9IHJlZl9jbGtfcmF0ZTsKPiArCWVsc2Ugewo+ICsJCWRldl9lcnIoY2Ruc19w aHktPmRldiwgIk5vdCBzdXBwb3J0IFJlZiBDbG9jayBSYXRlKCVkSHopXG4iLCByZWZfY2xrX3Jh dGUpOwo+ICsJCWdvdG8gZXJyX3JlZl9jbGs7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ ICtlcnJfcmVmX2NsazoKPiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShjZG5zX3BoeS0+cmVmX2Ns ayk7Cj4gKwlyZXR1cm4gLUVJTlZBTDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaGRwdHhfZHBf YXV4X2NmZyhzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5KQo+ICt7Cj4gKwkvKiBQ b3dlciB1cCBBdXggKi8KPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhEQV9DWUFf QVVYREFfQ1lBLCAxKTsKPiArCj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIFRYX0RJ R19DVFJMX1JFR18xLCAweDMpOwo+ICsJbmRlbGF5KDE1MCk7Cj4gKwljZG5zX3BoeV9yZWdfd3Jp dGUoY2Ruc19waHksIFRYX0RJR19DVFJMX1JFR18yLCAzNik7Cj4gKwluZGVsYXkoMTUwKTsKPiAr CWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzIsIDB4MDEwMCk7 Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5B X0NUUkxfUkVHXzIsIDB4MDMwMCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193 cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzMsIDB4MDAwMCk7Cj4gKwluZGVsYXkoMTUw KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzEsIDB4 MjAwOCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwg VFhfQU5BX0NUUkxfUkVHXzEsIDB4MjAxOCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5 X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzEsIDB4QTAxOCk7Cj4gKwluZGVs YXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVH XzIsIDB4MDMwQyk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5z X3BoeSwgVFhfQU5BX0NUUkxfUkVHXzUsIDB4MDAwMCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNk bnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzQsIDB4MTAwMSk7Cj4g KwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NU UkxfUkVHXzEsIDB4QTA5OCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0 ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzEsIDB4QTE5OCk7Cj4gKwluZGVsYXkoMTUwKTsK PiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzIsIDB4MDMw ZCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhf QU5BX0NUUkxfUkVHXzIsIDB4MDMwZik7Cj4gK30KPiArCj4gKy8qIFBNQSBjb21tb24gY29uZmln dXJhdGlvbiBmb3IgMjdNSHogKi8KPiArc3RhdGljIHZvaWQgaGRwdHhfZHBfcGh5X3BtYV9jbW5f Y2ZnXzI3bWh6KHN0cnVjdCBjZG5zX2hkcHR4X2RwX3BoeSAqY2Ruc19waHkpCj4gK3sKPiArCXUz MiBudW1fbGFuZXMgPSBjZG5zX3BoeS0+bnVtX2xhbmVzOwo+ICsJdTE2IHZhbDsKPiArCWludCBr Owo+ICsKPiArCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfUE1BX0NNTl9D VFJMMSk7Cj4gKwl2YWwgJj0gMHhGRkY3Owo+ICsJdmFsIHw9IDB4MDAwODsKPiArCWNkbnNfcGh5 X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX1BNQV9DTU5fQ1RSTDEsIHZhbCk7Cj4gKwo+ICsJLyog U3RhcnR1cCBzdGF0ZSBtYWNoaW5lIHJlZ2lzdGVycyAqLwo+ICsJY2Ruc19waHlfcmVnX3dyaXRl KGNkbnNfcGh5LCBDTU5fU1NNX0JJQVNfVE1SLCAweDAwODcpOwo+ICsJY2Ruc19waHlfcmVnX3dy aXRlKGNkbnNfcGh5LCBDTU5fUExMU00wX1BMTEVOX1RNUiwgMHgwMDFCKTsKPiArCWNkbnNfcGh5 X3JlZ193cml0ZShjZG5zX3BoeSwgQ01OX1BMTFNNMF9QTExQUkVfVE1SLCAweDAwMzYpOwo+ICsJ Y2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fUExMU00wX1BMTFZSRUZfVE1SLCAweDAw MUIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fUExMU00wX1BMTExPQ0tf VE1SLCAweDAwNkMpOwo+ICsKPiArCS8qIEN1cnJlbnQgY2FsaWJyYXRpb24gcmVnaXN0ZXJzICov Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9JQ0FMX0lOSVRfVE1SLCAweDAw NDQpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fSUNBTF9JVEVSX1RNUiwg MHgwMDA2KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgQ01OX0lDQUxfQURKX0lO SVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fSUNB TF9BREpfSVRFUl9UTVIsIDB4MDAwNik7Cj4gKwo+ICsJLyogUmVzaXN0b3IgY2FsaWJyYXRpb24g cmVnaXN0ZXJzICovCj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9UWFBVQ0FM X0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5f VFhQVUNBTF9JVEVSX1RNUiwgMHgwMDA2KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3Bo eSwgQ01OX1RYUFVfQURKX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRl KGNkbnNfcGh5LCBDTU5fVFhQVV9BREpfSVRFUl9UTVIsIDB4MDAwNik7Cj4gKwljZG5zX3BoeV9y ZWdfd3JpdGUoY2Ruc19waHksIENNTl9UWFBEQ0FMX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ru c19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fVFhQRENBTF9JVEVSX1RNUiwgMHgwMDA2KTsK PiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgQ01OX1RYUERfQURKX0lOSVRfVE1SLCAw eDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fVFhQRF9BREpfSVRF Ul9UTVIsIDB4MDAwNik7Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9SWENB TF9JTklUX1RNUiwgMHgwMDIyKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgQ01O X1JYQ0FMX0lURVJfVE1SLCAweDAwMDYpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5 LCBDTU5fUlhfQURKX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNk bnNfcGh5LCBDTU5fUlhfQURKX0lURVJfVE1SLCAweDAwMDYpOwo+ICsKPiArCWZvciAoayA9IDA7 IGsgPCBudW1fbGFuZXM7IGsgPSBrICsgMSkgewo+ICsJCS8qIFBvd2VyIHN0YXRlIG1hY2hpbmUg cmVnaXN0ZXJzICovCj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBYQ1ZSX1BTTV9D QUxfVE1SICB8IChrIDw8IDkpLCAweDAxNkQpOwo+ICsJCWNkbnNfcGh5X3JlZ193cml0ZShjZG5z X3BoeSwgWENWUl9QU01fQTBJTl9UTVIgfCAoayA8PCA5KSwgMHgwMTZEKTsKPiArCQkvKiBUcmFu c2NlaXZlciBjb250cm9sIGFuZCBkaWFnbm9zdGljIHJlZ2lzdGVycyAqLwo+ICsJCWNkbnNfcGh5 X3JlZ193cml0ZShjZG5zX3BoeSwgWENWUl9ESUFHX0xBTkVfRkNNX0VOX01HTl9UTVIgfCAoayA8 PCA5KSwgMHgwMEEyKTsKPiArCQljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIFRYX0RJQUdf QkdSRUZfUFJFRFJWX0RFTEFZICAgIHwgKGsgPDwgOSksIDB4MDA5Nyk7Cj4gKwkJLyogVHJhbnNt aXR0ZXIgcmVjZWl2ZXIgZGV0ZWN0IHJlZ2lzdGVycyAqLwo+ICsJCWNkbnNfcGh5X3JlZ193cml0 ZShjZG5zX3BoeSwgVFhfUkNWREVUX0VOX1RNUiB8IChrIDw8IDkpLCAweDBBOEMpOwo+ICsJCWNk bnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfUkNWREVUX1NUX1RNUiB8IChrIDw8IDkpLCAw eDAwMzYpOwo+ICsJfQo+ICsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfRElB R19BQ1lBXzAsIDEpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBUWF9ESUFHX0FD WUFfMSwgMSk7Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIFRYX0RJQUdfQUNZQV8y LCAxKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfRElBR19BQ1lBXzMsIDEp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBoZHB0eF9kcF9waHlfcG1hX2Ntbl9wbGwwXzI3bWh6 KHN0cnVjdCBjZG5zX2hkcHR4X2RwX3BoeSAqY2Ruc19waHkpCj4gK3sKPiArCXUzMiBudW1fbGFu ZXMgPSBjZG5zX3BoeS0+bnVtX2xhbmVzOwo+ICsJdTMyIGxpbmtfcmF0ZSA9IGNkbnNfcGh5LT5s aW5rX3JhdGU7Cj4gKwl1MTYgdmFsOwo+ICsJaW50IGluZGV4LCBpLCBrOwo+ICsKPiArCS8qIERQ IFBMTCBkYXRhIHJhdGUgMC8xIGNsb2NrIGRpdmlkZXIgdmFsdWUgKi8KPiArCXZhbCA9IGNkbnNf cGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJdmFsICY9IDB4MDBG RjsKPiArCWlmIChsaW5rX3JhdGUgPD0gUkFURV8yXzcpCj4gKwkJdmFsIHw9IDB4MjQwMDsKPiAr CWVsc2UKPiArCQl2YWwgfD0gMHgxMjAwOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5 LCBQSFlfSERQX0NMS19DVEwsIHZhbCk7Cj4gKwo+ICsJLyogSGlnaCBzcGVlZCBjbG9jayAwLzEg ZGl2ICovCj4gKwl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgQ01OX0RJQUdfSFND TEtfU0VMKTsKPiArCXZhbCAmPSAweEZGQ0M7Cj4gKwlpZiAobGlua19yYXRlIDw9IFJBVEVfMl83 KQo+ICsJCXZhbCB8PSAweDAwMTE7Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENN Tl9ESUFHX0hTQ0xLX1NFTCwgdmFsKTsKPiArCj4gKwlmb3IgKGsgPSAwOyBrIDwgbnVtX2xhbmVz OyBrKyspIHsKPiArCQl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgKFhDVlJfRElB R19IU0NMS19TRUwgfCAoayA8PCA5KSkpOwo+ICsJCXZhbCA9IHZhbCAmIDB4Q0ZGRjsKPiArCQlp ZiAobGlua19yYXRlIDw9IFJBVEVfMl83KQo+ICsJCQl2YWwgfD0gMHgxMDAwOwo+ICsJCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgKFhDVlJfRElBR19IU0NMS19TRUwgfCAoayA8PCA5KSks IHZhbCk7Cj4gKwl9Cj4gKwo+ICsJLyogRFAgUEhZIFBMTCAyN01IeiBjb25maWd1cmF0aW9uICov Cj4gKwlpbmRleCA9IGxpbmtfcmF0ZV9pbmRleChsaW5rX3JhdGUpOwo+ICsJZm9yIChpID0gMDsg aSA8IEFSUkFZX1NJWkUocGh5X3BsbF8yN21fY2ZnKTsgaSsrKQo+ICsJCWNkbnNfcGh5X3JlZ193 cml0ZShjZG5zX3BoeSwgcGh5X3BsbF8yN21fY2ZnW2ldLmFkZHIsCj4gKwkJCQlwaHlfcGxsXzI3 bV9jZmdbaV0udmFsW2luZGV4XSk7Cj4gKwo+ICsJLyogVHJhbnNjZWl2ZXIgY29udHJvbCBhbmQg ZGlhZ25vc3RpYyByZWdpc3RlcnMgKi8KPiArCWZvciAoayA9IDA7IGsgPCBudW1fbGFuZXM7IGsr Kykgewo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCAoWENWUl9ESUFHX1BM TERSQ19DVFJMIHwgKGsgPDwgOSkpKTsKPiArCQl2YWwgPSB2YWwgJiAweDhGRkY7Cj4gKwkJaWYg KGxpbmtfcmF0ZSA8PSBSQVRFXzJfNykKPiArCQkJdmFsIHw9IDB4MjAwMDsKPiArCQllbHNlCj4g KwkJCXZhbCB8PSAweDEwMDA7Cj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCAoWENW Ul9ESUFHX1BMTERSQ19DVFJMIHwgKGsgPDwgOSkpLCB2YWwpOwo+ICsJfQo+ICsKPiArCWZvciAo ayA9IDA7IGsgPCBudW1fbGFuZXM7IGsgPSBrICsgMSkgewo+ICsJCS8qIFBvd2VyIHN0YXRlIG1h Y2hpbmUgcmVnaXN0ZXJzICovCj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCAoWENW Ul9QU01fUkNUUkwgfCAoayA8PCA5KSksICAweEJFRkMpOwo+ICsJCWNkbnNfcGh5X3JlZ193cml0 ZShjZG5zX3BoeSwgKFRYX1BTQ19BMCB8IChrIDw8IDkpKSwgMHg2Nzk5KTsKPiArCQljZG5zX3Bo eV9yZWdfd3JpdGUoY2Ruc19waHksIChUWF9QU0NfQTEgfCAoayA8PCA5KSksIDB4Njc5OCk7Cj4g KwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCAoVFhfUFNDX0EyIHwgKGsgPDwgOSkpLCAw eDAwOTgpOwo+ICsJCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgKFRYX1BTQ19BMyB8IChr IDw8IDkpKSwgMHgwMDk4KTsKPiArCQkvKiBSZWNlaXZlciBjYWxpYnJhdGlvbiBwb3dlciBzdGF0 ZSBkZWZpbml0aW9uIHJlZ2lzdGVyICovCj4gKwkJdmFsID0gY2Ruc19waHlfcmVnX3JlYWQoY2Ru c19waHksIFJYX1BTQ19DQUwgfCAoayA8PCA5KSk7Cj4gKwkJdmFsICY9IDB4RkZCQjsKPiArCQlj ZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIChSWF9QU0NfQ0FMIHwgKGsgPDwgOSkpLCB2YWwp Owo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBSWF9QU0NfQTAgIHwgKGsg PDwgOSkpOwo+ICsJCXZhbCAmPSAweEZGQkI7Cj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNf cGh5LCAoUlhfUFNDX0EwICB8IChrIDw8IDkpKSwgdmFsKTsKPiArCX0KPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgaGRwdHhfZHBfcGh5X3JlZl9jbG9ja190eXBlKHN0cnVjdCBjZG5zX2hkcHR4X2Rw X3BoeSAqY2Ruc19waHkpCj4gK3sKPiArCXUzMiB2YWw7Cj4gKwo+ICsJdmFsID0gY2Ruc19waHlf cmVnX3JlYWQoY2Ruc19waHksIFBIWV9QTUFfQ01OX0NUUkwxKTsKPiArCXZhbCAmPSAweEZGOEY7 Cj4gKwkvKgo+ICsJICogc2luZ2xlIGVuZGVkIHJlZmVyZW5jZSBjbG9jayAodmFsIHw9IDB4MDAz MCk7Cj4gKwkgKiBkaWZmZXJlbnRpYWwgY2xvY2sgICh2YWwgfD0gMHgwMDAwKTsKPiArCSAqCj4g KwkgKiBmb3IgZGlmZmVyZW50aWFsIGNsb2NrIG9uIHRoZSByZWZjbGtfcCBhbmQKPiArCSAqIHJl ZmNsa19tIG9mZiBjaGlwIHBpbnM6IENNTl9ESUFHX0FDWUFbOF09MSdiMQo+ICsJICogY2Ruc19w aHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fRElBR19BQ1lBLCAweDAxMDApOwo+ICsJICovCj4g Kwl2YWwgfD0gMHgwMDMwOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBQSFlfUE1B X0NNTl9DVFJMMSwgdmFsKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBoZHB0eF9kcF9waHlfcG93 ZXJfdXAoc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSkKPiArewo+ICsJdTMyIHZh bCwgaTsKPiArCj4gKwkvKiBFbmFibGUgSERQIFBMTOKAmXMgZm9yIGhpZ2ggc3BlZWQgY2xvY2tz ICovCj4gKwl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RM KTsKPiArCXZhbCB8PSAoMSA8PCAwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwg UEhZX0hEUF9DTEtfQ1RMLCB2YWwpOwo+ICsJLyogV2FpdCBmb3IgUExMIHJlYWR5IEFDSyAqLwo+ ICsJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKPiArCQl2YWwgPSBjZG5zX3BoeV9yZWdfcmVh ZChjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMKTsKPiArCQlpZiAodmFsICYgKDEgPDwgMSkpCj4g KwkJCWJyZWFrOwo+ICsJCW1zbGVlcCgyMCk7Cj4gKwl9Cj4gKwlpZiAoaSA9PSAxMCkgewo+ICsJ CWRldl9lcnIoY2Ruc19waHktPmRldiwgIldhaXQgUExMIEFjayBmYWlsZWRcbiIpOwo+ICsJCXJl dHVybiAtMTsKPiArCX0KPiArCj4gKwkvKiBFbmFibGUgSERQIFBMTOKAmXMgZGF0YSByYXRlIGFu ZCBmdWxsIHJhdGUgY2xvY2tzIG91dCBvZiBQTUEuICovCj4gKwl2YWwgPSBjZG5zX3BoeV9yZWdf cmVhZChjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMKTsKPiArCXZhbCB8PSAoMSA8PCAyKTsKPiAr CWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMLCB2YWwpOwo+ICsJ LyogV2FpdCBmb3IgUExMIGNsb2NrIGVuYWJsZSBBQ0sgKi8KPiArCWZvciAoaSA9IDA7IGkgPCAx MDsgaSsrKSB7Cj4gKwkJdmFsID0gY2Ruc19waHlfcmVnX3JlYWQoY2Ruc19waHksIFBIWV9IRFBf Q0xLX0NUTCk7Cj4gKwkJaWYgKHZhbCAmICgxIDw8IDMpKQo+ICsJCQlicmVhazsKPiArCQltc2xl ZXAoMjApOwo+ICsJfQo+ICsJaWYgKGkgPT0gMTApIHsKPiArCQlkZXZfZXJyKGNkbnNfcGh5LT5k ZXYsICJXYWl0IFBMTCBjbG9jayBlbmFibGUgQUNrIGZhaWxlZFxuIik7Cj4gKwkJcmV0dXJuIC0x Owo+ICsJfQo+ICsKPiArCS8qIENvbmZpZ3VyZSBQSFkgaW4gQTIgTW9kZSAqLwo+ICsJY2Ruc19w aHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBQSFlfSERQX01PREVfQ1RSTCwgMHgwMDA0KTsKPiArCS8q IFdhaXQgZm9yIFBvd2VyIFN0YXRlIEEyIEFjayAqLwo+ICsJZm9yIChpID0gMDsgaSA8IDEwOyBp KyspIHsKPiArCQl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9NT0RF X0NUUkwpOwo+ICsJCWlmICh2YWwgJiAoMSA8PCA2KSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVw KDIwKTsKPiArCX0KPiArCWlmIChpID09IDEwKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2 LCAiV2FpdCBBMiBBY2sgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm4gLTE7Cj4gKwl9Cj4gKwo+ICsJ LyogQ29uZmlndXJlIFBIWSBpbiBBMCBtb2RlIChQSFkgbXVzdCBiZSBpbiB0aGUgQTAgcG93ZXIK PiArCSAqIHN0YXRlIGluIG9yZGVyIHRvIHRyYW5zbWl0IGRhdGEpCj4gKwkgKi8KPiArCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hEUF9NT0RFX0NUUkwsIDB4MDEwMSk7Cj4gKwo+ ICsJLyogV2FpdCBmb3IgUG93ZXIgU3RhdGUgQTAgQWNrICovCj4gKwlmb3IgKGkgPSAwOyBpIDwg MTA7IGkrKykgewo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQ X01PREVfQ1RSTCk7Cj4gKwkJaWYgKHZhbCAmICgxIDw8IDQpKQo+ICsJCQlicmVhazsKPiArCQlt c2xlZXAoMjApOwo+ICsJfQo+ICsJaWYgKGkgPT0gMTApIHsKPiArCQlkZXZfZXJyKGNkbnNfcGh5 LT5kZXYsICJXYWl0IEEwIEFjayBmYWlsZWRcbiIpOwo+ICsJCXJldHVybiAtMTsKPiArCX0KPiAr Cj4gKwljZG5zX3BoeS0+cG93ZXJfdXAgPSB0cnVlOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBoZHB0eF9kcF9waHlfcG93ZXJfZG93bihzdHJ1Y3QgY2Ruc19oZHB0 eF9kcF9waHkgKmNkbnNfcGh5KQo+ICt7Cj4gKwl1MTYgdmFsOwo+ICsJaW50IGk7Cj4gKwo+ICsJ aWYgKCFjZG5zX3BoeS0+cG93ZXJfdXApCj4gKwkJcmV0dXJuOwo+ICsKPiArCS8qIFBsYWNlIHRo ZSBQSFkgbGFuZXMgaW4gdGhlIEEzIHBvd2VyIHN0YXRlLiAqLwo+ICsJY2Ruc19waHlfcmVnX3dy aXRlKGNkbnNfcGh5LCBQSFlfSERQX01PREVfQ1RSTCwgMHg4KTsKPiArCS8qIFdhaXQgZm9yIFBv d2VyIFN0YXRlIEEzIEFjayAqLwo+ICsJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKPiArCQl2 YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9NT0RFX0NUUkwpOwo+ICsJ CWlmICh2YWwgJiAoMSA8PCA3KSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVwKDIwKTsKPiArCX0K PiArCWlmIChpID09IDEwKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiV2FpdCBBMyBB Y2sgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJLyogRGlzYWJsZSBIRFAg UExM4oCZcyBkYXRhIHJhdGUgYW5kIGZ1bGwgcmF0ZSBjbG9ja3Mgb3V0IG9mIFBNQS4gKi8KPiAr CXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJ dmFsICY9IH4oMSA8PCAyKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hE UF9DTEtfQ1RMLCB2YWwpOwo+ICsJLyogV2FpdCBmb3IgUExMIGNsb2NrIGdhdGUgQUNLICovCj4g Kwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFk KGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJCWlmICghKHZhbCAmICgxIDw8IDMpKSkK PiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVwKDIwKTsKPiArCX0KPiArCWlmIChpID09IDEwKSB7Cj4g KwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiV2FpdCBQTEwgY2xvY2sgZ2F0ZSBBY2sgZmFpbGVk XG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJLyogRGlzYWJsZSBIRFAgUExM4oCZcyBm b3IgaGlnaCBzcGVlZCBjbG9ja3MgKi8KPiArCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNf cGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJdmFsICY9IH4oMSA8PCAwKTsKPiArCWNkbnNfcGh5 X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMLCB2YWwpOwo+ICsJLyogV2FpdCBm b3IgUExMIGRpc2FibGUgQUNLICovCj4gKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewo+ICsJ CXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJ CWlmICghKHZhbCAmICgxIDw8IDEpKSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVwKDIwKTsKPiAr CX0KPiArCWlmIChpID09IDEwKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiV2FpdCBQ TEwgZGlzYWJsZSBBY2sgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgY2Ruc19oZHB0eF9kcF9waHlfb24oc3RydWN0IHBoeSAqcGh5KQo+ICt7Cj4g KwlzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBo eSk7Cj4gKwo+ICsJcmV0dXJuIGhkcHR4X2RwX3BoeV9wb3dlcl91cChjZG5zX3BoeSk7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgY2Ruc19oZHB0eF9kcF9waHlfb2ZmKHN0cnVjdCBwaHkgKnBoeSkK PiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSA9IHBoeV9nZXRfZHJ2 ZGF0YShwaHkpOwo+ICsKPiArCWhkcHR4X2RwX3BoeV9wb3dlcl9kb3duKGNkbnNfcGh5KTsKPiAr Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBjZG5zX2hkcHR4X2RwX3BoeV9p bml0KHN0cnVjdCBwaHkgKnBoeSkKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpj ZG5zX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ICsJaW50IHJldDsKPiArCj4gKwloZHB0 eF9kcF9waHlfcmVmX2Nsb2NrX3R5cGUoY2Ruc19waHkpOwo+ICsKPiArCS8qIFBIWSBwb3dlciB1 cCAqLwo+ICsJcmV0ID0gaGRwdHhfZHBfcGh5X3Bvd2VyX3VwKGNkbnNfcGh5KTsKPiArCWlmIChy ZXQgPCAwKQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJaGRwdHhfZHBfYXV4X2NmZyhjZG5zX3Bo eSk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBjZG5zX2hkcHR4 X2RwX2NvbmZpZ3VyZShzdHJ1Y3QgcGh5ICpwaHksCj4gKwkJCQkgICAgIHVuaW9uIHBoeV9jb25m aWd1cmVfb3B0cyAqb3B0cykKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5z X3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ICsJaW50IHJldDsKPiArCj4gKwljZG5zX3Bo eS0+bGlua19yYXRlID0gb3B0cy0+ZHAubGlua19yYXRlOwo+ICsKPiArCS8qIERpc2FibGUgcGh5 IGNsb2NrIGlmIFBIWSBpbiBwb3dlciB1cCBzdGF0ZSAqLwo+ICsJaGRwdHhfZHBfcGh5X3Bvd2Vy X2Rvd24oY2Ruc19waHkpOwo+ICsKPiArCWlmIChjZG5zX3BoeS0+cmVmX2Nsa19yYXRlID09IFJF Rl9DTEtfMjdNSFopIHsKPiArCQloZHB0eF9kcF9waHlfcG1hX2Ntbl9jZmdfMjdtaHooY2Ruc19w aHkpOwo+ICsJCWhkcHR4X2RwX3BoeV9wbWFfY21uX3BsbDBfMjdtaHooY2Ruc19waHkpOwo+ICsJ fSBlbHNlCj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiTm90IHN1cHBvcnQgcmVmIGNsb2Nr IHJhdGVcbiIpOwo+ICsKPiArCS8qIFBIWSBwb3dlciB1cCAqLwo+ICsJcmV0ID0gaGRwdHhfZHBf cGh5X3Bvd2VyX3VwKGNkbnNfcGh5KTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtz dGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgY2Ruc19oZHB0eF9kcF9waHlfb3BzID0gewo+ICsJ LmluaXQJCT0gY2Ruc19oZHB0eF9kcF9waHlfaW5pdCwKPiArCS5jb25maWd1cmUJPSBjZG5zX2hk cHR4X2RwX2NvbmZpZ3VyZSwKPiArCS5wb3dlcl9vbgk9IGNkbnNfaGRwdHhfZHBfcGh5X29uLAo+ ICsJLnBvd2VyX29mZgk9IGNkbnNfaGRwdHhfZHBfcGh5X29mZiwKPiArCS5vd25lcgkJPSBUSElT X01PRFVMRSwKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgY2Ruc19oZHB0eF9kcF9waHlfcHJvYmUo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhf ZHBfcGh5ICpjZG5zX3BoeTsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Cj4g KwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBkZXYtPm9mX25vZGU7Cj4gKwlzdHJ1Y3QgcGh5 X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7Cj4gKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKPiArCXN0 cnVjdCBwaHkgKnBoeTsKPiArCWludCByZXQ7Cj4gKwo+ICsJY2Ruc19waHkgPSBkZXZtX2t6YWxs b2MoZGV2LCBzaXplb2YoKmNkbnNfcGh5KSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWNkbnNfcGh5 KQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiArCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGNkbnNf cGh5KTsKPiArCWNkbnNfcGh5LT5kZXYgPSBkZXY7Cj4gKwltdXRleF9pbml0KCZjZG5zX3BoeS0+ bWJveF9tdXRleCk7Cj4gKwo+ICsJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElP UkVTT1VSQ0VfTUVNLCAwKTsKPiArCWlmICghcmVzKQo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJ Y2Ruc19waHktPnJlZ3MgPSBkZXZtX2lvcmVtYXAoZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9z aXplKHJlcykpOwo+ICsJaWYgKElTX0VSUihjZG5zX3BoeS0+cmVncykpCj4gKwkJcmV0dXJuIFBU Ul9FUlIoY2Ruc19waHktPnJlZ3MpOwo+ICsKPiArCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihu b2RlLCAiY2RucyxudW0tbGFuZXMiLAo+ICsJCQkJICZjZG5zX3BoeS0+bnVtX2xhbmVzKSkgewo+ ICsJCWRldl9lcnIoZGV2LCAiJXM6IE5vIFwiY2RucyxudW0tbGFuZXNcIi1wcm9wZXJ0eS5cbiIs Cj4gKwkJCW5vZGUtPmZ1bGxfbmFtZSk7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ ICsJcGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgbm9kZSwgJmNkbnNfaGRwdHhfZHBfcGh5X29w cyk7Cj4gKwlpZiAoSVNfRVJSKHBoeSkpCj4gKwkJcmV0dXJuIFBUUl9FUlIocGh5KTsKPiArCj4g KwljZG5zX3BoeS0+bWF4X2JpdF9yYXRlID0gREVGQVVMVF9NQVhfQklUX1JBVEU7Cj4gKwlvZl9w cm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY2RucyxtYXgtYml0LXJhdGUiLAo+ICsJCQkgICAgICZj ZG5zX3BoeS0+bWF4X2JpdF9yYXRlKTsKPiArCj4gKwlzd2l0Y2ggKGNkbnNfcGh5LT5tYXhfYml0 X3JhdGUpIHsKPiArCS8qIHZhbGlkIGJpdCByYXRlICovCj4gKwljYXNlIDE2MjA6Cj4gKwljYXNl IDIxNjA6Cj4gKwljYXNlIDI0MzA6Cj4gKwljYXNlIDI3MDA6Cj4gKwljYXNlIDMyNDA6Cj4gKwlj YXNlIDQzMjA6Cj4gKwljYXNlIDU0MDA6Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIDgxMDA6Cj4gKwlk ZWZhdWx0Ogo+ICsJCWRldl9lcnIoZGV2LCAidW5zdXBwb3J0ZWQgbWF4IGJpdCByYXRlOiAlZE1i cHNcbiIsCj4gKwkJCQljZG5zX3BoeS0+bWF4X2JpdF9yYXRlKTsKPiArCQlyZXR1cm4gLUVJTlZB TDsKPiArCX0KPiArCj4gKwlkZXZfZGJnKGRldiwgIkRQIG1heCBiaXQgcmF0ZSAlZC4lMDNkIEdi cHNcbiIsCj4gKwkJY2Ruc19waHktPm1heF9iaXRfcmF0ZSAvIDEwMDAsCj4gKwkJY2Ruc19waHkt Pm1heF9iaXRfcmF0ZSAlIDEwMDApOwo+ICsKPiArCXBoeS0+YXR0cnMuYnVzX3dpZHRoID0gY2Ru c19waHktPm51bV9sYW5lczsKPiArCXBoeS0+YXR0cnMubWF4X2xpbmtfcmF0ZSA9IGNkbnNfcGh5 LT5tYXhfYml0X3JhdGU7Cj4gKwlwaHktPmF0dHJzLm1vZGUgPSBQSFlfTU9ERV9EUDsKPiArCj4g KwljZG5zX3BoeS0+cGh5ID0gcGh5Owo+ICsJcGh5X3NldF9kcnZkYXRhKHBoeSwgY2Ruc19waHkp Owo+ICsKPiArCWlmIChjZG5zX3BoeS0+bnVtX2xhbmVzID4gTUFYX05VTV9MQU5FUykgewo+ICsJ CWRldl9lcnIoZGV2LCAiSW52YWxpZCBsYW5lIGNvbmZpZ3VyYXRpb25cbiIpOwo+ICsJCXJldHVy biAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCXJldCA9IGhkcHR4X2RwX3JlZl9jbGsoY2Ruc19waHkp Owo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAiSW5pdCBjbGsgZmFpbFxuIik7Cj4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9w aHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBvZl9waHlfc2ltcGxlX3hsYXRlKTsKPiArCWlmIChJ U19FUlIocGh5X3Byb3ZpZGVyKSkgewo+ICsJCXJldCA9ICBQVFJfRVJSKHBoeV9wcm92aWRlcik7 Cj4gKwkJZ290byBjbGtfZGlzYWJsZTsKPiArCX0KPiArCj4gKwlkZXZfZGJnKGRldiwgImxpbms6 ICglZCBsYW5lcykiLCBjZG5zX3BoeS0+bnVtX2xhbmVzKTsKPiArCj4gKwlyZXR1cm4gMDsKPiAr Cj4gK2Nsa19kaXNhYmxlOgo+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNkbnNfcGh5LT5yZWZf Y2xrKTsKPiArCj4gKwlyZXR1cm4gLUVJTlZBTDsKPiArfQo+ICsKPiArc3RhdGljIGludCBjZG5z X2hkcHR4X2RwX3BoeV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSA9IHBsYXRmb3JtX2dldF9kcnZk YXRhKHBkZXYpOwo+ICsKPiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShjZG5zX3BoeS0+cmVmX2Ns ayk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2Zf ZGV2aWNlX2lkIGNkbnNfaGRwdHhfZHBfcGh5X29mX21hdGNoW10gPSB7Cj4gKwl7Cj4gKwkJLmNv bXBhdGlibGUgPSAiY2RucyxoZHB0eC1kcC1waHkiLAo+ICsJfSwKPiArCXt9Cj4gK307Cj4gK01P RFVMRV9ERVZJQ0VfVEFCTEUob2YsIGNkbnNfaGRwdHhfZHBfcGh5X29mX21hdGNoKTsKPiArCj4g K3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNkbnNfaGRwdHhfZHBfcGh5X2RyaXZlciA9 IHsKPiArCS5wcm9iZQk9IGNkbnNfaGRwdHhfZHBfcGh5X3Byb2JlLAo+ICsJLnJlbW92ZSA9IGNk bnNfaGRwdHhfZHBfcGh5X3JlbW92ZSwKPiArCS5kcml2ZXIgPSB7Cj4gKwkJLm5hbWUJPSAiY2Ru cy1oZHB0eC1kcC1waHkiLAo+ICsJCS5vZl9tYXRjaF90YWJsZQk9IGNkbnNfaGRwdHhfZHBfcGh5 X29mX21hdGNoLAo+ICsJfQo+ICt9Owo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGNkbnNfaGRw dHhfZHBfcGh5X2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJTYW5kb3IgWXUgPHNhbmRv ci55dUBueHAuY29tPiIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIkNhZGVuY2UgSERQLVRYIERp c3BsYXlQb3J0IFBIWSBkcml2ZXIiKTsKPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+IC0tIAo+ IDIuMzQuMQoKLS0gCn5WaW5vZAoKLS0gCmxpbnV4LXBoeSBtYWlsaW5nIGxpc3QKbGludXgtcGh5 QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cHM6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8vbGludXgtcGh5Cg== 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 02C01C433FE for ; Thu, 10 Nov 2022 07:42:01 +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=GAHPeg1kA+Oitx9NAXTA0PAyf+Dllv9kezjnoaKMlPI=; b=v4fWRjE85cEsYo brszhIwX52dDbL4vvPSXFOotVcxpPfunf6A5D2Q4HmNkRy0RTwzMdNhQ0zNJloFTaqKiLpIprpPJw fqeirsui6ege7k1M5gZYrOJViCQ/aT9LgKFEI7yPxjHLcUgVNtmUDcp4REEOZnY3PvcxwJIALATuw kiAjFJmeY24eyvd4ZlrbuSvpw9W4RYGm+YZb2084WTMF1BH07LWxyxb1qwRGvCYHpgBBP0oQOXvhT FvGQBrfqt87e+YlV0IizGZ2nGY1Gwahve5Olpl7REZqUjINVJpxHKoZZXLqgpiJsiqdSdOMu2tgPc jtSv+TpXXI56tp/gKybQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ot2BC-003w71-Sk; Thu, 10 Nov 2022 07:40:55 +0000 Received: from ams.source.kernel.org ([145.40.68.75]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1ot2B7-003w2v-CY; Thu, 10 Nov 2022 07:40:52 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 84F1CB82052; Thu, 10 Nov 2022 07:40:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 24433C433D6; Thu, 10 Nov 2022 07:40:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1668066046; bh=xOehpA7GaLY+h39F/Pnz3gq81tX/dJk6RV4MSFTtWHc=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=R6tzxmZ61Y6VXoaCUDUQzz75sIWsRTAASsEuOfDedj4PaJdYq0FkeW1lrPtRBvvMY UffPdvc1M8+9E7HvHHF3UTVyPCeYa+ALPrzUVl3IYKtTqTnnXvo+2Z0+xgV0tnOVkv Hm1RZm2pDmlRJKlOXdKrVuZiRz57tZTGKwooKQic8KWjvM/4sikceTSHO+Au3uwyUU e/18SXXmcR1PTniuEMzevXFN3nhOithFdYA0mW1eupzG/qnE/MKqsHPUfrXdHcmb2Q jnRVPq32nn+ihmYFbd2ylb20D+YR4dInUyWUpxMABFFN7RLvWPZl0peq3/cccNwPVF jmJ6h6Bo8ObSg== Date: Thu, 10 Nov 2022 13:10:42 +0530 From: Vinod Koul To: Sandor Yu Cc: 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, andrzej.hajda@intel.com, neil.armstrong@linaro.org, robert.foss@linaro.org, Laurent.pinchart@ideasonboard.com, jonas@kwiboo.se, jernej.skrabec@gmail.com, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, linux-imx@nxp.com, tzimmermann@suse.de, lyude@redhat.com, javierm@redhat.com, ville.syrjala@linux.intel.com, sam@ravnborg.org, jani.nikula@intel.com, maxime@cerno.tech, penguin-kernel@i-love.sakura.ne.jp, oliver.brown@nxp.com Subject: Re: [PATCH v3 08/10] phy: cadence: Add driver for HDP-TX DisplyPort PHY Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221109_234049_772981_F4C45D4D X-CRM114-Status: GOOD ( 29.27 ) 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 T24gMDgtMTEtMjIsIDIxOjAwLCBTYW5kb3IgWXUgd3JvdGU6Cj4gQWRkIENhZGVuY2UgSERQLVRY IERpc3BsYXlQb3J0IFBIWSBkcml2ZXIuCj4gCj4gQ2FkZW5jZSBIRFAtVFggUEhZIGNvdWxkIGJl IHB1dCBpbiBlaXRoZXIgRFAgbW9kZSBvcgo+IEhETUkgbW9kZSBiYXNlIG9uIHRoZSBjb25maWd1 cmF0aW9uIGNob3Nlbi4KPiBEaXNwbGF5UG9ydCBQSFkgbW9kZSBpcyBjb25maWd1cmF0ZWQgaW4g dGhlIGRyaXZlci4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBTYW5kb3IgWXUgPFNhbmRvci55dUBueHAu Y29tPgo+IC0tLQo+ICBkcml2ZXJzL3BoeS9jYWRlbmNlL0tjb25maWcgICAgICAgICAgICAgICAg fCAgIDggKwo+ICBkcml2ZXJzL3BoeS9jYWRlbmNlL01ha2VmaWxlICAgICAgICAgICAgICAgfCAg IDEgKwo+ICBkcml2ZXJzL3BoeS9jYWRlbmNlL3BoeS1jYWRlbmNlLWhkcHR4LWRwLmMgfCA3NzQg KysrKysrKysrKysrKysrKysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgNzgzIGluc2VydGlvbnMo KykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcGh5L2NhZGVuY2UvcGh5LWNhZGVuY2Ut aGRwdHgtZHAuYwo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9jYWRlbmNlL0tjb25maWcg Yi9kcml2ZXJzL3BoeS9jYWRlbmNlL0tjb25maWcKPiBpbmRleCAxYWRkZTJkOTlhZTcuLjFlMTkx NGQzYWZkYyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BoeS9jYWRlbmNlL0tjb25maWcKPiArKysg Yi9kcml2ZXJzL3BoeS9jYWRlbmNlL0tjb25maWcKPiBAQCAtNDYsMyArNDYsMTEgQEAgY29uZmln IFBIWV9DQURFTkNFX1NBTFZPCj4gIAkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIENhZGVu Y2UgU0FMVk8gUEhZIGRyaXZlciwKPiAgCSAgdGhpcyBQSFkgaXMgYSBsZWdhY3kgUEhZLCBhbmQg b25seSBhcmUgdXNlZCBmb3IgVVNCMwo+ICAJICBhbmQgVVNCMi4KPiArCj4gK2NvbmZpZyBQSFlf Q0FERU5DRV9IRFBUWF9EUAoKYWxwaGFiZXRpY2FsbHkgc29ydGVkIHBsZWFzZQoKPiArCXRyaXN0 YXRlICJDYWRlbmNlIEhEUFRYIERQIFBIWSBEcml2ZXIiCj4gKwlkZXBlbmRzIG9uIE9GICYmIEhB U19JT01FTQo+ICsJZGVwZW5kcyBvbiBDT01NT05fQ0xLCj4gKwlzZWxlY3QgR0VORVJJQ19QSFkK PiArCWhlbHAKPiArCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgQ2FkZW5jZSBIRFBUWCBE UCBQSFkgZHJpdmVyCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L2NhZGVuY2UvTWFrZWZpbGUg Yi9kcml2ZXJzL3BoeS9jYWRlbmNlL01ha2VmaWxlCj4gaW5kZXggZTE3ZjAzNWRkZWNlLi5mYmRi MGJjNWZmMTEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9waHkvY2FkZW5jZS9NYWtlZmlsZQo+ICsr KyBiL2RyaXZlcnMvcGh5L2NhZGVuY2UvTWFrZWZpbGUKPiBAQCAtNCwzICs0LDQgQEAgb2JqLSQo Q09ORklHX1BIWV9DQURFTkNFX0RQSFkpCSs9IGNkbnMtZHBoeS5vCj4gIG9iai0kKENPTkZJR19Q SFlfQ0FERU5DRV9EUEhZX1JYKQkrPSBjZG5zLWRwaHktcngubwo+ICBvYmotJChDT05GSUdfUEhZ X0NBREVOQ0VfU0lFUlJBKQkrPSBwaHktY2FkZW5jZS1zaWVycmEubwo+ICBvYmotJChDT05GSUdf UEhZX0NBREVOQ0VfU0FMVk8pCSs9IHBoeS1jYWRlbmNlLXNhbHZvLm8KPiArb2JqLSQoQ09ORklH X1BIWV9DQURFTkNFX0hEUFRYX0RQKQkrPSBwaHktY2FkZW5jZS1oZHB0eC1kcC5vCgpoZXJlIHRv bwoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvY2FkZW5jZS9waHktY2FkZW5jZS1oZHB0eC1k cC5jIGIvZHJpdmVycy9waHkvY2FkZW5jZS9waHktY2FkZW5jZS1oZHB0eC1kcC5jCj4gbmV3IGZp bGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjA3OWQ0Mzc3MmQxZAo+IC0tLSAv ZGV2L251bGwKPiArKysgYi9kcml2ZXJzL3BoeS9jYWRlbmNlL3BoeS1jYWRlbmNlLWhkcHR4LWRw LmMKPiBAQCAtMCwwICsxLDc3NCBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMC1vbmx5Cj4gKy8qCj4gKyAqIENhZGVuY2UgSERQLVRYIERpc3BsYXkgUG9ydCBJbnRlcmZh Y2UgKERQKSBQSFkgZHJpdmVyCj4gKyAqCj4gKyAqIENvcHlyaWdodCAoQykgMjAyMiBOWFAgU2Vt aWNvbmR1Y3RvciwgSW5jLgo+ICsgKi8KPiArI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KPiAr I2luY2x1ZGUgPGxpbnV4L2Nsay5oPgo+ICsjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Cj4gKyNp bmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZp Y2UuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lvLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pb3BvbGwu aD4KPiArCj4gKyNpbmNsdWRlIDxkcm0vYnJpZGdlL2NkbnMtbWhkcC1tYWlsYm94Lmg+Cj4gKwo+ ICsjZGVmaW5lIEFERFJfUEhZX0FGRQkweDgwMDAwCj4gKwo+ICsvKiBQSFkgcmVnaXN0ZXJzICov Cj4gKyNkZWZpbmUgQ01OX1NTTV9CSUFTX1RNUiAgICAgICAgICAgICAgICAweDAwMjIKPiArI2Rl ZmluZSBDTU5fUExMU00wX1BMTEVOX1RNUiAgICAgICAgICAgIDB4MDAyOQo+ICsjZGVmaW5lIENN Tl9QTExTTTBfUExMUFJFX1RNUiAgICAgICAgICAgMHgwMDJBCj4gKyNkZWZpbmUgQ01OX1BMTFNN MF9QTExWUkVGX1RNUiAgICAgICAgICAweDAwMkIKPiArI2RlZmluZSBDTU5fUExMU00wX1BMTExP Q0tfVE1SICAgICAgICAgIDB4MDAyQwo+ICsjZGVmaW5lIENNTl9QTExTTTBfVVNFUl9ERUZfQ1RS TCAgICAgICAgMHgwMDJGCj4gKyNkZWZpbmUgQ01OX1BTTV9DTEtfQ1RSTCAgICAgICAgICAgICAg ICAweDAwNjEKPiArI2RlZmluZSBDTU5fQ0RJQUdfUkVGQ0xLX0NUUkwgICAgICAgICAgIDB4MDA2 Mgo+ICsjZGVmaW5lIENNTl9QTEwwX1ZDT0NBTF9TVEFSVCAgICAgICAgICAgMHgwMDgxCj4gKyNk ZWZpbmUgQ01OX1BMTDBfVkNPQ0FMX0lOSVRfVE1SICAgICAgICAweDAwODQKPiArI2RlZmluZSBD TU5fUExMMF9WQ09DQUxfSVRFUl9UTVIgICAgICAgIDB4MDA4NQo+ICsjZGVmaW5lIENNTl9QTEww X0lOVERJViAgICAgICAgICAgICAgICAgMHgwMDk0Cj4gKyNkZWZpbmUgQ01OX1BMTDBfRlJBQ0RJ ViAgICAgICAgICAgICAgICAweDAwOTUKPiArI2RlZmluZSBDTU5fUExMMF9ISUdIX1RIUiAgICAg ICAgICAgICAgIDB4MDA5Ngo+ICsjZGVmaW5lIENNTl9QTEwwX0RTTV9ESUFHICAgICAgICAgICAg ICAgMHgwMDk3Cj4gKyNkZWZpbmUgQ01OX1BMTDBfU1NfQ1RSTDEgICAgICAgICAgICAgICAweDAw OTgKPiArI2RlZmluZSBDTU5fUExMMF9TU19DVFJMMiAgICAgICAgICAgICAgIDB4MDA5OQo+ICsj ZGVmaW5lIENNTl9JQ0FMX0lOSVRfVE1SICAgICAgICAgICAgICAgMHgwMEM0Cj4gKyNkZWZpbmUg Q01OX0lDQUxfSVRFUl9UTVIgICAgICAgICAgICAgICAweDAwQzUKPiArI2RlZmluZSBDTU5fUlhD QUxfSU5JVF9UTVIgICAgICAgICAgICAgIDB4MDBENAo+ICsjZGVmaW5lIENNTl9SWENBTF9JVEVS X1RNUiAgICAgICAgICAgICAgMHgwMEQ1Cj4gKyNkZWZpbmUgQ01OX1RYUFVDQUxfQ1RSTCAgICAg ICAgICAgICAgICAweDAwRTAKPiArI2RlZmluZSBDTU5fVFhQVUNBTF9JTklUX1RNUiAgICAgICAg ICAgIDB4MDBFNAo+ICsjZGVmaW5lIENNTl9UWFBVQ0FMX0lURVJfVE1SICAgICAgICAgICAgMHgw MEU1Cj4gKyNkZWZpbmUgQ01OX1RYUERDQUxfQ1RSTCAgICAgICAgICAgICAgICAweDAwRjAKPiAr I2RlZmluZSBDTU5fVFhQRENBTF9JTklUX1RNUiAgICAgICAgICAgIDB4MDBGNAo+ICsjZGVmaW5l IENNTl9UWFBEQ0FMX0lURVJfVE1SICAgICAgICAgICAgMHgwMEY1Cj4gKyNkZWZpbmUgQ01OX0lD QUxfQURKX0lOSVRfVE1SICAgICAgICAgICAweDAxMDIKPiArI2RlZmluZSBDTU5fSUNBTF9BREpf SVRFUl9UTVIgICAgICAgICAgIDB4MDEwMwo+ICsjZGVmaW5lIENNTl9SWF9BREpfSU5JVF9UTVIg ICAgICAgICAgICAgMHgwMTA2Cj4gKyNkZWZpbmUgQ01OX1JYX0FESl9JVEVSX1RNUiAgICAgICAg ICAgICAweDAxMDcKPiArI2RlZmluZSBDTU5fVFhQVV9BREpfQ1RSTCAgICAgICAgICAgICAgIDB4 MDEwOAo+ICsjZGVmaW5lIENNTl9UWFBVX0FESl9JTklUX1RNUiAgICAgICAgICAgMHgwMTBBCj4g KyNkZWZpbmUgQ01OX1RYUFVfQURKX0lURVJfVE1SICAgICAgICAgICAweDAxMEIKPiArI2RlZmlu ZSBDTU5fVFhQRF9BREpfQ1RSTCAgICAgICAgICAgICAgIDB4MDEwYwo+ICsjZGVmaW5lIENNTl9U WFBEX0FESl9JTklUX1RNUiAgICAgICAgICAgMHgwMTBFCj4gKyNkZWZpbmUgQ01OX1RYUERfQURK X0lURVJfVE1SICAgICAgICAgICAweDAxMEYKPiArI2RlZmluZSBDTU5fRElBR19QTEwwX0ZCSF9P VlJEICAgICAgICAgIDB4MDFDMAo+ICsjZGVmaW5lIENNTl9ESUFHX1BMTDBfRkJMX09WUkQgICAg ICAgICAgMHgwMUMxCj4gKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9PVlJEICAgICAgICAgICAgICAw eDAxQzIKPiArI2RlZmluZSBDTU5fRElBR19QTEwwX1RFU1RfTU9ERSAgICAgICAgIDB4MDFDNAo+ ICsjZGVmaW5lIENNTl9ESUFHX1BMTDBfVjJJX1RVTkUgICAgICAgICAgMHgwMUM1Cj4gKyNkZWZp bmUgQ01OX0RJQUdfUExMMF9DUF9UVU5FICAgICAgICAgICAweDAxQzYKPiArI2RlZmluZSBDTU5f RElBR19QTEwwX0xGX1BST0cgICAgICAgICAgIDB4MDFDNwo+ICsjZGVmaW5lIENNTl9ESUFHX1BM TDBfUFRBVElTX1RVTkUxICAgICAgMHgwMUM4Cj4gKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9QVEFU SVNfVFVORTIgICAgICAweDAxQzkKPiArI2RlZmluZSBDTU5fRElBR19QTEwwX0lOQ0xLX0NUUkwg ICAgICAgIDB4MDFDQQo+ICsjZGVmaW5lIENNTl9ESUFHX1BMTDBfUFhMX0RJVkggICAgICAgICAg MHgwMUNCCj4gKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9QWExfRElWTCAgICAgICAgICAweDAxQ0MK PiArI2RlZmluZSBDTU5fRElBR19IU0NMS19TRUwgICAgICAgICAgICAgIDB4MDFFMAo+ICsjZGVm aW5lIENNTl9ESUFHX1BFUl9DQUxfQURKICAgICAgICAgICAgMHgwMUVDCj4gKyNkZWZpbmUgQ01O X0RJQUdfQ0FMX0NUUkwgICAgICAgICAgICAgICAweDAxRUQKPiArI2RlZmluZSBDTU5fRElBR19B Q1lBICAgICAgICAgICAgICAgICAgIDB4MDFGRgo+ICsjZGVmaW5lIFhDVlJfUFNNX1JDVFJMICAg ICAgICAgICAgICAgICAgMHg0MDAxCj4gKyNkZWZpbmUgWENWUl9QU01fQ0FMX1RNUiAgICAgICAg ICAgICAgICAweDQwMDIKPiArI2RlZmluZSBYQ1ZSX1BTTV9BMElOX1RNUiAgICAgICAgICAgICAg IDB4NDAwMwo+ICsjZGVmaW5lIFRYX1RYQ0NfQ0FMX1NDTFJfTVVMVF8wICAgICAgICAgMHg0MDQ3 Cj4gKyNkZWZpbmUgVFhfVFhDQ19DUE9TVF9NVUxUXzAwXzAgICAgICAgICAweDQwNEMKPiArI2Rl ZmluZSBUWF9UWENDX01HTkZTX01VTFRfMDAwXzAgICAgICAgIDB4NDA1MAo+ICsjZGVmaW5lIFhD VlJfRElBR19QTExEUkNfQ1RSTCAgICAgICAgICAgMHg0MEUwCj4gKyNkZWZpbmUgWENWUl9ESUFH X1BMTERSQ19DVFJMICAgICAgICAgICAweDQwRTAKPiArI2RlZmluZSBYQ1ZSX0RJQUdfSFNDTEtf U0VMICAgICAgICAgICAgIDB4NDBFMQo+ICsjZGVmaW5lIFhDVlJfRElBR19CSURJX0NUUkwgICAg ICAgICAgICAgMHg0MEU4Cj4gKyNkZWZpbmUgWENWUl9ESUFHX0xBTkVfRkNNX0VOX01HTl9UTVIg ICAweDQwRjIKPiArI2RlZmluZSBYQ1ZSX0RJQUdfTEFORV9GQ01fRU5fTUdOICAgICAgIDB4NDBG Mgo+ICsjZGVmaW5lIFRYX1BTQ19BMCAgICAgICAgICAgICAgICAgICAgICAgMHg0MTAwCj4gKyNk ZWZpbmUgVFhfUFNDX0ExICAgICAgICAgICAgICAgICAgICAgICAweDQxMDEKPiArI2RlZmluZSBU WF9QU0NfQTIgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwMgo+ICsjZGVmaW5lIFRYX1BTQ19B MyAgICAgICAgICAgICAgICAgICAgICAgMHg0MTAzCj4gKyNkZWZpbmUgVFhfUkNWREVUX0NUUkwg ICAgICAgICAgICAgICAgICAweDQxMjAKPiArI2RlZmluZSBUWF9SQ1ZERVRfRU5fVE1SICAgICAg ICAgICAgICAgIDB4NDEyMgo+ICsjZGVmaW5lIFRYX1JDVkRFVF9FTl9UTVIgICAgICAgICAgICAg ICAgMHg0MTIyCj4gKyNkZWZpbmUgVFhfUkNWREVUX1NUX1RNUiAgICAgICAgICAgICAgICAweDQx MjMKPiArI2RlZmluZSBUWF9SQ1ZERVRfU1RfVE1SICAgICAgICAgICAgICAgIDB4NDEyMwo+ICsj ZGVmaW5lIFRYX0JJU1RfQ1RSTCAgICAgICAgICAgICAgICAgICAgMHg0MTQwCj4gKyNkZWZpbmUg VFhfQklTVF9VRERXUiAgICAgICAgICAgICAgICAgICAweDQxNDEKPiArI2RlZmluZSBUWF9ESUFH X1RYX0NUUkwgICAgICAgICAgICAgICAgIDB4NDFFMAo+ICsjZGVmaW5lIFRYX0RJQUdfVFhfRFJW ICAgICAgICAgICAgICAgICAgMHg0MUUxCj4gKyNkZWZpbmUgVFhfRElBR19CR1JFRl9QUkVEUlZf REVMQVkgICAgICAweDQxRTcKPiArI2RlZmluZSBUWF9ESUFHX0JHUkVGX1BSRURSVl9ERUxBWSAg ICAgIDB4NDFFNwo+ICsjZGVmaW5lIFhDVlJfUFNNX1JDVFJMXzEgICAgICAgICAgICAgICAgMHg0 MjAxCj4gKyNkZWZpbmUgVFhfVFhDQ19DQUxfU0NMUl9NVUxUXzEgICAgICAgICAweDQyNDcKPiAr I2RlZmluZSBUWF9UWENDX0NQT1NUX01VTFRfMDBfMSAgICAgICAgIDB4NDI0Qwo+ICsjZGVmaW5l IFRYX1RYQ0NfTUdORlNfTVVMVF8wMDBfMSAgICAgICAgMHg0MjUwCj4gKyNkZWZpbmUgWENWUl9E SUFHX1BMTERSQ19DVFJMXzEgICAgICAgICAweDQyRTAKPiArI2RlZmluZSBYQ1ZSX0RJQUdfSFND TEtfU0VMXzEgICAgICAgICAgIDB4NDJFMQo+ICsjZGVmaW5lIFhDVlJfRElBR19MQU5FX0ZDTV9F Tl9NR05fVE1SXzEgMHg0MkYyCj4gKyNkZWZpbmUgVFhfUkNWREVUX0VOX1RNUl8xICAgICAgICAg ICAgICAweDQzMjIKPiArI2RlZmluZSBUWF9SQ1ZERVRfU1RfVE1SXzEgICAgICAgICAgICAgIDB4 NDMyMwo+ICsjZGVmaW5lIFRYX0RJQUdfQUNZQV8wICAgICAgICAgICAgICAgICAgMHg0MUZGCj4g KyNkZWZpbmUgVFhfRElBR19BQ1lBXzEgICAgICAgICAgICAgICAgICAweDQzRkYKPiArI2RlZmlu ZSBUWF9ESUFHX0FDWUFfMiAgICAgICAgICAgICAgICAgIDB4NDVGRgo+ICsjZGVmaW5lIFRYX0RJ QUdfQUNZQV8zICAgICAgICAgICAgICAgICAgMHg0N0ZGCj4gKyNkZWZpbmUgVFhfQU5BX0NUUkxf UkVHXzEgICAgICAgICAgICAgICAweDUwMjAKPiArI2RlZmluZSBUWF9BTkFfQ1RSTF9SRUdfMiAg ICAgICAgICAgICAgIDB4NTAyMQo+ICsjZGVmaW5lIFRYREFfQ09FRkZfQ0FMQyAgICAgICAgICAg ICAgICAgMHg1MDIyCj4gKyNkZWZpbmUgVFhfRElHX0NUUkxfUkVHXzEgICAgICAgICAgICAgICAw eDUwMjMKPiArI2RlZmluZSBUWF9ESUdfQ1RSTF9SRUdfMiAgICAgICAgICAgICAgIDB4NTAyNAo+ ICsjZGVmaW5lIFRYREFfQ1lBX0FVWERBX0NZQSAgICAgICAgICAgICAgMHg1MDI1Cj4gKyNkZWZp bmUgVFhfQU5BX0NUUkxfUkVHXzMgICAgICAgICAgICAgICAweDUwMjYKPiArI2RlZmluZSBUWF9B TkFfQ1RSTF9SRUdfNCAgICAgICAgICAgICAgIDB4NTAyNwo+ICsjZGVmaW5lIFRYX0FOQV9DVFJM X1JFR181ICAgICAgICAgICAgICAgMHg1MDI5Cj4gKyNkZWZpbmUgUlhfUFNDX0EwICAgICAgICAg ICAgICAgICAgICAgICAweDgwMDAKPiArI2RlZmluZSBSWF9QU0NfQ0FMICAgICAgICAgICAgICAg ICAgICAgIDB4ODAwNgo+ICsjZGVmaW5lIFBNQV9MQU5FX0NGRyAgICAgICAgICAgICAgICAgICAg MHhDMDAwCj4gKyNkZWZpbmUgUElQRV9DTU5fQ1RSTDEgICAgICAgICAgICAgICAgICAweEMwMDEK PiArI2RlZmluZSBQSVBFX0NNTl9DVFJMMiAgICAgICAgICAgICAgICAgIDB4QzAwMgo+ICsjZGVm aW5lIFBJUEVfQ09NX0xPQ0tfQ0ZHMSAgICAgICAgICAgICAgMHhDMDAzCj4gKyNkZWZpbmUgUElQ RV9DT01fTE9DS19DRkcyICAgICAgICAgICAgICAweEMwMDQKPiArI2RlZmluZSBQSVBFX1JDVl9E RVRfSU5IICAgICAgICAgICAgICAgIDB4QzAwNQo+ICsjZGVmaW5lIFBIWV9IRFBfTU9ERV9DVFJM ICAgICAgICAgICAgICAgMHhDMDA4Cj4gKyNkZWZpbmUgUEhZX0hEUF9DTEtfQ1RMICAgICAgICAg ICAgICAgICAweEMwMDkKPiArI2RlZmluZSBTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDB4QzAwRgo+ICsjZGVmaW5lIFBIWV9JU09fQ01OX0NUUkwgICAgICAgICAgICAgICAgMHhDMDEw Cj4gKyNkZWZpbmUgUEhZX0lTT19DTU5fQ1RSTCAgICAgICAgICAgICAgICAweEMwMTAKPiArI2Rl ZmluZSBQSFlfSERQX1RYX0NUTF9MMCAgICAgICAgICAgICAgIDB4QzQwOAo+ICsjZGVmaW5lIFBI WV9EUF9UWF9DVEwgICAgICAgICAgICAgICAgICAgMHhDNDA4Cj4gKyNkZWZpbmUgUEhZX0hEUF9U WF9DVExfTDEgICAgICAgICAgICAgICAweEM0NDgKPiArI2RlZmluZSBQSFlfSERQX1RYX0NUTF9M MiAgICAgICAgICAgICAgIDB4QzQ4OAo+ICsjZGVmaW5lIFBIWV9IRFBfVFhfQ1RMX0wzICAgICAg ICAgICAgICAgMHhDNEM4Cj4gKyNkZWZpbmUgUEhZX1BNQV9DTU5fQ1RSTDEgICAgICAgICAgICAg ICAweEM4MDAKPiArI2RlZmluZSBQTUFfQ01OX0NUUkwxICAgICAgICAgICAgICAgICAgIDB4Qzgw MAo+ICsjZGVmaW5lIFBIWV9QTUFfSVNPX0NNTl9DVFJMICAgICAgICAgICAgMHhDODEwCj4gKyNk ZWZpbmUgUEhZX1BNQV9JU09fUExMX0NUUkwxICAgICAgICAgICAweEM4MTIKPiArI2RlZmluZSBQ SFlfUE1BX0lTT0xBVElPTl9DVFJMICAgICAgICAgIDB4QzgxRgo+ICsjZGVmaW5lIFBIWV9JU09M QVRJT05fQ1RSTCAgICAgICAgICAgICAgMHhDODFGCj4gKyNkZWZpbmUgUEhZX1BNQV9JU09fWENW Ul9DVFJMICAgICAgICAgICAweENDMTEKPiArI2RlZmluZSBQSFlfUE1BX0lTT19MSU5LX01PREUg ICAgICAgICAgIDB4Q0MxMgo+ICsjZGVmaW5lIFBIWV9QTUFfSVNPX1BXUlNUX0NUUkwgICAgICAg ICAgMHhDQzEzCj4gKyNkZWZpbmUgUEhZX1BNQV9JU09fVFhfREFUQV9MTyAgICAgICAgICAweEND MTQKPiArI2RlZmluZSBQSFlfUE1BX0lTT19UWF9EQVRBX0hJICAgICAgICAgIDB4Q0MxNQo+ICsj ZGVmaW5lIFBIWV9QTUFfSVNPX1JYX0RBVEFfTE8gICAgICAgICAgMHhDQzE2Cj4gKyNkZWZpbmUg UEhZX1BNQV9JU09fUlhfREFUQV9ISSAgICAgICAgICAweENDMTcKCmRvIHlvdSB1c2UgYWxsIHRo ZXNlPwoKPiArCj4gKyNkZWZpbmUgTUFYX05VTV9MQU5FUwkJNAo+ICsjZGVmaW5lIERFRkFVTFRf TUFYX0JJVF9SQVRFCTU0MDAgLyogaW4gTWJwcyAqLwo+ICsKPiArI2RlZmluZSBSRUZfQ0xLXzI3 TUhaCQkyNzAwMDAwMAo+ICsKPiArZW51bSBkcF9saW5rX3JhdGUgewo+ICsJUkFURV8xXzYgPSAx NjIwMDAsCj4gKwlSQVRFXzJfMSA9IDIxNjAwMCwKPiArCVJBVEVfMl80ID0gMjQzMDAwLAo+ICsJ UkFURV8yXzcgPSAyNzAwMDAsCj4gKwlSQVRFXzNfMiA9IDMyNDAwMCwKPiArCVJBVEVfNF8zID0g NDMyMDAwLAo+ICsJUkFURV81XzQgPSA1NDAwMDAsCj4gKwlSQVRFXzhfMSA9IDgxMDAwMCwKPiAr fTsKPiArCj4gK3N0cnVjdCBwaHlfcGxsX3JlZyB7Cj4gKwl1MTYgdmFsWzddOwo+ICsJdTMyIGFk ZHI7Cj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9wbGxfcmVnIHBoeV9wbGxf MjdtX2NmZ1tdID0gewo+ICsJLyogIDEuNjIgICAgMi4xNiAgICAyLjQzICAgIDIuNyAgICAgMy4y NCAgICA0LjMyICAgIDUuNCAgICAgIHJlZ2lzdGVyIGFkZHJlc3MgKi8KPiArCXt7IDB4MDEwRSwg MHgwMTBFLCAweDAxMEUsIDB4MDEwRSwgMHgwMTBFLCAweDAxMEUsIDB4MDEwRSB9LCBDTU5fUExM MF9WQ09DQUxfSU5JVF9UTVIgfSwKPiArCXt7IDB4MDAxQiwgMHgwMDFCLCAweDAwMUIsIDB4MDAx QiwgMHgwMDFCLCAweDAwMUIsIDB4MDAxQiB9LCBDTU5fUExMMF9WQ09DQUxfSVRFUl9UTVIgfSwK PiArCXt7IDB4MzBCOSwgMHgzMDg3LCAweDMwOTYsIDB4MzBCNCwgMHgzMEI5LCAweDMwODcsIDB4 MzBCNCB9LCBDTU5fUExMMF9WQ09DQUxfU1RBUlQgfSwKPiArCXt7IDB4MDA3NywgMHgwMDlGLCAw eDAwQjMsIDB4MDBDNywgMHgwMDc3LCAweDAwOUYsIDB4MDBDNyB9LCBDTU5fUExMMF9JTlRESVYg fSwKPiArCXt7IDB4RjlEQSwgMHhGN0NELCAweEY2QzcsIDB4RjVDMSwgMHhGOURBLCAweEY3Q0Qs IDB4RjVDMSB9LCBDTU5fUExMMF9GUkFDRElWIH0sCj4gKwl7eyAweDAwMUUsIDB4MDAyOCwgMHgw MDJELCAweDAwMzIsIDB4MDAxRSwgMHgwMDI4LCAweDAwMzIgfSwgQ01OX1BMTDBfSElHSF9USFIg fSwKPiArCXt7IDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAs IDB4MDAyMCB9LCBDTU5fUExMMF9EU01fRElBRyB9LAo+ICsJe3sgMHgwMDAwLCAweDEwMDAsIDB4 MTAwMCwgMHgxMDAwLCAweDAwMDAsIDB4MTAwMCwgMHgxMDAwIH0sIENNTl9QTExTTTBfVVNFUl9E RUZfQ1RSTCB9LAo+ICsJe3sgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAs IDB4MDAwMCwgMHgwMDAwIH0sIENNTl9ESUFHX1BMTDBfT1ZSRCB9LAo+ICsJe3sgMHgwMDAwLCAw eDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIENNTl9ESUFH X1BMTDBfRkJIX09WUkQgfSwKPiArCXt7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwg MHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCBDTU5fRElBR19QTEwwX0ZCTF9PVlJEIH0sCj4gKwl7 eyAweDAwMDYsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNiwgMHgwMDA3LCAweDAwMDcg fSwgQ01OX0RJQUdfUExMMF9WMklfVFVORSB9LAo+ICsJe3sgMHgwMDQzLCAweDAwNDMsIDB4MDA0 MywgMHgwMDQyLCAweDAwNDMsIDB4MDA0MywgMHgwMDQyIH0sIENNTl9ESUFHX1BMTDBfQ1BfVFVO RSB9LAo+ICsJe3sgMHgwMDA4LCAweDAwMDgsIDB4MDAwOCwgMHgwMDA4LCAweDAwMDgsIDB4MDAw OCwgMHgwMDA4IH0sIENNTl9ESUFHX1BMTDBfTEZfUFJPRyB9LAo+ICsJe3sgMHgwMTAwLCAweDAw MDEsIDB4MDAwMSwgMHgwMDAxLCAweDAxMDAsIDB4MDAwMSwgMHgwMDAxIH0sIENNTl9ESUFHX1BM TDBfUFRBVElTX1RVTkUxIH0sCj4gKwl7eyAweDAwMDcsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEs IDB4MDAwNywgMHgwMDAxLCAweDAwMDEgfSwgQ01OX0RJQUdfUExMMF9QVEFUSVNfVFVORTIgfSwK PiArCXt7IDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4 MDAyMCB9LCBDTU5fRElBR19QTEwwX1RFU1RfTU9ERX0sCj4gKwl7eyAweDAwMTYsIDB4MDAxNiwg MHgwMDE2LCAweDAwMTYsIDB4MDAxNiwgMHgwMDE2LCAweDAwMTYgfSwgQ01OX1BTTV9DTEtfQ1RS TCB9Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgewo+ICsJdm9pZCBfX2lv bWVtICpyZWdzOwkvKiBEUFRYIHJlZ2lzdGVycyBiYXNlICovCj4gKwlzdHJ1Y3QgZGV2aWNlICpk ZXY7Cj4gKwlzdHJ1Y3QgcGh5ICpwaHk7Cj4gKwlzdHJ1Y3QgbXV0ZXggbWJveF9tdXRleDsgLyog bXV0ZXggdG8gcHJvdGVjdCBtYWlsYm94ICovCj4gKwlzdHJ1Y3QgY2xrICpyZWZfY2xrOwo+ICsJ dTMyIHJlZl9jbGtfcmF0ZTsKPiArCXUzMiBudW1fbGFuZXM7Cj4gKwl1MzIgbWF4X2JpdF9yYXRl OyAvKiBNYXhpbXVtIGxpbmsgYml0IHJhdGUgdG8gdXNlIChpbiBNYnBzKSAqLwo+ICsJdTMyIGxp bmtfcmF0ZTsKPiArCWJvb2wgcG93ZXJfdXA7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IGNkbnNf cGh5X3JlZ193cml0ZShzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5LCB1MzIgYWRk ciwgdTMyIHZhbCkKPiArewo+ICsJcmV0dXJuIGNkbnNfbWhkcF9yZWdfd3JpdGUoY2Ruc19waHks IEFERFJfUEhZX0FGRSArIChhZGRyIDw8IDIpLCB2YWwpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdTMy IGNkbnNfcGh5X3JlZ19yZWFkKHN0cnVjdCBjZG5zX2hkcHR4X2RwX3BoeSAqY2Ruc19waHksIHUz MiBhZGRyKQo+ICt7Cj4gKwl1MzIgcmVnMzI7Cj4gKwo+ICsJY2Ruc19taGRwX3JlZ19yZWFkKGNk bnNfcGh5LCBBRERSX1BIWV9BRkUgKyAoYWRkciA8PCAyKSwgJnJlZzMyKTsKPiArCXJldHVybiBy ZWczMjsKPiArfQo+ICsKPiArc3RhdGljIGludCBsaW5rX3JhdGVfaW5kZXgodTMyIHJhdGUpCj4g K3sKPiArCXN3aXRjaCAocmF0ZSkgewo+ICsJY2FzZSBSQVRFXzFfNjoKPiArCQlyZXR1cm4gMDsK PiArCWNhc2UgUkFURV8yXzE6Cj4gKwkJcmV0dXJuIDE7Cj4gKwljYXNlIFJBVEVfMl80Ogo+ICsJ CXJldHVybiAyOwo+ICsJY2FzZSBSQVRFXzJfNzoKPiArCQlyZXR1cm4gMzsKPiArCWNhc2UgUkFU RV8zXzI6Cj4gKwkJcmV0dXJuIDQ7Cj4gKwljYXNlIFJBVEVfNF8zOgo+ICsJCXJldHVybiA1Owo+ ICsJY2FzZSBSQVRFXzVfNDoKPiArCQlyZXR1cm4gNjsKPiArCWRlZmF1bHQ6Cj4gKwkJcmV0dXJu IC0xOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGhkcHR4X2RwX3JlZl9jbGsoc3RydWN0 IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSkKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2 ID0gY2Ruc19waHktPmRldjsKPiArCXUzMiByZWZfY2xrX3JhdGU7Cj4gKwlpbnQgcmV0Owo+ICsK PiArCWNkbnNfcGh5LT5yZWZfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInJlZmNsayIpOwo+ICsJ aWYgKElTX0VSUihjZG5zX3BoeS0+cmVmX2NsaykpIHsKPiArCQlkZXZfZXJyKGRldiwgInBoeSBy ZWYgY2xvY2sgbm90IGZvdW5kXG4iKTsKPiArCQlyZXR1cm4gUFRSX0VSUihjZG5zX3BoeS0+cmVm X2Nsayk7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNkbnNfcGh5LT5y ZWZfY2xrKTsKPiArCWlmIChyZXQpIHsKPiArCQlkZXZfZXJyKGNkbnNfcGh5LT5kZXYsICJGYWls ZWQgdG8gcHJlcGFyZSByZWYgY2xvY2tcbiIpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ ICsJcmVmX2Nsa19yYXRlID0gY2xrX2dldF9yYXRlKGNkbnNfcGh5LT5yZWZfY2xrKTsKPiArCWlm ICghcmVmX2Nsa19yYXRlKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiRmFpbGVkIHRv IGdldCByZWYgY2xvY2sgcmF0ZVxuIik7Cj4gKwkJZ290byBlcnJfcmVmX2NsazsKPiArCX0KPiAr Cj4gKwlpZiAocmVmX2Nsa19yYXRlID09IFJFRl9DTEtfMjdNSFopCj4gKwkJY2Ruc19waHktPnJl Zl9jbGtfcmF0ZSA9IHJlZl9jbGtfcmF0ZTsKPiArCWVsc2Ugewo+ICsJCWRldl9lcnIoY2Ruc19w aHktPmRldiwgIk5vdCBzdXBwb3J0IFJlZiBDbG9jayBSYXRlKCVkSHopXG4iLCByZWZfY2xrX3Jh dGUpOwo+ICsJCWdvdG8gZXJyX3JlZl9jbGs7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ ICtlcnJfcmVmX2NsazoKPiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShjZG5zX3BoeS0+cmVmX2Ns ayk7Cj4gKwlyZXR1cm4gLUVJTlZBTDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaGRwdHhfZHBf YXV4X2NmZyhzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5KQo+ICt7Cj4gKwkvKiBQ b3dlciB1cCBBdXggKi8KPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhEQV9DWUFf QVVYREFfQ1lBLCAxKTsKPiArCj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIFRYX0RJ R19DVFJMX1JFR18xLCAweDMpOwo+ICsJbmRlbGF5KDE1MCk7Cj4gKwljZG5zX3BoeV9yZWdfd3Jp dGUoY2Ruc19waHksIFRYX0RJR19DVFJMX1JFR18yLCAzNik7Cj4gKwluZGVsYXkoMTUwKTsKPiAr CWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzIsIDB4MDEwMCk7 Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5B X0NUUkxfUkVHXzIsIDB4MDMwMCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193 cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzMsIDB4MDAwMCk7Cj4gKwluZGVsYXkoMTUw KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzEsIDB4 MjAwOCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwg VFhfQU5BX0NUUkxfUkVHXzEsIDB4MjAxOCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5 X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzEsIDB4QTAxOCk7Cj4gKwluZGVs YXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVH XzIsIDB4MDMwQyk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5z X3BoeSwgVFhfQU5BX0NUUkxfUkVHXzUsIDB4MDAwMCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNk bnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzQsIDB4MTAwMSk7Cj4g KwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NU UkxfUkVHXzEsIDB4QTA5OCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0 ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzEsIDB4QTE5OCk7Cj4gKwluZGVsYXkoMTUwKTsK PiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfQU5BX0NUUkxfUkVHXzIsIDB4MDMw ZCk7Cj4gKwluZGVsYXkoMTUwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhf QU5BX0NUUkxfUkVHXzIsIDB4MDMwZik7Cj4gK30KPiArCj4gKy8qIFBNQSBjb21tb24gY29uZmln dXJhdGlvbiBmb3IgMjdNSHogKi8KPiArc3RhdGljIHZvaWQgaGRwdHhfZHBfcGh5X3BtYV9jbW5f Y2ZnXzI3bWh6KHN0cnVjdCBjZG5zX2hkcHR4X2RwX3BoeSAqY2Ruc19waHkpCj4gK3sKPiArCXUz MiBudW1fbGFuZXMgPSBjZG5zX3BoeS0+bnVtX2xhbmVzOwo+ICsJdTE2IHZhbDsKPiArCWludCBr Owo+ICsKPiArCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfUE1BX0NNTl9D VFJMMSk7Cj4gKwl2YWwgJj0gMHhGRkY3Owo+ICsJdmFsIHw9IDB4MDAwODsKPiArCWNkbnNfcGh5 X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX1BNQV9DTU5fQ1RSTDEsIHZhbCk7Cj4gKwo+ICsJLyog U3RhcnR1cCBzdGF0ZSBtYWNoaW5lIHJlZ2lzdGVycyAqLwo+ICsJY2Ruc19waHlfcmVnX3dyaXRl KGNkbnNfcGh5LCBDTU5fU1NNX0JJQVNfVE1SLCAweDAwODcpOwo+ICsJY2Ruc19waHlfcmVnX3dy aXRlKGNkbnNfcGh5LCBDTU5fUExMU00wX1BMTEVOX1RNUiwgMHgwMDFCKTsKPiArCWNkbnNfcGh5 X3JlZ193cml0ZShjZG5zX3BoeSwgQ01OX1BMTFNNMF9QTExQUkVfVE1SLCAweDAwMzYpOwo+ICsJ Y2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fUExMU00wX1BMTFZSRUZfVE1SLCAweDAw MUIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fUExMU00wX1BMTExPQ0tf VE1SLCAweDAwNkMpOwo+ICsKPiArCS8qIEN1cnJlbnQgY2FsaWJyYXRpb24gcmVnaXN0ZXJzICov Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9JQ0FMX0lOSVRfVE1SLCAweDAw NDQpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fSUNBTF9JVEVSX1RNUiwg MHgwMDA2KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgQ01OX0lDQUxfQURKX0lO SVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fSUNB TF9BREpfSVRFUl9UTVIsIDB4MDAwNik7Cj4gKwo+ICsJLyogUmVzaXN0b3IgY2FsaWJyYXRpb24g cmVnaXN0ZXJzICovCj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9UWFBVQ0FM X0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5f VFhQVUNBTF9JVEVSX1RNUiwgMHgwMDA2KTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3Bo eSwgQ01OX1RYUFVfQURKX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRl KGNkbnNfcGh5LCBDTU5fVFhQVV9BREpfSVRFUl9UTVIsIDB4MDAwNik7Cj4gKwljZG5zX3BoeV9y ZWdfd3JpdGUoY2Ruc19waHksIENNTl9UWFBEQ0FMX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ru c19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fVFhQRENBTF9JVEVSX1RNUiwgMHgwMDA2KTsK PiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgQ01OX1RYUERfQURKX0lOSVRfVE1SLCAw eDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fVFhQRF9BREpfSVRF Ul9UTVIsIDB4MDAwNik7Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENNTl9SWENB TF9JTklUX1RNUiwgMHgwMDIyKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgQ01O X1JYQ0FMX0lURVJfVE1SLCAweDAwMDYpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5 LCBDTU5fUlhfQURKX0lOSVRfVE1SLCAweDAwMjIpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNk bnNfcGh5LCBDTU5fUlhfQURKX0lURVJfVE1SLCAweDAwMDYpOwo+ICsKPiArCWZvciAoayA9IDA7 IGsgPCBudW1fbGFuZXM7IGsgPSBrICsgMSkgewo+ICsJCS8qIFBvd2VyIHN0YXRlIG1hY2hpbmUg cmVnaXN0ZXJzICovCj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBYQ1ZSX1BTTV9D QUxfVE1SICB8IChrIDw8IDkpLCAweDAxNkQpOwo+ICsJCWNkbnNfcGh5X3JlZ193cml0ZShjZG5z X3BoeSwgWENWUl9QU01fQTBJTl9UTVIgfCAoayA8PCA5KSwgMHgwMTZEKTsKPiArCQkvKiBUcmFu c2NlaXZlciBjb250cm9sIGFuZCBkaWFnbm9zdGljIHJlZ2lzdGVycyAqLwo+ICsJCWNkbnNfcGh5 X3JlZ193cml0ZShjZG5zX3BoeSwgWENWUl9ESUFHX0xBTkVfRkNNX0VOX01HTl9UTVIgfCAoayA8 PCA5KSwgMHgwMEEyKTsKPiArCQljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIFRYX0RJQUdf QkdSRUZfUFJFRFJWX0RFTEFZICAgIHwgKGsgPDwgOSksIDB4MDA5Nyk7Cj4gKwkJLyogVHJhbnNt aXR0ZXIgcmVjZWl2ZXIgZGV0ZWN0IHJlZ2lzdGVycyAqLwo+ICsJCWNkbnNfcGh5X3JlZ193cml0 ZShjZG5zX3BoeSwgVFhfUkNWREVUX0VOX1RNUiB8IChrIDw8IDkpLCAweDBBOEMpOwo+ICsJCWNk bnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfUkNWREVUX1NUX1RNUiB8IChrIDw8IDkpLCAw eDAwMzYpOwo+ICsJfQo+ICsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfRElB R19BQ1lBXzAsIDEpOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBUWF9ESUFHX0FD WUFfMSwgMSk7Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIFRYX0RJQUdfQUNZQV8y LCAxKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgVFhfRElBR19BQ1lBXzMsIDEp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBoZHB0eF9kcF9waHlfcG1hX2Ntbl9wbGwwXzI3bWh6 KHN0cnVjdCBjZG5zX2hkcHR4X2RwX3BoeSAqY2Ruc19waHkpCj4gK3sKPiArCXUzMiBudW1fbGFu ZXMgPSBjZG5zX3BoeS0+bnVtX2xhbmVzOwo+ICsJdTMyIGxpbmtfcmF0ZSA9IGNkbnNfcGh5LT5s aW5rX3JhdGU7Cj4gKwl1MTYgdmFsOwo+ICsJaW50IGluZGV4LCBpLCBrOwo+ICsKPiArCS8qIERQ IFBMTCBkYXRhIHJhdGUgMC8xIGNsb2NrIGRpdmlkZXIgdmFsdWUgKi8KPiArCXZhbCA9IGNkbnNf cGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJdmFsICY9IDB4MDBG RjsKPiArCWlmIChsaW5rX3JhdGUgPD0gUkFURV8yXzcpCj4gKwkJdmFsIHw9IDB4MjQwMDsKPiAr CWVsc2UKPiArCQl2YWwgfD0gMHgxMjAwOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5 LCBQSFlfSERQX0NMS19DVEwsIHZhbCk7Cj4gKwo+ICsJLyogSGlnaCBzcGVlZCBjbG9jayAwLzEg ZGl2ICovCj4gKwl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgQ01OX0RJQUdfSFND TEtfU0VMKTsKPiArCXZhbCAmPSAweEZGQ0M7Cj4gKwlpZiAobGlua19yYXRlIDw9IFJBVEVfMl83 KQo+ICsJCXZhbCB8PSAweDAwMTE7Cj4gKwljZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIENN Tl9ESUFHX0hTQ0xLX1NFTCwgdmFsKTsKPiArCj4gKwlmb3IgKGsgPSAwOyBrIDwgbnVtX2xhbmVz OyBrKyspIHsKPiArCQl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgKFhDVlJfRElB R19IU0NMS19TRUwgfCAoayA8PCA5KSkpOwo+ICsJCXZhbCA9IHZhbCAmIDB4Q0ZGRjsKPiArCQlp ZiAobGlua19yYXRlIDw9IFJBVEVfMl83KQo+ICsJCQl2YWwgfD0gMHgxMDAwOwo+ICsJCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgKFhDVlJfRElBR19IU0NMS19TRUwgfCAoayA8PCA5KSks IHZhbCk7Cj4gKwl9Cj4gKwo+ICsJLyogRFAgUEhZIFBMTCAyN01IeiBjb25maWd1cmF0aW9uICov Cj4gKwlpbmRleCA9IGxpbmtfcmF0ZV9pbmRleChsaW5rX3JhdGUpOwo+ICsJZm9yIChpID0gMDsg aSA8IEFSUkFZX1NJWkUocGh5X3BsbF8yN21fY2ZnKTsgaSsrKQo+ICsJCWNkbnNfcGh5X3JlZ193 cml0ZShjZG5zX3BoeSwgcGh5X3BsbF8yN21fY2ZnW2ldLmFkZHIsCj4gKwkJCQlwaHlfcGxsXzI3 bV9jZmdbaV0udmFsW2luZGV4XSk7Cj4gKwo+ICsJLyogVHJhbnNjZWl2ZXIgY29udHJvbCBhbmQg ZGlhZ25vc3RpYyByZWdpc3RlcnMgKi8KPiArCWZvciAoayA9IDA7IGsgPCBudW1fbGFuZXM7IGsr Kykgewo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCAoWENWUl9ESUFHX1BM TERSQ19DVFJMIHwgKGsgPDwgOSkpKTsKPiArCQl2YWwgPSB2YWwgJiAweDhGRkY7Cj4gKwkJaWYg KGxpbmtfcmF0ZSA8PSBSQVRFXzJfNykKPiArCQkJdmFsIHw9IDB4MjAwMDsKPiArCQllbHNlCj4g KwkJCXZhbCB8PSAweDEwMDA7Cj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCAoWENW Ul9ESUFHX1BMTERSQ19DVFJMIHwgKGsgPDwgOSkpLCB2YWwpOwo+ICsJfQo+ICsKPiArCWZvciAo ayA9IDA7IGsgPCBudW1fbGFuZXM7IGsgPSBrICsgMSkgewo+ICsJCS8qIFBvd2VyIHN0YXRlIG1h Y2hpbmUgcmVnaXN0ZXJzICovCj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCAoWENW Ul9QU01fUkNUUkwgfCAoayA8PCA5KSksICAweEJFRkMpOwo+ICsJCWNkbnNfcGh5X3JlZ193cml0 ZShjZG5zX3BoeSwgKFRYX1BTQ19BMCB8IChrIDw8IDkpKSwgMHg2Nzk5KTsKPiArCQljZG5zX3Bo eV9yZWdfd3JpdGUoY2Ruc19waHksIChUWF9QU0NfQTEgfCAoayA8PCA5KSksIDB4Njc5OCk7Cj4g KwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCAoVFhfUFNDX0EyIHwgKGsgPDwgOSkpLCAw eDAwOTgpOwo+ICsJCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgKFRYX1BTQ19BMyB8IChr IDw8IDkpKSwgMHgwMDk4KTsKPiArCQkvKiBSZWNlaXZlciBjYWxpYnJhdGlvbiBwb3dlciBzdGF0 ZSBkZWZpbml0aW9uIHJlZ2lzdGVyICovCj4gKwkJdmFsID0gY2Ruc19waHlfcmVnX3JlYWQoY2Ru c19waHksIFJYX1BTQ19DQUwgfCAoayA8PCA5KSk7Cj4gKwkJdmFsICY9IDB4RkZCQjsKPiArCQlj ZG5zX3BoeV9yZWdfd3JpdGUoY2Ruc19waHksIChSWF9QU0NfQ0FMIHwgKGsgPDwgOSkpLCB2YWwp Owo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBSWF9QU0NfQTAgIHwgKGsg PDwgOSkpOwo+ICsJCXZhbCAmPSAweEZGQkI7Cj4gKwkJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNf cGh5LCAoUlhfUFNDX0EwICB8IChrIDw8IDkpKSwgdmFsKTsKPiArCX0KPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgaGRwdHhfZHBfcGh5X3JlZl9jbG9ja190eXBlKHN0cnVjdCBjZG5zX2hkcHR4X2Rw X3BoeSAqY2Ruc19waHkpCj4gK3sKPiArCXUzMiB2YWw7Cj4gKwo+ICsJdmFsID0gY2Ruc19waHlf cmVnX3JlYWQoY2Ruc19waHksIFBIWV9QTUFfQ01OX0NUUkwxKTsKPiArCXZhbCAmPSAweEZGOEY7 Cj4gKwkvKgo+ICsJICogc2luZ2xlIGVuZGVkIHJlZmVyZW5jZSBjbG9jayAodmFsIHw9IDB4MDAz MCk7Cj4gKwkgKiBkaWZmZXJlbnRpYWwgY2xvY2sgICh2YWwgfD0gMHgwMDAwKTsKPiArCSAqCj4g KwkgKiBmb3IgZGlmZmVyZW50aWFsIGNsb2NrIG9uIHRoZSByZWZjbGtfcCBhbmQKPiArCSAqIHJl ZmNsa19tIG9mZiBjaGlwIHBpbnM6IENNTl9ESUFHX0FDWUFbOF09MSdiMQo+ICsJICogY2Ruc19w aHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBDTU5fRElBR19BQ1lBLCAweDAxMDApOwo+ICsJICovCj4g Kwl2YWwgfD0gMHgwMDMwOwo+ICsJY2Ruc19waHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBQSFlfUE1B X0NNTl9DVFJMMSwgdmFsKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBoZHB0eF9kcF9waHlfcG93 ZXJfdXAoc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSkKPiArewo+ICsJdTMyIHZh bCwgaTsKPiArCj4gKwkvKiBFbmFibGUgSERQIFBMTOKAmXMgZm9yIGhpZ2ggc3BlZWQgY2xvY2tz ICovCj4gKwl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RM KTsKPiArCXZhbCB8PSAoMSA8PCAwKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwg UEhZX0hEUF9DTEtfQ1RMLCB2YWwpOwo+ICsJLyogV2FpdCBmb3IgUExMIHJlYWR5IEFDSyAqLwo+ ICsJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKPiArCQl2YWwgPSBjZG5zX3BoeV9yZWdfcmVh ZChjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMKTsKPiArCQlpZiAodmFsICYgKDEgPDwgMSkpCj4g KwkJCWJyZWFrOwo+ICsJCW1zbGVlcCgyMCk7Cj4gKwl9Cj4gKwlpZiAoaSA9PSAxMCkgewo+ICsJ CWRldl9lcnIoY2Ruc19waHktPmRldiwgIldhaXQgUExMIEFjayBmYWlsZWRcbiIpOwo+ICsJCXJl dHVybiAtMTsKPiArCX0KPiArCj4gKwkvKiBFbmFibGUgSERQIFBMTOKAmXMgZGF0YSByYXRlIGFu ZCBmdWxsIHJhdGUgY2xvY2tzIG91dCBvZiBQTUEuICovCj4gKwl2YWwgPSBjZG5zX3BoeV9yZWdf cmVhZChjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMKTsKPiArCXZhbCB8PSAoMSA8PCAyKTsKPiAr CWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMLCB2YWwpOwo+ICsJ LyogV2FpdCBmb3IgUExMIGNsb2NrIGVuYWJsZSBBQ0sgKi8KPiArCWZvciAoaSA9IDA7IGkgPCAx MDsgaSsrKSB7Cj4gKwkJdmFsID0gY2Ruc19waHlfcmVnX3JlYWQoY2Ruc19waHksIFBIWV9IRFBf Q0xLX0NUTCk7Cj4gKwkJaWYgKHZhbCAmICgxIDw8IDMpKQo+ICsJCQlicmVhazsKPiArCQltc2xl ZXAoMjApOwo+ICsJfQo+ICsJaWYgKGkgPT0gMTApIHsKPiArCQlkZXZfZXJyKGNkbnNfcGh5LT5k ZXYsICJXYWl0IFBMTCBjbG9jayBlbmFibGUgQUNrIGZhaWxlZFxuIik7Cj4gKwkJcmV0dXJuIC0x Owo+ICsJfQo+ICsKPiArCS8qIENvbmZpZ3VyZSBQSFkgaW4gQTIgTW9kZSAqLwo+ICsJY2Ruc19w aHlfcmVnX3dyaXRlKGNkbnNfcGh5LCBQSFlfSERQX01PREVfQ1RSTCwgMHgwMDA0KTsKPiArCS8q IFdhaXQgZm9yIFBvd2VyIFN0YXRlIEEyIEFjayAqLwo+ICsJZm9yIChpID0gMDsgaSA8IDEwOyBp KyspIHsKPiArCQl2YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9NT0RF X0NUUkwpOwo+ICsJCWlmICh2YWwgJiAoMSA8PCA2KSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVw KDIwKTsKPiArCX0KPiArCWlmIChpID09IDEwKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2 LCAiV2FpdCBBMiBBY2sgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm4gLTE7Cj4gKwl9Cj4gKwo+ICsJ LyogQ29uZmlndXJlIFBIWSBpbiBBMCBtb2RlIChQSFkgbXVzdCBiZSBpbiB0aGUgQTAgcG93ZXIK PiArCSAqIHN0YXRlIGluIG9yZGVyIHRvIHRyYW5zbWl0IGRhdGEpCj4gKwkgKi8KPiArCWNkbnNf cGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hEUF9NT0RFX0NUUkwsIDB4MDEwMSk7Cj4gKwo+ ICsJLyogV2FpdCBmb3IgUG93ZXIgU3RhdGUgQTAgQWNrICovCj4gKwlmb3IgKGkgPSAwOyBpIDwg MTA7IGkrKykgewo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQ X01PREVfQ1RSTCk7Cj4gKwkJaWYgKHZhbCAmICgxIDw8IDQpKQo+ICsJCQlicmVhazsKPiArCQlt c2xlZXAoMjApOwo+ICsJfQo+ICsJaWYgKGkgPT0gMTApIHsKPiArCQlkZXZfZXJyKGNkbnNfcGh5 LT5kZXYsICJXYWl0IEEwIEFjayBmYWlsZWRcbiIpOwo+ICsJCXJldHVybiAtMTsKPiArCX0KPiAr Cj4gKwljZG5zX3BoeS0+cG93ZXJfdXAgPSB0cnVlOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBoZHB0eF9kcF9waHlfcG93ZXJfZG93bihzdHJ1Y3QgY2Ruc19oZHB0 eF9kcF9waHkgKmNkbnNfcGh5KQo+ICt7Cj4gKwl1MTYgdmFsOwo+ICsJaW50IGk7Cj4gKwo+ICsJ aWYgKCFjZG5zX3BoeS0+cG93ZXJfdXApCj4gKwkJcmV0dXJuOwo+ICsKPiArCS8qIFBsYWNlIHRo ZSBQSFkgbGFuZXMgaW4gdGhlIEEzIHBvd2VyIHN0YXRlLiAqLwo+ICsJY2Ruc19waHlfcmVnX3dy aXRlKGNkbnNfcGh5LCBQSFlfSERQX01PREVfQ1RSTCwgMHg4KTsKPiArCS8qIFdhaXQgZm9yIFBv d2VyIFN0YXRlIEEzIEFjayAqLwo+ICsJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKPiArCQl2 YWwgPSBjZG5zX3BoeV9yZWdfcmVhZChjZG5zX3BoeSwgUEhZX0hEUF9NT0RFX0NUUkwpOwo+ICsJ CWlmICh2YWwgJiAoMSA8PCA3KSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVwKDIwKTsKPiArCX0K PiArCWlmIChpID09IDEwKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiV2FpdCBBMyBB Y2sgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJLyogRGlzYWJsZSBIRFAg UExM4oCZcyBkYXRhIHJhdGUgYW5kIGZ1bGwgcmF0ZSBjbG9ja3Mgb3V0IG9mIFBNQS4gKi8KPiAr CXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJ dmFsICY9IH4oMSA8PCAyKTsKPiArCWNkbnNfcGh5X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hE UF9DTEtfQ1RMLCB2YWwpOwo+ICsJLyogV2FpdCBmb3IgUExMIGNsb2NrIGdhdGUgQUNLICovCj4g Kwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewo+ICsJCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFk KGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJCWlmICghKHZhbCAmICgxIDw8IDMpKSkK PiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVwKDIwKTsKPiArCX0KPiArCWlmIChpID09IDEwKSB7Cj4g KwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiV2FpdCBQTEwgY2xvY2sgZ2F0ZSBBY2sgZmFpbGVk XG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJLyogRGlzYWJsZSBIRFAgUExM4oCZcyBm b3IgaGlnaCBzcGVlZCBjbG9ja3MgKi8KPiArCXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNf cGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJdmFsICY9IH4oMSA8PCAwKTsKPiArCWNkbnNfcGh5 X3JlZ193cml0ZShjZG5zX3BoeSwgUEhZX0hEUF9DTEtfQ1RMLCB2YWwpOwo+ICsJLyogV2FpdCBm b3IgUExMIGRpc2FibGUgQUNLICovCj4gKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewo+ICsJ CXZhbCA9IGNkbnNfcGh5X3JlZ19yZWFkKGNkbnNfcGh5LCBQSFlfSERQX0NMS19DVEwpOwo+ICsJ CWlmICghKHZhbCAmICgxIDw8IDEpKSkKPiArCQkJYnJlYWs7Cj4gKwkJbXNsZWVwKDIwKTsKPiAr CX0KPiArCWlmIChpID09IDEwKSB7Cj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiV2FpdCBQ TEwgZGlzYWJsZSBBY2sgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgY2Ruc19oZHB0eF9kcF9waHlfb24oc3RydWN0IHBoeSAqcGh5KQo+ICt7Cj4g KwlzdHJ1Y3QgY2Ruc19oZHB0eF9kcF9waHkgKmNkbnNfcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBo eSk7Cj4gKwo+ICsJcmV0dXJuIGhkcHR4X2RwX3BoeV9wb3dlcl91cChjZG5zX3BoeSk7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgY2Ruc19oZHB0eF9kcF9waHlfb2ZmKHN0cnVjdCBwaHkgKnBoeSkK PiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSA9IHBoeV9nZXRfZHJ2 ZGF0YShwaHkpOwo+ICsKPiArCWhkcHR4X2RwX3BoeV9wb3dlcl9kb3duKGNkbnNfcGh5KTsKPiAr Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBjZG5zX2hkcHR4X2RwX3BoeV9p bml0KHN0cnVjdCBwaHkgKnBoeSkKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpj ZG5zX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ICsJaW50IHJldDsKPiArCj4gKwloZHB0 eF9kcF9waHlfcmVmX2Nsb2NrX3R5cGUoY2Ruc19waHkpOwo+ICsKPiArCS8qIFBIWSBwb3dlciB1 cCAqLwo+ICsJcmV0ID0gaGRwdHhfZHBfcGh5X3Bvd2VyX3VwKGNkbnNfcGh5KTsKPiArCWlmIChy ZXQgPCAwKQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJaGRwdHhfZHBfYXV4X2NmZyhjZG5zX3Bo eSk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBjZG5zX2hkcHR4 X2RwX2NvbmZpZ3VyZShzdHJ1Y3QgcGh5ICpwaHksCj4gKwkJCQkgICAgIHVuaW9uIHBoeV9jb25m aWd1cmVfb3B0cyAqb3B0cykKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5z X3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ICsJaW50IHJldDsKPiArCj4gKwljZG5zX3Bo eS0+bGlua19yYXRlID0gb3B0cy0+ZHAubGlua19yYXRlOwo+ICsKPiArCS8qIERpc2FibGUgcGh5 IGNsb2NrIGlmIFBIWSBpbiBwb3dlciB1cCBzdGF0ZSAqLwo+ICsJaGRwdHhfZHBfcGh5X3Bvd2Vy X2Rvd24oY2Ruc19waHkpOwo+ICsKPiArCWlmIChjZG5zX3BoeS0+cmVmX2Nsa19yYXRlID09IFJF Rl9DTEtfMjdNSFopIHsKPiArCQloZHB0eF9kcF9waHlfcG1hX2Ntbl9jZmdfMjdtaHooY2Ruc19w aHkpOwo+ICsJCWhkcHR4X2RwX3BoeV9wbWFfY21uX3BsbDBfMjdtaHooY2Ruc19waHkpOwo+ICsJ fSBlbHNlCj4gKwkJZGV2X2VycihjZG5zX3BoeS0+ZGV2LCAiTm90IHN1cHBvcnQgcmVmIGNsb2Nr IHJhdGVcbiIpOwo+ICsKPiArCS8qIFBIWSBwb3dlciB1cCAqLwo+ICsJcmV0ID0gaGRwdHhfZHBf cGh5X3Bvd2VyX3VwKGNkbnNfcGh5KTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtz dGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgY2Ruc19oZHB0eF9kcF9waHlfb3BzID0gewo+ICsJ LmluaXQJCT0gY2Ruc19oZHB0eF9kcF9waHlfaW5pdCwKPiArCS5jb25maWd1cmUJPSBjZG5zX2hk cHR4X2RwX2NvbmZpZ3VyZSwKPiArCS5wb3dlcl9vbgk9IGNkbnNfaGRwdHhfZHBfcGh5X29uLAo+ ICsJLnBvd2VyX29mZgk9IGNkbnNfaGRwdHhfZHBfcGh5X29mZiwKPiArCS5vd25lcgkJPSBUSElT X01PRFVMRSwKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgY2Ruc19oZHB0eF9kcF9waHlfcHJvYmUo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IGNkbnNfaGRwdHhf ZHBfcGh5ICpjZG5zX3BoeTsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Cj4g KwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBkZXYtPm9mX25vZGU7Cj4gKwlzdHJ1Y3QgcGh5 X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7Cj4gKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKPiArCXN0 cnVjdCBwaHkgKnBoeTsKPiArCWludCByZXQ7Cj4gKwo+ICsJY2Ruc19waHkgPSBkZXZtX2t6YWxs b2MoZGV2LCBzaXplb2YoKmNkbnNfcGh5KSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWNkbnNfcGh5 KQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiArCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGNkbnNf cGh5KTsKPiArCWNkbnNfcGh5LT5kZXYgPSBkZXY7Cj4gKwltdXRleF9pbml0KCZjZG5zX3BoeS0+ bWJveF9tdXRleCk7Cj4gKwo+ICsJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElP UkVTT1VSQ0VfTUVNLCAwKTsKPiArCWlmICghcmVzKQo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJ Y2Ruc19waHktPnJlZ3MgPSBkZXZtX2lvcmVtYXAoZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9z aXplKHJlcykpOwo+ICsJaWYgKElTX0VSUihjZG5zX3BoeS0+cmVncykpCj4gKwkJcmV0dXJuIFBU Ul9FUlIoY2Ruc19waHktPnJlZ3MpOwo+ICsKPiArCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihu b2RlLCAiY2RucyxudW0tbGFuZXMiLAo+ICsJCQkJICZjZG5zX3BoeS0+bnVtX2xhbmVzKSkgewo+ ICsJCWRldl9lcnIoZGV2LCAiJXM6IE5vIFwiY2RucyxudW0tbGFuZXNcIi1wcm9wZXJ0eS5cbiIs Cj4gKwkJCW5vZGUtPmZ1bGxfbmFtZSk7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ ICsJcGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgbm9kZSwgJmNkbnNfaGRwdHhfZHBfcGh5X29w cyk7Cj4gKwlpZiAoSVNfRVJSKHBoeSkpCj4gKwkJcmV0dXJuIFBUUl9FUlIocGh5KTsKPiArCj4g KwljZG5zX3BoeS0+bWF4X2JpdF9yYXRlID0gREVGQVVMVF9NQVhfQklUX1JBVEU7Cj4gKwlvZl9w cm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY2RucyxtYXgtYml0LXJhdGUiLAo+ICsJCQkgICAgICZj ZG5zX3BoeS0+bWF4X2JpdF9yYXRlKTsKPiArCj4gKwlzd2l0Y2ggKGNkbnNfcGh5LT5tYXhfYml0 X3JhdGUpIHsKPiArCS8qIHZhbGlkIGJpdCByYXRlICovCj4gKwljYXNlIDE2MjA6Cj4gKwljYXNl IDIxNjA6Cj4gKwljYXNlIDI0MzA6Cj4gKwljYXNlIDI3MDA6Cj4gKwljYXNlIDMyNDA6Cj4gKwlj YXNlIDQzMjA6Cj4gKwljYXNlIDU0MDA6Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIDgxMDA6Cj4gKwlk ZWZhdWx0Ogo+ICsJCWRldl9lcnIoZGV2LCAidW5zdXBwb3J0ZWQgbWF4IGJpdCByYXRlOiAlZE1i cHNcbiIsCj4gKwkJCQljZG5zX3BoeS0+bWF4X2JpdF9yYXRlKTsKPiArCQlyZXR1cm4gLUVJTlZB TDsKPiArCX0KPiArCj4gKwlkZXZfZGJnKGRldiwgIkRQIG1heCBiaXQgcmF0ZSAlZC4lMDNkIEdi cHNcbiIsCj4gKwkJY2Ruc19waHktPm1heF9iaXRfcmF0ZSAvIDEwMDAsCj4gKwkJY2Ruc19waHkt Pm1heF9iaXRfcmF0ZSAlIDEwMDApOwo+ICsKPiArCXBoeS0+YXR0cnMuYnVzX3dpZHRoID0gY2Ru c19waHktPm51bV9sYW5lczsKPiArCXBoeS0+YXR0cnMubWF4X2xpbmtfcmF0ZSA9IGNkbnNfcGh5 LT5tYXhfYml0X3JhdGU7Cj4gKwlwaHktPmF0dHJzLm1vZGUgPSBQSFlfTU9ERV9EUDsKPiArCj4g KwljZG5zX3BoeS0+cGh5ID0gcGh5Owo+ICsJcGh5X3NldF9kcnZkYXRhKHBoeSwgY2Ruc19waHkp Owo+ICsKPiArCWlmIChjZG5zX3BoeS0+bnVtX2xhbmVzID4gTUFYX05VTV9MQU5FUykgewo+ICsJ CWRldl9lcnIoZGV2LCAiSW52YWxpZCBsYW5lIGNvbmZpZ3VyYXRpb25cbiIpOwo+ICsJCXJldHVy biAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCXJldCA9IGhkcHR4X2RwX3JlZl9jbGsoY2Ruc19waHkp Owo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAiSW5pdCBjbGsgZmFpbFxuIik7Cj4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9w aHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBvZl9waHlfc2ltcGxlX3hsYXRlKTsKPiArCWlmIChJ U19FUlIocGh5X3Byb3ZpZGVyKSkgewo+ICsJCXJldCA9ICBQVFJfRVJSKHBoeV9wcm92aWRlcik7 Cj4gKwkJZ290byBjbGtfZGlzYWJsZTsKPiArCX0KPiArCj4gKwlkZXZfZGJnKGRldiwgImxpbms6 ICglZCBsYW5lcykiLCBjZG5zX3BoeS0+bnVtX2xhbmVzKTsKPiArCj4gKwlyZXR1cm4gMDsKPiAr Cj4gK2Nsa19kaXNhYmxlOgo+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNkbnNfcGh5LT5yZWZf Y2xrKTsKPiArCj4gKwlyZXR1cm4gLUVJTlZBTDsKPiArfQo+ICsKPiArc3RhdGljIGludCBjZG5z X2hkcHR4X2RwX3BoeV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ ICsJc3RydWN0IGNkbnNfaGRwdHhfZHBfcGh5ICpjZG5zX3BoeSA9IHBsYXRmb3JtX2dldF9kcnZk YXRhKHBkZXYpOwo+ICsKPiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShjZG5zX3BoeS0+cmVmX2Ns ayk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2Zf ZGV2aWNlX2lkIGNkbnNfaGRwdHhfZHBfcGh5X29mX21hdGNoW10gPSB7Cj4gKwl7Cj4gKwkJLmNv bXBhdGlibGUgPSAiY2RucyxoZHB0eC1kcC1waHkiLAo+ICsJfSwKPiArCXt9Cj4gK307Cj4gK01P RFVMRV9ERVZJQ0VfVEFCTEUob2YsIGNkbnNfaGRwdHhfZHBfcGh5X29mX21hdGNoKTsKPiArCj4g K3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNkbnNfaGRwdHhfZHBfcGh5X2RyaXZlciA9 IHsKPiArCS5wcm9iZQk9IGNkbnNfaGRwdHhfZHBfcGh5X3Byb2JlLAo+ICsJLnJlbW92ZSA9IGNk bnNfaGRwdHhfZHBfcGh5X3JlbW92ZSwKPiArCS5kcml2ZXIgPSB7Cj4gKwkJLm5hbWUJPSAiY2Ru cy1oZHB0eC1kcC1waHkiLAo+ICsJCS5vZl9tYXRjaF90YWJsZQk9IGNkbnNfaGRwdHhfZHBfcGh5 X29mX21hdGNoLAo+ICsJfQo+ICt9Owo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGNkbnNfaGRw dHhfZHBfcGh5X2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJTYW5kb3IgWXUgPHNhbmRv ci55dUBueHAuY29tPiIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIkNhZGVuY2UgSERQLVRYIERp c3BsYXlQb3J0IFBIWSBkcml2ZXIiKTsKPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+IC0tIAo+ IDIuMzQuMQoKLS0gCn5WaW5vZAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5l bEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo= 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 D0975C4332F for ; Thu, 10 Nov 2022 07:40:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232590AbiKJHk5 (ORCPT ); Thu, 10 Nov 2022 02:40:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53938 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230093AbiKJHkv (ORCPT ); Thu, 10 Nov 2022 02:40:51 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F3A5163E2; Wed, 9 Nov 2022 23:40:48 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 85FCFB820CD; Thu, 10 Nov 2022 07:40:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 24433C433D6; Thu, 10 Nov 2022 07:40:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1668066046; bh=xOehpA7GaLY+h39F/Pnz3gq81tX/dJk6RV4MSFTtWHc=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=R6tzxmZ61Y6VXoaCUDUQzz75sIWsRTAASsEuOfDedj4PaJdYq0FkeW1lrPtRBvvMY UffPdvc1M8+9E7HvHHF3UTVyPCeYa+ALPrzUVl3IYKtTqTnnXvo+2Z0+xgV0tnOVkv Hm1RZm2pDmlRJKlOXdKrVuZiRz57tZTGKwooKQic8KWjvM/4sikceTSHO+Au3uwyUU e/18SXXmcR1PTniuEMzevXFN3nhOithFdYA0mW1eupzG/qnE/MKqsHPUfrXdHcmb2Q jnRVPq32nn+ihmYFbd2ylb20D+YR4dInUyWUpxMABFFN7RLvWPZl0peq3/cccNwPVF jmJ6h6Bo8ObSg== Date: Thu, 10 Nov 2022 13:10:42 +0530 From: Vinod Koul To: Sandor Yu Cc: 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, andrzej.hajda@intel.com, neil.armstrong@linaro.org, robert.foss@linaro.org, Laurent.pinchart@ideasonboard.com, jonas@kwiboo.se, jernej.skrabec@gmail.com, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, linux-imx@nxp.com, tzimmermann@suse.de, lyude@redhat.com, javierm@redhat.com, ville.syrjala@linux.intel.com, sam@ravnborg.org, jani.nikula@intel.com, maxime@cerno.tech, penguin-kernel@i-love.sakura.ne.jp, oliver.brown@nxp.com Subject: Re: [PATCH v3 08/10] phy: cadence: Add driver for HDP-TX DisplyPort PHY Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org On 08-11-22, 21:00, Sandor Yu wrote: > Add Cadence HDP-TX DisplayPort PHY driver. > > 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/cadence/Kconfig | 8 + > drivers/phy/cadence/Makefile | 1 + > drivers/phy/cadence/phy-cadence-hdptx-dp.c | 774 +++++++++++++++++++++ > 3 files changed, 783 insertions(+) > create mode 100644 drivers/phy/cadence/phy-cadence-hdptx-dp.c > > diff --git a/drivers/phy/cadence/Kconfig b/drivers/phy/cadence/Kconfig > index 1adde2d99ae7..1e1914d3afdc 100644 > --- a/drivers/phy/cadence/Kconfig > +++ b/drivers/phy/cadence/Kconfig > @@ -46,3 +46,11 @@ config PHY_CADENCE_SALVO > Enable this to support the Cadence SALVO PHY driver, > this PHY is a legacy PHY, and only are used for USB3 > and USB2. > + > +config PHY_CADENCE_HDPTX_DP alphabetically sorted please > + tristate "Cadence HDPTX DP PHY Driver" > + depends on OF && HAS_IOMEM > + depends on COMMON_CLK > + select GENERIC_PHY > + help > + Enable this to support the Cadence HDPTX DP PHY driver > diff --git a/drivers/phy/cadence/Makefile b/drivers/phy/cadence/Makefile > index e17f035ddece..fbdb0bc5ff11 100644 > --- a/drivers/phy/cadence/Makefile > +++ b/drivers/phy/cadence/Makefile > @@ -4,3 +4,4 @@ obj-$(CONFIG_PHY_CADENCE_DPHY) += cdns-dphy.o > obj-$(CONFIG_PHY_CADENCE_DPHY_RX) += cdns-dphy-rx.o > obj-$(CONFIG_PHY_CADENCE_SIERRA) += phy-cadence-sierra.o > obj-$(CONFIG_PHY_CADENCE_SALVO) += phy-cadence-salvo.o > +obj-$(CONFIG_PHY_CADENCE_HDPTX_DP) += phy-cadence-hdptx-dp.o here too > diff --git a/drivers/phy/cadence/phy-cadence-hdptx-dp.c b/drivers/phy/cadence/phy-cadence-hdptx-dp.c > new file mode 100644 > index 000000000000..079d43772d1d > --- /dev/null > +++ b/drivers/phy/cadence/phy-cadence-hdptx-dp.c > @@ -0,0 +1,774 @@ > +// 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 > + > +/* 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_CDIAG_REFCLK_CTRL 0x0062 > +#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_CTRL1 0x0098 > +#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_CTRL 0x00E0 > +#define CMN_TXPUCAL_INIT_TMR 0x00E4 > +#define CMN_TXPUCAL_ITER_TMR 0x00E5 > +#define CMN_TXPDCAL_CTRL 0x00F0 > +#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_CTRL 0x0108 > +#define CMN_TXPU_ADJ_INIT_TMR 0x010A > +#define CMN_TXPU_ADJ_ITER_TMR 0x010B > +#define CMN_TXPD_ADJ_CTRL 0x010c > +#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_PLL0_INCLK_CTRL 0x01CA > +#define CMN_DIAG_PLL0_PXL_DIVH 0x01CB > +#define CMN_DIAG_PLL0_PXL_DIVL 0x01CC > +#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 TX_TXCC_MGNFS_MULT_000_0 0x4050 > +#define XCVR_DIAG_PLLDRC_CTRL 0x40E0 > +#define XCVR_DIAG_PLLDRC_CTRL 0x40E0 > +#define XCVR_DIAG_HSCLK_SEL 0x40E1 > +#define XCVR_DIAG_BIDI_CTRL 0x40E8 > +#define XCVR_DIAG_LANE_FCM_EN_MGN_TMR 0x40F2 > +#define XCVR_DIAG_LANE_FCM_EN_MGN 0x40F2 > +#define TX_PSC_A0 0x4100 > +#define TX_PSC_A1 0x4101 > +#define TX_PSC_A2 0x4102 > +#define TX_PSC_A3 0x4103 > +#define TX_RCVDET_CTRL 0x4120 > +#define TX_RCVDET_EN_TMR 0x4122 > +#define TX_RCVDET_EN_TMR 0x4122 > +#define TX_RCVDET_ST_TMR 0x4123 > +#define TX_RCVDET_ST_TMR 0x4123 > +#define TX_BIST_CTRL 0x4140 > +#define TX_BIST_UDDWR 0x4141 > +#define TX_DIAG_TX_CTRL 0x41E0 > +#define TX_DIAG_TX_DRV 0x41E1 > +#define TX_DIAG_BGREF_PREDRV_DELAY 0x41E7 > +#define TX_DIAG_BGREF_PREDRV_DELAY 0x41E7 > +#define XCVR_PSM_RCTRL_1 0x4201 > +#define TX_TXCC_CAL_SCLR_MULT_1 0x4247 > +#define TX_TXCC_CPOST_MULT_00_1 0x424C > +#define TX_TXCC_MGNFS_MULT_000_1 0x4250 > +#define XCVR_DIAG_PLLDRC_CTRL_1 0x42E0 > +#define XCVR_DIAG_HSCLK_SEL_1 0x42E1 > +#define XCVR_DIAG_LANE_FCM_EN_MGN_TMR_1 0x42F2 > +#define TX_RCVDET_EN_TMR_1 0x4322 > +#define TX_RCVDET_ST_TMR_1 0x4323 > +#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 TXDA_COEFF_CALC 0x5022 > +#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 PMA_LANE_CFG 0xC000 > +#define PIPE_CMN_CTRL1 0xC001 > +#define PIPE_CMN_CTRL2 0xC002 > +#define PIPE_COM_LOCK_CFG1 0xC003 > +#define PIPE_COM_LOCK_CFG2 0xC004 > +#define PIPE_RCV_DET_INH 0xC005 > +#define PHY_HDP_MODE_CTRL 0xC008 > +#define PHY_HDP_CLK_CTL 0xC009 > +#define STS 0xC00F > +#define PHY_ISO_CMN_CTRL 0xC010 > +#define PHY_ISO_CMN_CTRL 0xC010 > +#define PHY_HDP_TX_CTL_L0 0xC408 > +#define PHY_DP_TX_CTL 0xC408 > +#define PHY_HDP_TX_CTL_L1 0xC448 > +#define PHY_HDP_TX_CTL_L2 0xC488 > +#define PHY_HDP_TX_CTL_L3 0xC4C8 > +#define PHY_PMA_CMN_CTRL1 0xC800 > +#define PMA_CMN_CTRL1 0xC800 > +#define PHY_PMA_ISO_CMN_CTRL 0xC810 > +#define PHY_PMA_ISO_PLL_CTRL1 0xC812 > +#define PHY_PMA_ISOLATION_CTRL 0xC81F > +#define PHY_ISOLATION_CTRL 0xC81F > +#define PHY_PMA_ISO_XCVR_CTRL 0xCC11 > +#define PHY_PMA_ISO_LINK_MODE 0xCC12 > +#define PHY_PMA_ISO_PWRST_CTRL 0xCC13 > +#define PHY_PMA_ISO_TX_DATA_LO 0xCC14 > +#define PHY_PMA_ISO_TX_DATA_HI 0xCC15 > +#define PHY_PMA_ISO_RX_DATA_LO 0xCC16 > +#define PHY_PMA_ISO_RX_DATA_HI 0xCC17 do you use all these? > + > +#define MAX_NUM_LANES 4 > +#define DEFAULT_MAX_BIT_RATE 5400 /* in Mbps */ > + > +#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, > +}; > + > +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 } > +}; > + > +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; > + u32 ref_clk_rate; > + u32 num_lanes; > + u32 max_bit_rate; /* Maximum link bit rate to use (in Mbps) */ > + 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_ref_clk(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, "refclk"); > + if (IS_ERR(cdns_phy->ref_clk)) { > + dev_err(dev, "phy ref clock not found\n"); > + return PTR_ERR(cdns_phy->ref_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; > + } > + > + return 0; > + > +err_ref_clk: > + clk_disable_unprepare(cdns_phy->ref_clk); > + return -EINVAL; > +} > + > +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; > + > + /* 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); > + > + if (of_property_read_u32(node, "cdns,num-lanes", > + &cdns_phy->num_lanes)) { > + dev_err(dev, "%s: No \"cdns,num-lanes\"-property.\n", > + node->full_name); > + return -EINVAL; > + } > + > + phy = devm_phy_create(dev, node, &cdns_hdptx_dp_phy_ops); > + if (IS_ERR(phy)) > + return PTR_ERR(phy); > + > + cdns_phy->max_bit_rate = DEFAULT_MAX_BIT_RATE; > + of_property_read_u32(node, "cdns,max-bit-rate", > + &cdns_phy->max_bit_rate); > + > + switch (cdns_phy->max_bit_rate) { > + /* valid bit rate */ > + case 1620: > + case 2160: > + case 2430: > + case 2700: > + case 3240: > + case 4320: > + case 5400: > + break; > + case 8100: > + default: > + dev_err(dev, "unsupported max bit rate: %dMbps\n", > + cdns_phy->max_bit_rate); > + return -EINVAL; > + } > + > + dev_dbg(dev, "DP max bit rate %d.%03d Gbps\n", > + cdns_phy->max_bit_rate / 1000, > + cdns_phy->max_bit_rate % 1000); > + > + phy->attrs.bus_width = cdns_phy->num_lanes; > + phy->attrs.max_link_rate = cdns_phy->max_bit_rate; > + phy->attrs.mode = PHY_MODE_DP; > + > + cdns_phy->phy = phy; > + phy_set_drvdata(phy, cdns_phy); > + > + if (cdns_phy->num_lanes > MAX_NUM_LANES) { > + dev_err(dev, "Invalid lane configuration\n"); > + return -EINVAL; > + } > + > + ret = hdptx_dp_ref_clk(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; > + } > + > + dev_dbg(dev, "link: (%d lanes)", cdns_phy->num_lanes); > + > + return 0; > + > +clk_disable: > + clk_disable_unprepare(cdns_phy->ref_clk); > + > + return -EINVAL; > +} > + > +static int cdns_hdptx_dp_phy_remove(struct platform_device *pdev) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy = platform_get_drvdata(pdev); > + > + clk_disable_unprepare(cdns_phy->ref_clk); > + > + return 0; > +} > + > +static const struct of_device_id cdns_hdptx_dp_phy_of_match[] = { > + { > + .compatible = "cdns,hdptx-dp-phy", > + }, > + {} > +}; > +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 C1BDDC4332F for ; Thu, 10 Nov 2022 07:40:53 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6AAEC10E66C; Thu, 10 Nov 2022 07:40:52 +0000 (UTC) Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4A7B910E66C for ; Thu, 10 Nov 2022 07:40:49 +0000 (UTC) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 84F1CB82052; Thu, 10 Nov 2022 07:40:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 24433C433D6; Thu, 10 Nov 2022 07:40:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1668066046; bh=xOehpA7GaLY+h39F/Pnz3gq81tX/dJk6RV4MSFTtWHc=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=R6tzxmZ61Y6VXoaCUDUQzz75sIWsRTAASsEuOfDedj4PaJdYq0FkeW1lrPtRBvvMY UffPdvc1M8+9E7HvHHF3UTVyPCeYa+ALPrzUVl3IYKtTqTnnXvo+2Z0+xgV0tnOVkv Hm1RZm2pDmlRJKlOXdKrVuZiRz57tZTGKwooKQic8KWjvM/4sikceTSHO+Au3uwyUU e/18SXXmcR1PTniuEMzevXFN3nhOithFdYA0mW1eupzG/qnE/MKqsHPUfrXdHcmb2Q jnRVPq32nn+ihmYFbd2ylb20D+YR4dInUyWUpxMABFFN7RLvWPZl0peq3/cccNwPVF jmJ6h6Bo8ObSg== Date: Thu, 10 Nov 2022 13:10:42 +0530 From: Vinod Koul To: Sandor Yu Subject: Re: [PATCH v3 08/10] phy: cadence: Add driver for HDP-TX DisplyPort PHY Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: 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: andrzej.hajda@intel.com, penguin-kernel@i-love.sakura.ne.jp, dri-devel@lists.freedesktop.org, Laurent.pinchart@ideasonboard.com, krzysztof.kozlowski+dt@linaro.org, linux-phy@lists.infradead.org, sam@ravnborg.org, javierm@redhat.com, jernej.skrabec@gmail.com, linux-imx@nxp.com, devicetree@vger.kernel.org, kernel@pengutronix.de, jonas@kwiboo.se, jani.nikula@intel.com, s.hauer@pengutronix.de, robh+dt@kernel.org, maxime@cerno.tech, linux-arm-kernel@lists.infradead.org, oliver.brown@nxp.com, neil.armstrong@linaro.org, linux-kernel@vger.kernel.org, robert.foss@linaro.org, tzimmermann@suse.de, shawnguo@kernel.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On 08-11-22, 21:00, Sandor Yu wrote: > Add Cadence HDP-TX DisplayPort PHY driver. > > 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/cadence/Kconfig | 8 + > drivers/phy/cadence/Makefile | 1 + > drivers/phy/cadence/phy-cadence-hdptx-dp.c | 774 +++++++++++++++++++++ > 3 files changed, 783 insertions(+) > create mode 100644 drivers/phy/cadence/phy-cadence-hdptx-dp.c > > diff --git a/drivers/phy/cadence/Kconfig b/drivers/phy/cadence/Kconfig > index 1adde2d99ae7..1e1914d3afdc 100644 > --- a/drivers/phy/cadence/Kconfig > +++ b/drivers/phy/cadence/Kconfig > @@ -46,3 +46,11 @@ config PHY_CADENCE_SALVO > Enable this to support the Cadence SALVO PHY driver, > this PHY is a legacy PHY, and only are used for USB3 > and USB2. > + > +config PHY_CADENCE_HDPTX_DP alphabetically sorted please > + tristate "Cadence HDPTX DP PHY Driver" > + depends on OF && HAS_IOMEM > + depends on COMMON_CLK > + select GENERIC_PHY > + help > + Enable this to support the Cadence HDPTX DP PHY driver > diff --git a/drivers/phy/cadence/Makefile b/drivers/phy/cadence/Makefile > index e17f035ddece..fbdb0bc5ff11 100644 > --- a/drivers/phy/cadence/Makefile > +++ b/drivers/phy/cadence/Makefile > @@ -4,3 +4,4 @@ obj-$(CONFIG_PHY_CADENCE_DPHY) += cdns-dphy.o > obj-$(CONFIG_PHY_CADENCE_DPHY_RX) += cdns-dphy-rx.o > obj-$(CONFIG_PHY_CADENCE_SIERRA) += phy-cadence-sierra.o > obj-$(CONFIG_PHY_CADENCE_SALVO) += phy-cadence-salvo.o > +obj-$(CONFIG_PHY_CADENCE_HDPTX_DP) += phy-cadence-hdptx-dp.o here too > diff --git a/drivers/phy/cadence/phy-cadence-hdptx-dp.c b/drivers/phy/cadence/phy-cadence-hdptx-dp.c > new file mode 100644 > index 000000000000..079d43772d1d > --- /dev/null > +++ b/drivers/phy/cadence/phy-cadence-hdptx-dp.c > @@ -0,0 +1,774 @@ > +// 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 > + > +/* 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_CDIAG_REFCLK_CTRL 0x0062 > +#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_CTRL1 0x0098 > +#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_CTRL 0x00E0 > +#define CMN_TXPUCAL_INIT_TMR 0x00E4 > +#define CMN_TXPUCAL_ITER_TMR 0x00E5 > +#define CMN_TXPDCAL_CTRL 0x00F0 > +#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_CTRL 0x0108 > +#define CMN_TXPU_ADJ_INIT_TMR 0x010A > +#define CMN_TXPU_ADJ_ITER_TMR 0x010B > +#define CMN_TXPD_ADJ_CTRL 0x010c > +#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_PLL0_INCLK_CTRL 0x01CA > +#define CMN_DIAG_PLL0_PXL_DIVH 0x01CB > +#define CMN_DIAG_PLL0_PXL_DIVL 0x01CC > +#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 TX_TXCC_MGNFS_MULT_000_0 0x4050 > +#define XCVR_DIAG_PLLDRC_CTRL 0x40E0 > +#define XCVR_DIAG_PLLDRC_CTRL 0x40E0 > +#define XCVR_DIAG_HSCLK_SEL 0x40E1 > +#define XCVR_DIAG_BIDI_CTRL 0x40E8 > +#define XCVR_DIAG_LANE_FCM_EN_MGN_TMR 0x40F2 > +#define XCVR_DIAG_LANE_FCM_EN_MGN 0x40F2 > +#define TX_PSC_A0 0x4100 > +#define TX_PSC_A1 0x4101 > +#define TX_PSC_A2 0x4102 > +#define TX_PSC_A3 0x4103 > +#define TX_RCVDET_CTRL 0x4120 > +#define TX_RCVDET_EN_TMR 0x4122 > +#define TX_RCVDET_EN_TMR 0x4122 > +#define TX_RCVDET_ST_TMR 0x4123 > +#define TX_RCVDET_ST_TMR 0x4123 > +#define TX_BIST_CTRL 0x4140 > +#define TX_BIST_UDDWR 0x4141 > +#define TX_DIAG_TX_CTRL 0x41E0 > +#define TX_DIAG_TX_DRV 0x41E1 > +#define TX_DIAG_BGREF_PREDRV_DELAY 0x41E7 > +#define TX_DIAG_BGREF_PREDRV_DELAY 0x41E7 > +#define XCVR_PSM_RCTRL_1 0x4201 > +#define TX_TXCC_CAL_SCLR_MULT_1 0x4247 > +#define TX_TXCC_CPOST_MULT_00_1 0x424C > +#define TX_TXCC_MGNFS_MULT_000_1 0x4250 > +#define XCVR_DIAG_PLLDRC_CTRL_1 0x42E0 > +#define XCVR_DIAG_HSCLK_SEL_1 0x42E1 > +#define XCVR_DIAG_LANE_FCM_EN_MGN_TMR_1 0x42F2 > +#define TX_RCVDET_EN_TMR_1 0x4322 > +#define TX_RCVDET_ST_TMR_1 0x4323 > +#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 TXDA_COEFF_CALC 0x5022 > +#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 PMA_LANE_CFG 0xC000 > +#define PIPE_CMN_CTRL1 0xC001 > +#define PIPE_CMN_CTRL2 0xC002 > +#define PIPE_COM_LOCK_CFG1 0xC003 > +#define PIPE_COM_LOCK_CFG2 0xC004 > +#define PIPE_RCV_DET_INH 0xC005 > +#define PHY_HDP_MODE_CTRL 0xC008 > +#define PHY_HDP_CLK_CTL 0xC009 > +#define STS 0xC00F > +#define PHY_ISO_CMN_CTRL 0xC010 > +#define PHY_ISO_CMN_CTRL 0xC010 > +#define PHY_HDP_TX_CTL_L0 0xC408 > +#define PHY_DP_TX_CTL 0xC408 > +#define PHY_HDP_TX_CTL_L1 0xC448 > +#define PHY_HDP_TX_CTL_L2 0xC488 > +#define PHY_HDP_TX_CTL_L3 0xC4C8 > +#define PHY_PMA_CMN_CTRL1 0xC800 > +#define PMA_CMN_CTRL1 0xC800 > +#define PHY_PMA_ISO_CMN_CTRL 0xC810 > +#define PHY_PMA_ISO_PLL_CTRL1 0xC812 > +#define PHY_PMA_ISOLATION_CTRL 0xC81F > +#define PHY_ISOLATION_CTRL 0xC81F > +#define PHY_PMA_ISO_XCVR_CTRL 0xCC11 > +#define PHY_PMA_ISO_LINK_MODE 0xCC12 > +#define PHY_PMA_ISO_PWRST_CTRL 0xCC13 > +#define PHY_PMA_ISO_TX_DATA_LO 0xCC14 > +#define PHY_PMA_ISO_TX_DATA_HI 0xCC15 > +#define PHY_PMA_ISO_RX_DATA_LO 0xCC16 > +#define PHY_PMA_ISO_RX_DATA_HI 0xCC17 do you use all these? > + > +#define MAX_NUM_LANES 4 > +#define DEFAULT_MAX_BIT_RATE 5400 /* in Mbps */ > + > +#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, > +}; > + > +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 } > +}; > + > +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; > + u32 ref_clk_rate; > + u32 num_lanes; > + u32 max_bit_rate; /* Maximum link bit rate to use (in Mbps) */ > + 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_ref_clk(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, "refclk"); > + if (IS_ERR(cdns_phy->ref_clk)) { > + dev_err(dev, "phy ref clock not found\n"); > + return PTR_ERR(cdns_phy->ref_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; > + } > + > + return 0; > + > +err_ref_clk: > + clk_disable_unprepare(cdns_phy->ref_clk); > + return -EINVAL; > +} > + > +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; > + > + /* 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); > + > + if (of_property_read_u32(node, "cdns,num-lanes", > + &cdns_phy->num_lanes)) { > + dev_err(dev, "%s: No \"cdns,num-lanes\"-property.\n", > + node->full_name); > + return -EINVAL; > + } > + > + phy = devm_phy_create(dev, node, &cdns_hdptx_dp_phy_ops); > + if (IS_ERR(phy)) > + return PTR_ERR(phy); > + > + cdns_phy->max_bit_rate = DEFAULT_MAX_BIT_RATE; > + of_property_read_u32(node, "cdns,max-bit-rate", > + &cdns_phy->max_bit_rate); > + > + switch (cdns_phy->max_bit_rate) { > + /* valid bit rate */ > + case 1620: > + case 2160: > + case 2430: > + case 2700: > + case 3240: > + case 4320: > + case 5400: > + break; > + case 8100: > + default: > + dev_err(dev, "unsupported max bit rate: %dMbps\n", > + cdns_phy->max_bit_rate); > + return -EINVAL; > + } > + > + dev_dbg(dev, "DP max bit rate %d.%03d Gbps\n", > + cdns_phy->max_bit_rate / 1000, > + cdns_phy->max_bit_rate % 1000); > + > + phy->attrs.bus_width = cdns_phy->num_lanes; > + phy->attrs.max_link_rate = cdns_phy->max_bit_rate; > + phy->attrs.mode = PHY_MODE_DP; > + > + cdns_phy->phy = phy; > + phy_set_drvdata(phy, cdns_phy); > + > + if (cdns_phy->num_lanes > MAX_NUM_LANES) { > + dev_err(dev, "Invalid lane configuration\n"); > + return -EINVAL; > + } > + > + ret = hdptx_dp_ref_clk(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; > + } > + > + dev_dbg(dev, "link: (%d lanes)", cdns_phy->num_lanes); > + > + return 0; > + > +clk_disable: > + clk_disable_unprepare(cdns_phy->ref_clk); > + > + return -EINVAL; > +} > + > +static int cdns_hdptx_dp_phy_remove(struct platform_device *pdev) > +{ > + struct cdns_hdptx_dp_phy *cdns_phy = platform_get_drvdata(pdev); > + > + clk_disable_unprepare(cdns_phy->ref_clk); > + > + return 0; > +} > + > +static const struct of_device_id cdns_hdptx_dp_phy_of_match[] = { > + { > + .compatible = "cdns,hdptx-dp-phy", > + }, > + {} > +}; > +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