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 CD0FAC25B76 for ; Fri, 31 May 2024 00:09:46 +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=Dd9ytWyvw4af9JlKkg2sq0XYMAqb8QG1RlCqC/vTjmE=; b=zGrKCO7Za3VIBO vkzPWI5FTNv9a9OpTBKlRWDACsWUhmiyV4+g+JFfpP7eYCw3YmL3FWlE5sSQ2r3N1aBUmVAfUcffo eNYcLQvIJQYNaLmwap7ju+hP3Nm8xQvbcPpELJSFJIpKU2370+BhPgSEkeeKeVoBcvCryDMNOtbo1 Neqyc3Dz70U4KynDphgzW4ZMXeWWXR4Tjg59g2T749fNO2tWTxDEt5i2VtD++yABtst2Pen95wRT2 6bPhO2uClaOiD4Xcgv7r5fTbzU1e8VTjfxSw1znNaiJuXJFOYGESLA2jrEtVx9mrZOq50aH72r3/+ 1HFEffCYX6PBRUuK8Org==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sCppq-00000008lXX-2HCB; Fri, 31 May 2024 00:09:30 +0000 Received: from perceval.ideasonboard.com ([213.167.242.64]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sCppl-00000008lX2-05cW for linux-arm-kernel@lists.infradead.org; Fri, 31 May 2024 00:09:28 +0000 Received: from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi [81.175.209.231]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3D14C11A3; Fri, 31 May 2024 02:09:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1717114156; bh=fegVz/cmIf29HwbAsa6sfuaO6oTpfkPL8AT6AINy9Vo=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=nb9n32/bpwzydRh6Am52Cff4lNfzUulnDImuJ5qgj+bq0ei2zKoG0ddgPj2tC7h66 ofca7XaBFD5+Ga6G23T9+0yotwYi7WdBYu2CZkFvDlXwq5fhijUmlpqDYbGQYxQEh3 Va7/v2DFvmtYFASnj12gjwvygXvbQlVO/mOTogj0= Date: Fri, 31 May 2024 03:09:07 +0300 From: Laurent Pinchart To: Daniel Scally Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, jacopo.mondi@ideasonboard.com, nayden.kanchev@arm.com, robh+dt@kernel.org, mchehab@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, jerome.forissier@linaro.org, kieran.bingham@ideasonboard.com, sakari.ailus@iki.fi Subject: Re: [PATCH v5 14/16] media: uapi: Add parameters structs to mali-c55-config.h Message-ID: <20240531000907.GG5213@pendragon.ideasonboard.com> References: <20240529152858.183799-1-dan.scally@ideasonboard.com> <20240529152858.183799-15-dan.scally@ideasonboard.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20240529152858.183799-15-dan.scally@ideasonboard.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240530_170925_539318_9B054510 X-CRM114-Status: GOOD ( 47.42 ) 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 SGkgRGFuLAoKVGhhbmsgeW91IGZvciB0aGUgcGF0Y2guCgpPbiBXZWQsIE1heSAyOSwgMjAyNCBh dCAwNDoyODo1NlBNICswMTAwLCBEYW5pZWwgU2NhbGx5IHdyb3RlOgo+IEFkZCBzdHJ1Y3R1cmVz IGRlc2NyaWJpbmcgdGhlIElTUCBwYXJhbWV0ZXJzIHRvIG1hbGktYzU1LWNvbmZpZy5oCj4gCj4g QWNrZWQtYnk6IE5heWRlbiBLYW5jaGV2ICA8bmF5ZGVuLmthbmNoZXZAYXJtLmNvbT4KPiBDby1k ZXZlbG9wZWQtYnk6IEphY29wbyBNb25kaSA8amFjb3BvLm1vbmRpQGlkZWFzb25ib2FyZC5jb20+ Cj4gU2lnbmVkLW9mZi1ieTogSmFjb3BvIE1vbmRpIDxqYWNvcG8ubW9uZGlAaWRlYXNvbmJvYXJk LmNvbT4KPiBTaWduZWQtb2ZmLWJ5OiBEYW5pZWwgU2NhbGx5IDxkYW4uc2NhbGx5QGlkZWFzb25i b2FyZC5jb20+Cj4gLS0tCj4gQ2hhbmdlcyBpbiB2NToKPiAKPiAJLSBOZXcgcGF0Y2gKPiAKPiAg Li4uL3VhcGkvbGludXgvbWVkaWEvYXJtL21hbGktYzU1LWNvbmZpZy5oICAgIHwgNjY5ICsrKysr KysrKysrKysrKysrKwo+ICAxIGZpbGUgY2hhbmdlZCwgNjY5IGluc2VydGlvbnMoKykKPiAKPiBk aWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21lZGlhL2FybS9tYWxpLWM1NS1jb25maWcu aCBiL2luY2x1ZGUvdWFwaS9saW51eC9tZWRpYS9hcm0vbWFsaS1jNTUtY29uZmlnLmgKPiBpbmRl eCA4ZmI4OWFmNmM4NzQuLmZjZTE0YmM3NGY0YSAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL3VhcGkv bGludXgvbWVkaWEvYXJtL21hbGktYzU1LWNvbmZpZy5oCj4gKysrIGIvaW5jbHVkZS91YXBpL2xp bnV4L21lZGlhL2FybS9tYWxpLWM1NS1jb25maWcuaAo+IEBAIC0xNzksNCArMTc5LDY3MyBAQCBz dHJ1Y3QgbWFsaV9jNTVfc3RhdHNfYnVmZmVyIHsKPiAgCV9fdTMyIHJlc2VydmVkM1sxNV07Cj4g IH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cj4gIAo+ICsvKioKPiArICogZW51bSBtYWxpX2M1 NV9wYXJhbV9idWZmZXJfdmVyc2lvbiAtIE1hbGktQzU1IHBhcmFtZXRlcnMgYmxvY2sgdmVyc2lv bmluZwo+ICsgKgo+ICsgKiBATUFMSV9DNTVfUEFSQU1fQlVGRkVSX1YwOiBGaXJzdCB2ZXJzaW9u IG9mIE1hbGktQzU1IHBhcmFtZXRlcnMgYmxvY2sKClNvIHlvdSBsaWtlIHZlcnNpb25zIHRvIGJl IDAtYmFzZWQgPyA6LSkKCj4gKyAqLwo+ICtlbnVtIG1hbGlfYzU1X3BhcmFtX2J1ZmZlcl92ZXJz aW9uIHsKPiArCU1BTElfQzU1X1BBUkFNX0JVRkZFUl9WMCwKPiArfTsKPiArCj4gKy8qKgo+ICsg KiBlbnVtIG1hbGlfYzU1X3BhcmFtX2Jsb2NrX3R5cGUgLSBFbnVtZXJhdGlvbiBvZiBNYWxpLUM1 NSBwYXJhbWV0ZXIgYmxvY2tzCj4gKyAqCj4gKyAqIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0 aGUgdHlwZXMgb2YgTWFsaS1DNTUgcGFyYW1ldGVycyBibG9jay4gRWFjaCBibG9jawo+ICsgKiBj b25maWd1cmVzIGEgc3BlY2lmaWMgcHJvY2Vzc2luZyBibG9jayBvZiB0aGUgTWFsaS1DNTUgSVNQ LiBUaGUgYmxvY2sKPiArICogdHlwZSBhbGxvd3MgdGhlIGRyaXZlciB0byBjb3JyZWN0bHkgaW50 ZXJwcmV0IHRoZSBwYXJhbWV0ZXJzIGJsb2NrIGRhdGEuCj4gKyAqCj4gKyAqIEl0IGlzIHRoZSBy ZXNwb25zaWJpbGl0eSBvZiB1c2Vyc3BhY2UgdG8gY29ycmVjdGx5IHNldCB0aGUgdHlwZSBvZiBl YWNoCj4gKyAqIHBhcmFtZXRlcnMgYmxvY2suCj4gKyAqCj4gKyAqIEBNQUxJX0M1NV9QQVJBTV9C TE9DS19TRU5TT1JfT0ZGUzogU2Vuc29yIHByZS1zaGFkaW5nIGJsYWNrIGxldmVsIG9mZnNldAo+ ICsgKiBATUFMSV9DNTVfUEFSQU1fQkxPQ0tfQUVYUF9ISVNUOiBBdXRvLWV4cG9zdXJlIDEwMjQt YmluIGhpc3RvZ3JhbQo+ICsgKgkJCQkgICAgY29uZmlndXJhdGlvbgo+ICsgKiBATUFMSV9DNTVf UEFSQU1fQkxPQ0tfQUVYUF9JSElTVDogUG9zdC1JcmlkaXggYXV0by1leHBvc3VyZSAxMDI0LWJp bgo+ICsgKgkJCQkgICAgIGhpc3RvZ3JhbSBjb25maWd1cmF0aW9uCj4gKyAqIEBNQUxJX0M1NV9Q QVJBTV9CTE9DS19BRVhQX0hJU1RfV0VJR0hUUzogQXV0by1leHBvc3VyZSAxMDI0LWJpbiBoaXN0 b2dyYW0KPiArICoJCQkJCSAgICB3ZWlnaHRpbmcKPiArICogQE1BTElfQzU1X1BBUkFNX0JMT0NL X0FFWFBfSUhJU1RfV0VJR0hUUzogUG9zdC1JcmlkaXggYXV0by1leHBvc3VyZSAxMDI0LWJpbgo+ ICsgKgkJCQkJICAgICBoaXN0b2dyYW0gd2VpZ2h0aW5nCgpEbyB5b3UgZXhwZWN0IGFwcGxpY2F0 aW9ucyB0byBuZWVkIHRvIHNldCB0aGUgaGlzdG9ncmFtIGNvbmZpZ3VyYXRpb24KYW5kIHdlaWdo dHMgc2VwYXJhdGVseSA/Cgo+ICsgKiBATUFMSV9DNTVfUEFSQU1fQkxPQ0tfRElHSVRBTF9HQUlO OiBEaWdpdGFsIGdhaW4KPiArICogQE1BTElfQzU1X1BBUkFNX0JMT0NLX0FXQl9HQUlOUzogQXV0 by13aGl0ZSBiYWxhbmNlIGdhaW5zCgpJIHdhcyB0aGlua2luZyB0aGF0IHRob3NlIHR3byBjb3Vs ZCBiZSBjb21iaW5lZCwgYnV0IGlmIHRoZSBmb3JtZXIgaXMKdXNlZCBieSBBRUMgYW5kIHRoZSBs YXR0ZXIgYnkgQVdCLCBtYXliZSBrZWVwaW5nIHRoZW0gc2VwYXJhdGUgd291bGQKbWFrZSBsaWtl IGVhc2llciBmb3IgdXNlcnNwYWNlLgoKPiArICogQE1BTElfQzU1X1BBUkFNX0JMT0NLX0FXQl9D T05GSUc6IEF1dG8td2hpdGUgYmFsYW5jZSBzdGF0aXN0aWNzIGNvbmZpZwo+ICsgKiBATUFMSV9D NTVfUEFSQU1fQkxPQ0tfQVdCX0dBSU5TX0FFWFA6IEF1dG8td2hpdGUgYmFsYW5jZSBnYWlucyBm b3IgQUVYUC0wIHRhcAo+ICsgKiBATUFMSV9DNTVfUEFSQU1fTUVTSF9TSEFESU5HX0NPTkZJRyA6 IE1lc2ggc2hhZGluZyB0YWJsZXMgY29uZmlndXJhdGlvbgo+ICsgKiBATUFMSV9DNTVfUEFSQU1f TUVTSF9TSEFESU5HX1NFTEVDVElPTjogTWVzaCBzaGFkaW5nIHRhYmxlIHNlbGVjdGlvbgo+ICsg KiBATUFMSV9DNTVfUEFSQU1fQkxPQ0tfU0VOVElORUw6IEZpcnN0IG5vbi12YWxpZCBibG9jayBp bmRleAoKWW91IHNob3VsZCBpbmRpY2F0ZSBzb21ld2hlcmUgdGhlIGNvcnJlc3BvbmRhbmNlIGJl dHdlZW4gdGhlIGJsb2NrIHR5cGUKYW5kIHRoZSBibG9jayBkYXRhIHN0cnVjdHVyZS4gSXQgY291 bGQgYmUgZG9uZSBpbiB0aGUgZGVmaW5pdGlvbiBvZiBlYWNoCmRhdGEgc3RydWN0dXJlIGZvciBp bnN0YW5jZS4KCj4gKyAqLwo+ICtlbnVtIG1hbGlfYzU1X3BhcmFtX2Jsb2NrX3R5cGUgewo+ICsJ TUFMSV9DNTVfUEFSQU1fQkxPQ0tfU0VOU09SX09GRlMsCj4gKwlNQUxJX0M1NV9QQVJBTV9CTE9D S19BRVhQX0hJU1QsCj4gKwlNQUxJX0M1NV9QQVJBTV9CTE9DS19BRVhQX0lISVNULAo+ICsJTUFM SV9DNTVfUEFSQU1fQkxPQ0tfQUVYUF9ISVNUX1dFSUdIVFMsCj4gKwlNQUxJX0M1NV9QQVJBTV9C TE9DS19BRVhQX0lISVNUX1dFSUdIVFMsCj4gKwlNQUxJX0M1NV9QQVJBTV9CTE9DS19ESUdJVEFM X0dBSU4sCj4gKwlNQUxJX0M1NV9QQVJBTV9CTE9DS19BV0JfR0FJTlMsCj4gKwlNQUxJX0M1NV9Q QVJBTV9CTE9DS19BV0JfQ09ORklHLAo+ICsJTUFMSV9DNTVfUEFSQU1fQkxPQ0tfQVdCX0dBSU5T X0FFWFAsCj4gKwlNQUxJX0M1NV9QQVJBTV9NRVNIX1NIQURJTkdfQ09ORklHLAo+ICsJTUFMSV9D NTVfUEFSQU1fTUVTSF9TSEFESU5HX1NFTEVDVElPTiwKPiArCU1BTElfQzU1X1BBUkFNX0JMT0NL X1NFTlRJTkVMLAo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIHN0cnVjdCBtYWxpX2M1NV9wYXJhbXNf YmxvY2tfaGVhZGVyIC0gTWFsaS1DNTUgcGFyYW1ldGVyIGJsb2NrIGhlYWRlcgo+ICsgKgo+ICsg KiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIHRoZSBjb21tb24gcGFydCBvZiBhbGwgdGhlIElT UCBjb25maWd1cmF0aW9uCj4gKyAqIGJsb2Nrcy4gRWFjaCBwYXJhbWV0ZXJzIGJsb2NrIHNoYWxs IGVtYmVkIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlIHR5cGUKCnMvc2hhbGwgZW1iZWQv ZW1iZWRzLwoKPiArICogYXMgaXRzIGZpcnN0IG1lbWJlciwgZm9sbG93ZWQgYnkgdGhlIGJsb2Nr LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGF0YS4gVGhlCj4gKyAqIGRyaXZlciBpbnNwZWN0cyB0 aGlzIGNvbW1vbiBoZWFkZXIgdG8gZGlzY2VybiB0aGUgYmxvY2sgdHlwZSBhbmQgaXRzIHNpemUg YW5kCj4gKyAqIHByb3Blcmx5IGhhbmRsZSB0aGUgYmxvY2sgY29udGVudCBieSBjYXN0aW5nIGl0 IHRvIHRoZSBjb3JyZWN0IGJsb2NrLXNwZWNpZmljCj4gKyAqIHR5cGUuCj4gKyAqCj4gKyAqIFRo ZSBAdHlwZSBmaWVsZCBpcyBvbmUgb2YgdGhlIHZhbHVlcyBlbnVtZXJhdGVkIGJ5Cj4gKyAqIDpj OnR5cGU6YG1hbGlfYzU1X3BhcmFtX2Jsb2NrX3R5cGVgIGFuZCBzcGVjaWZpZXMgaG93IHRoZSBk YXRhIHNob3VsZCBiZQo+ICsgKiBpbnRlcnByZXRlZCBieSB0aGUgZHJpdmVyLiBUaGUgQHNpemUg ZmllbGQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZQo+ICsgKiBwYXJhbWV0ZXJzIGJsb2NrIGFu ZCBpcyB1c2VkIGJ5IHRoZSBkcml2ZXIgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMuIFRoZQo+ICsg KiBAZW5hYmxlZCBmaWVsZCBzcGVjaWZpZXMgaWYgdGhlIElTUCBibG9jayBzaG91bGQgYmUgZW5h YmxlZCAoYW5kIGNvbmZpZ3VyZWQKPiArICogYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBwYXJh bWV0ZXJzKSBvciBkaXNhYmxlZC4KPiArICoKPiArICogLi4gY29kZS1ibG9jazo6IGMKPiArICoK PiArICoJc3RydWN0IG1hbGlfYzU1X3BhcmFtc19ibG9ja19oZWFkZXIgKmJsb2NrID0gLi4uOwo+ ICsgKgo+ICsgKglzd2l0Y2ggKGJsb2NrLT50eXBlKSB7Cj4gKyAqCWNhc2UgTUFMSV9DNTVfUEFS QU1fQkxPQ0tfU0VOU09SX09GRlM6Cj4gKyAqCQlzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX3NlbnNv cl9vZmZfcHJlc2hhZGluZyAqc2Vuc29yX29mZnMgPQo+ICsgKgkJCShzdHJ1Y3QgbWFsaV9jNTVf cGFyYW1zX3NlbnNvcl9vZmZfcHJlc2hhZGluZyAqKWJsb2NrOwo+ICsgKgo+ICsgKgkJaWYgKGJs b2NrLT5zaXplICE9Cj4gKyAqCQkgICAgc2l6ZW9mKHN0cnVjdCBtYWxpX2M1NV9wYXJhbXNfc2Vu c29yX29mZl9wcmVzaGFkaW5nKSkKPiArICoJCQlyZXR1cm4gLUVJTlZBTDsKPiArICoKPiArICoJ CWhhbmRsZV9zZW5zb3Jfb2ZmcyhzZW5zb3Jfb2Zmcyk7Cj4gKyAqCQlicmVhazsKPiArICoKPiAr ICoJY2FzZSBNQUxJX0M1NV9QQVJBTV9CTE9DS19BRVhQX0hJU1Q6Cj4gKyAqCQlzdHJ1Y3QgbWFs aV9jNTVfcGFyYW1zX2FleHBfaGlzdCAqYWV4cF9oaXN0ID0KPiArICoJCQkoc3RydWN0IG1hbGlf YzU1X3BhcmFtc19hZXhwX2hpc3QpYmxvY2s7Cj4gKyAqCj4gKyAqCQlpZiAoYmxvY2stPnNpemUg IT0gc2l6ZW9mKG1hbGlfYzU1X3BhcmFtc19hZXhwX2hpc3QpKQo+ICsgKgkJCXJldHVybiAtRUlO VkFMOwo+ICsgKgo+ICsgKgkJaGFuZGxlX2FleHBfaGlzdChhZXNwX2hpc3QpOwo+ICsgKgkJYnJl YWs7Cj4gKyAqCj4gKyAqCS4uLgo+ICsgKgo+ICsgKgl9CgpJIHdvdWxkIHByb2JhYmx5IHNraXAg dGhpcy4gVGhlIGtlcm5lbC1zaWRlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjYW4gYmUKZm91bmQg aW4gdGhlIGRyaXZlci4gSSB3b3VsZCBkb2N1bWVudCB0aGUgVUFQSSBoZXJlIHdpdGggZXhhbXBs ZXMKZm9jdXNzaW5nIG9uIHRoZSB1c2Vyc3BhY2Ugc2lkZSBvbmx5LgoKPiArICoKPiArICogVXNl cnNwYWNlIGlzIHJlc3BvbnNpYmxlIGZvciBjb3JyZWN0bHkgcG9wdWxhdGluZyB0aGUgcGFyYW1l dGVycyBibG9jayBoZWFkZXIKPiArICogZmllbGRzIChAdHlwZSwgQGVuYWJsZWQgYW5kIEBzaXpl KSBhbmQgY29ycmVjdGx5IHBvcHVsYXRlIHRoZSBibG9jay1zcGVjaWZpYwo+ICsgKiBwYXJhbWV0 ZXJzLgo+ICsgKgo+ICsgKiBGb3IgZXhhbXBsZToKPiArICoKPiArICogLi4gY29kZS1ibG9jazo6 IGMKPiArICoKPiArICoJdm9pZCBwb3B1bGF0ZV9zZW5zb3Jfb2ZmcyhzdHJ1Y3QgbWFsaV9jNTVf cGFyYW1zX2Jsb2NrX2hlYWRlciAqYmxvY2spIHsKPiArICoJCWJsb2NrLT50eXBlID0gTUFMSV9D NTVfUEFSQU1fQkxPQ0tfU0VOU09SX09GRlM7Cj4gKyAqCQlibG9jay0+ZW5hYmxlZCA9IHRydWU7 Cj4gKyAqCQlibG9jay0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX3NlbnNv cl9vZmZfcHJlc2hhZGluZyk7Cj4gKyAqCj4gKyAqCQlzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX3Nl bnNvcl9vZmZfcHJlc2hhZGluZyAqc2Vuc29yX29mZnMgPQo+ICsgKgkJCShzdHJ1Y3QgbWFsaV9j NTVfcGFyYW1zX3NlbnNvcl9vZmZfcHJlc2hhZGluZyAqKWJsb2NrOwo+ICsgKgo+ICsgKgkJc2Vu c29yX29mZnMtPmNoYW4wMCA9IG9mZnNldDAwOwo+ICsgKgkJc2Vuc29yX29mZnMtPmNoYW4wMSA9 IG9mZnNldDAxOwo+ICsgKgkJc2Vuc29yX29mZnMtPmNoYW4xMCA9IG9mZnNldDEwOwo+ICsgKgkJ c2Vuc29yX29mZnMtPmNoYW4xMSA9IG9mZnNldDExOwo+ICsgKgl9Cj4gKyAqCj4gKyAqIEB0eXBl OiBUaGUgcGFyYW1ldGVycyBibG9jayB0eXBlIChlbnVtIG1hbGlfYzU1X3BhcmFtX2Jsb2NrX3R5 cGUpCj4gKyAqIEBlbmFibGVkOiBCbG9jayBlbmFibGVkL2Rpc2FibGVkIGZsYWcKCkRvZXMgdGhp cyBmbGFnIGFwcGx5IHRvIGFsbCBibG9ja3MgPyBJZiBub3QsIGl0IHdvdWxkIGJlIGdvb2QgdG8K aW5kaWNhdGUgd2hpY2ggYmxvY2tzIGl0IGFwcGxpZXMgdG8uCgpBbHNvLCBJIHRoaW5rIHdlIGRp c2N1c3NlZCBwcmV2aW91c2x5IHRoYXQsIHdoZW4gYSBibG9jayBpcyBkaXNhYmxlZCwKaXRzIGNv bmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGFwcGxpY2FibGUgYW55bW9yZSwgYW5kIGNv dWxkIHRoZW4KYmUgc2tpcHBlZC4gSXMgdGhhdCBzb21ldGhpbmcgdXNlZnVsIHRvIGRvID8KCj4g KyAqIEBzaXplOiBTaXplIChpbiBieXRlcykgb2YgdGhlIHBhcmFtZXRlcnMgYmxvY2sKPiArICov Cj4gK3N0cnVjdCBtYWxpX2M1NV9wYXJhbXNfYmxvY2tfaGVhZGVyIHsKPiArCWVudW0gbWFsaV9j NTVfcGFyYW1fYmxvY2tfdHlwZSB0eXBlOwo+ICsJYm9vbCBlbmFibGVkOwo+ICsJc2l6ZV90IHNp emU7CgplbnVtcywgYm9vbCBhbmQgc2l6ZV90IHNob3VsZG4ndCBiZSB1c2VkIGluIGEgVUFQSSwg YXMgdGhleSBzaXplIG1heQp2YXJ5IGJldHdlZW4gMzItIGFuZCA2NC1iaXQgYXJjaGl0ZWN0dXJl cywgbWFraW5nIDMyLWJpdCB1c2Vyc3BhY2Ugb24gYQo2NC1iaXQga2VybmVsIHJlcXVpcmUgY29t cGF0IGhhbmRsaW5nIGluIHRoZSBkcml2ZXIuIFVzZSB0eXBlcyB3aXRoCndlbGwtZGVmaW5lZCBz aXplcy4gU2FtZSBiZWxvdy4KCj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IG1hbGlfYzU1 X3BhcmFtc19zZW5zb3Jfb2ZmX3ByZXNoYWRpbmcgLSBvZmZzZXQgc3VidHJhY3Rpb24gZm9yIGVh Y2gKPiArICoJCQkJCQkgIGNvbG9yIGNoYW5uZWwKPiArICoKPiArICogUHJvdmlkZXMgcmVtb3Zh bCBvZiB0aGUgc2Vuc29yIGJsYWNrIGxldmVsIGZyb20gdGhlIHNlbnNvciBkYXRhLiBTZXBhcmF0 ZQo+ICsgKiBv76yAc2V0cyBhcmUgcHJvdmlkZWQgZm9yIGVhY2ggb2YgdGhlIGZvdXIgQmF5ZXIg Y29tcG9uZW50IGNvbG9yIGNoYW5uZWxzCgpUaGF0J3MgYSB3ZWlyZCBzcGVsbGluZyBvZiBvZmZz ZXRzLgoKPiArICogd2hpY2ggYXJlIGRlZmF1bHRlZCB0byBSLCBHciwgR2IsIEIuCgpJIHRoaW5r IGl0IHdvdWxkIGJlIHVzZWZ1bCB0byBpbmRpY2F0ZSwgZm9yIGVhY2ggc3RydWN0dXJlLCB3aGF0 IGJsb2NrCml0IGNvcnJlc3BvbmRzIHRvIGluIHRoZSBhc2NpaSBkaWFncmFtIGluIHBhdGNoIDEy LzE2LiBPbiBhIHNpZGUgbm90ZSwKYXQgc29tZSBwb2ludCB0dXJuaW5nIHRoYXQgZGlhZ3JhbSBp bnRvIFNWRyBtYXkgbWFrZSBzZW5zZS4KCj4gKyAqCj4gKyAqIEBoZWFkZXI6IFRoZSBNYWxpLUM1 NSBwYXJhbWV0ZXJzIGJsb2NrIGhlYWRlcgo+ICsgKiBAY2hhbjAwOiBPZmZzZXQgZm9yIGNvbG9y IGNoYW5uZWwgMDAgKGRlZmF1bHQ6IFIpCj4gKyAqIEBjaGFuMDE6IE9mZnNldCBmb3IgY29sb3Ig Y2hhbm5lbCAwMSAoZGVmYXVsdDogR3IpCj4gKyAqIEBjaGFuMTA6IE9mZnNldCBmb3IgY29sb3Ig Y2hhbm5lbCAxMCAoZGVmYXVsdDogR2IpCj4gKyAqIEBjaGFuMTE6IE9mZnNldCBmb3IgY29sb3Ig Y2hhbm5lbCAxMSAoZGVmYXVsdDogQikKPiArICovCj4gK3N0cnVjdCBtYWxpX2M1NV9wYXJhbXNf c2Vuc29yX29mZl9wcmVzaGFkaW5nIHsKPiArCXN0cnVjdCBtYWxpX2M1NV9wYXJhbXNfYmxvY2tf aGVhZGVyIGhlYWRlcjsKPiArCV9fdTMyIGNoYW4wMDsKPiArCV9fdTMyIGNoYW4wMTsKPiArCV9f dTMyIGNoYW4xMDsKPiArCV9fdTMyIGNoYW4xMTsKPiArfTsKPiArCj4gKy8qKgo+ICsgKiBlbnVt IG1hbGlfYzU1X2FleHBfaGlzdF90YXBfcG9pbnRzIC0gVGFwIHBvaW50cyBmb3IgdGhlIEFFWFAg aGlzdG9ncmFtCj4gKyAqIEBNQUxJX0M1NV9BRVhQX0hJU1RfVEFQX1dCOiBBZnRlciBzdGF0aWMg d2hpdGUgYmFsYW5jZQo+ICsgKiBATUFMSV9DNTVfQUVYUF9ISVNUX1RBUF9GUzogQWZ0ZXIgV0RS IEZyYW1lIFN0aXRjaAo+ICsgKiBATUFMSV9DNTVfQUVYUF9ISVNUX1RBUF9UUEc6IEFmdGVyIHRo ZSB0ZXN0IHBhdHRlcm4gZ2VuZXJhdG9yCj4gKyAqLwo+ICtlbnVtIG1hbGlfYzU1X2FleHBfaGlz dF90YXBfcG9pbnRzIHsKPiArCU1BTElfQzU1X0FFWFBfSElTVF9UQVBfV0IgPSAwLAo+ICsJTUFM SV9DNTVfQUVYUF9ISVNUX1RBUF9GUywKPiArCU1BTElfQzU1X0FFWFBfSElTVF9UQVBfVFBHLAo+ ICt9Owo+ICsKPiArLyoqCj4gKyAqIGVudW0gbWFsaV9jNTVfYWV4cF9za2lwX3ggLSBIb3Jpem9u dGFsIHBpeGVsIHNraXBwaW5nCj4gKyAqIEBNQUxJX0M1NV9BRVhQX1NLSVBfWF9FVkVSWV8yTkQ6 IENvbGxlY3QgZXZlcnkgMm5kIHBpeGVsIGhvcml6b250YWxseQo+ICsgKiBATUFMSV9DNTVfQUVY UF9TS0lQX1hfRVZFUllfM1JEOiBDb2xsZWN0IGV2ZXJ5IDNyZCBwaXhlbCBob3Jpem9udGFsbHkK PiArICogQE1BTElfQzU1X0FFWFBfU0tJUF9YX0VWRVJZXzRUSDogQ29sbGVjdCBldmVyeSA0dGgg cGl4ZWwgaG9yaXpvbnRhbGx5Cj4gKyAqIEBNQUxJX0M1NV9BRVhQX1NLSVBfWF9FVkVSWV81VEg6 IENvbGxlY3QgZXZlcnkgNXRoIHBpeGVsIGhvcml6b250YWxseQo+ICsgKiBATUFMSV9DNTVfQUVY UF9TS0lQX1hfRVZFUllfOFRIOiBDb2xsZWN0IGV2ZXJ5IDh0aCBwaXhlbCBob3Jpem9udGFsbHkK PiArICogQE1BTElfQzU1X0FFWFBfU0tJUF9YX0VWRVJZXzlUSDogQ29sbGVjdCBldmVyeSA5dGgg cGl4ZWwgaG9yaXpvbnRhbGx5Cj4gKyAqLwo+ICtlbnVtIG1hbGlfYzU1X2FleHBfc2tpcF94IHsK PiArCU1BTElfQzU1X0FFWFBfU0tJUF9YX0VWRVJZXzJORCwKPiArCU1BTElfQzU1X0FFWFBfU0tJ UF9YX0VWRVJZXzNSRCwKPiArCU1BTElfQzU1X0FFWFBfU0tJUF9YX0VWRVJZXzRUSCwKPiArCU1B TElfQzU1X0FFWFBfU0tJUF9YX0VWRVJZXzVUSCwKPiArCU1BTElfQzU1X0FFWFBfU0tJUF9YX0VW RVJZXzhUSCwKPiArCU1BTElfQzU1X0FFWFBfU0tJUF9YX0VWRVJZXzlUSAo+ICt9OwoKRG9lcyB0 aGlzIG1lYW4gdGhhdCB0aGF0IHRoZSBoaXN0b2dyYW0gY2FuJ3Qgb3BlcmF0ZSBvbiBldmVyeSBw aXhlbHMsCmJ1dCB3aWxsIGFsd2F5cyBza2lwIGF0IGxlYXN0IGV2ZXJ5IG90aGVyIHBpeGVsID8K Cj4gKwo+ICsvKioKPiArICogZW51bSBtYWxpX2M1NV9hZXhwX3NraXBfeSAtIFZlcnRpY2FsIHBp eGVsIHNraXBwaW5nCj4gKyAqIEBNQUxJX0M1NV9BRVhQX1NLSVBfWV9BTEw6IENvbGxlY3QgZXZl cnkgc2luZ2xlIHBpeGVsIHZlcnRpY2FsbHkKPiArICogQE1BTElfQzU1X0FFWFBfU0tJUF9ZX0VW RVJZXzJORDogQ29sbGVjdCBldmVyeSAybmQgcGl4ZWwgdmVydGljYWxseQo+ICsgKiBATUFMSV9D NTVfQUVYUF9TS0lQX1lfRVZFUllfM1JEOiBDb2xsZWN0IGV2ZXJ5IDNyZCBwaXhlbCB2ZXJ0aWNh bGx5Cj4gKyAqIEBNQUxJX0M1NV9BRVhQX1NLSVBfWV9FVkVSWV80VEg6IENvbGxlY3QgZXZlcnkg NHRoIHBpeGVsIHZlcnRpY2FsbHkKPiArICogQE1BTElfQzU1X0FFWFBfU0tJUF9ZX0VWRVJZXzVU SDogQ29sbGVjdCBldmVyeSA1dGggcGl4ZWwgdmVydGljYWxseQo+ICsgKiBATUFMSV9DNTVfQUVY UF9TS0lQX1lfRVZFUllfOFRIOiBDb2xsZWN0IGV2ZXJ5IDh0aCBwaXhlbCB2ZXJ0aWNhbGx5Cj4g KyAqIEBNQUxJX0M1NV9BRVhQX1NLSVBfWV9FVkVSWV85VEg6IENvbGxlY3QgZXZlcnkgOXRoIHBp eGVsIHZlcnRpY2FsbHkKPiArICovCj4gK2VudW0gbWFsaV9jNTVfYWV4cF9za2lwX3kgewo+ICsJ TUFMSV9DNTVfQUVYUF9TS0lQX1lfQUxMLAo+ICsJTUFMSV9DNTVfQUVYUF9TS0lQX1lfRVZFUllf Mk5ELAo+ICsJTUFMSV9DNTVfQUVYUF9TS0lQX1lfRVZFUllfM1JELAo+ICsJTUFMSV9DNTVfQUVY UF9TS0lQX1lfRVZFUllfNFRILAo+ICsJTUFMSV9DNTVfQUVYUF9TS0lQX1lfRVZFUllfNVRILAo+ ICsJTUFMSV9DNTVfQUVYUF9TS0lQX1lfRVZFUllfOFRILAo+ICsJTUFMSV9DNTVfQUVYUF9TS0lQ X1lfRVZFUllfOVRICj4gK307Cj4gKwo+ICsvKioKPiArICogZW51bSBtYWxpX2M1NV9hZXhwX3Jv d19jb2x1bW5fb2Zmc2V0IC0gU3RhcnQgZnJvbSB0aGUgZmlyc3Qgb3Igc2Vjb25kIHJvdyBvcgo+ ICsgKgkJCQkJICBjb2x1bW4KPiArICogQE1BTElfQzU1X0FFWFBfRklSU1RfUk9XX09SX0NPTDoJ U3RhcnQgZnJvbSB0aGUgZmlyc3Qgcm93IC8gY29sdW1uCj4gKyAqIEBNQUxJX0M1NV9BRVhQX1NF Q09ORF9ST1dfT1JfQ09MOglTdGFydCBmcm9tIHRoZSBzZWNvbmQgcm93IC8gY29sdW1uCj4gKyAq Lwo+ICtlbnVtIG1hbGlfYzU1X2FleHBfcm93X2NvbHVtbl9vZmZzZXQgewo+ICsJTUFMSV9DNTVf QUVYUF9GSVJTVF9ST1dfT1JfQ09MID0gMSwKPiArCU1BTElfQzU1X0FFWFBfU0VDT05EX1JPV19P Ul9DT0wgPSAyLAo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGVudW0gbWFsaV9jNTVfYWV4cF9oaXN0 X3BsYW5lX21vZGUgLSBNb2RlIGZvciB0aGUgQUVYUCBIaXN0b2dyYW1zCgpBcyBoaXN0b2dyYW1z IGFyZSBjb21wdXRlZCBvbiBiYXllciBkYXRhLCBJJ2QgdGFsayBhYm91dCAiY29tcG9uZW50Igpp bnN0ZWFkIG9mICJwbGFuZSIgaGVyZSwgdW5sZXNzIHRoZSB3b3JkIHBsYW5lIG1hdGNoZXMgZG9j dW1lbnRhdGlvbi4KCj4gKyAqIEBNQUxJX0M1NV9BRVhQX0hJU1RfQ09NQklORUQ6IEFsbCBjb2xv ciBwbGFuZXMgaW4gb25lIDEwMjQtYmluIGhpc3RvZ3JhbQo+ICsgKiBATUFMSV9DNTVfQUVYUF9I SVNUX1NFUEFSQVRFOiBFYWNoIGNvbG9yIHBsYW5lIGluIG9uZSAyNTYtYmluIGhpc3RvZ3JhbSB3 aXRoIGEgYmluIHdpZHRoIG9mIDE2Cj4gKyAqIEBNQUxJX0M1NV9BRVhQX0hJU1RfRk9DVVNfMDA6 IFRvcCBsZWZ0IHBsYW5lIGluIHRoZSBmaXJzdCBiYW5rLCByZXN0IGluIHNlY29uZCBiYW5rCj4g KyAqIEBNQUxJX0M1NV9BRVhQX0hJU1RfRk9DVVNfMDE6IFRvcCByaWdodCBwbGFuZSBpbiB0aGUg Zmlyc3QgYmFuaywgcmVzdCBpbiBzZWNvbmQgYmFuawo+ICsgKiBATUFMSV9DNTVfQUVYUF9ISVNU X0ZPQ1VTXzEwOiBCb3R0b20gbGVmdCBwbGFuZSBpbiB0aGUgZmlyc3QgYmFuaywgcmVzdCBpbiBz ZWNvbmQgYmFuawo+ICsgKiBATUFMSV9DNTVfQUVYUF9ISVNUX0ZPQ1VTXzExOiBCb3R0b20gcmln aHQgcGxhbmUgaW4gdGhlIGZpcnN0IGJhbmssIHJlc3QgaW4gc2Vjb25kIGJhbmsKPiArICoKPiAr ICogSW4gdGhlICJmb2N1cyIgbW9kZXMgc3RhdGlzdGljcyBhcmUgY29sbGVjdGVkIGludG8gdHdv IDUxMi1iaW4gaGlzdG9ncmFtcwo+ICsgKiB3aXRoIGEgYmluIHdpZHRoIG9mIDguIE9uZSBjb2xv dXIgcGxhbmUgaXMgaW4gdGhlIGZpcnN0IGhpc3RvZ3JhbSB3aXRoIHRoZQo+ICsgKiByZW1haW5k ZXIgY29tYmluZWQgaW50byB0aGUgc2Vjb25kLiBUaGUgZm91ciBvcHRpb25zIHJlcHJlc2VudCB3 aGljaCBvZiB0aGUKPiArICogZm91ciBwb3NpdGlvbnMgaW4gYSBiYXllciBwYXR0ZXJuIGFyZSB0 aGUgZm9jdXNlZCBwbGFuZS4KCkhvdyBkb2VzIHRoYXQgd29yayB3aXRoIHgveSBza2lwcGluZyA/ IElzIHNraXBwaW5nIHRoZW4gYXBwbGllZCB0byAyeDIKYmxvY2tzLCBvciBzdGlsbCB0byBwaXhl bHMgPwoKPiArICovCj4gK2VudW0gbWFsaV9jNTVfYWV4cF9oaXN0X3BsYW5lX21vZGUgewo+ICsJ TUFMSV9DNTVfQUVYUF9ISVNUX0NPTUJJTkVEID0gMCwKPiArCU1BTElfQzU1X0FFWFBfSElTVF9T RVBBUkFURSA9IDEsCj4gKwlNQUxJX0M1NV9BRVhQX0hJU1RfRk9DVVNfMDAgPSA0LAo+ICsJTUFM SV9DNTVfQUVYUF9ISVNUX0ZPQ1VTXzAxID0gNSwKPiArCU1BTElfQzU1X0FFWFBfSElTVF9GT0NV U18xMCA9IDYsCj4gKwlNQUxJX0M1NV9BRVhQX0hJU1RfRk9DVVNfMTEgPSA3LAo+ICt9Owo+ICsK PiArLyoqCj4gKyAqIHN0cnVjdCBtYWxpX2M1NV9wYXJhbXNfYWV4cF9oaXN0IC0gY29uZmlndXJh dGlvbiBmb3IgQUVYUCBtZXRlcmluZyBoaXN0cwo+ICsgKgo+ICsgKiBUaGlzIHN0cnVjdCBhbGxv d3MgdXNlcnMgdG8gY29uZmlndXJlIHRoZSAxMDI0LWJpbiBBRVhQIGhpc3RvZ3JhbXMuIEJyb2Fk bHkKPiArICogc3BlYWtpbmcgdGhlIHBhcmFtZXRlcnMgYWxsb3cgeW91IHRvIG1hc2sgcGFydGlj dWxhciByZWdpb25zIG9mIHRoZSBpbWFnZSBhbmQKPiArICogdG8gc2VsZWN0IGRpZmZlcmVudCBr aW5kcyBvZiBoaXN0b2dyYW0uCj4gKyAqCj4gKyAqIEBoZWFkZXI6CQlUaGUgTWFsaS1DNTUgcGFy YW1ldGVycyBibG9jayBoZWFkZXIKPiArICogQHNraXBfeDoJCUhvcml6b250YWwgZGVjaW1hdGlv bi4gU2VlIGVudW0gbWFsaV9jNTVfYWV4cF9za2lwX3gKPiArICogQG9mZnNldF94OgkJQ29sdW1u IHRvIHN0YXJ0IGZyb20uIFNlZSBlbnVtIG1hbGlfYzU1X2FleHBfcm93X2NvbHVtbl9vZmZzZXQK PiArICogQHNraXBfeToJCVZlcnRpY2FsIGRlY2ltYXRpb24uIFNlZSBlbnVtIG1hbGlfYzU1X2Fl eHBfc2tpcF95Cj4gKyAqIEBvZmZzZXRfeToJCVJvdyB0byBzdGFydCBmcm9tLiBTZWUgZW51bSBt YWxpX2M1NV9hZXhwX3Jvd19jb2x1bW5fb2Zmc2V0CgpEbyB0aGUgb2Zmc2V0cyBuZWVkIHRvIGJl IG11bHRpcGxlcyBvZiAyID8KCj4gKyAqIEBzY2FsZV9ib3R0b206CXNjYWxlIG9mIGJvdHRvbSBo YWxmIG9mIHJhbmdlOiAwPTF4ICwxPTJ4LCAyPTR4LCA0PTh4LCA0PTE2eAoKQ291bGQgeW91IGVs YWJvcmF0ZSBvbiB0aGlzID8KCj4gKyAqIEBzY2FsZV90b3A6CQlzY2FsZSBvZiB0b3AgaGFsZiBv ZiByYW5nZTogMD0xeCAsMT0yeCwgMj00eCwgND04eCwgND0xNngKPiArICogQHBsYW5lX21vZGU6 CQlQbGFuZSBzZXBhcmF0aW9uIG1vZGUuIFNlZSBlbnVtIG1hbGlfYzU1X2FleHBfaGlzdF9wbGFu ZV9tb2RlCj4gKyAqIEB0YXBfcG9pbnQ6CQlUYXAgcG9pbnQgZm9yIGhpc3RvZ3JhbSBmcm9tIGVu dW0gbWFsaV9jNTVfYWV4cF9oaXN0X3RhcF9wb2ludHMuCj4gKyAqCQkJVGhpcyBwYXJhbWV0ZXIg aXMgdW51c2VkIGZvciB0aGUgcG9zdC1JcmlkaXggSGlzdG9ncmFtCj4gKyAqLwo+ICtzdHJ1Y3Qg bWFsaV9jNTVfcGFyYW1zX2FleHBfaGlzdCB7Cj4gKwlzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2Js b2NrX2hlYWRlciBoZWFkZXI7Cj4gKwlfX3U4IHNraXBfeDsKPiArCV9fdTggb2Zmc2V0X3g7Cj4g KwlfX3U4IHNraXBfeTsKPiArCV9fdTggb2Zmc2V0X3k7Cj4gKwlfX3U4IHNjYWxlX2JvdHRvbTsK PiArCV9fdTggc2NhbGVfdG9wOwo+ICsJX191OCBwbGFuZV9tb2RlOwo+ICsJX191OCB0YXBfcG9p bnQ7Cj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IG1hbGlfYzU1X3BhcmFtc19hZXhwX3dl aWdodHMgLSBBcnJheSBvZiB3ZWlnaHRzIGZvciBBRVhQIG1ldGVyaW5nCj4gKyAqCj4gKyAqIFRo aXMgc3RydWN0IGFsbG93cyB1c2VycyB0byBjb25maWd1cmUgdGhlIHdlaWdodGluZyBmb3IgYm90 aCBvZiB0aGUgMTAyNC1iaW4KPiArICogQUVYUCBoaXN0b2dyYW1zLiBUaGUgcGl4ZWwgZGF0YSBj b2xsZWN0ZWQgZm9yIGVhY2ggem9uZSBpcyBtdWx0aXBsaWVkIGJ5IHRoZQo+ICsgKiBjb3JyZXNw b25kaW5nIHdlaWdodCBmcm9tIHRoaXMgYXJyYXksIHdoaWNoIG1heSBiZSB6ZXJvIGlmIHRoZSBp bnRlbnRpb24gaXMKPiArICogdG8gbWFzayBvZmYgdGhlIHpvbmUgZW50aXJlbHkuCj4gKyAqCj4g KyAqIEBoZWFkZXI6CQlUaGUgTWFsaS1DNTUgcGFyYW1ldGVycyBibG9jayBoZWFkZXIKPiArICog QG5vZGVzX3VzZWRfaG9yaXo6CU51bWJlciBvZiBhY3RpdmUgem9uZXMgaG9yaXpvbnRhbGx5IFsw Li4xNV0KPiArICogQG5vZGVzX3VzZWRfdmVydDoJTnVtYmVyIG9mIGFjdGl2ZSB6b25lcyB2ZXJ0 aWNhbGx5IFswLi4xNV0KCklzIHRoZSBpbWFnZSBhdXRvbWF0aWNhbGx5IHNwbGl0IGluIHRoZSBu dW1iZXIgb2Ygem9uZXMgd2l0aCBhIHVuaWZvcm0KZGlzdHJpYnV0aW9uID8KCldoYXQgaGFwcGVu cyBpZiB0aGUgbnVtYmVyIG9mIHpvbmVzIGlzIDAgPwoKPiArICogQHpvbmVfd2VpZ2h0czoJWm9u ZSB3ZWlnaHRpbmcuIEluZGV4IGlzIHJvdypjb2wgd2hlcmUgMCwwIGlzIHRoZSB0b3AKPiArICog CQkJbGVmdCB6b25lIGNvbnRpbnVpbmcgaW4gcmFzdGVyIG9yZGVyLiBFYWNoIHpvbmUgY2FuIGJl Cj4gKyAqCQkJd2VpZ2h0ZWQgaW4gdGhlIHJhbmdlIFswLi4xNV0uIFRoZSBudW1iZXIgb2Ygcm93 cyBhbmQKPiArICoJCQljb2x1bW5zIGlzIGRlZmluZWQgYnkgQG5vZGVzX3VzZWRfdmVydCBhbmQK PiArICoJCQlAbm9kZXNfdXNlZF9ob3Jpego+ICsgKi8KPiArc3RydWN0IG1hbGlfYzU1X3BhcmFt c19hZXhwX3dlaWdodHMgewo+ICsJc3RydWN0IG1hbGlfYzU1X3BhcmFtc19ibG9ja19oZWFkZXIg aGVhZGVyOwo+ICsJX191OCBub2Rlc191c2VkX2hvcml6Owo+ICsJX191OCBub2Rlc191c2VkX3Zl cnQ7Cj4gKwlfX3U4IHpvbmVfd2VpZ2h0c1tNQUxJX0M1NV9NQVhfWk9ORVNdOwo+ICt9Owo+ICsK PiArLyoqCj4gKyAqIHN0cnVjdCBtYWxpX2M1NV9wYXJhbXNfZGlnaXRhbF9nYWluIC0gRGlnaXRh bCBnYWluIHZhbHVlCj4gKyAqCj4gKyAqIFRoaXMgc3RydWN0IGNhcnJpZXMgYSBkaWdpdGFsIGdh aW4gdmFsdWUgdG8gc2V0IGluIHRoZSBJU1AKPiArICoKPiArICogQGhlYWRlcjoJVGhlIE1hbGkt QzU1IHBhcmFtZXRlcnMgYmxvY2sgaGVhZGVyCj4gKyAqIEBnYWluOglUaGUgZGlnaXRhbCBnYWlu IHZhbHVlIHRvIGFwcGx5LCBpbiBRNS44IGZvcm1hdC4KPiArICovCj4gK3N0cnVjdCBtYWxpX2M1 NV9wYXJhbXNfZGlnaXRhbF9nYWluIHsKPiArCXN0cnVjdCBtYWxpX2M1NV9wYXJhbXNfYmxvY2tf aGVhZGVyIGhlYWRlcjsKPiArCV9fdTE2IGdhaW47Cj4gK307Cj4gKwo+ICsvKioKPiArICogZW51 bSBtYWxpX2M1NV9hd2Jfc3RhdHNfbW9kZSAtIFN0YXRpc3RpY3MgbW9kZSBmb3IgQVdCCj4gKyAq IEBNQUxJX0M1NV9BV0JfTU9ERV9HUkJSOiBTdGF0aXN0aWNzIGNvbGxlY3RlZCBhcyBHcmVlbi9S ZWQgYW5kIEJsdWUvUmVkIHJhdGlvcwo+ICsgKiBATUFMSV9DNTVfQVdCX01PREVfUkdCRzogU3Rh dGlzdGljcyBjb2xsZWN0ZWQgYXMgUmVkL0dyZWVuIGFuZCBCbHVlL0dyZWVuIHJhdGlvcwo+ICsg Ki8KPiArZW51bSBtYWxpX2M1NV9hd2Jfc3RhdHNfbW9kZSB7Cj4gKyAgICAgICBNQUxJX0M1NV9B V0JfTU9ERV9HUkJSID0gMCwKPiArICAgICAgIE1BTElfQzU1X0FXQl9NT0RFX1JHQkcsCj4gK307 Cj4gKwo+ICsvKioKPiArICogc3RydWN0IG1hbGlfYzU1X3BhcmFtc19hd2JfZ2FpbnMgLSBHYWlu IHNldHRpbmdzIGZvciBhdXRvIHdoaXRlIGJhbGFuY2UKPiArICoKPiArICogVGhpcyBzdHJ1Y3Qg YWxsb3dzIHVzZXJzIHRvIGNvbmZpZ3VyZSB0aGUgZ2FpbnMgZm9yIGF1dG8td2hpdGUgYmFsYW5j ZS4gVGhlcmUKPiArICogYXJlIGZvdXIgZ2FpbiBzZXR0aW5ncyBjb3JyZXNwb25kaW5nIHRvIGVh Y2ggY29sb3VyIGNoYW5uZWwgaW4gdGhlIGJheWVyCj4gKyAqIGRvbWFpbi4gQWx0aG91Z2ggbmFt ZWQgZ2VuZXJpY2FsbHksIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBnYWluIGFwcGxpZWQK PiArICogYW5kIHRoZSBjb2xvdXIgY2hhbm5lbCBpcyBkb25lIGF1dG9tYXRpY2FsbHkgd2l0aGlu IHRoZSBJU1AgZGVwZW5kaW5nIG9uIHRoZQo+ICsgKiBpbnB1dCBmb3JtYXQsIGFuZCBzbyB0aGUg Zm9sbG93aW5nIG1hcHBpbmcgYWx3YXlzIGhvbGRzIHRydWU6Ogo+ICsgKgo+ICsgKglnYWluMDAg PSBSCj4gKyAqCWdhaW4wMSA9IEdyCj4gKyAqCWdhaW4xMCA9IEdiCj4gKyAqCWdhaW4xMSA9IEIK CkhvdyBhYm91dCBuYW1pbmcgdGhlbSBhY2NvcmRpbmdseSB0aGVuID8gOi0pCgo+ICsgKgo+ICsg KiBBbGwgb2YgdGhlIGdhaW5zIGFyZSBzdG9yZWQgaW4gUTQuOCBmb3JtYXQuCj4gKyAqCj4gKyAq IEBoZWFkZXI6CVRoZSBNYWxpLUM1NSBwYXJhbWV0ZXJzIGJsb2NrIGhlYWRlcgo+ICsgKiBAZ2Fp bjAwOglNdWx0aXBsaWVyIGZvciBjb2xvdXIgY2hhbm5lbCAwMAo+ICsgKiBAZ2FpbjAxOglNdWx0 aXBsaWVyIGZvciBjb2xvdXIgY2hhbm5lbCAwMQo+ICsgKiBAZ2FpbjEwOglNdWx0aXBsaWVyIGZv ciBjb2xvdXIgY2hhbm5lbCAxMAo+ICsgKiBAZ2FpbjExOglNdWx0aXBsaWVyIGZvciBjb2xvdXIg Y2hhbm5lbCAxMQo+ICsgKi8KPiArc3RydWN0IG1hbGlfYzU1X3BhcmFtc19hd2JfZ2FpbnMgewo+ ICsJc3RydWN0IG1hbGlfYzU1X3BhcmFtc19ibG9ja19oZWFkZXIgaGVhZGVyOwo+ICsJX191MTYg Z2FpbjAwOwo+ICsJX191MTYgZ2FpbjAxOwo+ICsJX191MTYgZ2FpbjEwOwo+ICsJX191MTYgZ2Fp bjExOwo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGVudW0gbWFsaV9jNTVfcGFyYW1zX2F3Yl90YXBf cG9pbnRzIC0gVGFwIHBvaW50cyBmb3IgdGhlIEFXQiBzdGF0aXN0aWNzCj4gKyAqIEBNQUxJX0M1 NV9BV0JfU1RBVFNfVEFQX1BGOiBJbW1lZGlhdGVseSBhZnRlciB0aGUgUHVycGxlIEZyaW5nZSBi bG9jawo+ICsgKiBATUFMSV9DNTVfQVdCX1NUQVRTX1RBUF9DTlI6IEltbWVkaWF0ZWx5IGFmdGVy IHRoZSBDTlIgYmxvY2sKPiArICovCj4gK2VudW0gbWFsaV9jNTVfcGFyYW1zX2F3Yl90YXBfcG9p bnRzIHsKPiArCU1BTElfQzU1X0FXQl9TVEFUU19UQVBfUEYgPSAwLAo+ICsJTUFMSV9DNTVfQVdC X1NUQVRTX1RBUF9DTlIsCj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IG1hbGlfYzU1X3Bh cmFtc19hd2JfY29uZmlnIC0gU3RhdHMgc2V0dGluZ3MgZm9yIGF1dG8td2hpdGUgYmFsYW5jZQo+ ICsgKgo+ICsgKiBUaGlzIHN0cnVjdCBhbGxvd3MgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHN0 YXRpc3RpY3MgZ2VuZXJhdGVkIGZvciBhdXRvCj4gKyAqIHdoaXRlIGJhbGFuY2UuIFBpeGVsIGlu dGVuc2l0eSBsaW1pdHMgY2FuIGJlIHNldCB0byBleGNsdWRlIG92ZXJseSBicmlnaHQgb3IKPiAr ICogZGFyayByZWdpb25zIG9mIGFuIGltYWdlIGZyb20gdGhlIHN0YXRpc3RpY3MgZW50aXJlbHku IENvbG91ciByYXRpbyBtaW5pbWEKPiArICogYW5kIG1heGltYSBjYW4gYmUgc2V0IHRvIGRpc2Nv dW50IHBpeGVscyB3aG8ncyByYXRpb3MgZmFsbCBvdXRzaWRlIHRoZQo+ICsgKiBkZWZpbmVkIGJv dW5kYXJpZXM7IHRoZXJlIGFyZSB0d28gc2V0cyBvZiByZWdpc3RlcnMgdG8gZG8gdGhpcyAtIHRo ZQo+ICsgKiAibWluL21heCIgcmF0aW9zIHdoaWNoIGJvdW5kIGEgcmVnaW9uIGFuZCB0aGUgImhp Z2gvbG93IiByYXRpb3Mgd2hpY2ggZnVydGhlcgo+ICsgKiB0cmltIHRoZSB1cHBlciBhbmQgbG93 ZXIgcmF0aW9zLiBGb3IgZXhhbXBsZSB3aXRoIHRoZSBib3VuZGFyaWVzIGNvbmZpZ3VyZWQKPiAr ICogYXMgZm9sbG93cywgb25seSBwaXhlbHMgd2hvcyBjb2xvdXIgcmF0aW9zIGZhbGxzIGludG8g dGhlIHJlZ2lvbiBtYXJrZWQgIkEiCj4gKyAqIHdvdWxkIGJlIGNvdW50ZWQ6Ogo+ICsgKgo+ICsg KgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY3JfaGlnaAo+ICsgKgkgICAgMi4wIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8Cj4gKyAqCSAgICAgICAgfCAgICAgICAgICAgICAgIGNiX21h eCAtLT4gX19fX19fX19fX19fX19fX19fX19fX19fX3ZfX19fXwo+ICsgKgkgICAgMS44IHwgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBcICAgIHwKPiAr ICoJICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAg ICAgICAgIFwgICB8Cj4gKyAqCSAgICAxLjYgfCAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg ICAgICAgICAgICAgICAgICAgICAgICAgXCAgfAo+ICsgKgkgICAgICAgIHwgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIHwKPiArICoJIGMgIDEu NCB8ICAgICAgICAgICAgICAgY2JfbG93IC0tPnxcICAgICAgICAgICAgICBBICAgICAgICAgICAg IFx8PC0tICBjYl9oaWdoCj4gKyAqCSBiICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8 IFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ICsgKgkgICAgMS4yIHwgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKPiArICoJIHIg ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBcICAgICAgICAgICAgICAgICAgICAg ICAgICB8Cj4gKyAqCSBhICAxLjAgfCAgICAgICAgICAgICAgY2JfbWluIC0tPiB8X19fX1xfX19f X19fX19fX19fX19fX19fX19fX19ffAo+ICsgKgkgdCAgICAgIHwgICAgICAgICAgICAgICAgICAg ICAgICAgXiAgICBeICAgICAgICAgICAgICAgICAgICAgICAgIF4KPiArICoJIGkgIDAuOCB8ICAg ICAgICAgICAgICAgICAgICAgICAgIHwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4g KyAqCSBvICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBjcl9taW4gIHwgICAgICAgICAgICAg ICAgICAgICAgIGNyX21heAo+ICsgKgkgcyAgMC42IHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8Cj4gKyAqCSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JfbG93 Cj4gKyAqCSAgICAwLjQgfAo+ICsgKgkgICAgICAgIHwKPiArICoJICAgIDAuMiB8Cj4gKyAqCSAg ICAgICAgfAo+ICsgKgkgICAgMC4wIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiArICoJICAgICAgICAwLjAgICAwLjIgICAw LjQgICAwLjYgICAwLjggICAxLjAgICAxLjIgICAxLjQgICAxLjYgICAxLjggICAyLjAKPiArICoJ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjciByYXRpb3MKPiArICoKPiArICog QGhlYWRlcjoJCVRoZSBNYWxpLUM1NSBwYXJhbWV0ZXJzIGJsb2NrIGhlYWRlcgo+ICsgKiBAdGFw X3BvaW50OgkJVGhlIHRhcCBwb2ludCBmcm9tIGVudW0gbWFsaV9jNTVfcGFyYW1zX2F3Yl90YXBf cG9pbnRzCj4gKyAqIEBzdGF0c19tb2RlOgkJQVdCIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBtb2Rl LCBzZWUgOmM6dHlwZTpgbWFsaV9jNTVfYXdiX3N0YXRzX21vZGVgCj4gKyAqIEB3aGl0ZV9sZXZl bDoJVXBwZXIgcGl4ZWwgaW50ZW5zaXR5IChJLkUuIHJhdyBwaXhlbCB2YWx1ZXMpIGxpbWl0Cj4g KyAqIEBibGFja19sZXZlbDoJTG93ZXIgcGl4ZWwgaW50ZW5zaXR5IChJLkUuIHJhdyBwaXhlbCB2 YWx1ZXMpIGxpbWl0Cj4gKyAqIEBjcl9tYXg6CQlNYXhpbXVtIFIvRyByYXRpbyAoUTQuOCBmb3Jt YXQpCj4gKyAqIEBjcl9taW46CQlNaW5pbXVtIFIvRyByYXRpbyAoUTQuOCBmb3JtYXQpCj4gKyAq IEBjYl9tYXg6CQlNYXhpbXVtIEIvRyByYXRpbyAoUTQuOCBmb3JtYXQpCj4gKyAqIEBjYl9taW46 CQlNaW5pbXVtIEIvRyByYXRpbyAoUTQuOCBmb3JtYXQpCj4gKyAqIEBub2Rlc191c2VkX2hvcml6 OglOdW1iZXIgb2YgYWN0aXZlIHpvbmVzIGhvcml6b250YWxseSBbMC4uMTVdCj4gKyAqIEBub2Rl c191c2VkX3ZlcnQ6CU51bWJlciBvZiBhY3RpdmUgem9uZXMgdmVydGljYWxseSBbMC4uMTVdCj4g KyAqIEBjcl9oaWdoOgkJUi9HIHJhdGlvIHRyaW0gaGlnaCAoUTQuOCBmb3JtYXQpCj4gKyAqIEBj cl9sb3c6CQlSL0cgcmF0aW8gdHJpbSBsb3cgKFE0LjggZm9ybWF0KQo+ICsgKiBAY2JfaGlnaDoJ CUIvRyByYXRpbyB0cmltIGhpZ2ggKFE0LjggZm9ybWF0KQo+ICsgKiBAY2JfbG93OgkJQi9HIHJh dGlvIHRyaW0gbG93IChRNC44IGZvcm1hdCkKPiArICovCj4gK3N0cnVjdCBtYWxpX2M1NV9wYXJh bXNfYXdiX2NvbmZpZyB7Cj4gKwlzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2Jsb2NrX2hlYWRlciBo ZWFkZXI7Cj4gKwlfX3U4IHRhcF9wb2ludDsKPiArCV9fdTggc3RhdHNfbW9kZTsKPiArCV9fdTE2 IHdoaXRlX2xldmVsOwo+ICsJX191MTYgYmxhY2tfbGV2ZWw7Cj4gKwlfX3UxNiBjcl9tYXg7Cj4g KwlfX3UxNiBjcl9taW47Cj4gKwlfX3UxNiBjYl9tYXg7Cj4gKwlfX3UxNiBjYl9taW47Cj4gKwlf X3U4IG5vZGVzX3VzZWRfaG9yaXo7Cj4gKwlfX3U4IG5vZGVzX3VzZWRfdmVydDsKPiArCV9fdTE2 IGNyX2hpZ2g7Cj4gKwlfX3UxNiBjcl9sb3c7Cj4gKwlfX3UxNiBjYl9oaWdoOwo+ICsJX191MTYg Y2JfbG93Owo+ICt9Owo+ICsKPiArI2RlZmluZSBNQUxJX0M1NV9OVU1fTUVTSF9TSEFESU5HX0VM RU1FTlRTIDMwNzIKPiArCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX21lc2hf c2hhZGluZ19jb25maWcgLSBNZXNoIHNoYWRpbmcgY29uZmlndXJhdGlvbgo+ICsgKgo+ICsgKiBU aGUgbWVzaCBzaGFkaW5nIGNvcnJlY3Rpb24gbW9kdWxlIGFsbG93cyBwcm9ncmFtbWluZyBhIHNl cGFyYXRlIHRhYmxlIG9mCj4gKyAqIGVpdGhlciAxNngxNiBvciAzMngzMiBub2RlIGNvZWZmaWNp ZW50cyBmb3IgMyBkaWZmZXJlbnQgbGlnaHQgc291cmNlcy4gVGhlCj4gKyAqIGZpbmFsIGNvcnJl Y3Rpb24gY29lZmZpY2llbnRzIGFwcGxpZWQgYXJlIGNvbXB1dGVkIGJ5IGJsZW5kaW5nIHRoZQo+ ICsgKiBjb2VmZmljaWVudHMgZnJvbSB0d28gdGFibGVzIHRvZ2V0aGVyLgo+ICsgKgo+ICsgKiBB IHBhZ2Ugb2YgMTAyNCAzMi1iaXQgaW50ZWdlcnMgaXMgYXNzb2NpYXRlZCB0byBlYWNoIGNvbG91 ciBjaGFubmVsLCB3aXRoCj4gKyAqIHBhZ2VzIHN0b3JlZCBjb25zZWN1dGl2ZWx5IGluIG1lbW9y eS4gRWFjaCAzMi1iaXQgaW50ZWdlciBwYWNrcyAzIDgtYml0Cj4gKyAqIGNvcnJlY3Rpb24gY29l ZmZpY2llbnRzIGZvciBhIHNpbmdsZSBub2RlLCBvbmUgZm9yIGVhY2ggb2YgdGhlIHRocmVlIGxp Z2h0Cj4gKyAqIHNvdXJjZXMuIFRoZSA4IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgdW51c2Vk LiBUaGUgZm9sbG93aW5nIHRhYmxlCj4gKyAqIGRlc2NyaWJlcyB0aGUgbGF5b3V0OjoKPiArICoK PiArICoJKy0tLS0tLS0tLS0tIFBhZ2UgKENvbG91ciBQbGFuZSkgMCAtLS0tLS0tLS0tLS0tKwo+ ICsgKgl8IEBtZXNoW2ldICB8IE1lc2ggUG9pbnQgfCBCaXRzICB8IExpZ2h0IFNvdXJjZSB8Cj4g KyAqCSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKPiAr ICoJfCAgICAgICAgIDAgfCAgICAgICAgMCwwIHwgMTYsMjMgfCBMUzIgICAgICAgICAgfAo+ICsg Kgl8ICAgICAgICAgICB8ICAgICAgICAgICAgfCAwOC0xNSB8IExTMSAgICAgICAgICB8Cj4gKyAq CXwgICAgICAgICAgIHwgICAgICAgICAgICB8IDAwLTA3IHwgTFMwICAgICAgICAgIHwKPiArICoJ Ky0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwo+ICsgKgl8 ICAgICAgICAgMSB8ICAgICAgICAwLDEgfCAxNiwyMyB8IExTMiAgICAgICAgICB8Cj4gKyAqCXwg ICAgICAgICAgIHwgICAgICAgICAgICB8IDA4LTE1IHwgTFMxICAgICAgICAgIHwKPiArICoJfCAg ICAgICAgICAgfCAgICAgICAgICAgIHwgMDAtMDcgfCBMUzAgICAgICAgICAgfAo+ICsgKgkrLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCj4gKyAqCXwgICAg ICAgLi4uIHwgICAgICAgIC4uLiB8IC4uLiAgIHwgLi4uICAgICAgICAgIHwKPiArICoJKy0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwo+ICsgKgl8ICAgICAg MTAyMyB8ICAgICAgMzEsMzEgfCAxNiwyMyB8IExTMiAgICAgICAgICB8Cj4gKyAqCXwgICAgICAg ICAgIHwgICAgICAgICAgICB8IDA4LTE1IHwgTFMxICAgICAgICAgIHwKPiArICoJfCAgICAgICAg ICAgfCAgICAgICAgICAgIHwgMDAtMDcgfCBMUzAgICAgICAgICAgfAo+ICsgKgkrLS0tLS0tLS0t LS0gUGFnZSAoQ29sb3VyIFBsYW5lKSAxIC0tLS0tLS0tLS0tLS0rCj4gKyAqCXwgQG1lc2hbaV0g IHwgTWVzaCBQb2ludCB8IEJpdHMgIHwgTGlnaHQgU291cmNlIHwKPiArICoJKy0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwo+ICsgKgl8ICAgICAgMTAyNCB8 ICAgICAgICAwLDAgfCAxNiwyMyB8IExTMiAgICAgICAgICB8Cj4gKyAqCXwgICAgICAgICAgIHwg ICAgICAgICAgICB8IDA4LTE1IHwgTFMxICAgICAgICAgIHwKPiArICoJfCAgICAgICAgICAgfCAg ICAgICAgICAgIHwgMDAtMDcgfCBMUzAgICAgICAgICAgfAo+ICsgKgkrLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCj4gKyAqCXwgICAgICAxMDI1IHwgICAg ICAgIDAsMSB8IDE2LDIzIHwgTFMyICAgICAgICAgIHwKPiArICoJfCAgICAgICAgICAgfCAgICAg ICAgICAgIHwgMDgtMTUgfCBMUzEgICAgICAgICAgfAo+ICsgKgl8ICAgICAgICAgICB8ICAgICAg ICAgICAgfCAwMC0wNyB8IExTMCAgICAgICAgICB8Cj4gKyAqCSstLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKPiArICoJfCAgICAgICAuLi4gfCAgICAgICAg Li4uIHwgLi4uICAgfCAuLi4gICAgICAgICAgfAo+ICsgKgkrLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCj4gKyAqCXwgICAgICAyMDQ3IHwgICAgICAzMSwz MSB8IDE2LDIzIHwgTFMyICAgICAgICAgIHwKPiArICoJfCAgICAgICAgICAgfCAgICAgICAgICAg IHwgMDgtMTUgfCBMUzEgICAgICAgICAgfAo+ICsgKgl8ICAgICAgICAgICB8ICAgICAgICAgICAg fCAwMC0wNyB8IExTMCAgICAgICAgICB8Cj4gKyAqCSstLS0tLS0tLS0tLSBQYWdlIChDb2xvdXIg UGxhbmUpIDIgLS0tLS0tLS0tLS0tLSsKPiArICoJfCBAbWVzaFtpXSAgfCBNZXNoIFBvaW50IHwg Qml0cyAgfCBMaWdodCBTb3VyY2UgfAo+ICsgKgkrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0t LS0tLS0rLS0tLS0tLS0tLS0tLS0rCj4gKyAqCXwgICAgICAyMDQ4IHwgICAgICAgIDAsMCB8IDE2 LDIzIHwgTFMyICAgICAgICAgIHwKPiArICoJfCAgICAgICAgICAgfCAgICAgICAgICAgIHwgMDgt MTUgfCBMUzEgICAgICAgICAgfAo+ICsgKgl8ICAgICAgICAgICB8ICAgICAgICAgICAgfCAwMC0w NyB8IExTMCAgICAgICAgICB8Cj4gKyAqCSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0t LSstLS0tLS0tLS0tLS0tLSsKPiArICoJfCAgICAgIDIwNDkgfCAgICAgICAgMCwxIHwgMTYsMjMg fCBMUzIgICAgICAgICAgfAo+ICsgKgl8ICAgICAgICAgICB8ICAgICAgICAgICAgfCAwOC0xNSB8 IExTMSAgICAgICAgICB8Cj4gKyAqCXwgICAgICAgICAgIHwgICAgICAgICAgICB8IDAwLTA3IHwg TFMwICAgICAgICAgIHwKPiArICoJKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tKy0t LS0tLS0tLS0tLS0tKwo+ICsgKgl8ICAgICAgIC4uLiB8ICAgICAgICAuLi4gfCAuLi4gICB8IC4u LiAgICAgICAgICB8Cj4gKyAqCSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0t LS0tLS0tLS0tLSsKPiArICoJfCAgICAgIDMwNzEgfCAgICAgIDMxLDMxIHwgMTYsMjMgfCBMUzIg ICAgICAgICAgfAo+ICsgKgl8ICAgICAgICAgICB8ICAgICAgICAgICAgfCAwOC0xNSB8IExTMSAg ICAgICAgICB8Cj4gKyAqCXwgICAgICAgICAgIHwgICAgICAgICAgICB8IDAwLTA3IHwgTFMwICAg ICAgICAgIHwKPiArICoJKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0t LS0tLS0tKwo+ICsgKgo+ICsgKiBUaGUgQG1lc2hfc2NhbGUgbWVtYmVyIGRldGVybWluZXMgdGhl IHByZWNpc2lvbiBhbmQgbWluaW11bSBhbmQgbWF4aW11bSBnYWluLgo+ICsgKiBGb3IgZXhhbXBs ZSBpZiBAbWVzaF9zY2FsZSBpcyAwIGFuZCB0aGVyZWZvcmUgc2VsZWN0cyAwIC0gMnggZ2Fpbiwg YSB2YWx1ZSBvZgo+ICsgKiAwIGluIGEgY29lZmZpY2llbnQgbWVhbnMgMC4wIGdhaW4sIGEgdmFs dWUgb2YgMTI4IG1lYW5zIDEuMCBnYWluIGFuZCAyNTUKPiArICogbWVhbnMgMi4wIGdhaW4uCj4g KyAqCj4gKyAqIEBoZWFkZXI6CQlUaGUgTWFsaS1DNTUgcGFyYW1ldGVycyBibG9jayBoZWFkZXIK PiArICogQG1lc2hfc2hvdzoJCU91dHB1dCB0aGUgbWVzaCBkYXRhIHJhdGhlciB0aGFuIGltYWdl IGRhdGEKPiArICogQG1lc2hfc2NhbGU6CQlTZXQgdGhlIHByZWNpc2lvbiBhbmQgbWF4aW11bSBn YWluIHJhbmdlIG9mIG1lc2ggc2hhZGluZwo+ICsgKgkJCQktIDAgPSAwLTJ4IGdhaW4KPiArICoJ CQkJLSAxID0gMC00eCBnYWluCj4gKyAqCQkJCS0gMiA9IDAtOHggZ2Fpbgo+ICsgKgkJCQktIDMg PSAwLTE2eCBnYWluCj4gKyAqCQkJCS0gNCA9IDEtMnggZ2Fpbgo+ICsgKgkJCQktIDUgPSAxLTN4 IGdhaW4KPiArICoJCQkJLSA2ID0gMS01eCBnYWluCj4gKyAqCQkJCS0gNyA9IDEtOXggZ2Fpbgo+ ICsgKiBAbWVzaF9wYWdlX3I6CU1lc2ggcGFnZSBzZWxlY3QgZm9yIHJlZCBjb2xvdXIgcGxhbmUg WzAuLjJdCj4gKyAqIEBtZXNoX3BhZ2VfZzoJTWVzaCBwYWdlIHNlbGVjdCBmb3IgZ3JlZW4gY29s b3VyIHBsYW5lIFswLi4yXQo+ICsgKiBAbWVzaF9wYWdlX2I6CU1lc2ggcGFnZSBzZWxlY3QgZm9y IGJsdWUgY29sb3VyIHBsYW5lIFswLi4yXQo+ICsgKiBAbWVzaF93aWR0aDoJCU51bWJlciBvZiBo b3Jpem9udGFsIG5vZGVzIG1pbnVzIDEgWzE1LDMxXQo+ICsgKiBAbWVzaF9oZWlnaHQ6CU51bWJl ciBvZiB2ZXJ0aWNhbCBub2RlcyBtaW51cyAxIFsxNSwzMV0KPiArICogQG1lc2g6CQlNZXNoIHNo YWRpbmcgY29ycmVjdGlvbiB0YWJsZXMKPiArICovCj4gK3N0cnVjdCBtYWxpX2M1NV9wYXJhbXNf bWVzaF9zaGFkaW5nX2NvbmZpZyB7Cj4gKwlzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2Jsb2NrX2hl YWRlciBoZWFkZXI7Cj4gKwlib29sIG1lc2hfc2hvdzsKPiArCV9fdTggbWVzaF9zY2FsZTsKPiAr CV9fdTggbWVzaF9wYWdlX3I7Cj4gKwlfX3U4IG1lc2hfcGFnZV9nOwo+ICsJX191OCBtZXNoX3Bh Z2VfYjsKPiArCV9fdTggbWVzaF93aWR0aDsKPiArCV9fdTggbWVzaF9oZWlnaHQ7Cj4gKwlfX3Uz MiBtZXNoW01BTElfQzU1X05VTV9NRVNIX1NIQURJTkdfRUxFTUVOVFNdOwo+ICt9Owo+ICsKPiAr LyoqIGVudW0gbWFsaV9jNTVfcGFyYW1zX21lc2hfYWxwaGFfYmFuayAtIE1lc2ggc2hhZGluZyB0 YWJsZSBiYW5rIHNlbGVjdGlvbgo+ICsgKiBATUFMSV9DNTVfTUVTSF9BTFBIQV9CQU5LX0xTMF9B TkRfTFMxIC0gU2VsZWN0IExpZ2h0IFNvdXJjZXMgMCBhbmQgMQo+ICsgKiBATUFMSV9DNTVfTUVT SF9BTFBIQV9CQU5LX0xTMV9BTkRfTFMyIC0gU2VsZWN0IExpZ2h0IFNvdXJjZXMgMSBhbmQgMgo+ ICsgKiBATUFMSV9DNTVfTUVTSF9BTFBIQV9CQU5LX0xTMF9BTkRfTFMyIC0gU2VsZWN0IExpZ2h0 IFNvdXJjZXMgMCBhbmQgMgo+ICsgKi8KPiArZW51bSBtYWxpX2M1NV9wYXJhbXNfbWVzaF9hbHBo YV9iYW5rIHsKPiArCU1BTElfQzU1X01FU0hfQUxQSEFfQkFOS19MUzBfQU5EX0xTMSA9IDAsCj4g KwlNQUxJX0M1NV9NRVNIX0FMUEhBX0JBTktfTFMxX0FORF9MUzIgPSAxLAo+ICsJTUFMSV9DNTVf TUVTSF9BTFBIQV9CQU5LX0xTMF9BTkRfTFMyID0gNAo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIHN0 cnVjdCBtYWxpX2M1NV9wYXJhbXNfbWVzaF9zaGFkaW5nX3NlbGVjdGlvbiAtIE1lc2ggdGFibGUg c2VsZWN0aW9uCj4gKyAqCj4gKyAqIFRoZSBtb2R1bGUgY29tcHV0ZXMgdGhlIGZpbmFsIGNvcnJl Y3Rpb24gY29lZmZpY2llbnRzIGJ5IGJsZW5kaW5nIHRoZSBvbmVzCj4gKyAqIGZyb20gdHdvIGxp Z2h0IHNvdXJjZSB0YWJsZXMsIHdoaWNoIGFyZSBzZWxlY3RlZCAoaW5kZXBlbmRlbnRseSBmb3Ig ZWFjaAo+ICsgKiBjb2xvdXIgY2hhbm5lbCkgYnkgdGhlIEBtZXNoX2FscGhhX2Jhbmtfci9nL2Ig ZmllbGRzLgo+ICsgKgo+ICsgKiBUaGUgZmluYWwgYmxlbmRlZCBjb2VmZmljaWVudHMgZm9yIGVh Y2ggbm9kZSBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUKPiArICogZm9sbG93aW5nIGVxdWF0aW9u Ogo+ICsgKgo+ICsgKiAgICAgRmluYWwgY29lZmZpY2llbnQgPSAoYSB4IExTXCA6c3ViOmBiYFwg KyAoMjU2IC0gYSkgeCBMU1wgOnN1YjpgYWBcKSAvIDI1Ngo+ICsgKgo+ICsgKiBXaGVyZSBhIGlz IHRoZSBAbWVzaF9hbHBoYV9yL2cvYiB2YWx1ZSwgYW5kIExTXCA6c3ViOmBhYFwgYW5kIExTXCA6 c3ViOmBiYFwKPiArICogYXJlIHRoZSBub2RlIGNvZmZpY2llbnRzIGZvciB0aGUgdHdvIHRhYmxl cyBzZWxlY3RlZCBieSB0aGUKPiArICogQG1lc2hfYWxwaGFfYmFua19yL2cvYiB2YWx1ZS4KPiAr ICoKPiArICogVGhlIHNjYWxlIG9mIHRoZSBhcHBsaWVkIGNvcnJlY3Rpb24gbWF5IGFsc28gYmUg Y29udHJvbGxlZCBieSB0dW5pbmcgdGhlCj4gKyAqIEBtZXNoX3N0cmVuZ3RoIG1lbWJlci4gVGhp cyBpcyBhIG1vZGlmaWVyIHRvIHRoZSBmaW5hbCBjb2VmZmljaWVudHMgd2hpY2ggY2FuCj4gKyAq IGJlIHVzZWQgdG8gZ2xvYmFsbHkgcmVkdWNlIHRoZSBnYWlucyBhcHBsaWVkLgo+ICsgKgo+ICsg KiBAaGVhZGVyOgkJVGhlIE1hbGktQzU1IHBhcmFtZXRlcnMgYmxvY2sgaGVhZGVyCj4gKyAqIEBt ZXNoX2FscGhhX2JhbmtfcjoJUmVkIG1lc2ggdGFibGUgc2VsZWN0IChjOnR5cGU6YGVudW0gbWFs aV9jNTVfcGFyYW1zX21lc2hfYWxwaGFfYmFua2ApCj4gKyAqIEBtZXNoX2FscGhhX2JhbmtfZzoJ R3JlZW4gbWVzaCB0YWJsZSBzZWxlY3QgKGM6dHlwZTpgZW51bSBtYWxpX2M1NV9wYXJhbXNfbWVz aF9hbHBoYV9iYW5rYCkKPiArICogQG1lc2hfYWxwaGFfYmFua19iOglCbHVlIG1lc2ggdGFibGUg c2VsZWN0IChjOnR5cGU6YGVudW0gbWFsaV9jNTVfcGFyYW1zX21lc2hfYWxwaGFfYmFua2ApCj4g KyAqIEBtZXNoX2FscGhhX3I6CUJsZW5kIGNvZWZmaWNpZW50IGZvciBSIFswLi4yNTVdCj4gKyAq IEBtZXNoX2FscGhhX2c6CUJsZW5kIGNvZWZmaWNpZW50IGZvciBHIFswLi4yNTVdCj4gKyAqIEBt ZXNoX2FscGhhX2I6CUJsZW5kIGNvZWZmaWNpZW50IGZvciBCIFswLi4yNTVdCj4gKyAqIEBtZXNo X3N0cmVuZ3RoOglNZXNoIHN0cmVuZ3RoIGluIFE0LjEyIGZvcm1hdCBbMC4uNDA5Nl0KPiArICov Cj4gK3N0cnVjdCBtYWxpX2M1NV9wYXJhbXNfbWVzaF9zaGFkaW5nX3NlbGVjdGlvbiB7Cj4gKwlz dHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2Jsb2NrX2hlYWRlciBoZWFkZXI7Cj4gKwlfX3U4IG1lc2hf YWxwaGFfYmFua19yOwo+ICsJX191OCBtZXNoX2FscGhhX2JhbmtfZzsKPiArCV9fdTggbWVzaF9h bHBoYV9iYW5rX2I7Cj4gKwlfX3U4IG1lc2hfYWxwaGFfcjsKPiArCV9fdTggbWVzaF9hbHBoYV9n Owo+ICsJX191OCBtZXNoX2FscGhhX2I7Cj4gKwlfX3UxNiBtZXNoX3N0cmVuZ3RoOwo+ICt9Owo+ ICsKPiArLyoqCj4gKyAqIGRlZmluZSBNQUxJX0M1NV9QQVJBTVNfTUFYX1NJWkUgLSBNYXhpbXVt IHNpemUgb2YgYWxsIE1hbGkgQzU1IFBhcmFtZXRlcnMKPiArICoKPiArICogVGhvdWdoIHRoZSBw YXJhbWV0ZXJzIGZvciB0aGUgTWFsaS1DNTUgYXJlIHBhc3NlZCBhcyBvcHRpb25hbCBibG9ja3Ms IHRoZQo+ICsgKiBkcml2ZXIgc3RpbGwgbmVlZHMgdG8ga25vdyB0aGUgYWJzb2x1dGUgbWF4aW11 bSBzaXplIHNvIHRoYXQgaXQgY2FuIGFsbG9jYXRlCj4gKyAqIGEgYnVmZmVyIHNpemVkIGFwcHJv cHJpYXRlbHkgdG8gYWNjb21vZGF0ZSB1c2Vyc3BhY2UgYXR0ZW1wdGluZyB0byBzZXQgYWxsCj4g KyAqIHBvc3NpYmxlIHBhcmFtZXRlcnMgaW4gYSBzaW5nbGUgZnJhbWUuCj4gKyAqLwo+ICsjZGVm aW5lIE1BTElfQzU1X1BBUkFNU19NQVhfU0laRQkJCQlcCj4gKwlzaXplb2Yoc3RydWN0IG1hbGlf YzU1X3BhcmFtc19zZW5zb3Jfb2ZmX3ByZXNoYWRpbmcpICsgCVwKPiArCXNpemVvZihzdHJ1Y3Qg bWFsaV9jNTVfcGFyYW1zX2FleHBfaGlzdCkgKwkJXAo+ICsJc2l6ZW9mKHN0cnVjdCBtYWxpX2M1 NV9wYXJhbXNfYWV4cF93ZWlnaHRzKSArCQlcCj4gKwlzaXplb2Yoc3RydWN0IG1hbGlfYzU1X3Bh cmFtc19hZXhwX2hpc3QpICsJCVwKPiArCXNpemVvZihzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2Fl eHBfd2VpZ2h0cykgKwkJXAo+ICsJc2l6ZW9mKHN0cnVjdCBtYWxpX2M1NV9wYXJhbXNfZGlnaXRh bF9nYWluKSArCQlcCj4gKwlzaXplb2Yoc3RydWN0IG1hbGlfYzU1X3BhcmFtc19hd2JfZ2FpbnMp ICsJCVwKPiArCXNpemVvZihzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2F3Yl9jb25maWcpICsJCVwK PiArCXNpemVvZihzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2F3Yl9nYWlucykgKwkJXAoKU29tZSBk YXRhIHN0cnVjdHVyZXMgYXJlIGR1cGxpY2F0ZWQsIHBsZWFzZSBleHBsYWluIHdoeSBzb21ld2hl cmUsIG9yIGl0Cm1heSBhcHBlYXIgdG8gYmUgYSBidWcuCgo+ICsJc2l6ZW9mKHN0cnVjdCBtYWxp X2M1NV9wYXJhbXNfbWVzaF9zaGFkaW5nX2NvbmZpZykgKwlcCj4gKwlzaXplb2Yoc3RydWN0IG1h bGlfYzU1X3BhcmFtc19tZXNoX3NoYWRpbmdfc2VsZWN0aW9uKQoKSSB0aGluayB0aGlzIHdpbGwg d29yayBmaW5lIG5vdywgYnV0IGFzIHNvb24gYXMgeW91IGFkZCBhIGJsb2NrIHRoYXQKY29udGFp bnMgYSA2NC1iaXQgZmllbGQsIHlvdSdsbCBoYXZlIGlzc3Vlcy4gTWFueSBDUFVzIGV4cGVjdCA2 NC1iaXQKYWNjZXNzZXMgdG8gYmUgYWxpZ25lZC4gSWYgc29tZSBzdHJ1Y3R1cmVzIGhhdmUgYSBz aXplIHRoYXQgYXJlIG5vdAptdWx0aXBsZXMgb2YgNjQtYml0LCB5b3UnbGwgZW5kIHVwIGhhdmlu ZyB1bmFsaWduZWQgYmxvY2tzLgoKSSB3b3VsZCByZWNvbW1lbmQgYWxpZ25pbmcgdGhlIHNpemUg b2YgZWFjaCBkYXRhIHN0cnVjdHVyZSB0byA2NCBiaXRzLiBBCnNpbXBsZSB3YXkgdG8gZG8gc28g d291bGQgYmUgdG8gYWxpZ24gdGhlIHNpemUgb2YgdGhlIGhlYWRlciB0byA2NCBiaXRzLgpQbGVh c2UgdGVzdCB0aGUgcmVzdWx0IHRvIG1ha2Ugc3VyZSBJJ20gcmlnaHQgdGhvdWdoIDotKQoKPiAr Cj4gKy8qKgo+ICsgKiBzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2J1ZmZlciAtIDNBIGNvbmZpZ3Vy YXRpb24gcGFyYW1ldGVycwo+ICsgKgo+ICsgKiBUaGlzIHN0cnVjdCBjb250YWlucyB0aGUgY29u ZmlndXJhdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBNYWxpLUM1NSBJU1AKPiArICogYWxnb3JpdGht cywgc2VyaWFsaXplZCBieSB1c2Vyc3BhY2UgaW50byBhbiBvcGFxdWUgZGF0YSBidWZmZXIuIEVh Y2gKCkl0J3Mgbm90IG9wYXF1ZSwgeW91J3ZlIGRvY3VtZW50ZWQgaXQgZnVsbHkgOi0pCgpzL29w YXF1ZSAvLwoKPiArICogY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgYmxvY2sgaXMgcmVwcmVzZW50 ZWQgYnkgYSBibG9jay1zcGVjaWZpYyBzdHJ1Y3R1cmUKPiArICogd2hpY2ggY29udGFpbnMgYSA6 Yzp0eXBlOmBtYWxpX2M1NV9wYXJhbXNfYmxvY2tfaGVhZGVyYCBlbnRyeSBhcyBmaXJzdAo+ICsg KiBtZW1iZXIuIFVzZXJzcGFjZSBwb3B1bGF0ZXMgdGhlIEBkYXRhIGJ1ZmZlciB3aXRoIGNvbmZp Z3VyYXRpb24gcGFyYW1ldGVycwo+ICsgKiBmb3IgdGhlIGJsb2NrcyB0aGF0IGl0IGludGVuZHMg dG8gY29uZmlndXJlLiBBcyBhIGNvbnNlcXVlbmNlLCB0aGUgZGF0YQo+ICsgKiBidWZmZXIgZWZm ZWN0aXZlIHNpemUgY2hhbmdlcyBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBJU1AgYmxvY2tz IHRoYXQKPiArICogdXNlcnNwYWNlIGludGVuZHMgdG8gY29uZmlndXJlLgo+ICsgKgo+ICsgKiBU aGUgcGFyYW1ldGVycyBidWZmZXIgaXMgdmVyc2lvbmVkIGJ5IHRoZSBAdmVyc2lvbiBmaWVsZCB0 byBhbGxvdyBtb2RpZnlpbmcKPiArICogYW5kIGV4dGVuZGluZyBpdHMgZGVmaW5pdGlvbi4gVXNl cnNwYWNlIHNob3VsZCBwb3B1bGF0ZSB0aGUgQHZlcnNpb24gZmllbGQgdG8KCnMvc2hvdWxkL3No YWxsLwoKPiArICogaW5mb3JtIHRoZSBkcml2ZXIgYWJvdXQgdGhlIHZlcnNpb24gaXQgaW50ZW5k cyB0byB1c2UuIFRoZSBkcml2ZXIgd2lsbCBwYXJzZQo+ICsgKiBhbmQgaGFuZGxlIHRoZSBAZGF0 YSBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIGxheW91dCBzcGVjaWZpYyB0byB0aGUKPiAr ICogaW5kaWNhdGVkIHJldmlzaW9uIGFuZCByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIGRlc2lyZWQg cmV2aXNpb24gaXMgbm90CgpzL3JldmlzaW9uL3ZlcnNpb24vZwoKPiArICogc3VwcG9ydGVkLgo+ ICsgKgo+ICsgKiBGb3IgZWFjaCBJU1AgYmxvY2sgdGhhdCB1c2Vyc3BhY2Ugd2FudHMgdG8gY29u ZmlndXJlLCBhIGJsb2NrLXNwZWNpZmljCj4gKyAqIHN0cnVjdHVyZSBpcyBhcHBlbmRlZCB0byB0 aGUgQGRhdGEgYnVmZmVyLCBvbmUgYWZ0ZXIgdGhlIG90aGVyIHdpdGhvdXQgZ2Fwcwo+ICsgKiBp biBiZXR3ZWVuIG5vciBvdmVybGFwcy4gVXNlcnNwYWNlIHNoYWxsIHBvcHVsYXRlIHRoZSBAdG90 YWxfc2l6ZSBmaWVsZCB3aXRoCj4gKyAqIHRoZSBlZmZlY3RpdmUgc2l6ZSwgaW4gYnl0ZXMsIG9m IHRoZSBAZGF0YSBidWZmZXIuCj4gKyAqCj4gKyAqIFRoZSBleHBlY3RlZCBtZW1vcnkgbGF5b3V0 IG9mIHRoZSBwYXJhbWV0ZXJzIGJ1ZmZlciBpczo6Cj4gKyAqCj4gKyAqCSstLS0tLS0tLS0tLS0t LS0tLS0tLSBzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2J1ZmZlciAtLS0tLS0tLS0tLS0tLS0tLS0r Cj4gKyAqCXwgdmVyc2lvbiA9IE1BTElfQzU1X1BBUkFNX0JVRkZFUl9WMDsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8Cj4gKyAqCXwgdG90YWxfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qg bWFsaV9jNTVfcGFyYW1zX3NlbnNvcl9vZmZfcHJlc2hhZGluZykgICB8Cj4gKyAqCXwgICAgICAg ICAgICAgIHNpemVvZihzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2FleHBfaGlzdCk7ICAgICAgICAg ICAgICB8Cj4gKyAqCXwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGF0YSAgLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyB8Cj4gKyAqCXwgfCArLS0tLS0tLS0tIHN0cnVjdCBt YWxpX2M1NV9wYXJhbXNfc2Vuc29yX29mZl9wcmVzaGFkaW5nIC0tLS0tLSsgfCB8Cj4gKyAqCXwg fCB8ICstLS0tLS0tLSBzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2Jsb2NrX2hlYWRlciBoZWFkZXIg LS0tLS0rIHwgfCB8Cj4gKyAqCXwgfCB8IHwgdHlwZSA9IE1BTElfQzU1X1BBUkFNX0JMT0NLX1NF TlNPUl9PRkZTOyAgICAgICAgICAgICAgICB8IHwgfCB8Cj4gKyAqCXwgfCB8IHwgZW5hYmxlZCA9 IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfCB8Cj4g KyAqCXwgfCB8IHwgc2l6ZSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8IHwgfCB8Cj4gKyAqCXwgfCB8IHwgICAgc2l6ZW9mKHN0cnVjdCBtYWxpX2M1 NV9wYXJhbXNfc2Vuc29yX29mZl9wcmVzaGFkaW5nKTt8IHwgfCB8Cj4gKyAqCXwgfCB8ICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIHwg fCB8Cj4gKyAqCXwgfCB8IGNoYW4wMCA9IC4uLjsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgfCB8Cj4gKyAqCXwgfCB8IGNoYW4wMSA9IC4uLjsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Cj4gKyAqCXwgfCB8 IGNoYW4xMCA9IC4uLjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgfCB8Cj4gKyAqCXwgfCB8IGNoYW4xMSA9IC4uLjsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Cj4gKyAqCXwgfCArLS0tLS0tLS0tLS0tIHN0 cnVjdCBtYWxpX2M1NV9wYXJhbXNfYWV4cF9oaXN0IC0tLS0tLS0tLS0tLS0tLSsgfCB8Cj4gKyAq CXwgfCB8ICstLS0tLS0tLSBzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2Jsb2NrX2hlYWRlciBoZWFk ZXIgLS0tLS0rIHwgfCB8Cj4gKyAqCXwgfCB8IHwgdHlwZSA9IE1BTElfQzU1X1BBUkFNX0JMT0NL X0FFWFBfSElTVDsgICAgICAgICAgICAgICAgICB8IHwgfCB8Cj4gKyAqCXwgfCB8IHwgZW5hYmxl ZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfCB8 Cj4gKyAqCXwgfCB8IHwgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbWFsaV9jNTVfcGFyYW1zX2FleHBf aGlzdCk7ICAgICAgICB8IHwgfCB8Cj4gKyAqCXwgfCB8ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIHwgfCB8Cj4gKyAqCXwgfCB8IHNr aXBfeCA9IC4uLjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgfCB8Cj4gKyAqCXwgfCB8IG9mZnNldF94ID0gLi4uOyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Cj4gKyAqCXwgfCB8IHNraXBfeSA9IC4uLjsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Cj4gKyAqCXwg fCB8IG9mZnNldF95ID0gLi4uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgfCB8Cj4gKyAqCXwgfCB8IHNjYWxlX2JvdHRvbSA9IC4uLjsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Cj4gKyAqCXwgfCB8IHNjYWxlX3RvcCA9 IC4uLjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Cj4g KyAqCXwgfCB8IHBsYW5lX21vZGUgPSAuLi47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgfCB8Cj4gKyAqCXwgfCB8IHRhcF9wb2ludCA9IC4uLjsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Cj4gKyAqCXwgfCArLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsg fCB8Cj4gKyAqCXwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tKyB8Cj4gKyAqCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqCj4gKyAq IEB2ZXJzaW9uOiBUaGUgTWFsaS1DNTUgcGFyYW1ldGVycyBidWZmZXIgdmVyc2lvbgo+ICsgKiBA dG90YWxfc2l6ZTogVGhlIE1hbGktQzU1IGNvbmZpZ3VyYXRpb24gZGF0YSBlZmZlY3RpdmUgc2l6 ZSwgZXhjbHVkaW5nIHRoaXMKPiArICoJCWhlYWRlcgo+ICsgKiBAZGF0YTogVGhlIE1hbGktQzU1 IGNvbmZpZ3VyYXRpb24gYmxvY2tzIGRhdGEKPiArICovCj4gK3N0cnVjdCBtYWxpX2M1NV9wYXJh bXNfYnVmZmVyIHsKPiArCWVudW0gbWFsaV9jNTVfcGFyYW1fYnVmZmVyX3ZlcnNpb24gdmVyc2lv bjsKPiArCXNpemVfdCB0b3RhbF9zaXplOwo+ICsJX191OCBkYXRhW01BTElfQzU1X1BBUkFNU19N QVhfU0laRV07Cj4gK307Cj4gKwo+ICAjZW5kaWYgLyogX19VQVBJX01BTElfQzU1X0NPTkZJR19I ICovCgotLSAKUmVnYXJkcywKCkxhdXJlbnQgUGluY2hhcnQKCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0 CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A6521A2D; Fri, 31 May 2024 00:09:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717114166; cv=none; b=kBnX8o9Os0DwYDitv+4fHMMIFrqq29dgdTfr6acSGSXEHeIDQLyYzMkoD5lYDrJSaHA83u6Q1Qj5MD/pf6+LJYSaN0lCvm20t55tc9jJEpof7FjszFXjOi2R7vX4fq0MoKJ847l3uh/0N+KZRjyJa2zRpjNZLLHjPzyUKcKYQ+o= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717114166; c=relaxed/simple; bh=fegVz/cmIf29HwbAsa6sfuaO6oTpfkPL8AT6AINy9Vo=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=A8NbGsO3w5A1pDIawwmtVnghLyqYo7E8xVKJhHMb/NmroyxRBln4WKzVgUW5D/Ui0PoQBu8rYgel+7h3yaq14u8zopRWhUvuXHwRFT8bJ4Id93sQ8QHnI5vaaHz2YrdQ9dSGue3BE0iWAYeaTJPpWaExHoiysTLclMOYx7fX6CM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=nb9n32/b; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="nb9n32/b" Received: from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi [81.175.209.231]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3D14C11A3; Fri, 31 May 2024 02:09:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1717114156; bh=fegVz/cmIf29HwbAsa6sfuaO6oTpfkPL8AT6AINy9Vo=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=nb9n32/bpwzydRh6Am52Cff4lNfzUulnDImuJ5qgj+bq0ei2zKoG0ddgPj2tC7h66 ofca7XaBFD5+Ga6G23T9+0yotwYi7WdBYu2CZkFvDlXwq5fhijUmlpqDYbGQYxQEh3 Va7/v2DFvmtYFASnj12gjwvygXvbQlVO/mOTogj0= Date: Fri, 31 May 2024 03:09:07 +0300 From: Laurent Pinchart To: Daniel Scally Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, jacopo.mondi@ideasonboard.com, nayden.kanchev@arm.com, robh+dt@kernel.org, mchehab@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, jerome.forissier@linaro.org, kieran.bingham@ideasonboard.com, sakari.ailus@iki.fi Subject: Re: [PATCH v5 14/16] media: uapi: Add parameters structs to mali-c55-config.h Message-ID: <20240531000907.GG5213@pendragon.ideasonboard.com> References: <20240529152858.183799-1-dan.scally@ideasonboard.com> <20240529152858.183799-15-dan.scally@ideasonboard.com> Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20240529152858.183799-15-dan.scally@ideasonboard.com> Hi Dan, Thank you for the patch. On Wed, May 29, 2024 at 04:28:56PM +0100, Daniel Scally wrote: > Add structures describing the ISP parameters to mali-c55-config.h > > Acked-by: Nayden Kanchev > Co-developed-by: Jacopo Mondi > Signed-off-by: Jacopo Mondi > Signed-off-by: Daniel Scally > --- > Changes in v5: > > - New patch > > .../uapi/linux/media/arm/mali-c55-config.h | 669 ++++++++++++++++++ > 1 file changed, 669 insertions(+) > > diff --git a/include/uapi/linux/media/arm/mali-c55-config.h b/include/uapi/linux/media/arm/mali-c55-config.h > index 8fb89af6c874..fce14bc74f4a 100644 > --- a/include/uapi/linux/media/arm/mali-c55-config.h > +++ b/include/uapi/linux/media/arm/mali-c55-config.h > @@ -179,4 +179,673 @@ struct mali_c55_stats_buffer { > __u32 reserved3[15]; > } __attribute__((packed)); > > +/** > + * enum mali_c55_param_buffer_version - Mali-C55 parameters block versioning > + * > + * @MALI_C55_PARAM_BUFFER_V0: First version of Mali-C55 parameters block So you like versions to be 0-based ? :-) > + */ > +enum mali_c55_param_buffer_version { > + MALI_C55_PARAM_BUFFER_V0, > +}; > + > +/** > + * enum mali_c55_param_block_type - Enumeration of Mali-C55 parameter blocks > + * > + * This enumeration defines the types of Mali-C55 parameters block. Each block > + * configures a specific processing block of the Mali-C55 ISP. The block > + * type allows the driver to correctly interpret the parameters block data. > + * > + * It is the responsibility of userspace to correctly set the type of each > + * parameters block. > + * > + * @MALI_C55_PARAM_BLOCK_SENSOR_OFFS: Sensor pre-shading black level offset > + * @MALI_C55_PARAM_BLOCK_AEXP_HIST: Auto-exposure 1024-bin histogram > + * configuration > + * @MALI_C55_PARAM_BLOCK_AEXP_IHIST: Post-Iridix auto-exposure 1024-bin > + * histogram configuration > + * @MALI_C55_PARAM_BLOCK_AEXP_HIST_WEIGHTS: Auto-exposure 1024-bin histogram > + * weighting > + * @MALI_C55_PARAM_BLOCK_AEXP_IHIST_WEIGHTS: Post-Iridix auto-exposure 1024-bin > + * histogram weighting Do you expect applications to need to set the histogram configuration and weights separately ? > + * @MALI_C55_PARAM_BLOCK_DIGITAL_GAIN: Digital gain > + * @MALI_C55_PARAM_BLOCK_AWB_GAINS: Auto-white balance gains I was thinking that those two could be combined, but if the former is used by AEC and the latter by AWB, maybe keeping them separate would make like easier for userspace. > + * @MALI_C55_PARAM_BLOCK_AWB_CONFIG: Auto-white balance statistics config > + * @MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP: Auto-white balance gains for AEXP-0 tap > + * @MALI_C55_PARAM_MESH_SHADING_CONFIG : Mesh shading tables configuration > + * @MALI_C55_PARAM_MESH_SHADING_SELECTION: Mesh shading table selection > + * @MALI_C55_PARAM_BLOCK_SENTINEL: First non-valid block index You should indicate somewhere the correspondance between the block type and the block data structure. It could be done in the definition of each data structure for instance. > + */ > +enum mali_c55_param_block_type { > + MALI_C55_PARAM_BLOCK_SENSOR_OFFS, > + MALI_C55_PARAM_BLOCK_AEXP_HIST, > + MALI_C55_PARAM_BLOCK_AEXP_IHIST, > + MALI_C55_PARAM_BLOCK_AEXP_HIST_WEIGHTS, > + MALI_C55_PARAM_BLOCK_AEXP_IHIST_WEIGHTS, > + MALI_C55_PARAM_BLOCK_DIGITAL_GAIN, > + MALI_C55_PARAM_BLOCK_AWB_GAINS, > + MALI_C55_PARAM_BLOCK_AWB_CONFIG, > + MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP, > + MALI_C55_PARAM_MESH_SHADING_CONFIG, > + MALI_C55_PARAM_MESH_SHADING_SELECTION, > + MALI_C55_PARAM_BLOCK_SENTINEL, > +}; > + > +/** > + * struct mali_c55_params_block_header - Mali-C55 parameter block header > + * > + * This structure represents the common part of all the ISP configuration > + * blocks. Each parameters block shall embed an instance of this structure type s/shall embed/embeds/ > + * as its first member, followed by the block-specific configuration data. The > + * driver inspects this common header to discern the block type and its size and > + * properly handle the block content by casting it to the correct block-specific > + * type. > + * > + * The @type field is one of the values enumerated by > + * :c:type:`mali_c55_param_block_type` and specifies how the data should be > + * interpreted by the driver. The @size field specifies the size of the > + * parameters block and is used by the driver for validation purposes. The > + * @enabled field specifies if the ISP block should be enabled (and configured > + * according to the provided parameters) or disabled. > + * > + * .. code-block:: c > + * > + * struct mali_c55_params_block_header *block = ...; > + * > + * switch (block->type) { > + * case MALI_C55_PARAM_BLOCK_SENSOR_OFFS: > + * struct mali_c55_params_sensor_off_preshading *sensor_offs = > + * (struct mali_c55_params_sensor_off_preshading *)block; > + * > + * if (block->size != > + * sizeof(struct mali_c55_params_sensor_off_preshading)) > + * return -EINVAL; > + * > + * handle_sensor_offs(sensor_offs); > + * break; > + * > + * case MALI_C55_PARAM_BLOCK_AEXP_HIST: > + * struct mali_c55_params_aexp_hist *aexp_hist = > + * (struct mali_c55_params_aexp_hist)block; > + * > + * if (block->size != sizeof(mali_c55_params_aexp_hist)) > + * return -EINVAL; > + * > + * handle_aexp_hist(aesp_hist); > + * break; > + * > + * ... > + * > + * } I would probably skip this. The kernel-side of the implementation can be found in the driver. I would document the UAPI here with examples focussing on the userspace side only. > + * > + * Userspace is responsible for correctly populating the parameters block header > + * fields (@type, @enabled and @size) and correctly populate the block-specific > + * parameters. > + * > + * For example: > + * > + * .. code-block:: c > + * > + * void populate_sensor_offs(struct mali_c55_params_block_header *block) { > + * block->type = MALI_C55_PARAM_BLOCK_SENSOR_OFFS; > + * block->enabled = true; > + * block->size = sizeof(struct mali_c55_params_sensor_off_preshading); > + * > + * struct mali_c55_params_sensor_off_preshading *sensor_offs = > + * (struct mali_c55_params_sensor_off_preshading *)block; > + * > + * sensor_offs->chan00 = offset00; > + * sensor_offs->chan01 = offset01; > + * sensor_offs->chan10 = offset10; > + * sensor_offs->chan11 = offset11; > + * } > + * > + * @type: The parameters block type (enum mali_c55_param_block_type) > + * @enabled: Block enabled/disabled flag Does this flag apply to all blocks ? If not, it would be good to indicate which blocks it applies to. Also, I think we discussed previously that, when a block is disabled, its configuration parameters are not applicable anymore, and could then be skipped. Is that something useful to do ? > + * @size: Size (in bytes) of the parameters block > + */ > +struct mali_c55_params_block_header { > + enum mali_c55_param_block_type type; > + bool enabled; > + size_t size; enums, bool and size_t shouldn't be used in a UAPI, as they size may vary between 32- and 64-bit architectures, making 32-bit userspace on a 64-bit kernel require compat handling in the driver. Use types with well-defined sizes. Same below. > +}; > + > +/** > + * struct mali_c55_params_sensor_off_preshading - offset subtraction for each > + * color channel > + * > + * Provides removal of the sensor black level from the sensor data. Separate > + * offsets are provided for each of the four Bayer component color channels That's a weird spelling of offsets. > + * which are defaulted to R, Gr, Gb, B. I think it would be useful to indicate, for each structure, what block it corresponds to in the ascii diagram in patch 12/16. On a side note, at some point turning that diagram into SVG may make sense. > + * > + * @header: The Mali-C55 parameters block header > + * @chan00: Offset for color channel 00 (default: R) > + * @chan01: Offset for color channel 01 (default: Gr) > + * @chan10: Offset for color channel 10 (default: Gb) > + * @chan11: Offset for color channel 11 (default: B) > + */ > +struct mali_c55_params_sensor_off_preshading { > + struct mali_c55_params_block_header header; > + __u32 chan00; > + __u32 chan01; > + __u32 chan10; > + __u32 chan11; > +}; > + > +/** > + * enum mali_c55_aexp_hist_tap_points - Tap points for the AEXP histogram > + * @MALI_C55_AEXP_HIST_TAP_WB: After static white balance > + * @MALI_C55_AEXP_HIST_TAP_FS: After WDR Frame Stitch > + * @MALI_C55_AEXP_HIST_TAP_TPG: After the test pattern generator > + */ > +enum mali_c55_aexp_hist_tap_points { > + MALI_C55_AEXP_HIST_TAP_WB = 0, > + MALI_C55_AEXP_HIST_TAP_FS, > + MALI_C55_AEXP_HIST_TAP_TPG, > +}; > + > +/** > + * enum mali_c55_aexp_skip_x - Horizontal pixel skipping > + * @MALI_C55_AEXP_SKIP_X_EVERY_2ND: Collect every 2nd pixel horizontally > + * @MALI_C55_AEXP_SKIP_X_EVERY_3RD: Collect every 3rd pixel horizontally > + * @MALI_C55_AEXP_SKIP_X_EVERY_4TH: Collect every 4th pixel horizontally > + * @MALI_C55_AEXP_SKIP_X_EVERY_5TH: Collect every 5th pixel horizontally > + * @MALI_C55_AEXP_SKIP_X_EVERY_8TH: Collect every 8th pixel horizontally > + * @MALI_C55_AEXP_SKIP_X_EVERY_9TH: Collect every 9th pixel horizontally > + */ > +enum mali_c55_aexp_skip_x { > + MALI_C55_AEXP_SKIP_X_EVERY_2ND, > + MALI_C55_AEXP_SKIP_X_EVERY_3RD, > + MALI_C55_AEXP_SKIP_X_EVERY_4TH, > + MALI_C55_AEXP_SKIP_X_EVERY_5TH, > + MALI_C55_AEXP_SKIP_X_EVERY_8TH, > + MALI_C55_AEXP_SKIP_X_EVERY_9TH > +}; Does this mean that that the histogram can't operate on every pixels, but will always skip at least every other pixel ? > + > +/** > + * enum mali_c55_aexp_skip_y - Vertical pixel skipping > + * @MALI_C55_AEXP_SKIP_Y_ALL: Collect every single pixel vertically > + * @MALI_C55_AEXP_SKIP_Y_EVERY_2ND: Collect every 2nd pixel vertically > + * @MALI_C55_AEXP_SKIP_Y_EVERY_3RD: Collect every 3rd pixel vertically > + * @MALI_C55_AEXP_SKIP_Y_EVERY_4TH: Collect every 4th pixel vertically > + * @MALI_C55_AEXP_SKIP_Y_EVERY_5TH: Collect every 5th pixel vertically > + * @MALI_C55_AEXP_SKIP_Y_EVERY_8TH: Collect every 8th pixel vertically > + * @MALI_C55_AEXP_SKIP_Y_EVERY_9TH: Collect every 9th pixel vertically > + */ > +enum mali_c55_aexp_skip_y { > + MALI_C55_AEXP_SKIP_Y_ALL, > + MALI_C55_AEXP_SKIP_Y_EVERY_2ND, > + MALI_C55_AEXP_SKIP_Y_EVERY_3RD, > + MALI_C55_AEXP_SKIP_Y_EVERY_4TH, > + MALI_C55_AEXP_SKIP_Y_EVERY_5TH, > + MALI_C55_AEXP_SKIP_Y_EVERY_8TH, > + MALI_C55_AEXP_SKIP_Y_EVERY_9TH > +}; > + > +/** > + * enum mali_c55_aexp_row_column_offset - Start from the first or second row or > + * column > + * @MALI_C55_AEXP_FIRST_ROW_OR_COL: Start from the first row / column > + * @MALI_C55_AEXP_SECOND_ROW_OR_COL: Start from the second row / column > + */ > +enum mali_c55_aexp_row_column_offset { > + MALI_C55_AEXP_FIRST_ROW_OR_COL = 1, > + MALI_C55_AEXP_SECOND_ROW_OR_COL = 2, > +}; > + > +/** > + * enum mali_c55_aexp_hist_plane_mode - Mode for the AEXP Histograms As histograms are computed on bayer data, I'd talk about "component" instead of "plane" here, unless the word plane matches documentation. > + * @MALI_C55_AEXP_HIST_COMBINED: All color planes in one 1024-bin histogram > + * @MALI_C55_AEXP_HIST_SEPARATE: Each color plane in one 256-bin histogram with a bin width of 16 > + * @MALI_C55_AEXP_HIST_FOCUS_00: Top left plane in the first bank, rest in second bank > + * @MALI_C55_AEXP_HIST_FOCUS_01: Top right plane in the first bank, rest in second bank > + * @MALI_C55_AEXP_HIST_FOCUS_10: Bottom left plane in the first bank, rest in second bank > + * @MALI_C55_AEXP_HIST_FOCUS_11: Bottom right plane in the first bank, rest in second bank > + * > + * In the "focus" modes statistics are collected into two 512-bin histograms > + * with a bin width of 8. One colour plane is in the first histogram with the > + * remainder combined into the second. The four options represent which of the > + * four positions in a bayer pattern are the focused plane. How does that work with x/y skipping ? Is skipping then applied to 2x2 blocks, or still to pixels ? > + */ > +enum mali_c55_aexp_hist_plane_mode { > + MALI_C55_AEXP_HIST_COMBINED = 0, > + MALI_C55_AEXP_HIST_SEPARATE = 1, > + MALI_C55_AEXP_HIST_FOCUS_00 = 4, > + MALI_C55_AEXP_HIST_FOCUS_01 = 5, > + MALI_C55_AEXP_HIST_FOCUS_10 = 6, > + MALI_C55_AEXP_HIST_FOCUS_11 = 7, > +}; > + > +/** > + * struct mali_c55_params_aexp_hist - configuration for AEXP metering hists > + * > + * This struct allows users to configure the 1024-bin AEXP histograms. Broadly > + * speaking the parameters allow you to mask particular regions of the image and > + * to select different kinds of histogram. > + * > + * @header: The Mali-C55 parameters block header > + * @skip_x: Horizontal decimation. See enum mali_c55_aexp_skip_x > + * @offset_x: Column to start from. See enum mali_c55_aexp_row_column_offset > + * @skip_y: Vertical decimation. See enum mali_c55_aexp_skip_y > + * @offset_y: Row to start from. See enum mali_c55_aexp_row_column_offset Do the offsets need to be multiples of 2 ? > + * @scale_bottom: scale of bottom half of range: 0=1x ,1=2x, 2=4x, 4=8x, 4=16x Could you elaborate on this ? > + * @scale_top: scale of top half of range: 0=1x ,1=2x, 2=4x, 4=8x, 4=16x > + * @plane_mode: Plane separation mode. See enum mali_c55_aexp_hist_plane_mode > + * @tap_point: Tap point for histogram from enum mali_c55_aexp_hist_tap_points. > + * This parameter is unused for the post-Iridix Histogram > + */ > +struct mali_c55_params_aexp_hist { > + struct mali_c55_params_block_header header; > + __u8 skip_x; > + __u8 offset_x; > + __u8 skip_y; > + __u8 offset_y; > + __u8 scale_bottom; > + __u8 scale_top; > + __u8 plane_mode; > + __u8 tap_point; > +}; > + > +/** > + * struct mali_c55_params_aexp_weights - Array of weights for AEXP metering > + * > + * This struct allows users to configure the weighting for both of the 1024-bin > + * AEXP histograms. The pixel data collected for each zone is multiplied by the > + * corresponding weight from this array, which may be zero if the intention is > + * to mask off the zone entirely. > + * > + * @header: The Mali-C55 parameters block header > + * @nodes_used_horiz: Number of active zones horizontally [0..15] > + * @nodes_used_vert: Number of active zones vertically [0..15] Is the image automatically split in the number of zones with a uniform distribution ? What happens if the number of zones is 0 ? > + * @zone_weights: Zone weighting. Index is row*col where 0,0 is the top > + * left zone continuing in raster order. Each zone can be > + * weighted in the range [0..15]. The number of rows and > + * columns is defined by @nodes_used_vert and > + * @nodes_used_horiz > + */ > +struct mali_c55_params_aexp_weights { > + struct mali_c55_params_block_header header; > + __u8 nodes_used_horiz; > + __u8 nodes_used_vert; > + __u8 zone_weights[MALI_C55_MAX_ZONES]; > +}; > + > +/** > + * struct mali_c55_params_digital_gain - Digital gain value > + * > + * This struct carries a digital gain value to set in the ISP > + * > + * @header: The Mali-C55 parameters block header > + * @gain: The digital gain value to apply, in Q5.8 format. > + */ > +struct mali_c55_params_digital_gain { > + struct mali_c55_params_block_header header; > + __u16 gain; > +}; > + > +/** > + * enum mali_c55_awb_stats_mode - Statistics mode for AWB > + * @MALI_C55_AWB_MODE_GRBR: Statistics collected as Green/Red and Blue/Red ratios > + * @MALI_C55_AWB_MODE_RGBG: Statistics collected as Red/Green and Blue/Green ratios > + */ > +enum mali_c55_awb_stats_mode { > + MALI_C55_AWB_MODE_GRBR = 0, > + MALI_C55_AWB_MODE_RGBG, > +}; > + > +/** > + * struct mali_c55_params_awb_gains - Gain settings for auto white balance > + * > + * This struct allows users to configure the gains for auto-white balance. There > + * are four gain settings corresponding to each colour channel in the bayer > + * domain. Although named generically, the association between the gain applied > + * and the colour channel is done automatically within the ISP depending on the > + * input format, and so the following mapping always holds true:: > + * > + * gain00 = R > + * gain01 = Gr > + * gain10 = Gb > + * gain11 = B How about naming them accordingly then ? :-) > + * > + * All of the gains are stored in Q4.8 format. > + * > + * @header: The Mali-C55 parameters block header > + * @gain00: Multiplier for colour channel 00 > + * @gain01: Multiplier for colour channel 01 > + * @gain10: Multiplier for colour channel 10 > + * @gain11: Multiplier for colour channel 11 > + */ > +struct mali_c55_params_awb_gains { > + struct mali_c55_params_block_header header; > + __u16 gain00; > + __u16 gain01; > + __u16 gain10; > + __u16 gain11; > +}; > + > +/** > + * enum mali_c55_params_awb_tap_points - Tap points for the AWB statistics > + * @MALI_C55_AWB_STATS_TAP_PF: Immediately after the Purple Fringe block > + * @MALI_C55_AWB_STATS_TAP_CNR: Immediately after the CNR block > + */ > +enum mali_c55_params_awb_tap_points { > + MALI_C55_AWB_STATS_TAP_PF = 0, > + MALI_C55_AWB_STATS_TAP_CNR, > +}; > + > +/** > + * struct mali_c55_params_awb_config - Stats settings for auto-white balance > + * > + * This struct allows the configuration of the statistics generated for auto > + * white balance. Pixel intensity limits can be set to exclude overly bright or > + * dark regions of an image from the statistics entirely. Colour ratio minima > + * and maxima can be set to discount pixels who's ratios fall outside the > + * defined boundaries; there are two sets of registers to do this - the > + * "min/max" ratios which bound a region and the "high/low" ratios which further > + * trim the upper and lower ratios. For example with the boundaries configured > + * as follows, only pixels whos colour ratios falls into the region marked "A" > + * would be counted:: > + * > + * cr_high > + * 2.0 | | > + * | cb_max --> _________________________v_____ > + * 1.8 | | \ | > + * | | \ | > + * 1.6 | | \ | > + * | | \ | > + * c 1.4 | cb_low -->|\ A \|<-- cb_high > + * b | | \ | > + * 1.2 | | \ | > + * r | | \ | > + * a 1.0 | cb_min --> |____\_________________________| > + * t | ^ ^ ^ > + * i 0.8 | | | | > + * o | cr_min | cr_max > + * s 0.6 | | > + * | cr_low > + * 0.4 | > + * | > + * 0.2 | > + * | > + * 0.0 |_______________________________________________________________ > + * 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 > + * cr ratios > + * > + * @header: The Mali-C55 parameters block header > + * @tap_point: The tap point from enum mali_c55_params_awb_tap_points > + * @stats_mode: AWB statistics collection mode, see :c:type:`mali_c55_awb_stats_mode` > + * @white_level: Upper pixel intensity (I.E. raw pixel values) limit > + * @black_level: Lower pixel intensity (I.E. raw pixel values) limit > + * @cr_max: Maximum R/G ratio (Q4.8 format) > + * @cr_min: Minimum R/G ratio (Q4.8 format) > + * @cb_max: Maximum B/G ratio (Q4.8 format) > + * @cb_min: Minimum B/G ratio (Q4.8 format) > + * @nodes_used_horiz: Number of active zones horizontally [0..15] > + * @nodes_used_vert: Number of active zones vertically [0..15] > + * @cr_high: R/G ratio trim high (Q4.8 format) > + * @cr_low: R/G ratio trim low (Q4.8 format) > + * @cb_high: B/G ratio trim high (Q4.8 format) > + * @cb_low: B/G ratio trim low (Q4.8 format) > + */ > +struct mali_c55_params_awb_config { > + struct mali_c55_params_block_header header; > + __u8 tap_point; > + __u8 stats_mode; > + __u16 white_level; > + __u16 black_level; > + __u16 cr_max; > + __u16 cr_min; > + __u16 cb_max; > + __u16 cb_min; > + __u8 nodes_used_horiz; > + __u8 nodes_used_vert; > + __u16 cr_high; > + __u16 cr_low; > + __u16 cb_high; > + __u16 cb_low; > +}; > + > +#define MALI_C55_NUM_MESH_SHADING_ELEMENTS 3072 > + > +/** > + * struct mali_c55_params_mesh_shading_config - Mesh shading configuration > + * > + * The mesh shading correction module allows programming a separate table of > + * either 16x16 or 32x32 node coefficients for 3 different light sources. The > + * final correction coefficients applied are computed by blending the > + * coefficients from two tables together. > + * > + * A page of 1024 32-bit integers is associated to each colour channel, with > + * pages stored consecutively in memory. Each 32-bit integer packs 3 8-bit > + * correction coefficients for a single node, one for each of the three light > + * sources. The 8 most significant bits are unused. The following table > + * describes the layout:: > + * > + * +----------- Page (Colour Plane) 0 -------------+ > + * | @mesh[i] | Mesh Point | Bits | Light Source | > + * +-----------+------------+-------+--------------+ > + * | 0 | 0,0 | 16,23 | LS2 | > + * | | | 08-15 | LS1 | > + * | | | 00-07 | LS0 | > + * +-----------+------------+-------+--------------+ > + * | 1 | 0,1 | 16,23 | LS2 | > + * | | | 08-15 | LS1 | > + * | | | 00-07 | LS0 | > + * +-----------+------------+-------+--------------+ > + * | ... | ... | ... | ... | > + * +-----------+------------+-------+--------------+ > + * | 1023 | 31,31 | 16,23 | LS2 | > + * | | | 08-15 | LS1 | > + * | | | 00-07 | LS0 | > + * +----------- Page (Colour Plane) 1 -------------+ > + * | @mesh[i] | Mesh Point | Bits | Light Source | > + * +-----------+------------+-------+--------------+ > + * | 1024 | 0,0 | 16,23 | LS2 | > + * | | | 08-15 | LS1 | > + * | | | 00-07 | LS0 | > + * +-----------+------------+-------+--------------+ > + * | 1025 | 0,1 | 16,23 | LS2 | > + * | | | 08-15 | LS1 | > + * | | | 00-07 | LS0 | > + * +-----------+------------+-------+--------------+ > + * | ... | ... | ... | ... | > + * +-----------+------------+-------+--------------+ > + * | 2047 | 31,31 | 16,23 | LS2 | > + * | | | 08-15 | LS1 | > + * | | | 00-07 | LS0 | > + * +----------- Page (Colour Plane) 2 -------------+ > + * | @mesh[i] | Mesh Point | Bits | Light Source | > + * +-----------+------------+-------+--------------+ > + * | 2048 | 0,0 | 16,23 | LS2 | > + * | | | 08-15 | LS1 | > + * | | | 00-07 | LS0 | > + * +-----------+------------+-------+--------------+ > + * | 2049 | 0,1 | 16,23 | LS2 | > + * | | | 08-15 | LS1 | > + * | | | 00-07 | LS0 | > + * +-----------+------------+-------+--------------+ > + * | ... | ... | ... | ... | > + * +-----------+------------+-------+--------------+ > + * | 3071 | 31,31 | 16,23 | LS2 | > + * | | | 08-15 | LS1 | > + * | | | 00-07 | LS0 | > + * +-----------+------------+-------+--------------+ > + * > + * The @mesh_scale member determines the precision and minimum and maximum gain. > + * For example if @mesh_scale is 0 and therefore selects 0 - 2x gain, a value of > + * 0 in a coefficient means 0.0 gain, a value of 128 means 1.0 gain and 255 > + * means 2.0 gain. > + * > + * @header: The Mali-C55 parameters block header > + * @mesh_show: Output the mesh data rather than image data > + * @mesh_scale: Set the precision and maximum gain range of mesh shading > + * - 0 = 0-2x gain > + * - 1 = 0-4x gain > + * - 2 = 0-8x gain > + * - 3 = 0-16x gain > + * - 4 = 1-2x gain > + * - 5 = 1-3x gain > + * - 6 = 1-5x gain > + * - 7 = 1-9x gain > + * @mesh_page_r: Mesh page select for red colour plane [0..2] > + * @mesh_page_g: Mesh page select for green colour plane [0..2] > + * @mesh_page_b: Mesh page select for blue colour plane [0..2] > + * @mesh_width: Number of horizontal nodes minus 1 [15,31] > + * @mesh_height: Number of vertical nodes minus 1 [15,31] > + * @mesh: Mesh shading correction tables > + */ > +struct mali_c55_params_mesh_shading_config { > + struct mali_c55_params_block_header header; > + bool mesh_show; > + __u8 mesh_scale; > + __u8 mesh_page_r; > + __u8 mesh_page_g; > + __u8 mesh_page_b; > + __u8 mesh_width; > + __u8 mesh_height; > + __u32 mesh[MALI_C55_NUM_MESH_SHADING_ELEMENTS]; > +}; > + > +/** enum mali_c55_params_mesh_alpha_bank - Mesh shading table bank selection > + * @MALI_C55_MESH_ALPHA_BANK_LS0_AND_LS1 - Select Light Sources 0 and 1 > + * @MALI_C55_MESH_ALPHA_BANK_LS1_AND_LS2 - Select Light Sources 1 and 2 > + * @MALI_C55_MESH_ALPHA_BANK_LS0_AND_LS2 - Select Light Sources 0 and 2 > + */ > +enum mali_c55_params_mesh_alpha_bank { > + MALI_C55_MESH_ALPHA_BANK_LS0_AND_LS1 = 0, > + MALI_C55_MESH_ALPHA_BANK_LS1_AND_LS2 = 1, > + MALI_C55_MESH_ALPHA_BANK_LS0_AND_LS2 = 4 > +}; > + > +/** > + * struct mali_c55_params_mesh_shading_selection - Mesh table selection > + * > + * The module computes the final correction coefficients by blending the ones > + * from two light source tables, which are selected (independently for each > + * colour channel) by the @mesh_alpha_bank_r/g/b fields. > + * > + * The final blended coefficients for each node are calculated using the > + * following equation: > + * > + * Final coefficient = (a x LS\ :sub:`b`\ + (256 - a) x LS\ :sub:`a`\) / 256 > + * > + * Where a is the @mesh_alpha_r/g/b value, and LS\ :sub:`a`\ and LS\ :sub:`b`\ > + * are the node cofficients for the two tables selected by the > + * @mesh_alpha_bank_r/g/b value. > + * > + * The scale of the applied correction may also be controlled by tuning the > + * @mesh_strength member. This is a modifier to the final coefficients which can > + * be used to globally reduce the gains applied. > + * > + * @header: The Mali-C55 parameters block header > + * @mesh_alpha_bank_r: Red mesh table select (c:type:`enum mali_c55_params_mesh_alpha_bank`) > + * @mesh_alpha_bank_g: Green mesh table select (c:type:`enum mali_c55_params_mesh_alpha_bank`) > + * @mesh_alpha_bank_b: Blue mesh table select (c:type:`enum mali_c55_params_mesh_alpha_bank`) > + * @mesh_alpha_r: Blend coefficient for R [0..255] > + * @mesh_alpha_g: Blend coefficient for G [0..255] > + * @mesh_alpha_b: Blend coefficient for B [0..255] > + * @mesh_strength: Mesh strength in Q4.12 format [0..4096] > + */ > +struct mali_c55_params_mesh_shading_selection { > + struct mali_c55_params_block_header header; > + __u8 mesh_alpha_bank_r; > + __u8 mesh_alpha_bank_g; > + __u8 mesh_alpha_bank_b; > + __u8 mesh_alpha_r; > + __u8 mesh_alpha_g; > + __u8 mesh_alpha_b; > + __u16 mesh_strength; > +}; > + > +/** > + * define MALI_C55_PARAMS_MAX_SIZE - Maximum size of all Mali C55 Parameters > + * > + * Though the parameters for the Mali-C55 are passed as optional blocks, the > + * driver still needs to know the absolute maximum size so that it can allocate > + * a buffer sized appropriately to accomodate userspace attempting to set all > + * possible parameters in a single frame. > + */ > +#define MALI_C55_PARAMS_MAX_SIZE \ > + sizeof(struct mali_c55_params_sensor_off_preshading) + \ > + sizeof(struct mali_c55_params_aexp_hist) + \ > + sizeof(struct mali_c55_params_aexp_weights) + \ > + sizeof(struct mali_c55_params_aexp_hist) + \ > + sizeof(struct mali_c55_params_aexp_weights) + \ > + sizeof(struct mali_c55_params_digital_gain) + \ > + sizeof(struct mali_c55_params_awb_gains) + \ > + sizeof(struct mali_c55_params_awb_config) + \ > + sizeof(struct mali_c55_params_awb_gains) + \ Some data structures are duplicated, please explain why somewhere, or it may appear to be a bug. > + sizeof(struct mali_c55_params_mesh_shading_config) + \ > + sizeof(struct mali_c55_params_mesh_shading_selection) I think this will work fine now, but as soon as you add a block that contains a 64-bit field, you'll have issues. Many CPUs expect 64-bit accesses to be aligned. If some structures have a size that are not multiples of 64-bit, you'll end up having unaligned blocks. I would recommend aligning the size of each data structure to 64 bits. A simple way to do so would be to align the size of the header to 64 bits. Please test the result to make sure I'm right though :-) > + > +/** > + * struct mali_c55_params_buffer - 3A configuration parameters > + * > + * This struct contains the configuration parameters of the Mali-C55 ISP > + * algorithms, serialized by userspace into an opaque data buffer. Each It's not opaque, you've documented it fully :-) s/opaque // > + * configuration parameter block is represented by a block-specific structure > + * which contains a :c:type:`mali_c55_params_block_header` entry as first > + * member. Userspace populates the @data buffer with configuration parameters > + * for the blocks that it intends to configure. As a consequence, the data > + * buffer effective size changes according to the number of ISP blocks that > + * userspace intends to configure. > + * > + * The parameters buffer is versioned by the @version field to allow modifying > + * and extending its definition. Userspace should populate the @version field to s/should/shall/ > + * inform the driver about the version it intends to use. The driver will parse > + * and handle the @data buffer according to the data layout specific to the > + * indicated revision and return an error if the desired revision is not s/revision/version/g > + * supported. > + * > + * For each ISP block that userspace wants to configure, a block-specific > + * structure is appended to the @data buffer, one after the other without gaps > + * in between nor overlaps. Userspace shall populate the @total_size field with > + * the effective size, in bytes, of the @data buffer. > + * > + * The expected memory layout of the parameters buffer is:: > + * > + * +-------------------- struct mali_c55_params_buffer ------------------+ > + * | version = MALI_C55_PARAM_BUFFER_V0; | > + * | total_size = sizeof(struct mali_c55_params_sensor_off_preshading) | > + * | sizeof(struct mali_c55_params_aexp_hist); | > + * | +------------------------- data ---------------------------------+ | > + * | | +--------- struct mali_c55_params_sensor_off_preshading ------+ | | > + * | | | +-------- struct mali_c55_params_block_header header -----+ | | | > + * | | | | type = MALI_C55_PARAM_BLOCK_SENSOR_OFFS; | | | | > + * | | | | enabled = 1; | | | | > + * | | | | size = | | | | > + * | | | | sizeof(struct mali_c55_params_sensor_off_preshading);| | | | > + * | | | +---------------------------------------------------------+ | | | > + * | | | chan00 = ...; | | | > + * | | | chan01 = ...; | | | > + * | | | chan10 = ...; | | | > + * | | | chan11 = ...; | | | > + * | | +------------ struct mali_c55_params_aexp_hist ---------------+ | | > + * | | | +-------- struct mali_c55_params_block_header header -----+ | | | > + * | | | | type = MALI_C55_PARAM_BLOCK_AEXP_HIST; | | | | > + * | | | | enabled = 1; | | | | > + * | | | | size = sizeof(struct mali_c55_params_aexp_hist); | | | | > + * | | | +---------------------------------------------------------+ | | | > + * | | | skip_x = ...; | | | > + * | | | offset_x = ...; | | | > + * | | | skip_y = ...; | | | > + * | | | offset_y = ...; | | | > + * | | | scale_bottom = ...; | | | > + * | | | scale_top = ...; | | | > + * | | | plane_mode = ...; | | | > + * | | | tap_point = ...; | | | > + * | | +-------------------------------------------------------------+ | | > + * | +-----------------------------------------------------------------+ | > + * +---------------------------------------------------------------------+ > + * > + * @version: The Mali-C55 parameters buffer version > + * @total_size: The Mali-C55 configuration data effective size, excluding this > + * header > + * @data: The Mali-C55 configuration blocks data > + */ > +struct mali_c55_params_buffer { > + enum mali_c55_param_buffer_version version; > + size_t total_size; > + __u8 data[MALI_C55_PARAMS_MAX_SIZE]; > +}; > + > #endif /* __UAPI_MALI_C55_CONFIG_H */ -- Regards, Laurent Pinchart