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 D3F7CC433F5 for ; Fri, 3 Dec 2021 01:55:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1356720AbhLCB6b (ORCPT ); Thu, 2 Dec 2021 20:58:31 -0500 Received: from mailgw01.mediatek.com ([60.244.123.138]:54578 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S235608AbhLCB6a (ORCPT ); Thu, 2 Dec 2021 20:58:30 -0500 X-UUID: ba3d8d483edc422f9c1a20e721a9484e-20211203 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=+noD9So2vtPTce89wwpEV+fiHvsXrozU1mApoEZnKXk=; b=PfAm3HcgjPInXl+G9h2kGxF/31DPKcTI/eTVx1fkZcoG667oTYnMJU0cJQIQFeJ016WnZLsk65f07tJMdpN2NfZ9xwC4gQYbfpM4E6bp+jzUGVu3rKlvOxe0axKJJP7CqdssNRDeICBSoR4AJmXQzeJdFD6170SsOhuVNoioJlA=; X-UUID: ba3d8d483edc422f9c1a20e721a9484e-20211203 Received: from mtkexhb01.mediatek.inc [(172.21.101.102)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1932849924; Fri, 03 Dec 2021 09:55:03 +0800 Received: from mtkcas11.mediatek.inc (172.21.101.40) by mtkmbs07n2.mediatek.inc (172.21.101.141) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 3 Dec 2021 09:55:02 +0800 Received: from mhfsdcap04 (10.17.3.154) by mtkcas11.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Fri, 3 Dec 2021 09:55:00 +0800 Message-ID: <196c55db7c48c29a5858e6446f19756fae3bb157.camel@mediatek.com> Subject: Re: [PATCH v11, 10/19] media: mtk-vcodec: Add msg queue feature for lat and core architecture From: "yunfei.dong@mediatek.com" To: AngeloGioacchino Del Regno , Alexandre Courbot , Hans Verkuil , Tzung-Bi Shih , "Tiffany Lin" , Andrew-CT Chen , Mauro Carvalho Chehab , Rob Herring , Matthias Brugger , Tomasz Figa CC: Hsin-Yi Wang , Fritz Koenig , Dafna Hirschfeld , Benjamin Gaignard , Daniel Vetter , dri-devel , Irui Wang , , , , , , , Date: Fri, 3 Dec 2021 09:55:00 +0800 In-Reply-To: <9710488f-9129-4462-b528-642561021731@collabora.com> References: <20211129034201.5767-1-yunfei.dong@mediatek.com> <20211129034201.5767-11-yunfei.dong@mediatek.com> <9710488f-9129-4462-b528-642561021731@collabora.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.2 MIME-Version: 1.0 X-MTK: N Content-Transfer-Encoding: base64 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SGkgQW5nZWxvR2lvYWNjaGlubywNCg0KVGhhbmtzIGZvciB5b3VyIHN1Z2dlc3Rpb24uDQpPbiBX ZWQsIDIwMjEtMTItMDEgYXQgMTM6MDkgKzAxMDAsIEFuZ2Vsb0dpb2FjY2hpbm8gRGVsIFJlZ25v IHdyb3RlOg0KPiBJbCAyOS8xMS8yMSAwNDo0MSwgWXVuZmVpIERvbmcgaGEgc2NyaXR0bzoNCj4g PiBGb3IgbGF0IGFuZCBjb3JlIGFyY2hpdGVjdHVyZSwgbGF0IHRocmVhZCB3aWxsIHNlbmQgbWVz c2FnZSB0byBjb3JlDQo+ID4gdGhyZWFkIHdoZW4gbGF0IGRlY29kZSBkb25lLiBDb3JlIGhhcmR3 YXJlIHdpbGwgdXNlIHRoZSBtZXNzYWdlDQo+ID4gZnJvbSBsYXQgdG8gZGVjb2RlLCB0aGVuIGZy ZWUgbWVzc2FnZSB0byBsYXQgdGhyZWFkIHdoZW4gZGVjb2RlDQo+ID4gZG9uZS4NCj4gPiANCj4g PiBTaWduZWQtb2ZmLWJ5OiBZdW5mZWkgRG9uZyA8eXVuZmVpLmRvbmdAbWVkaWF0ZWsuY29tPg0K PiA+IC0tLQ0KPiA+ICAgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL01ha2VmaWxl ICAgIHwgICAxICsNCj4gPiAgIC4uLi9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZHJ2 LmggICAgICB8ICAgOSArDQo+ID4gICAuLi4vcGxhdGZvcm0vbXRrLXZjb2RlYy92ZGVjX21zZ19x dWV1ZS5jICAgICAgfCAyNTcNCj4gPiArKysrKysrKysrKysrKysrKysNCj4gPiAgIC4uLi9wbGF0 Zm9ybS9tdGstdmNvZGVjL3ZkZWNfbXNnX3F1ZXVlLmggICAgICB8IDE0OCArKysrKysrKysrDQo+ ID4gICA0IGZpbGVzIGNoYW5nZWQsIDQxNSBpbnNlcnRpb25zKCspDQo+ID4gICBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstDQo+ID4gdmNvZGVjL3ZkZWNfbXNn X3F1ZXVlLmMNCj4gPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL21lZGlhL3BsYXRmb3Jt L210ay0NCj4gPiB2Y29kZWMvdmRlY19tc2dfcXVldWUuaA0KPiA+IA0KPiA+IGRpZmYgLS1naXQg YS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvTWFrZWZpbGUNCj4gPiBiL2RyaXZl cnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9NYWtlZmlsZQ0KPiA+IGluZGV4IGM2MWJmYjE3 OWJjYy4uMzU5NjE5NjUzYTBlIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZv cm0vbXRrLXZjb2RlYy9NYWtlZmlsZQ0KPiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0v bXRrLXZjb2RlYy9NYWtlZmlsZQ0KPiA+IEBAIC0xMiw2ICsxMiw3IEBAIG10ay12Y29kZWMtZGVj LXkgOj0gdmRlYy92ZGVjX2gyNjRfaWYubyBcDQo+ID4gICAJCW10a192Y29kZWNfZGVjX2Rydi5v IFwNCj4gPiAgIAkJdmRlY19kcnZfaWYubyBcDQo+ID4gICAJCXZkZWNfdnB1X2lmLm8gXA0KPiA+ ICsJCXZkZWNfbXNnX3F1ZXVlLm8gXA0KPiA+ICAgCQltdGtfdmNvZGVjX2RlYy5vIFwNCj4gPiAg IAkJbXRrX3Zjb2RlY19kZWNfc3RhdGVmdWwubyBcDQo+ID4gICAJCW10a192Y29kZWNfZGVjX3N0 YXRlbGVzcy5vIFwNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGst dmNvZGVjL210a192Y29kZWNfZHJ2LmgNCj4gPiBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRr LXZjb2RlYy9tdGtfdmNvZGVjX2Rydi5oDQo+ID4gaW5kZXggN2ZjMTA2ZGYwMzliLi42MTBiMGFm MTM4NzkgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVj L210a192Y29kZWNfZHJ2LmgNCj4gPiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12 Y29kZWMvbXRrX3Zjb2RlY19kcnYuaA0KPiA+IEBAIC0xNSw3ICsxNSw5IEBADQo+ID4gICAjaW5j bHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPg0KPiA+ICAgI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVt Mm1lbS5oPg0KPiA+ICAgI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+DQo+ID4gKw0K PiA+ICAgI2luY2x1ZGUgIm10a192Y29kZWNfdXRpbC5oIg0KPiA+ICsjaW5jbHVkZSAidmRlY19t c2dfcXVldWUuaCINCj4gPiAgIA0KPiA+ICAgI2RlZmluZSBNVEtfVkNPREVDX0RSVl9OQU1FCSJt dGtfdmNvZGVjX2RydiINCj4gPiAgICNkZWZpbmUgTVRLX1ZDT0RFQ19ERUNfTkFNRQkibXRrLXZj b2RlYy1kZWMiDQo+ID4gQEAgLTI4Miw2ICsyODQsOCBAQCBzdHJ1Y3QgdmRlY19waWNfaW5mbyB7 DQo+ID4gICAgKiBAZGVjb2RlZF9mcmFtZV9jbnQ6IG51bWJlciBvZiBkZWNvZGVkIGZyYW1lcw0K PiA+ICAgICogQGxvY2s6IHByb3RlY3QgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IFY0TDIgdGhyZWFk cyBhbmQgd29ya2VyDQo+ID4gdGhyZWFkIHN1Y2ggYXMNCj4gPiAgICAqCSAgbXRrX3ZpZGVvX2Rl Y19idWYuDQo+ID4gKyAqDQo+ID4gKyAqIEBtc2dfcXVldWU6IG1zZyBxdWV1ZSB1c2VkIHRvIHN0 b3JlIGxhdCBidWZmZXIgaW5mb3JtYXRpb24uDQo+ID4gICAgKi8NCj4gPiAgIHN0cnVjdCBtdGtf dmNvZGVjX2N0eCB7DQo+ID4gICAJZW51bSBtdGtfaW5zdGFuY2VfdHlwZSB0eXBlOw0KPiA+IEBA IC0zMjUsNiArMzI5LDcgQEAgc3RydWN0IG10a192Y29kZWNfY3R4IHsNCj4gPiAgIAlpbnQgZGVj b2RlZF9mcmFtZV9jbnQ7DQo+ID4gICAJc3RydWN0IG11dGV4IGxvY2s7DQo+ID4gICANCj4gPiAr CXN0cnVjdCB2ZGVjX21zZ19xdWV1ZSBtc2dfcXVldWU7DQo+ID4gICB9Ow0KPiA+ICAgDQo+ID4g ICBlbnVtIG10a19jaGlwIHsNCj4gPiBAQCAtNDU3LDYgKzQ2Miw4IEBAIHN0cnVjdCBtdGtfdmNv ZGVjX2VuY19wZGF0YSB7DQo+ID4gICAgKiBAZGVjX2NhcGFiaWxpdHk6IHVzZWQgdG8gaWRlbnRp ZnkgZGVjb2RlIGNhcGFiaWxpdHksIGV4OiA0aw0KPiA+ICAgICogQGVuY19jYXBhYmlsaXR5OiB1 c2VkIHRvIGlkZW50aWZ5IGVuY29kZSBjYXBhYmlsaXR5DQo+ID4gICAgKg0KPiA+ICsgKiBAbXNn X3F1ZXVlX2NvcmVfY3R4OiBtc2cgcXVldWUgY29udGV4dCB1c2VkIGZvciBjb3JlIHdvcmtxdWV1 ZQ0KPiA+ICsgKg0KPiA+ICAgICogQHN1YmRldl9kZXY6IHN1YmRldiBoYXJkd2FyZSBkZXZpY2UN Cj4gPiAgICAqIEBzdWJkZXZfYml0bWFwOiB1c2VkIHRvIHJlY29yZCBoYXJkd2FyZSBpcyByZWFk eSBvciBub3QNCj4gPiAgICAqLw0KPiA+IEBAIC00OTcsNiArNTA0LDggQEAgc3RydWN0IG10a192 Y29kZWNfZGV2IHsNCj4gPiAgIAl1bnNpZ25lZCBpbnQgZGVjX2NhcGFiaWxpdHk7DQo+ID4gICAJ dW5zaWduZWQgaW50IGVuY19jYXBhYmlsaXR5Ow0KPiA+ICAgDQo+ID4gKwlzdHJ1Y3QgdmRlY19t c2dfcXVldWVfY3R4IG1zZ19xdWV1ZV9jb3JlX2N0eDsNCj4gPiArDQo+ID4gICAJdm9pZCAqc3Vi ZGV2X2RldltNVEtfVkRFQ19IV19NQVhdOw0KPiA+ICAgCURFQ0xBUkVfQklUTUFQKHN1YmRldl9i aXRtYXAsIE1US19WREVDX0hXX01BWCk7DQo+ID4gICB9Ow0KPiA+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmRlY19tc2dfcXVldWUuYw0KPiA+IGIvZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZkZWNfbXNnX3F1ZXVlLmMNCj4gPiBuZXcg ZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uZGE0ZDExNGY3YWQwDQo+ ID4gLS0tIC9kZXYvbnVsbA0KPiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZj b2RlYy92ZGVjX21zZ19xdWV1ZS5jDQo+ID4gQEAgLTAsMCArMSwyNTcgQEANCj4gPiArLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjANCj4gPiArLyoNCj4gPiArICogQ29weXJpZ2h0 IChjKSAyMDIxIE1lZGlhVGVrIEluYy4NCj4gPiArICogQXV0aG9yOiBZdW5mZWkgRG9uZyA8eXVu ZmVpLmRvbmdAbWVkaWF0ZWsuY29tPg0KPiA+ICsgKi8NCj4gPiArDQo+ID4gKyNpbmNsdWRlIDxs aW51eC9mcmVlemVyLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4NCj4gPiAr I2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4NCj4gPiArDQo+ID4gKyNpbmNsdWRlICJtdGtfdmNv ZGVjX2RlY19wbS5oIg0KPiA+ICsjaW5jbHVkZSAibXRrX3Zjb2RlY19kcnYuaCINCj4gPiArI2lu Y2x1ZGUgInZkZWNfbXNnX3F1ZXVlLmgiDQo+ID4gKw0KPiA+ICsvKiB0aGUgc2l6ZSB1c2VkIHRv IHN0b3JlIGxhdCBzbGljZSBoZWFkZXIgaW5mb3JtYXRpb24gKi8NCj4gPiArI2RlZmluZSBWREVD X0xBVF9TTElDRV9IRUFERVJfU1ogICAgKDY0MCAqIFNaXzFLKQ0KPiA+ICsNCj4gPiArLyogdGhl IHNpemUgdXNlZCB0byBzdG9yZSBhdmMgZXJyb3IgaW5mb3JtYXRpb24gKi8NCj4gPiArI2RlZmlu ZSBWREVDX0VSUl9NQVBfU1pfQVZDICAgICAgICAgKDE3ICogU1pfMUspDQo+ID4gKw0KPiA+ICsv KiBjb3JlIHdpbGwgcmVhZCB0aGUgdHJhbnMgYnVmZmVyIHdoaWNoIGRlY29kZWQgYnkgbGF0IHRv IGRlY29kZQ0KPiA+IGFnYWluLg0KPiA+ICsgKiBUaGUgdHJhbnMgYnVmZmVyIHNpemUgb2YgRkhE IGFuZCA0SyBiaXRzdHJlYW1zIGFyZSBkaWZmZXJlbnQuDQo+ID4gKyAqLw0KPiA+ICtzdGF0aWMg aW50IHZkZV9tc2dfcXVldWVfZ2V0X3RyYW5zX3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQ0K PiA+ICt7DQo+ID4gKwlpZiAod2lkdGggPiAxOTIwIHx8IGhlaWdodCA+IDEwODgpDQo+ID4gKwkJ cmV0dXJuIDMwICogU1pfMU07DQo+ID4gKwllbHNlDQo+ID4gKwkJcmV0dXJuIDYgKiBTWl8xTTsN Cj4gPiArfQ0KPiA+ICsNCj4gPiArdm9pZCB2ZGVjX21zZ19xdWV1ZV9pbml0X2N0eChzdHJ1Y3Qg dmRlY19tc2dfcXVldWVfY3R4ICpjdHgsDQo+ID4gKwlpbnQgaGFyZHdhcmVfaW5kZXgpDQo+ID4g K3sNCj4gPiArCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+cmVhZHlfdG9fdXNlKTsNCj4gPiAr CUlOSVRfTElTVF9IRUFEKCZjdHgtPnJlYWR5X3F1ZXVlKTsNCj4gPiArCXNwaW5fbG9ja19pbml0 KCZjdHgtPnJlYWR5X2xvY2spOw0KPiA+ICsJY3R4LT5yZWFkeV9udW0gPSAwOw0KPiA+ICsJY3R4 LT5oYXJkd2FyZV9pbmRleCA9IGhhcmR3YXJlX2luZGV4Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtz dGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqdmRlY19nZXRfYnVmX2xpc3QoaW50IGhhcmR3YXJlX2lu ZGV4LA0KPiA+ICsJc3RydWN0IHZkZWNfbGF0X2J1ZiAqYnVmKQ0KPiA+ICt7DQo+ID4gKwlzd2l0 Y2ggKGhhcmR3YXJlX2luZGV4KSB7DQo+ID4gKwljYXNlIE1US19WREVDX0NPUkU6DQo+ID4gKwkJ cmV0dXJuICZidWYtPmNvcmVfbGlzdDsNCj4gPiArCWNhc2UgTVRLX1ZERUNfTEFUMDoNCj4gPiAr CQlyZXR1cm4gJmJ1Zi0+bGF0X2xpc3Q7DQo+ID4gKwlkZWZhdWx0Og0KPiA+ICsJCXJldHVybiBO VUxMOw0KPiA+ICsJfQ0KPiA+ICt9DQo+ID4gKw0KPiA+ICt2b2lkIHZkZWNfbXNnX3F1ZXVlX3Fi dWYoc3RydWN0IHZkZWNfbXNnX3F1ZXVlX2N0eCAqbXNnX2N0eCwNCj4gPiArCXN0cnVjdCB2ZGVj X2xhdF9idWYgKmJ1ZikNCj4gDQo+IFRoaXMgZnVuY3Rpb24gY2FuIGZhaWw6IGl0IGhhcyB0byBy ZXR1cm4gYW4gaW50ZWdlciB2YWx1ZS4NCj4gDQo+ID4gK3sNCj4gPiArCXN0cnVjdCBsaXN0X2hl YWQgKmhlYWQ7DQo+ID4gKw0KPiA+ICsJaGVhZCA9IHZkZWNfZ2V0X2J1Zl9saXN0KG1zZ19jdHgt PmhhcmR3YXJlX2luZGV4LCBidWYpOw0KPiA+ICsJaWYgKCFoZWFkKSB7DQo+ID4gKwkJbXRrX3Y0 bDJfZXJyKCJmYWlsIHRvIHFidWY6ICVkIixtc2dfY3R4LQ0KPiA+ID5oYXJkd2FyZV9pbmRleCk7 DQo+ID4gKwkJcmV0dXJuOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXNwaW5fbG9jaygmbXNnX2N0 eC0+cmVhZHlfbG9jayk7DQo+ID4gKwlsaXN0X2FkZF90YWlsKGhlYWQsICZtc2dfY3R4LT5yZWFk eV9xdWV1ZSk7DQo+ID4gKwltc2dfY3R4LT5yZWFkeV9udW0rKzsNCj4gPiArDQo+ID4gKwlpZiAo bXNnX2N0eC0+aGFyZHdhcmVfaW5kZXggIT0gTVRLX1ZERUNfQ09SRSkNCj4gPiArCQl3YWtlX3Vw X2FsbCgmbXNnX2N0eC0+cmVhZHlfdG9fdXNlKTsNCj4gPiArDQo+ID4gKwltdGtfdjRsMl9kZWJ1 ZygzLCAiZW5xdWV1ZSBidWYgdHlwZTogJWQgYWRkcjogMHglcCBudW06ICVkIiwNCj4gPiArCQlt c2dfY3R4LT5oYXJkd2FyZV9pbmRleCwgYnVmLCBtc2dfY3R4LT5yZWFkeV9udW0pOw0KPiA+ICsJ c3Bpbl91bmxvY2soJm1zZ19jdHgtPnJlYWR5X2xvY2spOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtz dGF0aWMgYm9vbCB2ZGVjX21zZ19xdWV1ZV93YWl0X2V2ZW50KHN0cnVjdCB2ZGVjX21zZ19xdWV1 ZV9jdHgNCj4gPiAqbXNnX2N0eCkNCj4gPiArew0KPiA+ICsJaW50IHJldDsNCj4gPiArDQo+ID4g KwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQobXNnX2N0eC0+cmVhZHlfdG9fdXNlLA0KPiA+ICsJ CSFsaXN0X2VtcHR5KCZtc2dfY3R4LT5yZWFkeV9xdWV1ZSksDQo+ID4gKwkJbXNlY3NfdG9famlm ZmllcygxNTAwKSk7DQo+IA0KPiBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZmlsZToNCj4gI2Rl ZmluZSBWREVDX01TR19RVUVVRV9USU1FT1VUX01TCTE1MDANCj4gDQpGaXggaW4gcGF0Y2ggdjEy Lg0KPiAuLi50aGVuOg0KPiAJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KG1zZ19jdHgtPnJlYWR5 X3RvX3VzZSwNCj4gDQo+IAkJCQkgIWxpc3RfZW1wdHkoJm1zZ19jdHgtPnJlYWR5X3F1ZXVlKSwN Cj4gDQo+IAkJCQkgbXNlY3NfdG9famlmZmllcyhWREVDX01TR19RVUVVRV9USU1FT1UNCj4gVF9N UykpOw0KPiANCj4gDQo+ID4gKwlpZiAoIXJldCkNCj4gPiArCQlyZXR1cm4gZmFsc2U7DQo+ID4g Kw0KPiA+ICsJcmV0dXJuIHRydWU7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0cnVjdCB2ZGVjX2xh dF9idWYgKnZkZWNfbXNnX3F1ZXVlX2RxYnVmKHN0cnVjdA0KPiA+IHZkZWNfbXNnX3F1ZXVlX2N0 eCAqbXNnX2N0eCkNCj4gPiArew0KPiA+ICsJc3RydWN0IHZkZWNfbGF0X2J1ZiAqYnVmOw0KPiA+ ICsJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsNCj4gPiArCWludCByZXQ7DQo+ID4gKw0KPiA+ICsJ c3Bpbl9sb2NrKCZtc2dfY3R4LT5yZWFkeV9sb2NrKTsNCj4gPiArCWlmIChsaXN0X2VtcHR5KCZt c2dfY3R4LT5yZWFkeV9xdWV1ZSkpIHsNCj4gPiArCQltdGtfdjRsMl9kZWJ1ZygzLCAicXVldWUg aXMgTlVMTCwgdHlwZTolZCBudW06ICVkIiwNCj4gPiArCQkJbXNnX2N0eC0+aGFyZHdhcmVfaW5k ZXgsIG1zZ19jdHgtPnJlYWR5X251bSk7DQo+ID4gKwkJc3Bpbl91bmxvY2soJm1zZ19jdHgtPnJl YWR5X2xvY2spOw0KPiA+ICsNCj4gPiArCQlpZiAobXNnX2N0eC0+aGFyZHdhcmVfaW5kZXggPT0g TVRLX1ZERUNfQ09SRSkNCj4gPiArCQkJcmV0dXJuIE5VTEw7DQo+ID4gKw0KPiA+ICsJCXJldCA9 IHZkZWNfbXNnX3F1ZXVlX3dhaXRfZXZlbnQobXNnX2N0eCk7DQo+ID4gKwkJaWYgKCFyZXQpDQo+ ID4gKwkJCXJldHVybiBOVUxMOw0KPiA+ICsJCXNwaW5fbG9jaygmbXNnX2N0eC0+cmVhZHlfbG9j ayk7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJaWYgKG1zZ19jdHgtPmhhcmR3YXJlX2luZGV4ID09 IE1US19WREVDX0NPUkUpDQo+ID4gKwkJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmbXNnX2N0eC0+ cmVhZHlfcXVldWUsDQo+ID4gKwkJCXN0cnVjdCB2ZGVjX2xhdF9idWYsIGNvcmVfbGlzdCk7DQo+ ID4gKwllbHNlDQo+ID4gKwkJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmbXNnX2N0eC0+cmVhZHlf cXVldWUsDQo+ID4gKwkJCXN0cnVjdCB2ZGVjX2xhdF9idWYsIGxhdF9saXN0KTsNCj4gPiArDQo+ ID4gKwloZWFkID0gdmRlY19nZXRfYnVmX2xpc3QobXNnX2N0eC0+aGFyZHdhcmVfaW5kZXgsIGJ1 Zik7DQo+ID4gKwlpZiAoIWhlYWQpIHsNCj4gPiArCQlzcGluX3VubG9jaygmbXNnX2N0eC0+cmVh ZHlfbG9jayk7DQo+ID4gKwkJbXRrX3Y0bDJfZXJyKCJmYWlsIHRvIGRxYnVmOiAlZCIsbXNnX2N0 eC0NCj4gPiA+aGFyZHdhcmVfaW5kZXgpOw0KPiA+ICsJCXJldHVybiBOVUxMOw0KPiA+ICsJfQ0K PiA+ICsJbGlzdF9kZWwoaGVhZCk7DQo+ID4gKw0KPiA+ICsJbXNnX2N0eC0+cmVhZHlfbnVtLS07 DQo+ID4gKwltdGtfdjRsMl9kZWJ1ZygzLCAiZHF1ZXVlIGJ1ZiB0eXBlOiVkIGFkZHI6IDB4JXAg bnVtOiAlZCIsDQo+ID4gKwkJbXNnX2N0eC0+aGFyZHdhcmVfaW5kZXgsIGJ1ZiwgbXNnX2N0eC0+ cmVhZHlfbnVtKTsNCj4gPiArCXNwaW5fdW5sb2NrKCZtc2dfY3R4LT5yZWFkeV9sb2NrKTsNCj4g PiArDQo+ID4gKwlyZXR1cm4gYnVmOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICt2b2lkIHZkZWNfbXNn X3F1ZXVlX3VwZGF0ZV91YmVfcnB0cihzdHJ1Y3QgdmRlY19tc2dfcXVldWUNCj4gPiAqbXNnX3F1 ZXVlLA0KPiA+ICsJdWludDY0X3QgdWJlX3JwdHIpDQo+ID4gK3sNCj4gPiArCXNwaW5fbG9jaygm bXNnX3F1ZXVlLT5sYXRfY3R4LnJlYWR5X2xvY2spOw0KPiA+ICsJbXNnX3F1ZXVlLT53ZG1hX3Jw dHJfYWRkciA9IHViZV9ycHRyOw0KPiA+ICsJbXRrX3Y0bDJfZGVidWcoMywgInVwZGF0ZSB1YmUg cnBydCAoMHglbGx4KSIsIHViZV9ycHRyKTsNCj4gPiArCXNwaW5fdW5sb2NrKCZtc2dfcXVldWUt PmxhdF9jdHgucmVhZHlfbG9jayk7DQo+ID4gK30NCj4gPiArDQo+ID4gK3ZvaWQgdmRlY19tc2df cXVldWVfdXBkYXRlX3ViZV93cHRyKHN0cnVjdCB2ZGVjX21zZ19xdWV1ZQ0KPiA+ICptc2dfcXVl dWUsDQo+ID4gKwl1aW50NjRfdCB1YmVfd3B0cikNCj4gPiArew0KPiA+ICsJc3Bpbl9sb2NrKCZt c2dfcXVldWUtPmxhdF9jdHgucmVhZHlfbG9jayk7DQo+ID4gKwltc2dfcXVldWUtPndkbWFfd3B0 cl9hZGRyID0gdWJlX3dwdHI7DQo+ID4gKwltdGtfdjRsMl9kZWJ1ZygzLCAidXBkYXRlIHViZSB3 cHJ0OiAoMHglbGx4IDB4JWxseCkgb2Zmc2V0Og0KPiA+IDB4JWxseCIsDQo+ID4gKwkJbXNnX3F1 ZXVlLT53ZG1hX3JwdHJfYWRkciwgbXNnX3F1ZXVlLT53ZG1hX3dwdHJfYWRkciwNCj4gPiB1YmVf d3B0cik7DQo+ID4gKwlzcGluX3VubG9jaygmbXNnX3F1ZXVlLT5sYXRfY3R4LnJlYWR5X2xvY2sp Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtib29sIHZkZWNfbXNnX3F1ZXVlX3dhaXRfbGF0X2J1Zl9m dWxsKHN0cnVjdCB2ZGVjX21zZ19xdWV1ZQ0KPiA+ICptc2dfcXVldWUpDQo+ID4gK3sNCj4gPiAr CWxvbmcgdGltZW91dF9qaWZmOw0KPiA+ICsJaW50IHJldDsNCj4gPiArDQo+ID4gKwl0aW1lb3V0 X2ppZmYgPSBtc2Vjc190b19qaWZmaWVzKDEwMDAgKiAoTlVNX0JVRkZFUl9DT1VOVCArIDIpKTsN Cj4gPiArCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChtc2dfcXVldWUtPmxhdF9jdHgucmVhZHlf dG9fdXNlLA0KPiA+ICsJCW1zZ19xdWV1ZS0+bGF0X2N0eC5yZWFkeV9udW0gPT0gTlVNX0JVRkZF Ul9DT1VOVCwNCj4gPiArCQl0aW1lb3V0X2ppZmYpOw0KPiA+ICsJaWYgKHJldCkgew0KPiA+ICsJ CW10a192NGwyX2RlYnVnKDMsICJzdWNjZXNzIHRvIGdldCBsYXQgYnVmOiAlZCIsDQo+ID4gKwkJ CW1zZ19xdWV1ZS0+bGF0X2N0eC5yZWFkeV9udW0pOw0KPiA+ICsJCXJldHVybiB0cnVlOw0KPiA+ ICsJfQ0KPiA+ICsJbXRrX3Y0bDJfZXJyKCJmYWlsZWQgd2l0aCBsYXQgYnVmIGlzbid0IGZ1bGw6 ICVkIiwNCj4gPiArCQltc2dfcXVldWUtPmxhdF9jdHgucmVhZHlfbnVtKTsNCj4gPiArCXJldHVy biBmYWxzZTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArdm9pZCB2ZGVjX21zZ19xdWV1ZV9kZWluaXQo DQo+ID4gKwlzdHJ1Y3QgdmRlY19tc2dfcXVldWUgKm1zZ19xdWV1ZSwNCj4gPiArCXN0cnVjdCBt dGtfdmNvZGVjX2N0eCAqY3R4KQ0KPiA+ICt7DQo+ID4gKwlzdHJ1Y3QgdmRlY19sYXRfYnVmICps YXRfYnVmOw0KPiA+ICsJc3RydWN0IG10a192Y29kZWNfbWVtICptZW07DQo+ID4gKwlpbnQgaTsN Cj4gPiArDQo+ID4gKwltZW0gPSAmbXNnX3F1ZXVlLT53ZG1hX2FkZHI7DQo+ID4gKwlpZiAobWVt LT52YSkNCj4gPiArCQltdGtfdmNvZGVjX21lbV9mcmVlKGN0eCwgbWVtKTsNCj4gPiArCWZvciAo aSA9IDA7IGkgPCBOVU1fQlVGRkVSX0NPVU5UOyBpKyspIHsNCj4gPiArCQlsYXRfYnVmID0gJm1z Z19xdWV1ZS0+bGF0X2J1ZltpXTsNCj4gPiArDQo+ID4gKwkJbWVtID0gJmxhdF9idWYtPndkbWFf ZXJyX2FkZHI7DQo+ID4gKwkJaWYgKG1lbS0+dmEpDQo+ID4gKwkJCW10a192Y29kZWNfbWVtX2Zy ZWUoY3R4LCBtZW0pOw0KPiA+ICsNCj4gPiArCQltZW0gPSAmbGF0X2J1Zi0+c2xpY2VfYmNfYWRk cjsNCj4gPiArCQlpZiAobWVtLT52YSkNCj4gPiArCQkJbXRrX3Zjb2RlY19tZW1fZnJlZShjdHgs IG1lbSk7DQo+ID4gKw0KPiA+ICsJCWlmIChsYXRfYnVmLT5wcml2YXRlX2RhdGEpDQo+ID4gKwkJ CWtmcmVlKGxhdF9idWYtPnByaXZhdGVfZGF0YSk7DQo+ID4gKwl9DQo+ID4gK30NCj4gPiArDQo+ ID4gK2ludCB2ZGVjX21zZ19xdWV1ZV9pbml0KA0KPiA+ICsJc3RydWN0IHZkZWNfbXNnX3F1ZXVl ICptc2dfcXVldWUsDQo+ID4gKwlzdHJ1Y3QgbXRrX3Zjb2RlY19jdHggKmN0eCwNCj4gPiArCWNv cmVfZGVjb2RlX2NiX3QgY29yZV9kZWNvZGUsDQo+ID4gKwlpbnQgcHJpdmF0ZV9zaXplKQ0KPiA+ ICt7DQo+ID4gKwlzdHJ1Y3QgdmRlY19sYXRfYnVmICpsYXRfYnVmOw0KPiA+ICsJaW50IGksIGVy cjsNCj4gPiArDQo+ID4gKwkvKiBhbHJlYWR5IGluaXQgbXNnIHF1ZXVlICovDQo+ID4gKwlpZiAo bXNnX3F1ZXVlLT53ZG1hX2FkZHIuc2l6ZSkNCj4gPiArCQlyZXR1cm4gMDsNCj4gPiArDQo+ID4g Kwl2ZGVjX21zZ19xdWV1ZV9pbml0X2N0eCgmbXNnX3F1ZXVlLT5sYXRfY3R4LCBNVEtfVkRFQ19M QVQwKTsNCj4gPiArCW1zZ19xdWV1ZS0+d2RtYV9hZGRyLnNpemUgPSB2ZGVfbXNnX3F1ZXVlX2dl dF90cmFuc19zaXplKA0KPiA+ICsJCWN0eC0+cGljaW5mby5idWZfdywgY3R4LT5waWNpbmZvLmJ1 Zl9oKTsNCj4gPiArDQo+ID4gKwllcnIgPSBtdGtfdmNvZGVjX21lbV9hbGxvYyhjdHgsICZtc2df cXVldWUtPndkbWFfYWRkcik7DQo+ID4gKwlpZiAoZXJyKSB7DQo+ID4gKwkJbXRrX3Y0bDJfZXJy KCJmYWlsZWQgdG8gYWxsb2NhdGUgd2RtYV9hZGRyIGJ1ZiIpOw0KPiA+ICsJCXJldHVybiAtRU5P TUVNOw0KPiA+ICsJfQ0KPiA+ICsJbXNnX3F1ZXVlLT53ZG1hX3JwdHJfYWRkciA9IG1zZ19xdWV1 ZS0+d2RtYV9hZGRyLmRtYV9hZGRyOw0KPiA+ICsJbXNnX3F1ZXVlLT53ZG1hX3dwdHJfYWRkciA9 IG1zZ19xdWV1ZS0+d2RtYV9hZGRyLmRtYV9hZGRyOw0KPiA+ICsNCj4gPiArCWZvciAoaSA9IDA7 IGkgPCBOVU1fQlVGRkVSX0NPVU5UOyBpKyspIHsNCj4gPiArCQlsYXRfYnVmID0gJm1zZ19xdWV1 ZS0+bGF0X2J1ZltpXTsNCj4gPiArDQo+ID4gKwkJbGF0X2J1Zi0+d2RtYV9lcnJfYWRkci5zaXpl ID0gVkRFQ19FUlJfTUFQX1NaX0FWQzsNCj4gPiArCQllcnIgPSBtdGtfdmNvZGVjX21lbV9hbGxv YyhjdHgsICZsYXRfYnVmLQ0KPiA+ID53ZG1hX2Vycl9hZGRyKTsNCj4gPiArCQlpZiAoZXJyKSB7 DQo+ID4gKwkJCW10a192NGwyX2VycigiZmFpbGVkIHRvIGFsbG9jYXRlIHdkbWFfZXJyX2FkZHIN Cj4gPiBidWZbJWRdIiwgaSk7DQo+ID4gKwkJCWdvdG8gbWVtX2FsbG9jX2VycjsNCj4gPiArCQl9 DQo+ID4gKw0KPiA+ICsJCWxhdF9idWYtPnNsaWNlX2JjX2FkZHIuc2l6ZSA9IFZERUNfTEFUX1NM SUNFX0hFQURFUl9TWjsNCj4gPiArCQllcnIgPSBtdGtfdmNvZGVjX21lbV9hbGxvYyhjdHgsICZs YXRfYnVmLQ0KPiA+ID5zbGljZV9iY19hZGRyKTsNCj4gPiArCQlpZiAoZXJyKSB7DQo+ID4gKwkJ CW10a192NGwyX2VycigiZmFpbGVkIHRvIGFsbG9jYXRlIHdkbWFfYWRkcg0KPiA+IGJ1ZlslZF0i LCBpKTsNCj4gPiArCQkJZ290byBtZW1fYWxsb2NfZXJyOw0KPiA+ICsJCX0NCj4gPiArDQo+ID4g KwkJbGF0X2J1Zi0+cHJpdmF0ZV9kYXRhID0ga3phbGxvYyhwcml2YXRlX3NpemUsDQo+ID4gR0ZQ X0tFUk5FTCk7DQo+ID4gKwkJaWYgKCFsYXRfYnVmLT5wcml2YXRlX2RhdGEpIHsNCj4gPiArCQkJ bXRrX3Y0bDJfZXJyKCJmYWlsZWQgdG8gYWxsb2NhdGUNCj4gPiBwcml2YXRlX2RhdGFbJWRdIiwg aSk7DQo+ID4gKwkJCWdvdG8gbWVtX2FsbG9jX2VycjsNCj4gPiArCQl9DQo+ID4gKw0KPiA+ICsJ CWxhdF9idWYtPmN0eCA9IGN0eDsNCj4gPiArCQlsYXRfYnVmLT5jb3JlX2RlY29kZSA9IGNvcmVf ZGVjb2RlOw0KPiA+ICsJCXZkZWNfbXNnX3F1ZXVlX3FidWYoJm1zZ19xdWV1ZS0+bGF0X2N0eCwg bGF0X2J1Zik7DQo+IA0KPiBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCB0aGVyZSB3aWxsIGJlIG5v IGJ1ZmZlci4gSW4gY2FzZSBvZiBmYWlsdXJlLA0KPiB5b3Ugc2hvdWxkDQo+IHRha2UgdGhlIGFw cHJvcHJpYXRlIGFjdGlvbiBoZXJlLCBpbnN0ZWFkIG9mIGdvaW5nIG9uIHdpdGggYW4gaW52YWxp ZA0KPiBidWZmZXIuDQo+IA0KQWRkIHJldHVybiB2YWx1ZSwNCkZpeCBpbiBwYXRjaCB2MTIuDQo+ ID4gKwl9DQo+ID4gKwlyZXR1cm4gMDsNCj4gPiArDQo+ID4gK21lbV9hbGxvY19lcnI6DQo+ID4g Kwl2ZGVjX21zZ19xdWV1ZV9kZWluaXQobXNnX3F1ZXVlLCBjdHgpOw0KPiA+ICsJcmV0dXJuIC1F Tk9NRU07DQo+ID4gK30NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9t dGstdmNvZGVjL3ZkZWNfbXNnX3F1ZXVlLmgNCj4gPiBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0v bXRrLXZjb2RlYy92ZGVjX21zZ19xdWV1ZS5oDQo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4g PiBpbmRleCAwMDAwMDAwMDAwMDAuLjkxYTMxNWJhMGNiYQ0KPiA+IC0tLSAvZGV2L251bGwNCj4g PiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmRlY19tc2dfcXVldWUu aA0KPiA+IEBAIC0wLDAgKzEsMTQ4IEBADQo+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wDQo+ID4gKy8qDQo+ID4gKyAqIENvcHlyaWdodCAoYykgMjAyMSBNZWRpYVRlayBJ bmMuDQo+ID4gKyAqIEF1dGhvcjogWXVuZmVpIERvbmcgPHl1bmZlaS5kb25nQG1lZGlhdGVrLmNv bT4NCj4gPiArICovDQo+ID4gKw0KPiA+ICsjaWZuZGVmIF9WREVDX01TR19RVUVVRV9IXw0KPiA+ ICsjZGVmaW5lIF9WREVDX01TR19RVUVVRV9IXw0KPiA+ICsNCj4gPiArI2luY2x1ZGUgPGxpbnV4 L3NjaGVkLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4NCj4gPiArI2luY2x1 ZGUgPGxpbnV4L3NsYWIuaD4NCj4gPiArI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi12NGwyLmg+ DQo+ID4gKw0KPiA+ICsjaW5jbHVkZSAibXRrX3Zjb2RlY191dGlsLmgiDQo+ID4gKw0KPiA+ICsj ZGVmaW5lIE5VTV9CVUZGRVJfQ09VTlQgMw0KPiA+ICsNCj4gPiArc3RydWN0IHZkZWNfbGF0X2J1 ZjsNCj4gPiArc3RydWN0IG10a192Y29kZWNfY3R4Ow0KPiA+ICtzdHJ1Y3QgbXRrX3Zjb2RlY19k ZXY7DQo+ID4gK3R5cGVkZWYgaW50ICgqY29yZV9kZWNvZGVfY2JfdCkoc3RydWN0IHZkZWNfbGF0 X2J1ZiAqbGF0X2J1Zik7DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICogc3RydWN0IHZkZWNfbXNn X3F1ZXVlX2N0eCAtIHJlcHJlc2VudHMgYSBxdWV1ZSBmb3IgYnVmZmVycw0KPiA+IHJlYWR5IHRv IGJlIHByb2Nlc3NlZA0KPiA+ICsgKiBAcmVhZHlfdXNlZDogcmVhZHkgdXNlZCBxdWV1ZSB1c2Vk IHRvIHNpZ25hbGl6ZSB3aGVuIGdldCBhIGpvYg0KPiA+IHF1ZXVlDQo+ID4gKyAqIEByZWFkeV9x dWV1ZTogbGlzdCBvZiByZWFkeSBsYXQgYnVmZmVyIHF1ZXVlcw0KPiA+ICsgKiBAcmVhZHlfbG9j azogc3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIGxhdCBidWZmZXIgdXNhZ2UNCj4gPiArICogQHJl YWR5X251bTogbnVtYmVyIG9mIGJ1ZmZlcnMgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkDQo+ID4gKyAq IEBoYXJkd2FyZV9pbmRleDogaGFyZHdhcmUgaWQgdGhhdCB0aGlzIHF1ZXVlIGlzIHVzZWQgZm9y DQo+ID4gKyAqLw0KPiA+ICtzdHJ1Y3QgdmRlY19tc2dfcXVldWVfY3R4IHsNCj4gPiArCXdhaXRf cXVldWVfaGVhZF90IHJlYWR5X3RvX3VzZTsNCj4gPiArCXN0cnVjdCBsaXN0X2hlYWQgcmVhZHlf cXVldWU7DQo+ID4gKwlzcGlubG9ja190IHJlYWR5X2xvY2s7DQo+ID4gKwlpbnQgcmVhZHlfbnVt Ow0KPiA+ICsJaW50IGhhcmR3YXJlX2luZGV4Ow0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArLyoqDQo+ ID4gKyAqIHN0cnVjdCB2ZGVjX2xhdF9idWYgLSBsYXQgYnVmZmVyIG1lc3NhZ2UgdXNlZCB0byBz dG9yZSBsYXQgaW5mbw0KPiA+IGZvciBjb3JlIGRlY29kZQ0KPiA+ICsgKiBAd2RtYV9lcnJfYWRk cjogd2RtYSBlcnJvciBhZGRyZXNzIHVzZWQgZm9yIGxhdCBoYXJkd2FyZQ0KPiA+ICsgKiBAc2xp Y2VfYmNfYWRkcjogc2xpY2UgYmMgYWRkcmVzcyB1c2VkIGZvciBsYXQgaGFyZHdhcmUNCj4gPiAr ICogQHRzX2luZm86IG5lZWQgdG8gc2V0IHRpbWVzdGFtcCBmcm9tIG91dHB1dCB0byBjYXB0dXJl DQo+ID4gKyAqDQo+ID4gKyAqIEBwcml2YXRlX2RhdGE6IHNoYXJlZCBpbmZvcm1hdGlvbiB1c2Vk IHRvIGxhdCBhbmQgY29yZSBoYXJkd2FyZQ0KPiA+ICsgKiBAY3R4OiBtdGsgdmNvZGVjIGNvbnRl eHQgaW5mb3JtYXRpb24NCj4gPiArICogQGNvcmVfZGVjb2RlOiBkaWZmZXJlbnQgY29kZWMgdXNl IGRpZmZlcmVudCBkZWNvZGUgY2FsbGJhY2sNCj4gPiBmdW5jdGlvbg0KPiA+ICsgKiBAbGF0X2xp c3Q6IGFkZCBsYXQgYnVmZmVyIHRvIGxhdCBoZWFkIGxpc3QNCj4gPiArICogQGNvcmVfbGlzdDog YWRkIGxhdCBidWZmZXIgdG8gY29yZSBoZWFkIGxpc3QNCj4gPiArICovDQo+ID4gK3N0cnVjdCB2 ZGVjX2xhdF9idWYgew0KPiA+ICsJc3RydWN0IG10a192Y29kZWNfbWVtIHdkbWFfZXJyX2FkZHI7 DQo+ID4gKwlzdHJ1Y3QgbXRrX3Zjb2RlY19tZW0gc2xpY2VfYmNfYWRkcjsNCj4gPiArCXN0cnVj dCB2YjJfdjRsMl9idWZmZXIgdHNfaW5mbzsNCj4gPiArDQo+ID4gKwl2b2lkICpwcml2YXRlX2Rh dGE7DQo+ID4gKwlzdHJ1Y3QgbXRrX3Zjb2RlY19jdHggKmN0eDsNCj4gPiArCWNvcmVfZGVjb2Rl X2NiX3QgY29yZV9kZWNvZGU7DQo+ID4gKwlzdHJ1Y3QgbGlzdF9oZWFkIGxhdF9saXN0Ow0KPiA+ ICsJc3RydWN0IGxpc3RfaGVhZCBjb3JlX2xpc3Q7DQo+ID4gK307DQo+ID4gKw0KPiA+ICsvKioN Cj4gPiArICogc3RydWN0IHZkZWNfbXNnX3F1ZXVlIC0gdXNlZCB0byBzdG9yZSBsYXQgYnVmZmVy IG1lc3NhZ2UNCj4gPiArICogQGxhdF9idWY6IGxhdCBidWZmZXIgdXNlZCB0byBzdG9yZSBsYXQg YnVmZmVyIGluZm9ybWF0aW9uDQo+ID4gKyAqIEB3ZG1hX2FkZHI6IHdkbWEgYWRkcmVzcyB1c2Vk IGZvciB1YmUNCj4gPiArICogQHdkbWFfcnB0cl9hZGRyOiB1YmUgcmVhZCBwb2ludA0KPiA+ICsg KiBAd2RtYV93cHRyX2FkZHI6IHViZSB3cml0ZSBwb2ludA0KPiA+ICsgKiBAbGF0X2N0eDogdXNl ZCB0byBzdG9yZSBsYXQgYnVmZmVyIGxpc3QNCj4gPiArICovDQo+ID4gK3N0cnVjdCB2ZGVjX21z Z19xdWV1ZSB7DQo+ID4gKwlzdHJ1Y3QgdmRlY19sYXRfYnVmIGxhdF9idWZbTlVNX0JVRkZFUl9D T1VOVF07DQo+ID4gKw0KPiA+ICsJc3RydWN0IG10a192Y29kZWNfbWVtIHdkbWFfYWRkcjsNCj4g PiArCXVpbnQ2NF90IHdkbWFfcnB0cl9hZGRyOw0KPiA+ICsJdWludDY0X3Qgd2RtYV93cHRyX2Fk ZHI7DQo+ID4gKw0KPiA+ICsJc3RydWN0IHZkZWNfbXNnX3F1ZXVlX2N0eCBsYXRfY3R4Ow0KPiA+ ICt9Ow0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAqIHZkZWNfbXNnX3F1ZXVlX2luaXQgLSBpbml0 IGxhdCBidWZmZXIgaW5mb3JtYXRpb24uDQo+ID4gKyAqIEBtc2dfcXVldWU6IHVzZWQgdG8gc3Rv cmUgdGhlIGxhdCBidWZmZXIgaW5mb3JtYXRpb24NCj4gPiArICogQGN0eDogdjRsMiBjdHgNCj4g PiArICogQGNvcmVfZGVjb2RlOiBjb3JlIGRlY29kZSBjYWxsYmFjayBmb3IgZWFjaCBjb2RlYw0K PiA+ICsgKiBAcHJpdmF0ZV9zaXplOiB0aGUgcHJpdmF0ZSBkYXRhIHNpemUgdXNlZCB0byBzaGFy ZSB3aXRoIGNvcmUNCj4gPiArICovDQo+ID4gK2ludCB2ZGVjX21zZ19xdWV1ZV9pbml0KA0KPiA+ ICsJc3RydWN0IHZkZWNfbXNnX3F1ZXVlICptc2dfcXVldWUsDQo+ID4gKwlzdHJ1Y3QgbXRrX3Zj b2RlY19jdHggKmN0eCwNCj4gPiArCWNvcmVfZGVjb2RlX2NiX3QgY29yZV9kZWNvZGUsDQo+ID4g KwlpbnQgcHJpdmF0ZV9zaXplKTsNCj4gPiArDQo+IA0KPiBpbnQgdmRlY19tc2dfcXVldWVfaW5p dChzdHJ1Y3QgdmRlY19tc2dfcXVldWUgKm1zZ19xdWV1ZSwNCj4gCQkJc3RydWN0IG10a192Y29k ZWNfY3R4ICpjdHgsDQo+IA0KPiAJCQljb3JlX2RlY29kZV9jYl90IGNvcmVfZGVjb2RlLCBpbnQN Cj4gcHJpdmF0ZV9zaXplKTsNCj4gDQo+ID4gKy8qKg0KPiA+ICsgKiB2ZGVjX21zZ19xdWV1ZV9p bml0X2N0eCAtIHVzZWQgdG8gaW5pdCBtc2cgcXVldWUgY29udGV4dA0KPiA+IGluZm9ybWF0aW9u Lg0KPiA+ICsgKiBAY3R4OiBtZXNzYWdlIHF1ZXVlIGNvbnRleHQNCj4gPiArICogQGhhcmR3YXJl X2luZGV4OiBoYXJkd2FyZSBpbmRleA0KPiA+ICsgKi8NCj4gPiArdm9pZCB2ZGVjX21zZ19xdWV1 ZV9pbml0X2N0eChzdHJ1Y3QgdmRlY19tc2dfcXVldWVfY3R4ICpjdHgsDQo+ID4gKwlpbnQgaGFy ZHdhcmVfaW5kZXgpOw0KPiANCj4gRG9uJ3QgYnJlYWsgdGhpcyBsaW5lOyBldmVuIDkwIGNvbHVt bnMgaXMgZmluZS4uLg0KPiANCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiB2ZGVjX21zZ19xdWV1 ZV9xYnVmIC0gZW5xdWV1ZSBsYXQgYnVmZmVyIHRvIHF1ZXVlIGxpc3QuDQo+ID4gKyAqIEBjdHg6 IG1lc3NhZ2UgcXVldWUgY29udGV4dA0KPiA+ICsgKiBAYnVmOiBjdXJyZW50IGxhdCBidWZmZXIN Cj4gPiArICovDQo+ID4gK3ZvaWQgdmRlY19tc2dfcXVldWVfcWJ1ZihzdHJ1Y3QgdmRlY19tc2df cXVldWVfY3R4ICpjdHgsDQo+ID4gKwlzdHJ1Y3QgdmRlY19sYXRfYnVmICpidWYpOw0KPiANCj4g U2FtZSBoZXJlLg0KPiANCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiB2ZGVjX21zZ19xdWV1ZV9k cWJ1ZiAtIGRlcXVldWUgbGF0IGJ1ZmZlciBmcm9tIHF1ZXVlIGxpc3QuDQo+ID4gKyAqIEBjdHg6 IG1lc3NhZ2UgcXVldWUgY29udGV4dA0KPiA+ICsgKi8NCj4gPiArc3RydWN0IHZkZWNfbGF0X2J1 ZiAqdmRlY19tc2dfcXVldWVfZHFidWYoc3RydWN0DQo+ID4gdmRlY19tc2dfcXVldWVfY3R4ICpj dHgpOw0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAqIHZkZWNfbXNnX3F1ZXVlX3VwZGF0ZV91YmVf cnB0ciAtIHVzZWQgdG8gdXBkYXRhIHRoZSB1YmUgcmVhZA0KPiA+IHBvaW50Lg0KPiA+ICsgKiBA bXNnX3F1ZXVlOiB1c2VkIHRvIHN0b3JlIHRoZSBsYXQgYnVmZmVyIGluZm9ybWF0aW9uDQo+ID4g KyAqIEB1YmVfcnB0cjogY3VycmVudCB1YmUgcmVhZCBwb2ludA0KPiA+ICsgKi8NCj4gPiArdm9p ZCB2ZGVjX21zZ19xdWV1ZV91cGRhdGVfdWJlX3JwdHIoc3RydWN0IHZkZWNfbXNnX3F1ZXVlDQo+ ID4gKm1zZ19xdWV1ZSwNCj4gPiArCXVpbnQ2NF90IHViZV9ycHRyKTsNCj4gDQo+IC4uLiBhbmQg YWdhaW4gLi4uDQo+IA0KRml4IGluIHBhdGNoIHYxMi4NCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsg KiB2ZGVjX21zZ19xdWV1ZV91cGRhdGVfdWJlX3dwdHIgLSB1c2VkIHRvIHVwZGF0YSB0aGUgdWJl IHdyaXRlDQo+ID4gcG9pbnQuDQo+ID4gKyAqIEBtc2dfcXVldWU6IHVzZWQgdG8gc3RvcmUgdGhl IGxhdCBidWZmZXIgaW5mb3JtYXRpb24NCj4gPiArICogQHViZV93cHRyOiBjdXJyZW50IHViZSB3 cml0ZSBwb2ludA0KPiA+ICsgKi8NCj4gPiArdm9pZCB2ZGVjX21zZ19xdWV1ZV91cGRhdGVfdWJl X3dwdHIoc3RydWN0IHZkZWNfbXNnX3F1ZXVlDQo+ID4gKm1zZ19xdWV1ZSwNCj4gPiArCXVpbnQ2 NF90IHViZV93cHRyKTsNCj4gDQo+IC4uLiBhbmQgYWdhaW4gLi4uDQo+IA0KPiA+ICsNCj4gPiAr LyoqDQo+ID4gKyAqIHZkZWNfbXNnX3F1ZXVlX3dhaXRfbGF0X2J1Zl9mdWxsIC0gdXNlZCB0byBj aGVjayB3aGV0aGVyIGFsbA0KPiA+IGxhdCBidWZmZXINCj4gPiArICogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpbiBsYXQgbGlzdC4NCj4gPiArICogQG1zZ19xdWV1ZTogdXNl ZCB0byBzdG9yZSB0aGUgbGF0IGJ1ZmZlciBpbmZvcm1hdGlvbg0KPiA+ICsgKi8NCj4gPiArYm9v bCB2ZGVjX21zZ19xdWV1ZV93YWl0X2xhdF9idWZfZnVsbChzdHJ1Y3QgdmRlY19tc2dfcXVldWUN Cj4gPiAqbXNnX3F1ZXVlKTsNCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiB2ZGVjX21zZ19xdWV1 ZV9kZWluaXQgLSBkZWluaXQgbGF0IGJ1ZmZlciBpbmZvcm1hdGlvbi4NCj4gPiArICogQG1zZ19x dWV1ZTogdXNlZCB0byBzdG9yZSB0aGUgbGF0IGJ1ZmZlciBpbmZvcm1hdGlvbg0KPiA+ICsgKiBA Y3R4OiB2NGwyIGN0eA0KPiA+ICsgKi8NCj4gPiArdm9pZCB2ZGVjX21zZ19xdWV1ZV9kZWluaXQo c3RydWN0IHZkZWNfbXNnX3F1ZXVlICptc2dfcXVldWUsDQo+ID4gKwkJCSAgIHN0cnVjdCBtdGtf dmNvZGVjX2N0eCAqY3R4KTsNCj4gDQo+IC4uLiBhbmQgYWdhaW4uDQo+IA0KPiA+ICsNCj4gPiAr I2VuZGlmDQo+ID4gDQo+IA0KQmVzdCBSZWdhcmRzLA0KWXVuZmVpIERvbmcNCj4gDQo= 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 7C19DC4332F for ; Fri, 3 Dec 2021 01:55:10 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 622C56E0CF; Fri, 3 Dec 2021 01:55:09 +0000 (UTC) Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5A2FD6E0CF for ; Fri, 3 Dec 2021 01:55:07 +0000 (UTC) X-UUID: ba3d8d483edc422f9c1a20e721a9484e-20211203 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=+noD9So2vtPTce89wwpEV+fiHvsXrozU1mApoEZnKXk=; b=PfAm3HcgjPInXl+G9h2kGxF/31DPKcTI/eTVx1fkZcoG667oTYnMJU0cJQIQFeJ016WnZLsk65f07tJMdpN2NfZ9xwC4gQYbfpM4E6bp+jzUGVu3rKlvOxe0axKJJP7CqdssNRDeICBSoR4AJmXQzeJdFD6170SsOhuVNoioJlA=; X-UUID: ba3d8d483edc422f9c1a20e721a9484e-20211203 Received: from mtkexhb01.mediatek.inc [(172.21.101.102)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1932849924; Fri, 03 Dec 2021 09:55:03 +0800 Received: from mtkcas11.mediatek.inc (172.21.101.40) by mtkmbs07n2.mediatek.inc (172.21.101.141) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 3 Dec 2021 09:55:02 +0800 Received: from mhfsdcap04 (10.17.3.154) by mtkcas11.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Fri, 3 Dec 2021 09:55:00 +0800 Message-ID: <196c55db7c48c29a5858e6446f19756fae3bb157.camel@mediatek.com> Subject: Re: [PATCH v11, 10/19] media: mtk-vcodec: Add msg queue feature for lat and core architecture From: "yunfei.dong@mediatek.com" To: AngeloGioacchino Del Regno , Alexandre Courbot , Hans Verkuil , Tzung-Bi Shih , "Tiffany Lin" , Andrew-CT Chen , Mauro Carvalho Chehab , Rob Herring , Matthias Brugger , Tomasz Figa Date: Fri, 3 Dec 2021 09:55:00 +0800 In-Reply-To: <9710488f-9129-4462-b528-642561021731@collabora.com> References: <20211129034201.5767-1-yunfei.dong@mediatek.com> <20211129034201.5767-11-yunfei.dong@mediatek.com> <9710488f-9129-4462-b528-642561021731@collabora.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.2 MIME-Version: 1.0 X-MTK: N Content-Transfer-Encoding: base64 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: Irui Wang , Benjamin Gaignard , srv_heupstream@mediatek.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel , Project_Global_Chrome_Upstream_Group@mediatek.com, linux-mediatek@lists.infradead.org, Hsin-Yi Wang , Fritz Koenig , Dafna Hirschfeld , linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" SGkgQW5nZWxvR2lvYWNjaGlubywNCg0KVGhhbmtzIGZvciB5b3VyIHN1Z2dlc3Rpb24uDQpPbiBX ZWQsIDIwMjEtMTItMDEgYXQgMTM6MDkgKzAxMDAsIEFuZ2Vsb0dpb2FjY2hpbm8gRGVsIFJlZ25v IHdyb3RlOg0KPiBJbCAyOS8xMS8yMSAwNDo0MSwgWXVuZmVpIERvbmcgaGEgc2NyaXR0bzoNCj4g PiBGb3IgbGF0IGFuZCBjb3JlIGFyY2hpdGVjdHVyZSwgbGF0IHRocmVhZCB3aWxsIHNlbmQgbWVz c2FnZSB0byBjb3JlDQo+ID4gdGhyZWFkIHdoZW4gbGF0IGRlY29kZSBkb25lLiBDb3JlIGhhcmR3 YXJlIHdpbGwgdXNlIHRoZSBtZXNzYWdlDQo+ID4gZnJvbSBsYXQgdG8gZGVjb2RlLCB0aGVuIGZy ZWUgbWVzc2FnZSB0byBsYXQgdGhyZWFkIHdoZW4gZGVjb2RlDQo+ID4gZG9uZS4NCj4gPiANCj4g PiBTaWduZWQtb2ZmLWJ5OiBZdW5mZWkgRG9uZyA8eXVuZmVpLmRvbmdAbWVkaWF0ZWsuY29tPg0K PiA+IC0tLQ0KPiA+ICAgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL01ha2VmaWxl ICAgIHwgICAxICsNCj4gPiAgIC4uLi9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZHJ2 LmggICAgICB8ICAgOSArDQo+ID4gICAuLi4vcGxhdGZvcm0vbXRrLXZjb2RlYy92ZGVjX21zZ19x dWV1ZS5jICAgICAgfCAyNTcNCj4gPiArKysrKysrKysrKysrKysrKysNCj4gPiAgIC4uLi9wbGF0 Zm9ybS9tdGstdmNvZGVjL3ZkZWNfbXNnX3F1ZXVlLmggICAgICB8IDE0OCArKysrKysrKysrDQo+ ID4gICA0IGZpbGVzIGNoYW5nZWQsIDQxNSBpbnNlcnRpb25zKCspDQo+ID4gICBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstDQo+ID4gdmNvZGVjL3ZkZWNfbXNn X3F1ZXVlLmMNCj4gPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL21lZGlhL3BsYXRmb3Jt L210ay0NCj4gPiB2Y29kZWMvdmRlY19tc2dfcXVldWUuaA0KPiA+IA0KPiA+IGRpZmYgLS1naXQg YS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvTWFrZWZpbGUNCj4gPiBiL2RyaXZl cnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9NYWtlZmlsZQ0KPiA+IGluZGV4IGM2MWJmYjE3 OWJjYy4uMzU5NjE5NjUzYTBlIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZv cm0vbXRrLXZjb2RlYy9NYWtlZmlsZQ0KPiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0v bXRrLXZjb2RlYy9NYWtlZmlsZQ0KPiA+IEBAIC0xMiw2ICsxMiw3IEBAIG10ay12Y29kZWMtZGVj LXkgOj0gdmRlYy92ZGVjX2gyNjRfaWYubyBcDQo+ID4gICAJCW10a192Y29kZWNfZGVjX2Rydi5v IFwNCj4gPiAgIAkJdmRlY19kcnZfaWYubyBcDQo+ID4gICAJCXZkZWNfdnB1X2lmLm8gXA0KPiA+ ICsJCXZkZWNfbXNnX3F1ZXVlLm8gXA0KPiA+ICAgCQltdGtfdmNvZGVjX2RlYy5vIFwNCj4gPiAg IAkJbXRrX3Zjb2RlY19kZWNfc3RhdGVmdWwubyBcDQo+ID4gICAJCW10a192Y29kZWNfZGVjX3N0 YXRlbGVzcy5vIFwNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGst dmNvZGVjL210a192Y29kZWNfZHJ2LmgNCj4gPiBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRr LXZjb2RlYy9tdGtfdmNvZGVjX2Rydi5oDQo+ID4gaW5kZXggN2ZjMTA2ZGYwMzliLi42MTBiMGFm MTM4NzkgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVj L210a192Y29kZWNfZHJ2LmgNCj4gPiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12 Y29kZWMvbXRrX3Zjb2RlY19kcnYuaA0KPiA+IEBAIC0xNSw3ICsxNSw5IEBADQo+ID4gICAjaW5j bHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPg0KPiA+ICAgI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVt Mm1lbS5oPg0KPiA+ICAgI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+DQo+ID4gKw0K PiA+ICAgI2luY2x1ZGUgIm10a192Y29kZWNfdXRpbC5oIg0KPiA+ICsjaW5jbHVkZSAidmRlY19t c2dfcXVldWUuaCINCj4gPiAgIA0KPiA+ICAgI2RlZmluZSBNVEtfVkNPREVDX0RSVl9OQU1FCSJt dGtfdmNvZGVjX2RydiINCj4gPiAgICNkZWZpbmUgTVRLX1ZDT0RFQ19ERUNfTkFNRQkibXRrLXZj b2RlYy1kZWMiDQo+ID4gQEAgLTI4Miw2ICsyODQsOCBAQCBzdHJ1Y3QgdmRlY19waWNfaW5mbyB7 DQo+ID4gICAgKiBAZGVjb2RlZF9mcmFtZV9jbnQ6IG51bWJlciBvZiBkZWNvZGVkIGZyYW1lcw0K PiA+ICAgICogQGxvY2s6IHByb3RlY3QgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IFY0TDIgdGhyZWFk cyBhbmQgd29ya2VyDQo+ID4gdGhyZWFkIHN1Y2ggYXMNCj4gPiAgICAqCSAgbXRrX3ZpZGVvX2Rl Y19idWYuDQo+ID4gKyAqDQo+ID4gKyAqIEBtc2dfcXVldWU6IG1zZyBxdWV1ZSB1c2VkIHRvIHN0 b3JlIGxhdCBidWZmZXIgaW5mb3JtYXRpb24uDQo+ID4gICAgKi8NCj4gPiAgIHN0cnVjdCBtdGtf dmNvZGVjX2N0eCB7DQo+ID4gICAJZW51bSBtdGtfaW5zdGFuY2VfdHlwZSB0eXBlOw0KPiA+IEBA IC0zMjUsNiArMzI5LDcgQEAgc3RydWN0IG10a192Y29kZWNfY3R4IHsNCj4gPiAgIAlpbnQgZGVj b2RlZF9mcmFtZV9jbnQ7DQo+ID4gICAJc3RydWN0IG11dGV4IGxvY2s7DQo+ID4gICANCj4gPiAr CXN0cnVjdCB2ZGVjX21zZ19xdWV1ZSBtc2dfcXVldWU7DQo+ID4gICB9Ow0KPiA+ICAgDQo+ID4g ICBlbnVtIG10a19jaGlwIHsNCj4gPiBAQCAtNDU3LDYgKzQ2Miw4IEBAIHN0cnVjdCBtdGtfdmNv ZGVjX2VuY19wZGF0YSB7DQo+ID4gICAgKiBAZGVjX2NhcGFiaWxpdHk6IHVzZWQgdG8gaWRlbnRp ZnkgZGVjb2RlIGNhcGFiaWxpdHksIGV4OiA0aw0KPiA+ICAgICogQGVuY19jYXBhYmlsaXR5OiB1 c2VkIHRvIGlkZW50aWZ5IGVuY29kZSBjYXBhYmlsaXR5DQo+ID4gICAgKg0KPiA+ICsgKiBAbXNn X3F1ZXVlX2NvcmVfY3R4OiBtc2cgcXVldWUgY29udGV4dCB1c2VkIGZvciBjb3JlIHdvcmtxdWV1 ZQ0KPiA+ICsgKg0KPiA+ICAgICogQHN1YmRldl9kZXY6IHN1YmRldiBoYXJkd2FyZSBkZXZpY2UN Cj4gPiAgICAqIEBzdWJkZXZfYml0bWFwOiB1c2VkIHRvIHJlY29yZCBoYXJkd2FyZSBpcyByZWFk eSBvciBub3QNCj4gPiAgICAqLw0KPiA+IEBAIC00OTcsNiArNTA0LDggQEAgc3RydWN0IG10a192 Y29kZWNfZGV2IHsNCj4gPiAgIAl1bnNpZ25lZCBpbnQgZGVjX2NhcGFiaWxpdHk7DQo+ID4gICAJ dW5zaWduZWQgaW50IGVuY19jYXBhYmlsaXR5Ow0KPiA+ICAgDQo+ID4gKwlzdHJ1Y3QgdmRlY19t c2dfcXVldWVfY3R4IG1zZ19xdWV1ZV9jb3JlX2N0eDsNCj4gPiArDQo+ID4gICAJdm9pZCAqc3Vi ZGV2X2RldltNVEtfVkRFQ19IV19NQVhdOw0KPiA+ICAgCURFQ0xBUkVfQklUTUFQKHN1YmRldl9i aXRtYXAsIE1US19WREVDX0hXX01BWCk7DQo+ID4gICB9Ow0KPiA+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmRlY19tc2dfcXVldWUuYw0KPiA+IGIvZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZkZWNfbXNnX3F1ZXVlLmMNCj4gPiBuZXcg ZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uZGE0ZDExNGY3YWQwDQo+ ID4gLS0tIC9kZXYvbnVsbA0KPiA+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZj b2RlYy92ZGVjX21zZ19xdWV1ZS5jDQo+ID4gQEAgLTAsMCArMSwyNTcgQEANCj4gPiArLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjANCj4gPiArLyoNCj4gPiArICogQ29weXJpZ2h0 IChjKSAyMDIxIE1lZGlhVGVrIEluYy4NCj4gPiArICogQXV0aG9yOiBZdW5mZWkgRG9uZyA8eXVu ZmVpLmRvbmdAbWVkaWF0ZWsuY29tPg0KPiA+ICsgKi8NCj4gPiArDQo+ID4gKyNpbmNsdWRlIDxs aW51eC9mcmVlemVyLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4NCj4gPiAr I2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4NCj4gPiArDQo+ID4gKyNpbmNsdWRlICJtdGtfdmNv ZGVjX2RlY19wbS5oIg0KPiA+ICsjaW5jbHVkZSAibXRrX3Zjb2RlY19kcnYuaCINCj4gPiArI2lu Y2x1ZGUgInZkZWNfbXNnX3F1ZXVlLmgiDQo+ID4gKw0KPiA+ICsvKiB0aGUgc2l6ZSB1c2VkIHRv IHN0b3JlIGxhdCBzbGljZSBoZWFkZXIgaW5mb3JtYXRpb24gKi8NCj4gPiArI2RlZmluZSBWREVD X0xBVF9TTElDRV9IRUFERVJfU1ogICAgKDY0MCAqIFNaXzFLKQ0KPiA+ICsNCj4gPiArLyogdGhl IHNpemUgdXNlZCB0byBzdG9yZSBhdmMgZXJyb3IgaW5mb3JtYXRpb24gKi8NCj4gPiArI2RlZmlu ZSBWREVDX0VSUl9NQVBfU1pfQVZDICAgICAgICAgKDE3ICogU1pfMUspDQo+ID4gKw0KPiA+ICsv KiBjb3JlIHdpbGwgcmVhZCB0aGUgdHJhbnMgYnVmZmVyIHdoaWNoIGRlY29kZWQgYnkgbGF0IHRv IGRlY29kZQ0KPiA+IGFnYWluLg0KPiA+ICsgKiBUaGUgdHJhbnMgYnVmZmVyIHNpemUgb2YgRkhE IGFuZCA0SyBiaXRzdHJlYW1zIGFyZSBkaWZmZXJlbnQuDQo+ID4gKyAqLw0KPiA+ICtzdGF0aWMg aW50IHZkZV9tc2dfcXVldWVfZ2V0X3RyYW5zX3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQ0K PiA+ICt7DQo+ID4gKwlpZiAod2lkdGggPiAxOTIwIHx8IGhlaWdodCA+IDEwODgpDQo+ID4gKwkJ cmV0dXJuIDMwICogU1pfMU07DQo+ID4gKwllbHNlDQo+ID4gKwkJcmV0dXJuIDYgKiBTWl8xTTsN Cj4gPiArfQ0KPiA+ICsNCj4gPiArdm9pZCB2ZGVjX21zZ19xdWV1ZV9pbml0X2N0eChzdHJ1Y3Qg dmRlY19tc2dfcXVldWVfY3R4ICpjdHgsDQo+ID4gKwlpbnQgaGFyZHdhcmVfaW5kZXgpDQo+ID4g K3sNCj4gPiArCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+cmVhZHlfdG9fdXNlKTsNCj4gPiAr CUlOSVRfTElTVF9IRUFEKCZjdHgtPnJlYWR5X3F1ZXVlKTsNCj4gPiArCXNwaW5fbG9ja19pbml0 KCZjdHgtPnJlYWR5X2xvY2spOw0KPiA+ICsJY3R4LT5yZWFkeV9udW0gPSAwOw0KPiA+ICsJY3R4 LT5oYXJkd2FyZV9pbmRleCA9IGhhcmR3YXJlX2luZGV4Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtz dGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqdmRlY19nZXRfYnVmX2xpc3QoaW50IGhhcmR3YXJlX2lu ZGV4LA0KPiA+ICsJc3RydWN0IHZkZWNfbGF0X2J1ZiAqYnVmKQ0KPiA+ICt7DQo+ID4gKwlzd2l0 Y2ggKGhhcmR3YXJlX2luZGV4KSB7DQo+ID4gKwljYXNlIE1US19WREVDX0NPUkU6DQo+ID4gKwkJ cmV0dXJuICZidWYtPmNvcmVfbGlzdDsNCj4gPiArCWNhc2UgTVRLX1ZERUNfTEFUMDoNCj4gPiAr CQlyZXR1cm4gJmJ1Zi0+bGF0X2xpc3Q7DQo+ID4gKwlkZWZhdWx0Og0KPiA+ICsJCXJldHVybiBO VUxMOw0KPiA+ICsJfQ0KPiA+ICt9DQo+ID4gKw0KPiA+ICt2b2lkIHZkZWNfbXNnX3F1ZXVlX3Fi dWYoc3RydWN0IHZkZWNfbXNnX3F1ZXVlX2N0eCAqbXNnX2N0eCwNCj4gPiArCXN0cnVjdCB2ZGVj X2xhdF9idWYgKmJ1ZikNCj4gDQo+IFRoaXMgZnVuY3Rpb24gY2FuIGZhaWw6IGl0IGhhcyB0byBy ZXR1cm4gYW4gaW50ZWdlciB2YWx1ZS4NCj4gDQo+ID4gK3sNCj4gPiArCXN0cnVjdCBsaXN0X2hl YWQgKmhlYWQ7DQo+ID4gKw0KPiA+ICsJaGVhZCA9IHZkZWNfZ2V0X2J1Zl9saXN0KG1zZ19jdHgt PmhhcmR3YXJlX2luZGV4LCBidWYpOw0KPiA+ICsJaWYgKCFoZWFkKSB7DQo+ID4gKwkJbXRrX3Y0 bDJfZXJyKCJmYWlsIHRvIHFidWY6ICVkIixtc2dfY3R4LQ0KPiA+ID5oYXJkd2FyZV9pbmRleCk7 DQo+ID4gKwkJcmV0dXJuOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXNwaW5fbG9jaygmbXNnX2N0 eC0+cmVhZHlfbG9jayk7DQo+ID4gKwlsaXN0X2FkZF90YWlsKGhlYWQsICZtc2dfY3R4LT5yZWFk eV9xdWV1ZSk7DQo+ID4gKwltc2dfY3R4LT5yZWFkeV9udW0rKzsNCj4gPiArDQo+ID4gKwlpZiAo bXNnX2N0eC0+aGFyZHdhcmVfaW5kZXggIT0gTVRLX1ZERUNfQ09SRSkNCj4gPiArCQl3YWtlX3Vw X2FsbCgmbXNnX2N0eC0+cmVhZHlfdG9fdXNlKTsNCj4gPiArDQo+ID4gKwltdGtfdjRsMl9kZWJ1 ZygzLCAiZW5xdWV1ZSBidWYgdHlwZTogJWQgYWRkcjogMHglcCBudW06ICVkIiwNCj4gPiArCQlt c2dfY3R4LT5oYXJkd2FyZV9pbmRleCwgYnVmLCBtc2dfY3R4LT5yZWFkeV9udW0pOw0KPiA+ICsJ c3Bpbl91bmxvY2soJm1zZ19jdHgtPnJlYWR5X2xvY2spOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtz dGF0aWMgYm9vbCB2ZGVjX21zZ19xdWV1ZV93YWl0X2V2ZW50KHN0cnVjdCB2ZGVjX21zZ19xdWV1 ZV9jdHgNCj4gPiAqbXNnX2N0eCkNCj4gPiArew0KPiA+ICsJaW50IHJldDsNCj4gPiArDQo+ID4g KwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQobXNnX2N0eC0+cmVhZHlfdG9fdXNlLA0KPiA+ICsJ CSFsaXN0X2VtcHR5KCZtc2dfY3R4LT5yZWFkeV9xdWV1ZSksDQo+ID4gKwkJbXNlY3NfdG9famlm ZmllcygxNTAwKSk7DQo+IA0KPiBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZmlsZToNCj4gI2Rl ZmluZSBWREVDX01TR19RVUVVRV9USU1FT1VUX01TCTE1MDANCj4gDQpGaXggaW4gcGF0Y2ggdjEy Lg0KPiAuLi50aGVuOg0KPiAJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KG1zZ19jdHgtPnJlYWR5 X3RvX3VzZSwNCj4gDQo+IAkJCQkgIWxpc3RfZW1wdHkoJm1zZ19jdHgtPnJlYWR5X3F1ZXVlKSwN Cj4gDQo+IAkJCQkgbXNlY3NfdG9famlmZmllcyhWREVDX01TR19RVUVVRV9USU1FT1UNCj4gVF9N UykpOw0KPiANCj4gDQo+ID4gKwlpZiAoIXJldCkNCj4gPiArCQlyZXR1cm4gZmFsc2U7DQo+ID4g Kw0KPiA+ICsJcmV0dXJuIHRydWU7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0cnVjdCB2ZGVjX2xh dF9idWYgKnZkZWNfbXNnX3F1ZXVlX2RxYnVmKHN0cnVjdA0KPiA+IHZkZWNfbXNnX3F1ZXVlX2N0 eCAqbXNnX2N0eCkNCj4gPiArew0KPiA+ICsJc3RydWN0IHZkZWNfbGF0X2J1ZiAqYnVmOw0KPiA+ ICsJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsNCj4gPiArCWludCByZXQ7DQo+ID4gKw0KPiA+ICsJ c3Bpbl9sb2NrKCZtc2dfY3R4LT5yZWFkeV9sb2NrKTsNCj4gPiArCWlmIChsaXN0X2VtcHR5KCZt c2dfY3R4LT5yZWFkeV9xdWV1ZSkpIHsNCj4gPiArCQltdGtfdjRsMl9kZWJ1ZygzLCAicXVldWUg aXMgTlVMTCwgdHlwZTolZCBudW06ICVkIiwNCj4gPiArCQkJbXNnX2N0eC0+aGFyZHdhcmVfaW5k ZXgsIG1zZ19jdHgtPnJlYWR5X251bSk7DQo+ID4gKwkJc3Bpbl91bmxvY2soJm1zZ19jdHgtPnJl YWR5X2xvY2spOw0KPiA+ICsNCj4gPiArCQlpZiAobXNnX2N0eC0+aGFyZHdhcmVfaW5kZXggPT0g TVRLX1ZERUNfQ09SRSkNCj4gPiArCQkJcmV0dXJuIE5VTEw7DQo+ID4gKw0KPiA+ICsJCXJldCA9 IHZkZWNfbXNnX3F1ZXVlX3dhaXRfZXZlbnQobXNnX2N0eCk7DQo+ID4gKwkJaWYgKCFyZXQpDQo+ ID4gKwkJCXJldHVybiBOVUxMOw0KPiA+ICsJCXNwaW5fbG9jaygmbXNnX2N0eC0+cmVhZHlfbG9j ayk7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJaWYgKG1zZ19jdHgtPmhhcmR3YXJlX2luZGV4ID09 IE1US19WREVDX0NPUkUpDQo+ID4gKwkJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmbXNnX2N0eC0+ cmVhZHlfcXVldWUsDQo+ID4gKwkJCXN0cnVjdCB2ZGVjX2xhdF9idWYsIGNvcmVfbGlzdCk7DQo+ ID4gKwllbHNlDQo+ID4gKwkJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmbXNnX2N0eC0+cmVhZHlf cXVldWUsDQo+ID4gKwkJCXN0cnVjdCB2ZGVjX2xhdF9idWYsIGxhdF9saXN0KTsNCj4gPiArDQo+ ID4gKwloZWFkID0gdmRlY19nZXRfYnVmX2xpc3QobXNnX2N0eC0+aGFyZHdhcmVfaW5kZXgsIGJ1 Zik7DQo+ID4gKwlpZiAoIWhlYWQpIHsNCj4gPiArCQlzcGluX3VubG9jaygmbXNnX2N0eC0+cmVh ZHlfbG9jayk7DQo+ID4gKwkJbXRrX3Y0bDJfZXJyKCJmYWlsIHRvIGRxYnVmOiAlZCIsbXNnX2N0 eC0NCj4gPiA+aGFyZHdhcmVfaW5kZXgpOw0KPiA+ICsJCXJldHVybiBOVUxMOw0KPiA+ICsJfQ0K PiA+ICsJbGlzdF9kZWwoaGVhZCk7DQo+ID4gKw0KPiA+ICsJbXNnX2N0eC0+cmVhZHlfbnVtLS07 DQo+ID4gKwltdGtfdjRsMl9kZWJ1ZygzLCAiZHF1ZXVlIGJ1ZiB0eXBlOiVkIGFkZHI6IDB4JXAg bnVtOiAlZCIsDQo+ID4gKwkJbXNnX2N0eC0+aGFyZHdhcmVfaW5kZXgsIGJ1ZiwgbXNnX2N0eC0+ cmVhZHlfbnVtKTsNCj4gPiArCXNwaW5fdW5sb2NrKCZtc2dfY3R4LT5yZWFkeV9sb2NrKTsNCj4g PiArDQo+ID4gKwlyZXR1cm4gYnVmOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICt2b2lkIHZkZWNfbXNn X3F1ZXVlX3VwZGF0ZV91YmVfcnB0cihzdHJ1Y3QgdmRlY19tc2dfcXVldWUNCj4gPiAqbXNnX3F1 ZXVlLA0KPiA+ICsJdWludDY0X3QgdWJlX3JwdHIpDQo+ID4gK3sNCj4gPiArCXNwaW5fbG9jaygm bXNnX3F1ZXVlLT5sYXRfY3R4LnJlYWR5X2xvY2spOw0KPiA+ICsJbXNnX3F1ZXVlLT53ZG1hX3Jw dHJfYWRkciA9IHViZV9ycHRyOw0KPiA+ICsJbXRrX3Y0bDJfZGVidWcoMywgInVwZGF0ZSB1YmUg cnBydCAoMHglbGx4KSIsIHViZV9ycHRyKTsNCj4gPiArCXNwaW5fdW5sb2NrKCZtc2dfcXVldWUt PmxhdF9jdHgucmVhZHlfbG9jayk7DQo+ID4gK30NCj4gPiArDQo+ID4gK3ZvaWQgdmRlY19tc2df cXVldWVfdXBkYXRlX3ViZV93cHRyKHN0cnVjdCB2ZGVjX21zZ19xdWV1ZQ0KPiA+ICptc2dfcXVl dWUsDQo+ID4gKwl1aW50NjRfdCB1YmVfd3B0cikNCj4gPiArew0KPiA+ICsJc3Bpbl9sb2NrKCZt c2dfcXVldWUtPmxhdF9jdHgucmVhZHlfbG9jayk7DQo+ID4gKwltc2dfcXVldWUtPndkbWFfd3B0 cl9hZGRyID0gdWJlX3dwdHI7DQo+ID4gKwltdGtfdjRsMl9kZWJ1ZygzLCAidXBkYXRlIHViZSB3 cHJ0OiAoMHglbGx4IDB4JWxseCkgb2Zmc2V0Og0KPiA+IDB4JWxseCIsDQo+ID4gKwkJbXNnX3F1 ZXVlLT53ZG1hX3JwdHJfYWRkciwgbXNnX3F1ZXVlLT53ZG1hX3dwdHJfYWRkciwNCj4gPiB1YmVf d3B0cik7DQo+ID4gKwlzcGluX3VubG9jaygmbXNnX3F1ZXVlLT5sYXRfY3R4LnJlYWR5X2xvY2sp Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtib29sIHZkZWNfbXNnX3F1ZXVlX3dhaXRfbGF0X2J1Zl9m dWxsKHN0cnVjdCB2ZGVjX21zZ19xdWV1ZQ0KPiA+ICptc2dfcXVldWUpDQo+ID4gK3sNCj4gPiAr CWxvbmcgdGltZW91dF9qaWZmOw0KPiA+ICsJaW50IHJldDsNCj4gPiArDQo+ID4gKwl0aW1lb3V0 X2ppZmYgPSBtc2Vjc190b19qaWZmaWVzKDEwMDAgKiAoTlVNX0JVRkZFUl9DT1VOVCArIDIpKTsN Cj4gPiArCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChtc2dfcXVldWUtPmxhdF9jdHgucmVhZHlf dG9fdXNlLA0KPiA+ICsJCW1zZ19xdWV1ZS0+bGF0X2N0eC5yZWFkeV9udW0gPT0gTlVNX0JVRkZF Ul9DT1VOVCwNCj4gPiArCQl0aW1lb3V0X2ppZmYpOw0KPiA+ICsJaWYgKHJldCkgew0KPiA+ICsJ CW10a192NGwyX2RlYnVnKDMsICJzdWNjZXNzIHRvIGdldCBsYXQgYnVmOiAlZCIsDQo+ID4gKwkJ CW1zZ19xdWV1ZS0+bGF0X2N0eC5yZWFkeV9udW0pOw0KPiA+ICsJCXJldHVybiB0cnVlOw0KPiA+ ICsJfQ0KPiA+ICsJbXRrX3Y0bDJfZXJyKCJmYWlsZWQgd2l0aCBsYXQgYnVmIGlzbid0IGZ1bGw6 ICVkIiwNCj4gPiArCQltc2dfcXVldWUtPmxhdF9jdHgucmVhZHlfbnVtKTsNCj4gPiArCXJldHVy biBmYWxzZTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArdm9pZCB2ZGVjX21zZ19xdWV1ZV9kZWluaXQo DQo+ID4gKwlzdHJ1Y3QgdmRlY19tc2dfcXVldWUgKm1zZ19xdWV1ZSwNCj4gPiArCXN0cnVjdCBt dGtfdmNvZGVjX2N0eCAqY3R4KQ0KPiA+ICt7DQo+ID4gKwlzdHJ1Y3QgdmRlY19sYXRfYnVmICps YXRfYnVmOw0KPiA+ICsJc3RydWN0IG10a192Y29kZWNfbWVtICptZW07DQo+ID4gKwlpbnQgaTsN Cj4gPiArDQo+ID4gKwltZW0gPSAmbXNnX3F1ZXVlLT53ZG1hX2FkZHI7DQo+ID4gKwlpZiAobWVt LT52YSkNCj4gPiArCQltdGtfdmNvZGVjX21lbV9mcmVlKGN0eCwgbWVtKTsNCj4gPiArCWZvciAo aSA9IDA7IGkgPCBOVU1fQlVGRkVSX0NPVU5UOyBpKyspIHsNCj4gPiArCQlsYXRfYnVmID0gJm1z Z19xdWV1ZS0+bGF0X2J1ZltpXTsNCj4gPiArDQo+ID4gKwkJbWVtID0gJmxhdF9idWYtPndkbWFf ZXJyX2FkZHI7DQo+ID4gKwkJaWYgKG1lbS0+dmEpDQo+ID4gKwkJCW10a192Y29kZWNfbWVtX2Zy ZWUoY3R4LCBtZW0pOw0KPiA+ICsNCj4gPiArCQltZW0gPSAmbGF0X2J1Zi0+c2xpY2VfYmNfYWRk cjsNCj4gPiArCQlpZiAobWVtLT52YSkNCj4gPiArCQkJbXRrX3Zjb2RlY19tZW1fZnJlZShjdHgs IG1lbSk7DQo+ID4gKw0KPiA+ICsJCWlmIChsYXRfYnVmLT5wcml2YXRlX2RhdGEpDQo+ID4gKwkJ CWtmcmVlKGxhdF9idWYtPnByaXZhdGVfZGF0YSk7DQo+ID4gKwl9DQo+ID4gK30NCj4gPiArDQo+ ID4gK2ludCB2ZGVjX21zZ19xdWV1ZV9pbml0KA0KPiA+ICsJc3RydWN0IHZkZWNfbXNnX3F1ZXVl ICptc2dfcXVldWUsDQo+ID4gKwlzdHJ1Y3QgbXRrX3Zjb2RlY19jdHggKmN0eCwNCj4gPiArCWNv cmVfZGVjb2RlX2NiX3QgY29yZV9kZWNvZGUsDQo+ID4gKwlpbnQgcHJpdmF0ZV9zaXplKQ0KPiA+ ICt7DQo+ID4gKwlzdHJ1Y3QgdmRlY19sYXRfYnVmICpsYXRfYnVmOw0KPiA+ICsJaW50IGksIGVy cjsNCj4gPiArDQo+ID4gKwkvKiBhbHJlYWR5IGluaXQgbXNnIHF1ZXVlICovDQo+ID4gKwlpZiAo bXNnX3F1ZXVlLT53ZG1hX2FkZHIuc2l6ZSkNCj4gPiArCQlyZXR1cm4gMDsNCj4gPiArDQo+ID4g Kwl2ZGVjX21zZ19xdWV1ZV9pbml0X2N0eCgmbXNnX3F1ZXVlLT5sYXRfY3R4LCBNVEtfVkRFQ19M QVQwKTsNCj4gPiArCW1zZ19xdWV1ZS0+d2RtYV9hZGRyLnNpemUgPSB2ZGVfbXNnX3F1ZXVlX2dl dF90cmFuc19zaXplKA0KPiA+ICsJCWN0eC0+cGljaW5mby5idWZfdywgY3R4LT5waWNpbmZvLmJ1 Zl9oKTsNCj4gPiArDQo+ID4gKwllcnIgPSBtdGtfdmNvZGVjX21lbV9hbGxvYyhjdHgsICZtc2df cXVldWUtPndkbWFfYWRkcik7DQo+ID4gKwlpZiAoZXJyKSB7DQo+ID4gKwkJbXRrX3Y0bDJfZXJy KCJmYWlsZWQgdG8gYWxsb2NhdGUgd2RtYV9hZGRyIGJ1ZiIpOw0KPiA+ICsJCXJldHVybiAtRU5P TUVNOw0KPiA+ICsJfQ0KPiA+ICsJbXNnX3F1ZXVlLT53ZG1hX3JwdHJfYWRkciA9IG1zZ19xdWV1 ZS0+d2RtYV9hZGRyLmRtYV9hZGRyOw0KPiA+ICsJbXNnX3F1ZXVlLT53ZG1hX3dwdHJfYWRkciA9 IG1zZ19xdWV1ZS0+d2RtYV9hZGRyLmRtYV9hZGRyOw0KPiA+ICsNCj4gPiArCWZvciAoaSA9IDA7 IGkgPCBOVU1fQlVGRkVSX0NPVU5UOyBpKyspIHsNCj4gPiArCQlsYXRfYnVmID0gJm1zZ19xdWV1 ZS0+bGF0X2J1ZltpXTsNCj4gPiArDQo+ID4gKwkJbGF0X2J1Zi0+d2RtYV9lcnJfYWRkci5zaXpl ID0gVkRFQ19FUlJfTUFQX1NaX0FWQzsNCj4gPiArCQllcnIgPSBtdGtfdmNvZGVjX21lbV9hbGxv YyhjdHgsICZsYXRfYnVmLQ0KPiA+ID53ZG1hX2Vycl9hZGRyKTsNCj4gPiArCQlpZiAoZXJyKSB7 DQo+ID4gKwkJCW10a192NGwyX2VycigiZmFpbGVkIHRvIGFsbG9jYXRlIHdkbWFfZXJyX2FkZHIN Cj4gPiBidWZbJWRdIiwgaSk7DQo+ID4gKwkJCWdvdG8gbWVtX2FsbG9jX2VycjsNCj4gPiArCQl9 DQo+ID4gKw0KPiA+ICsJCWxhdF9idWYtPnNsaWNlX2JjX2FkZHIuc2l6ZSA9IFZERUNfTEFUX1NM SUNFX0hFQURFUl9TWjsNCj4gPiArCQllcnIgPSBtdGtfdmNvZGVjX21lbV9hbGxvYyhjdHgsICZs YXRfYnVmLQ0KPiA+ID5zbGljZV9iY19hZGRyKTsNCj4gPiArCQlpZiAoZXJyKSB7DQo+ID4gKwkJ CW10a192NGwyX2VycigiZmFpbGVkIHRvIGFsbG9jYXRlIHdkbWFfYWRkcg0KPiA+IGJ1ZlslZF0i LCBpKTsNCj4gPiArCQkJZ290byBtZW1fYWxsb2NfZXJyOw0KPiA+ICsJCX0NCj4gPiArDQo+ID4g KwkJbGF0X2J1Zi0+cHJpdmF0ZV9kYXRhID0ga3phbGxvYyhwcml2YXRlX3NpemUsDQo+ID4gR0ZQ X0tFUk5FTCk7DQo+ID4gKwkJaWYgKCFsYXRfYnVmLT5wcml2YXRlX2RhdGEpIHsNCj4gPiArCQkJ bXRrX3Y0bDJfZXJyKCJmYWlsZWQgdG8gYWxsb2NhdGUNCj4gPiBwcml2YXRlX2RhdGFbJWRdIiwg aSk7DQo+ID4gKwkJCWdvdG8gbWVtX2FsbG9jX2VycjsNCj4gPiArCQl9DQo+ID4gKw0KPiA+ICsJ CWxhdF9idWYtPmN0eCA9IGN0eDsNCj4gPiArCQlsYXRfYnVmLT5jb3JlX2RlY29kZSA9IGNvcmVf ZGVjb2RlOw0KPiA+ICsJCXZkZWNfbXNnX3F1ZXVlX3FidWYoJm1zZ19xdWV1ZS0+bGF0X2N0eCwg bGF0X2J1Zik7DQo+IA0KPiBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCB0aGVyZSB3aWxsIGJlIG5v IGJ1ZmZlci4gSW4gY2FzZSBvZiBmYWlsdXJlLA0KPiB5b3Ugc2hvdWxkDQo+IHRha2UgdGhlIGFw cHJvcHJpYXRlIGFjdGlvbiBoZXJlLCBpbnN0ZWFkIG9mIGdvaW5nIG9uIHdpdGggYW4gaW52YWxp ZA0KPiBidWZmZXIuDQo+IA0KQWRkIHJldHVybiB2YWx1ZSwNCkZpeCBpbiBwYXRjaCB2MTIuDQo+ ID4gKwl9DQo+ID4gKwlyZXR1cm4gMDsNCj4gPiArDQo+ID4gK21lbV9hbGxvY19lcnI6DQo+ID4g Kwl2ZGVjX21zZ19xdWV1ZV9kZWluaXQobXNnX3F1ZXVlLCBjdHgpOw0KPiA+ICsJcmV0dXJuIC1F Tk9NRU07DQo+ID4gK30NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9t dGstdmNvZGVjL3ZkZWNfbXNnX3F1ZXVlLmgNCj4gPiBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0v bXRrLXZjb2RlYy92ZGVjX21zZ19xdWV1ZS5oDQo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4g PiBpbmRleCAwMDAwMDAwMDAwMDAuLjkxYTMxNWJhMGNiYQ0KPiA+IC0tLSAvZGV2L251bGwNCj4g PiArKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmRlY19tc2dfcXVldWUu aA0KPiA+IEBAIC0wLDAgKzEsMTQ4IEBADQo+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wDQo+ID4gKy8qDQo+ID4gKyAqIENvcHlyaWdodCAoYykgMjAyMSBNZWRpYVRlayBJ bmMuDQo+ID4gKyAqIEF1dGhvcjogWXVuZmVpIERvbmcgPHl1bmZlaS5kb25nQG1lZGlhdGVrLmNv bT4NCj4gPiArICovDQo+ID4gKw0KPiA+ICsjaWZuZGVmIF9WREVDX01TR19RVUVVRV9IXw0KPiA+ ICsjZGVmaW5lIF9WREVDX01TR19RVUVVRV9IXw0KPiA+ICsNCj4gPiArI2luY2x1ZGUgPGxpbnV4 L3NjaGVkLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4NCj4gPiArI2luY2x1 ZGUgPGxpbnV4L3NsYWIuaD4NCj4gPiArI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi12NGwyLmg+ DQo+ID4gKw0KPiA+ICsjaW5jbHVkZSAibXRrX3Zjb2RlY191dGlsLmgiDQo+ID4gKw0KPiA+ICsj ZGVmaW5lIE5VTV9CVUZGRVJfQ09VTlQgMw0KPiA+ICsNCj4gPiArc3RydWN0IHZkZWNfbGF0X2J1 ZjsNCj4gPiArc3RydWN0IG10a192Y29kZWNfY3R4Ow0KPiA+ICtzdHJ1Y3QgbXRrX3Zjb2RlY19k ZXY7DQo+ID4gK3R5cGVkZWYgaW50ICgqY29yZV9kZWNvZGVfY2JfdCkoc3RydWN0IHZkZWNfbGF0 X2J1ZiAqbGF0X2J1Zik7DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICogc3RydWN0IHZkZWNfbXNn X3F1ZXVlX2N0eCAtIHJlcHJlc2VudHMgYSBxdWV1ZSBmb3IgYnVmZmVycw0KPiA+IHJlYWR5IHRv IGJlIHByb2Nlc3NlZA0KPiA+ICsgKiBAcmVhZHlfdXNlZDogcmVhZHkgdXNlZCBxdWV1ZSB1c2Vk IHRvIHNpZ25hbGl6ZSB3aGVuIGdldCBhIGpvYg0KPiA+IHF1ZXVlDQo+ID4gKyAqIEByZWFkeV9x dWV1ZTogbGlzdCBvZiByZWFkeSBsYXQgYnVmZmVyIHF1ZXVlcw0KPiA+ICsgKiBAcmVhZHlfbG9j azogc3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIGxhdCBidWZmZXIgdXNhZ2UNCj4gPiArICogQHJl YWR5X251bTogbnVtYmVyIG9mIGJ1ZmZlcnMgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkDQo+ID4gKyAq IEBoYXJkd2FyZV9pbmRleDogaGFyZHdhcmUgaWQgdGhhdCB0aGlzIHF1ZXVlIGlzIHVzZWQgZm9y DQo+ID4gKyAqLw0KPiA+ICtzdHJ1Y3QgdmRlY19tc2dfcXVldWVfY3R4IHsNCj4gPiArCXdhaXRf cXVldWVfaGVhZF90IHJlYWR5X3RvX3VzZTsNCj4gPiArCXN0cnVjdCBsaXN0X2hlYWQgcmVhZHlf cXVldWU7DQo+ID4gKwlzcGlubG9ja190IHJlYWR5X2xvY2s7DQo+ID4gKwlpbnQgcmVhZHlfbnVt Ow0KPiA+ICsJaW50IGhhcmR3YXJlX2luZGV4Ow0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArLyoqDQo+ ID4gKyAqIHN0cnVjdCB2ZGVjX2xhdF9idWYgLSBsYXQgYnVmZmVyIG1lc3NhZ2UgdXNlZCB0byBz dG9yZSBsYXQgaW5mbw0KPiA+IGZvciBjb3JlIGRlY29kZQ0KPiA+ICsgKiBAd2RtYV9lcnJfYWRk cjogd2RtYSBlcnJvciBhZGRyZXNzIHVzZWQgZm9yIGxhdCBoYXJkd2FyZQ0KPiA+ICsgKiBAc2xp Y2VfYmNfYWRkcjogc2xpY2UgYmMgYWRkcmVzcyB1c2VkIGZvciBsYXQgaGFyZHdhcmUNCj4gPiAr ICogQHRzX2luZm86IG5lZWQgdG8gc2V0IHRpbWVzdGFtcCBmcm9tIG91dHB1dCB0byBjYXB0dXJl DQo+ID4gKyAqDQo+ID4gKyAqIEBwcml2YXRlX2RhdGE6IHNoYXJlZCBpbmZvcm1hdGlvbiB1c2Vk IHRvIGxhdCBhbmQgY29yZSBoYXJkd2FyZQ0KPiA+ICsgKiBAY3R4OiBtdGsgdmNvZGVjIGNvbnRl eHQgaW5mb3JtYXRpb24NCj4gPiArICogQGNvcmVfZGVjb2RlOiBkaWZmZXJlbnQgY29kZWMgdXNl IGRpZmZlcmVudCBkZWNvZGUgY2FsbGJhY2sNCj4gPiBmdW5jdGlvbg0KPiA+ICsgKiBAbGF0X2xp c3Q6IGFkZCBsYXQgYnVmZmVyIHRvIGxhdCBoZWFkIGxpc3QNCj4gPiArICogQGNvcmVfbGlzdDog YWRkIGxhdCBidWZmZXIgdG8gY29yZSBoZWFkIGxpc3QNCj4gPiArICovDQo+ID4gK3N0cnVjdCB2 ZGVjX2xhdF9idWYgew0KPiA+ICsJc3RydWN0IG10a192Y29kZWNfbWVtIHdkbWFfZXJyX2FkZHI7 DQo+ID4gKwlzdHJ1Y3QgbXRrX3Zjb2RlY19tZW0gc2xpY2VfYmNfYWRkcjsNCj4gPiArCXN0cnVj dCB2YjJfdjRsMl9idWZmZXIgdHNfaW5mbzsNCj4gPiArDQo+ID4gKwl2b2lkICpwcml2YXRlX2Rh dGE7DQo+ID4gKwlzdHJ1Y3QgbXRrX3Zjb2RlY19jdHggKmN0eDsNCj4gPiArCWNvcmVfZGVjb2Rl X2NiX3QgY29yZV9kZWNvZGU7DQo+ID4gKwlzdHJ1Y3QgbGlzdF9oZWFkIGxhdF9saXN0Ow0KPiA+ ICsJc3RydWN0IGxpc3RfaGVhZCBjb3JlX2xpc3Q7DQo+ID4gK307DQo+ID4gKw0KPiA+ICsvKioN Cj4gPiArICogc3RydWN0IHZkZWNfbXNnX3F1ZXVlIC0gdXNlZCB0byBzdG9yZSBsYXQgYnVmZmVy IG1lc3NhZ2UNCj4gPiArICogQGxhdF9idWY6IGxhdCBidWZmZXIgdXNlZCB0byBzdG9yZSBsYXQg YnVmZmVyIGluZm9ybWF0aW9uDQo+ID4gKyAqIEB3ZG1hX2FkZHI6IHdkbWEgYWRkcmVzcyB1c2Vk IGZvciB1YmUNCj4gPiArICogQHdkbWFfcnB0cl9hZGRyOiB1YmUgcmVhZCBwb2ludA0KPiA+ICsg KiBAd2RtYV93cHRyX2FkZHI6IHViZSB3cml0ZSBwb2ludA0KPiA+ICsgKiBAbGF0X2N0eDogdXNl ZCB0byBzdG9yZSBsYXQgYnVmZmVyIGxpc3QNCj4gPiArICovDQo+ID4gK3N0cnVjdCB2ZGVjX21z Z19xdWV1ZSB7DQo+ID4gKwlzdHJ1Y3QgdmRlY19sYXRfYnVmIGxhdF9idWZbTlVNX0JVRkZFUl9D T1VOVF07DQo+ID4gKw0KPiA+ICsJc3RydWN0IG10a192Y29kZWNfbWVtIHdkbWFfYWRkcjsNCj4g PiArCXVpbnQ2NF90IHdkbWFfcnB0cl9hZGRyOw0KPiA+ICsJdWludDY0X3Qgd2RtYV93cHRyX2Fk ZHI7DQo+ID4gKw0KPiA+ICsJc3RydWN0IHZkZWNfbXNnX3F1ZXVlX2N0eCBsYXRfY3R4Ow0KPiA+ ICt9Ow0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAqIHZkZWNfbXNnX3F1ZXVlX2luaXQgLSBpbml0 IGxhdCBidWZmZXIgaW5mb3JtYXRpb24uDQo+ID4gKyAqIEBtc2dfcXVldWU6IHVzZWQgdG8gc3Rv cmUgdGhlIGxhdCBidWZmZXIgaW5mb3JtYXRpb24NCj4gPiArICogQGN0eDogdjRsMiBjdHgNCj4g PiArICogQGNvcmVfZGVjb2RlOiBjb3JlIGRlY29kZSBjYWxsYmFjayBmb3IgZWFjaCBjb2RlYw0K PiA+ICsgKiBAcHJpdmF0ZV9zaXplOiB0aGUgcHJpdmF0ZSBkYXRhIHNpemUgdXNlZCB0byBzaGFy ZSB3aXRoIGNvcmUNCj4gPiArICovDQo+ID4gK2ludCB2ZGVjX21zZ19xdWV1ZV9pbml0KA0KPiA+ ICsJc3RydWN0IHZkZWNfbXNnX3F1ZXVlICptc2dfcXVldWUsDQo+ID4gKwlzdHJ1Y3QgbXRrX3Zj b2RlY19jdHggKmN0eCwNCj4gPiArCWNvcmVfZGVjb2RlX2NiX3QgY29yZV9kZWNvZGUsDQo+ID4g KwlpbnQgcHJpdmF0ZV9zaXplKTsNCj4gPiArDQo+IA0KPiBpbnQgdmRlY19tc2dfcXVldWVfaW5p dChzdHJ1Y3QgdmRlY19tc2dfcXVldWUgKm1zZ19xdWV1ZSwNCj4gCQkJc3RydWN0IG10a192Y29k ZWNfY3R4ICpjdHgsDQo+IA0KPiAJCQljb3JlX2RlY29kZV9jYl90IGNvcmVfZGVjb2RlLCBpbnQN Cj4gcHJpdmF0ZV9zaXplKTsNCj4gDQo+ID4gKy8qKg0KPiA+ICsgKiB2ZGVjX21zZ19xdWV1ZV9p bml0X2N0eCAtIHVzZWQgdG8gaW5pdCBtc2cgcXVldWUgY29udGV4dA0KPiA+IGluZm9ybWF0aW9u Lg0KPiA+ICsgKiBAY3R4OiBtZXNzYWdlIHF1ZXVlIGNvbnRleHQNCj4gPiArICogQGhhcmR3YXJl X2luZGV4OiBoYXJkd2FyZSBpbmRleA0KPiA+ICsgKi8NCj4gPiArdm9pZCB2ZGVjX21zZ19xdWV1 ZV9pbml0X2N0eChzdHJ1Y3QgdmRlY19tc2dfcXVldWVfY3R4ICpjdHgsDQo+ID4gKwlpbnQgaGFy ZHdhcmVfaW5kZXgpOw0KPiANCj4gRG9uJ3QgYnJlYWsgdGhpcyBsaW5lOyBldmVuIDkwIGNvbHVt bnMgaXMgZmluZS4uLg0KPiANCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiB2ZGVjX21zZ19xdWV1 ZV9xYnVmIC0gZW5xdWV1ZSBsYXQgYnVmZmVyIHRvIHF1ZXVlIGxpc3QuDQo+ID4gKyAqIEBjdHg6 IG1lc3NhZ2UgcXVldWUgY29udGV4dA0KPiA+ICsgKiBAYnVmOiBjdXJyZW50IGxhdCBidWZmZXIN Cj4gPiArICovDQo+ID4gK3ZvaWQgdmRlY19tc2dfcXVldWVfcWJ1ZihzdHJ1Y3QgdmRlY19tc2df cXVldWVfY3R4ICpjdHgsDQo+ID4gKwlzdHJ1Y3QgdmRlY19sYXRfYnVmICpidWYpOw0KPiANCj4g U2FtZSBoZXJlLg0KPiANCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiB2ZGVjX21zZ19xdWV1ZV9k cWJ1ZiAtIGRlcXVldWUgbGF0IGJ1ZmZlciBmcm9tIHF1ZXVlIGxpc3QuDQo+ID4gKyAqIEBjdHg6 IG1lc3NhZ2UgcXVldWUgY29udGV4dA0KPiA+ICsgKi8NCj4gPiArc3RydWN0IHZkZWNfbGF0X2J1 ZiAqdmRlY19tc2dfcXVldWVfZHFidWYoc3RydWN0DQo+ID4gdmRlY19tc2dfcXVldWVfY3R4ICpj dHgpOw0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAqIHZkZWNfbXNnX3F1ZXVlX3VwZGF0ZV91YmVf cnB0ciAtIHVzZWQgdG8gdXBkYXRhIHRoZSB1YmUgcmVhZA0KPiA+IHBvaW50Lg0KPiA+ICsgKiBA bXNnX3F1ZXVlOiB1c2VkIHRvIHN0b3JlIHRoZSBsYXQgYnVmZmVyIGluZm9ybWF0aW9uDQo+ID4g KyAqIEB1YmVfcnB0cjogY3VycmVudCB1YmUgcmVhZCBwb2ludA0KPiA+ICsgKi8NCj4gPiArdm9p ZCB2ZGVjX21zZ19xdWV1ZV91cGRhdGVfdWJlX3JwdHIoc3RydWN0IHZkZWNfbXNnX3F1ZXVlDQo+ ID4gKm1zZ19xdWV1ZSwNCj4gPiArCXVpbnQ2NF90IHViZV9ycHRyKTsNCj4gDQo+IC4uLiBhbmQg YWdhaW4gLi4uDQo+IA0KRml4IGluIHBhdGNoIHYxMi4NCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsg KiB2ZGVjX21zZ19xdWV1ZV91cGRhdGVfdWJlX3dwdHIgLSB1c2VkIHRvIHVwZGF0YSB0aGUgdWJl IHdyaXRlDQo+ID4gcG9pbnQuDQo+ID4gKyAqIEBtc2dfcXVldWU6IHVzZWQgdG8gc3RvcmUgdGhl IGxhdCBidWZmZXIgaW5mb3JtYXRpb24NCj4gPiArICogQHViZV93cHRyOiBjdXJyZW50IHViZSB3 cml0ZSBwb2ludA0KPiA+ICsgKi8NCj4gPiArdm9pZCB2ZGVjX21zZ19xdWV1ZV91cGRhdGVfdWJl X3dwdHIoc3RydWN0IHZkZWNfbXNnX3F1ZXVlDQo+ID4gKm1zZ19xdWV1ZSwNCj4gPiArCXVpbnQ2 NF90IHViZV93cHRyKTsNCj4gDQo+IC4uLiBhbmQgYWdhaW4gLi4uDQo+IA0KPiA+ICsNCj4gPiAr LyoqDQo+ID4gKyAqIHZkZWNfbXNnX3F1ZXVlX3dhaXRfbGF0X2J1Zl9mdWxsIC0gdXNlZCB0byBj aGVjayB3aGV0aGVyIGFsbA0KPiA+IGxhdCBidWZmZXINCj4gPiArICogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpbiBsYXQgbGlzdC4NCj4gPiArICogQG1zZ19xdWV1ZTogdXNl ZCB0byBzdG9yZSB0aGUgbGF0IGJ1ZmZlciBpbmZvcm1hdGlvbg0KPiA+ICsgKi8NCj4gPiArYm9v bCB2ZGVjX21zZ19xdWV1ZV93YWl0X2xhdF9idWZfZnVsbChzdHJ1Y3QgdmRlY19tc2dfcXVldWUN Cj4gPiAqbXNnX3F1ZXVlKTsNCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiB2ZGVjX21zZ19xdWV1 ZV9kZWluaXQgLSBkZWluaXQgbGF0IGJ1ZmZlciBpbmZvcm1hdGlvbi4NCj4gPiArICogQG1zZ19x dWV1ZTogdXNlZCB0byBzdG9yZSB0aGUgbGF0IGJ1ZmZlciBpbmZvcm1hdGlvbg0KPiA+ICsgKiBA Y3R4OiB2NGwyIGN0eA0KPiA+ICsgKi8NCj4gPiArdm9pZCB2ZGVjX21zZ19xdWV1ZV9kZWluaXQo c3RydWN0IHZkZWNfbXNnX3F1ZXVlICptc2dfcXVldWUsDQo+ID4gKwkJCSAgIHN0cnVjdCBtdGtf dmNvZGVjX2N0eCAqY3R4KTsNCj4gDQo+IC4uLiBhbmQgYWdhaW4uDQo+IA0KPiA+ICsNCj4gPiAr I2VuZGlmDQo+ID4gDQo+IA0KQmVzdCBSZWdhcmRzLA0KWXVuZmVpIERvbmcNCj4gDQo= 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 89986C433F5 for ; Fri, 3 Dec 2021 02:01:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:CC:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=cFMdVA5r2a96avdZlEnxUEcX1RHXUOeZKAvGuvziaKc=; b=pE31LBj7AM/8KT HQ4Uq99UJpJqxJpV12SvGRP8hi3CvkknS0qUS/cGskJb1k3vD+nQaV3V3EME49dTjqWI6woGSsRVK GrmRqvgzZayeqW0I8MIh6Qw/+lxVVN4hClEgmDAzgY/G5jmFjltltPBJsJcAIOBchtoOwt+YzdbPG ZY3v2Go6PXBY8wrzmMqyFMmYP3ke3aO8V4YcoMn5UT2xYKjCDXmGs3LBZGlMdZwb/vuVZqil3Nn4p yhNu1l9m/tJE+Sfn4IC/CJ07u4os9PKIoj70pe9TPet2WijmGgC7gzuS93iptuNpuz7d4kKr/5fN/ g0Woo1szhzNwOzmDJW4A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1msxtJ-00E2Sd-Mn; Fri, 03 Dec 2021 02:01:37 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1msxtD-00E2RS-Gn; Fri, 03 Dec 2021 02:01:36 +0000 X-UUID: 4dc698d12594424a907d6b4994db91ec-20211202 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=+noD9So2vtPTce89wwpEV+fiHvsXrozU1mApoEZnKXk=; b=PfAm3HcgjPInXl+G9h2kGxF/31DPKcTI/eTVx1fkZcoG667oTYnMJU0cJQIQFeJ016WnZLsk65f07tJMdpN2NfZ9xwC4gQYbfpM4E6bp+jzUGVu3rKlvOxe0axKJJP7CqdssNRDeICBSoR4AJmXQzeJdFD6170SsOhuVNoioJlA=; X-UUID: 4dc698d12594424a907d6b4994db91ec-20211202 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 865383134; Thu, 02 Dec 2021 19:01:29 -0700 Received: from MTKMBS07N2.mediatek.inc (172.21.101.141) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Thu, 2 Dec 2021 17:55:04 -0800 Received: from mtkcas11.mediatek.inc (172.21.101.40) by mtkmbs07n2.mediatek.inc (172.21.101.141) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 3 Dec 2021 09:55:02 +0800 Received: from mhfsdcap04 (10.17.3.154) by mtkcas11.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Fri, 3 Dec 2021 09:55:00 +0800 Message-ID: <196c55db7c48c29a5858e6446f19756fae3bb157.camel@mediatek.com> Subject: Re: [PATCH v11, 10/19] media: mtk-vcodec: Add msg queue feature for lat and core architecture From: "yunfei.dong@mediatek.com" To: AngeloGioacchino Del Regno , Alexandre Courbot , Hans Verkuil , Tzung-Bi Shih , "Tiffany Lin" , Andrew-CT Chen , Mauro Carvalho Chehab , Rob Herring , Matthias Brugger , Tomasz Figa CC: Hsin-Yi Wang , Fritz Koenig , Dafna Hirschfeld , Benjamin Gaignard , Daniel Vetter , dri-devel , Irui Wang , , , , , , , Date: Fri, 3 Dec 2021 09:55:00 +0800 In-Reply-To: <9710488f-9129-4462-b528-642561021731@collabora.com> References: <20211129034201.5767-1-yunfei.dong@mediatek.com> <20211129034201.5767-11-yunfei.dong@mediatek.com> <9710488f-9129-4462-b528-642561021731@collabora.com> X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.2 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211202_180131_617181_B32125F3 X-CRM114-Status: GOOD ( 33.43 ) X-BeenThere: linux-mediatek@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="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org Hi AngeloGioacchino, Thanks for your suggestion. On Wed, 2021-12-01 at 13:09 +0100, AngeloGioacchino Del Regno wrote: > Il 29/11/21 04:41, Yunfei Dong ha scritto: > > For lat and core architecture, lat thread will send message to core > > thread when lat decode done. Core hardware will use the message > > from lat to decode, then free message to lat thread when decode > > done. > > > > Signed-off-by: Yunfei Dong > > --- > > drivers/media/platform/mtk-vcodec/Makefile | 1 + > > .../platform/mtk-vcodec/mtk_vcodec_drv.h | 9 + > > .../platform/mtk-vcodec/vdec_msg_queue.c | 257 > > ++++++++++++++++++ > > .../platform/mtk-vcodec/vdec_msg_queue.h | 148 ++++++++++ > > 4 files changed, 415 insertions(+) > > create mode 100644 drivers/media/platform/mtk- > > vcodec/vdec_msg_queue.c > > create mode 100644 drivers/media/platform/mtk- > > vcodec/vdec_msg_queue.h > > > > diff --git a/drivers/media/platform/mtk-vcodec/Makefile > > b/drivers/media/platform/mtk-vcodec/Makefile > > index c61bfb179bcc..359619653a0e 100644 > > --- a/drivers/media/platform/mtk-vcodec/Makefile > > +++ b/drivers/media/platform/mtk-vcodec/Makefile > > @@ -12,6 +12,7 @@ mtk-vcodec-dec-y := vdec/vdec_h264_if.o \ > > mtk_vcodec_dec_drv.o \ > > vdec_drv_if.o \ > > vdec_vpu_if.o \ > > + vdec_msg_queue.o \ > > mtk_vcodec_dec.o \ > > mtk_vcodec_dec_stateful.o \ > > mtk_vcodec_dec_stateless.o \ > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > > b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > > index 7fc106df039b..610b0af13879 100644 > > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > > @@ -15,7 +15,9 @@ > > #include > > #include > > #include > > + > > #include "mtk_vcodec_util.h" > > +#include "vdec_msg_queue.h" > > > > #define MTK_VCODEC_DRV_NAME "mtk_vcodec_drv" > > #define MTK_VCODEC_DEC_NAME "mtk-vcodec-dec" > > @@ -282,6 +284,8 @@ struct vdec_pic_info { > > * @decoded_frame_cnt: number of decoded frames > > * @lock: protect variables accessed by V4L2 threads and worker > > thread such as > > * mtk_video_dec_buf. > > + * > > + * @msg_queue: msg queue used to store lat buffer information. > > */ > > struct mtk_vcodec_ctx { > > enum mtk_instance_type type; > > @@ -325,6 +329,7 @@ struct mtk_vcodec_ctx { > > int decoded_frame_cnt; > > struct mutex lock; > > > > + struct vdec_msg_queue msg_queue; > > }; > > > > enum mtk_chip { > > @@ -457,6 +462,8 @@ struct mtk_vcodec_enc_pdata { > > * @dec_capability: used to identify decode capability, ex: 4k > > * @enc_capability: used to identify encode capability > > * > > + * @msg_queue_core_ctx: msg queue context used for core workqueue > > + * > > * @subdev_dev: subdev hardware device > > * @subdev_bitmap: used to record hardware is ready or not > > */ > > @@ -497,6 +504,8 @@ struct mtk_vcodec_dev { > > unsigned int dec_capability; > > unsigned int enc_capability; > > > > + struct vdec_msg_queue_ctx msg_queue_core_ctx; > > + > > void *subdev_dev[MTK_VDEC_HW_MAX]; > > DECLARE_BITMAP(subdev_bitmap, MTK_VDEC_HW_MAX); > > }; > > diff --git a/drivers/media/platform/mtk-vcodec/vdec_msg_queue.c > > b/drivers/media/platform/mtk-vcodec/vdec_msg_queue.c > > new file mode 100644 > > index 000000000000..da4d114f7ad0 > > --- /dev/null > > +++ b/drivers/media/platform/mtk-vcodec/vdec_msg_queue.c > > @@ -0,0 +1,257 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Copyright (c) 2021 MediaTek Inc. > > + * Author: Yunfei Dong > > + */ > > + > > +#include > > +#include > > +#include > > + > > +#include "mtk_vcodec_dec_pm.h" > > +#include "mtk_vcodec_drv.h" > > +#include "vdec_msg_queue.h" > > + > > +/* the size used to store lat slice header information */ > > +#define VDEC_LAT_SLICE_HEADER_SZ (640 * SZ_1K) > > + > > +/* the size used to store avc error information */ > > +#define VDEC_ERR_MAP_SZ_AVC (17 * SZ_1K) > > + > > +/* core will read the trans buffer which decoded by lat to decode > > again. > > + * The trans buffer size of FHD and 4K bitstreams are different. > > + */ > > +static int vde_msg_queue_get_trans_size(int width, int height) > > +{ > > + if (width > 1920 || height > 1088) > > + return 30 * SZ_1M; > > + else > > + return 6 * SZ_1M; > > +} > > + > > +void vdec_msg_queue_init_ctx(struct vdec_msg_queue_ctx *ctx, > > + int hardware_index) > > +{ > > + init_waitqueue_head(&ctx->ready_to_use); > > + INIT_LIST_HEAD(&ctx->ready_queue); > > + spin_lock_init(&ctx->ready_lock); > > + ctx->ready_num = 0; > > + ctx->hardware_index = hardware_index; > > +} > > + > > +static struct list_head *vdec_get_buf_list(int hardware_index, > > + struct vdec_lat_buf *buf) > > +{ > > + switch (hardware_index) { > > + case MTK_VDEC_CORE: > > + return &buf->core_list; > > + case MTK_VDEC_LAT0: > > + return &buf->lat_list; > > + default: > > + return NULL; > > + } > > +} > > + > > +void vdec_msg_queue_qbuf(struct vdec_msg_queue_ctx *msg_ctx, > > + struct vdec_lat_buf *buf) > > This function can fail: it has to return an integer value. > > > +{ > > + struct list_head *head; > > + > > + head = vdec_get_buf_list(msg_ctx->hardware_index, buf); > > + if (!head) { > > + mtk_v4l2_err("fail to qbuf: %d",msg_ctx- > > >hardware_index); > > + return; > > + } > > + > > + spin_lock(&msg_ctx->ready_lock); > > + list_add_tail(head, &msg_ctx->ready_queue); > > + msg_ctx->ready_num++; > > + > > + if (msg_ctx->hardware_index != MTK_VDEC_CORE) > > + wake_up_all(&msg_ctx->ready_to_use); > > + > > + mtk_v4l2_debug(3, "enqueue buf type: %d addr: 0x%p num: %d", > > + msg_ctx->hardware_index, buf, msg_ctx->ready_num); > > + spin_unlock(&msg_ctx->ready_lock); > > +} > > + > > +static bool vdec_msg_queue_wait_event(struct vdec_msg_queue_ctx > > *msg_ctx) > > +{ > > + int ret; > > + > > + ret = wait_event_timeout(msg_ctx->ready_to_use, > > + !list_empty(&msg_ctx->ready_queue), > > + msecs_to_jiffies(1500)); > > At the beginning of this file: > #define VDEC_MSG_QUEUE_TIMEOUT_MS 1500 > Fix in patch v12. > ...then: > ret = wait_event_timeout(msg_ctx->ready_to_use, > > !list_empty(&msg_ctx->ready_queue), > > msecs_to_jiffies(VDEC_MSG_QUEUE_TIMEOU > T_MS)); > > > > + if (!ret) > > + return false; > > + > > + return true; > > +} > > + > > +struct vdec_lat_buf *vdec_msg_queue_dqbuf(struct > > vdec_msg_queue_ctx *msg_ctx) > > +{ > > + struct vdec_lat_buf *buf; > > + struct list_head *head; > > + int ret; > > + > > + spin_lock(&msg_ctx->ready_lock); > > + if (list_empty(&msg_ctx->ready_queue)) { > > + mtk_v4l2_debug(3, "queue is NULL, type:%d num: %d", > > + msg_ctx->hardware_index, msg_ctx->ready_num); > > + spin_unlock(&msg_ctx->ready_lock); > > + > > + if (msg_ctx->hardware_index == MTK_VDEC_CORE) > > + return NULL; > > + > > + ret = vdec_msg_queue_wait_event(msg_ctx); > > + if (!ret) > > + return NULL; > > + spin_lock(&msg_ctx->ready_lock); > > + } > > + > > + if (msg_ctx->hardware_index == MTK_VDEC_CORE) > > + buf = list_first_entry(&msg_ctx->ready_queue, > > + struct vdec_lat_buf, core_list); > > + else > > + buf = list_first_entry(&msg_ctx->ready_queue, > > + struct vdec_lat_buf, lat_list); > > + > > + head = vdec_get_buf_list(msg_ctx->hardware_index, buf); > > + if (!head) { > > + spin_unlock(&msg_ctx->ready_lock); > > + mtk_v4l2_err("fail to dqbuf: %d",msg_ctx- > > >hardware_index); > > + return NULL; > > + } > > + list_del(head); > > + > > + msg_ctx->ready_num--; > > + mtk_v4l2_debug(3, "dqueue buf type:%d addr: 0x%p num: %d", > > + msg_ctx->hardware_index, buf, msg_ctx->ready_num); > > + spin_unlock(&msg_ctx->ready_lock); > > + > > + return buf; > > +} > > + > > +void vdec_msg_queue_update_ube_rptr(struct vdec_msg_queue > > *msg_queue, > > + uint64_t ube_rptr) > > +{ > > + spin_lock(&msg_queue->lat_ctx.ready_lock); > > + msg_queue->wdma_rptr_addr = ube_rptr; > > + mtk_v4l2_debug(3, "update ube rprt (0x%llx)", ube_rptr); > > + spin_unlock(&msg_queue->lat_ctx.ready_lock); > > +} > > + > > +void vdec_msg_queue_update_ube_wptr(struct vdec_msg_queue > > *msg_queue, > > + uint64_t ube_wptr) > > +{ > > + spin_lock(&msg_queue->lat_ctx.ready_lock); > > + msg_queue->wdma_wptr_addr = ube_wptr; > > + mtk_v4l2_debug(3, "update ube wprt: (0x%llx 0x%llx) offset: > > 0x%llx", > > + msg_queue->wdma_rptr_addr, msg_queue->wdma_wptr_addr, > > ube_wptr); > > + spin_unlock(&msg_queue->lat_ctx.ready_lock); > > +} > > + > > +bool vdec_msg_queue_wait_lat_buf_full(struct vdec_msg_queue > > *msg_queue) > > +{ > > + long timeout_jiff; > > + int ret; > > + > > + timeout_jiff = msecs_to_jiffies(1000 * (NUM_BUFFER_COUNT + 2)); > > + ret = wait_event_timeout(msg_queue->lat_ctx.ready_to_use, > > + msg_queue->lat_ctx.ready_num == NUM_BUFFER_COUNT, > > + timeout_jiff); > > + if (ret) { > > + mtk_v4l2_debug(3, "success to get lat buf: %d", > > + msg_queue->lat_ctx.ready_num); > > + return true; > > + } > > + mtk_v4l2_err("failed with lat buf isn't full: %d", > > + msg_queue->lat_ctx.ready_num); > > + return false; > > +} > > + > > +void vdec_msg_queue_deinit( > > + struct vdec_msg_queue *msg_queue, > > + struct mtk_vcodec_ctx *ctx) > > +{ > > + struct vdec_lat_buf *lat_buf; > > + struct mtk_vcodec_mem *mem; > > + int i; > > + > > + mem = &msg_queue->wdma_addr; > > + if (mem->va) > > + mtk_vcodec_mem_free(ctx, mem); > > + for (i = 0; i < NUM_BUFFER_COUNT; i++) { > > + lat_buf = &msg_queue->lat_buf[i]; > > + > > + mem = &lat_buf->wdma_err_addr; > > + if (mem->va) > > + mtk_vcodec_mem_free(ctx, mem); > > + > > + mem = &lat_buf->slice_bc_addr; > > + if (mem->va) > > + mtk_vcodec_mem_free(ctx, mem); > > + > > + if (lat_buf->private_data) > > + kfree(lat_buf->private_data); > > + } > > +} > > + > > +int vdec_msg_queue_init( > > + struct vdec_msg_queue *msg_queue, > > + struct mtk_vcodec_ctx *ctx, > > + core_decode_cb_t core_decode, > > + int private_size) > > +{ > > + struct vdec_lat_buf *lat_buf; > > + int i, err; > > + > > + /* already init msg queue */ > > + if (msg_queue->wdma_addr.size) > > + return 0; > > + > > + vdec_msg_queue_init_ctx(&msg_queue->lat_ctx, MTK_VDEC_LAT0); > > + msg_queue->wdma_addr.size = vde_msg_queue_get_trans_size( > > + ctx->picinfo.buf_w, ctx->picinfo.buf_h); > > + > > + err = mtk_vcodec_mem_alloc(ctx, &msg_queue->wdma_addr); > > + if (err) { > > + mtk_v4l2_err("failed to allocate wdma_addr buf"); > > + return -ENOMEM; > > + } > > + msg_queue->wdma_rptr_addr = msg_queue->wdma_addr.dma_addr; > > + msg_queue->wdma_wptr_addr = msg_queue->wdma_addr.dma_addr; > > + > > + for (i = 0; i < NUM_BUFFER_COUNT; i++) { > > + lat_buf = &msg_queue->lat_buf[i]; > > + > > + lat_buf->wdma_err_addr.size = VDEC_ERR_MAP_SZ_AVC; > > + err = mtk_vcodec_mem_alloc(ctx, &lat_buf- > > >wdma_err_addr); > > + if (err) { > > + mtk_v4l2_err("failed to allocate wdma_err_addr > > buf[%d]", i); > > + goto mem_alloc_err; > > + } > > + > > + lat_buf->slice_bc_addr.size = VDEC_LAT_SLICE_HEADER_SZ; > > + err = mtk_vcodec_mem_alloc(ctx, &lat_buf- > > >slice_bc_addr); > > + if (err) { > > + mtk_v4l2_err("failed to allocate wdma_addr > > buf[%d]", i); > > + goto mem_alloc_err; > > + } > > + > > + lat_buf->private_data = kzalloc(private_size, > > GFP_KERNEL); > > + if (!lat_buf->private_data) { > > + mtk_v4l2_err("failed to allocate > > private_data[%d]", i); > > + goto mem_alloc_err; > > + } > > + > > + lat_buf->ctx = ctx; > > + lat_buf->core_decode = core_decode; > > + vdec_msg_queue_qbuf(&msg_queue->lat_ctx, lat_buf); > > If this function fails, there will be no buffer. In case of failure, > you should > take the appropriate action here, instead of going on with an invalid > buffer. > Add return value, Fix in patch v12. > > + } > > + return 0; > > + > > +mem_alloc_err: > > + vdec_msg_queue_deinit(msg_queue, ctx); > > + return -ENOMEM; > > +} > > diff --git a/drivers/media/platform/mtk-vcodec/vdec_msg_queue.h > > b/drivers/media/platform/mtk-vcodec/vdec_msg_queue.h > > new file mode 100644 > > index 000000000000..91a315ba0cba > > --- /dev/null > > +++ b/drivers/media/platform/mtk-vcodec/vdec_msg_queue.h > > @@ -0,0 +1,148 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Copyright (c) 2021 MediaTek Inc. > > + * Author: Yunfei Dong > > + */ > > + > > +#ifndef _VDEC_MSG_QUEUE_H_ > > +#define _VDEC_MSG_QUEUE_H_ > > + > > +#include > > +#include > > +#include > > +#include > > + > > +#include "mtk_vcodec_util.h" > > + > > +#define NUM_BUFFER_COUNT 3 > > + > > +struct vdec_lat_buf; > > +struct mtk_vcodec_ctx; > > +struct mtk_vcodec_dev; > > +typedef int (*core_decode_cb_t)(struct vdec_lat_buf *lat_buf); > > + > > +/** > > + * struct vdec_msg_queue_ctx - represents a queue for buffers > > ready to be processed > > + * @ready_used: ready used queue used to signalize when get a job > > queue > > + * @ready_queue: list of ready lat buffer queues > > + * @ready_lock: spin lock to protect the lat buffer usage > > + * @ready_num: number of buffers ready to be processed > > + * @hardware_index: hardware id that this queue is used for > > + */ > > +struct vdec_msg_queue_ctx { > > + wait_queue_head_t ready_to_use; > > + struct list_head ready_queue; > > + spinlock_t ready_lock; > > + int ready_num; > > + int hardware_index; > > +}; > > + > > +/** > > + * struct vdec_lat_buf - lat buffer message used to store lat info > > for core decode > > + * @wdma_err_addr: wdma error address used for lat hardware > > + * @slice_bc_addr: slice bc address used for lat hardware > > + * @ts_info: need to set timestamp from output to capture > > + * > > + * @private_data: shared information used to lat and core hardware > > + * @ctx: mtk vcodec context information > > + * @core_decode: different codec use different decode callback > > function > > + * @lat_list: add lat buffer to lat head list > > + * @core_list: add lat buffer to core head list > > + */ > > +struct vdec_lat_buf { > > + struct mtk_vcodec_mem wdma_err_addr; > > + struct mtk_vcodec_mem slice_bc_addr; > > + struct vb2_v4l2_buffer ts_info; > > + > > + void *private_data; > > + struct mtk_vcodec_ctx *ctx; > > + core_decode_cb_t core_decode; > > + struct list_head lat_list; > > + struct list_head core_list; > > +}; > > + > > +/** > > + * struct vdec_msg_queue - used to store lat buffer message > > + * @lat_buf: lat buffer used to store lat buffer information > > + * @wdma_addr: wdma address used for ube > > + * @wdma_rptr_addr: ube read point > > + * @wdma_wptr_addr: ube write point > > + * @lat_ctx: used to store lat buffer list > > + */ > > +struct vdec_msg_queue { > > + struct vdec_lat_buf lat_buf[NUM_BUFFER_COUNT]; > > + > > + struct mtk_vcodec_mem wdma_addr; > > + uint64_t wdma_rptr_addr; > > + uint64_t wdma_wptr_addr; > > + > > + struct vdec_msg_queue_ctx lat_ctx; > > +}; > > + > > +/** > > + * vdec_msg_queue_init - init lat buffer information. > > + * @msg_queue: used to store the lat buffer information > > + * @ctx: v4l2 ctx > > + * @core_decode: core decode callback for each codec > > + * @private_size: the private data size used to share with core > > + */ > > +int vdec_msg_queue_init( > > + struct vdec_msg_queue *msg_queue, > > + struct mtk_vcodec_ctx *ctx, > > + core_decode_cb_t core_decode, > > + int private_size); > > + > > int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue, > struct mtk_vcodec_ctx *ctx, > > core_decode_cb_t core_decode, int > private_size); > > > +/** > > + * vdec_msg_queue_init_ctx - used to init msg queue context > > information. > > + * @ctx: message queue context > > + * @hardware_index: hardware index > > + */ > > +void vdec_msg_queue_init_ctx(struct vdec_msg_queue_ctx *ctx, > > + int hardware_index); > > Don't break this line; even 90 columns is fine... > > > + > > +/** > > + * vdec_msg_queue_qbuf - enqueue lat buffer to queue list. > > + * @ctx: message queue context > > + * @buf: current lat buffer > > + */ > > +void vdec_msg_queue_qbuf(struct vdec_msg_queue_ctx *ctx, > > + struct vdec_lat_buf *buf); > > Same here. > > > + > > +/** > > + * vdec_msg_queue_dqbuf - dequeue lat buffer from queue list. > > + * @ctx: message queue context > > + */ > > +struct vdec_lat_buf *vdec_msg_queue_dqbuf(struct > > vdec_msg_queue_ctx *ctx); > > + > > +/** > > + * vdec_msg_queue_update_ube_rptr - used to updata the ube read > > point. > > + * @msg_queue: used to store the lat buffer information > > + * @ube_rptr: current ube read point > > + */ > > +void vdec_msg_queue_update_ube_rptr(struct vdec_msg_queue > > *msg_queue, > > + uint64_t ube_rptr); > > ... and again ... > Fix in patch v12. > > + > > +/** > > + * vdec_msg_queue_update_ube_wptr - used to updata the ube write > > point. > > + * @msg_queue: used to store the lat buffer information > > + * @ube_wptr: current ube write point > > + */ > > +void vdec_msg_queue_update_ube_wptr(struct vdec_msg_queue > > *msg_queue, > > + uint64_t ube_wptr); > > ... and again ... > > > + > > +/** > > + * vdec_msg_queue_wait_lat_buf_full - used to check whether all > > lat buffer > > + * in lat list. > > + * @msg_queue: used to store the lat buffer information > > + */ > > +bool vdec_msg_queue_wait_lat_buf_full(struct vdec_msg_queue > > *msg_queue); > > + > > +/** > > + * vdec_msg_queue_deinit - deinit lat buffer information. > > + * @msg_queue: used to store the lat buffer information > > + * @ctx: v4l2 ctx > > + */ > > +void vdec_msg_queue_deinit(struct vdec_msg_queue *msg_queue, > > + struct mtk_vcodec_ctx *ctx); > > ... and again. > > > + > > +#endif > > > Best Regards, Yunfei Dong > _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek 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 1ACC9C433EF for ; Fri, 3 Dec 2021 02:03:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:CC:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=4NBM2WaMKzJM3AnYrH8W97j2+rv06LNK7tX1vh8JvCM=; b=cNt+V4ePiSPjiR XgqfmOChgHlkmbsGkkRjWCzKL/1kDbgZhjUknNuUvPtPUGPDe3BgS5AoGnDmmviuzAVBa6ItC6GjK 16ZSZ2OseTR4/MuhydLlKw9/PCfgKqcyBRzL4HmIqsyWd74ymPuUWXQxRU+0sD3ClzFEQ1K1Lppav TqCL0IcG2Jaezy852mbCQdWyiN1sDZcOoiwto2O8MZCDi10Px3TxdAXcBGcaYpabXiz2aghVfEcCN 92zOEEiOvNXATJZWYiEPOGlc8pMV34abEH4Ryz0PZiCRM56nULutGXEqrvk77GHt6xPzrLw6N7HFv RRjaRkDiy2zF6pyd5TTw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1msxtM-00E2Sx-0J; Fri, 03 Dec 2021 02:01:40 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1msxtD-00E2RS-Gn; Fri, 03 Dec 2021 02:01:36 +0000 X-UUID: 4dc698d12594424a907d6b4994db91ec-20211202 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=+noD9So2vtPTce89wwpEV+fiHvsXrozU1mApoEZnKXk=; b=PfAm3HcgjPInXl+G9h2kGxF/31DPKcTI/eTVx1fkZcoG667oTYnMJU0cJQIQFeJ016WnZLsk65f07tJMdpN2NfZ9xwC4gQYbfpM4E6bp+jzUGVu3rKlvOxe0axKJJP7CqdssNRDeICBSoR4AJmXQzeJdFD6170SsOhuVNoioJlA=; X-UUID: 4dc698d12594424a907d6b4994db91ec-20211202 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 865383134; Thu, 02 Dec 2021 19:01:29 -0700 Received: from MTKMBS07N2.mediatek.inc (172.21.101.141) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Thu, 2 Dec 2021 17:55:04 -0800 Received: from mtkcas11.mediatek.inc (172.21.101.40) by mtkmbs07n2.mediatek.inc (172.21.101.141) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 3 Dec 2021 09:55:02 +0800 Received: from mhfsdcap04 (10.17.3.154) by mtkcas11.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Fri, 3 Dec 2021 09:55:00 +0800 Message-ID: <196c55db7c48c29a5858e6446f19756fae3bb157.camel@mediatek.com> Subject: Re: [PATCH v11, 10/19] media: mtk-vcodec: Add msg queue feature for lat and core architecture From: "yunfei.dong@mediatek.com" To: AngeloGioacchino Del Regno , Alexandre Courbot , Hans Verkuil , Tzung-Bi Shih , "Tiffany Lin" , Andrew-CT Chen , Mauro Carvalho Chehab , Rob Herring , Matthias Brugger , Tomasz Figa CC: Hsin-Yi Wang , Fritz Koenig , Dafna Hirschfeld , Benjamin Gaignard , Daniel Vetter , dri-devel , Irui Wang , , , , , , , Date: Fri, 3 Dec 2021 09:55:00 +0800 In-Reply-To: <9710488f-9129-4462-b528-642561021731@collabora.com> References: <20211129034201.5767-1-yunfei.dong@mediatek.com> <20211129034201.5767-11-yunfei.dong@mediatek.com> <9710488f-9129-4462-b528-642561021731@collabora.com> X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.2 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211202_180131_617181_B32125F3 X-CRM114-Status: GOOD ( 33.43 ) 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="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi AngeloGioacchino, Thanks for your suggestion. On Wed, 2021-12-01 at 13:09 +0100, AngeloGioacchino Del Regno wrote: > Il 29/11/21 04:41, Yunfei Dong ha scritto: > > For lat and core architecture, lat thread will send message to core > > thread when lat decode done. Core hardware will use the message > > from lat to decode, then free message to lat thread when decode > > done. > > > > Signed-off-by: Yunfei Dong > > --- > > drivers/media/platform/mtk-vcodec/Makefile | 1 + > > .../platform/mtk-vcodec/mtk_vcodec_drv.h | 9 + > > .../platform/mtk-vcodec/vdec_msg_queue.c | 257 > > ++++++++++++++++++ > > .../platform/mtk-vcodec/vdec_msg_queue.h | 148 ++++++++++ > > 4 files changed, 415 insertions(+) > > create mode 100644 drivers/media/platform/mtk- > > vcodec/vdec_msg_queue.c > > create mode 100644 drivers/media/platform/mtk- > > vcodec/vdec_msg_queue.h > > > > diff --git a/drivers/media/platform/mtk-vcodec/Makefile > > b/drivers/media/platform/mtk-vcodec/Makefile > > index c61bfb179bcc..359619653a0e 100644 > > --- a/drivers/media/platform/mtk-vcodec/Makefile > > +++ b/drivers/media/platform/mtk-vcodec/Makefile > > @@ -12,6 +12,7 @@ mtk-vcodec-dec-y := vdec/vdec_h264_if.o \ > > mtk_vcodec_dec_drv.o \ > > vdec_drv_if.o \ > > vdec_vpu_if.o \ > > + vdec_msg_queue.o \ > > mtk_vcodec_dec.o \ > > mtk_vcodec_dec_stateful.o \ > > mtk_vcodec_dec_stateless.o \ > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > > b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > > index 7fc106df039b..610b0af13879 100644 > > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h > > @@ -15,7 +15,9 @@ > > #include > > #include > > #include > > + > > #include "mtk_vcodec_util.h" > > +#include "vdec_msg_queue.h" > > > > #define MTK_VCODEC_DRV_NAME "mtk_vcodec_drv" > > #define MTK_VCODEC_DEC_NAME "mtk-vcodec-dec" > > @@ -282,6 +284,8 @@ struct vdec_pic_info { > > * @decoded_frame_cnt: number of decoded frames > > * @lock: protect variables accessed by V4L2 threads and worker > > thread such as > > * mtk_video_dec_buf. > > + * > > + * @msg_queue: msg queue used to store lat buffer information. > > */ > > struct mtk_vcodec_ctx { > > enum mtk_instance_type type; > > @@ -325,6 +329,7 @@ struct mtk_vcodec_ctx { > > int decoded_frame_cnt; > > struct mutex lock; > > > > + struct vdec_msg_queue msg_queue; > > }; > > > > enum mtk_chip { > > @@ -457,6 +462,8 @@ struct mtk_vcodec_enc_pdata { > > * @dec_capability: used to identify decode capability, ex: 4k > > * @enc_capability: used to identify encode capability > > * > > + * @msg_queue_core_ctx: msg queue context used for core workqueue > > + * > > * @subdev_dev: subdev hardware device > > * @subdev_bitmap: used to record hardware is ready or not > > */ > > @@ -497,6 +504,8 @@ struct mtk_vcodec_dev { > > unsigned int dec_capability; > > unsigned int enc_capability; > > > > + struct vdec_msg_queue_ctx msg_queue_core_ctx; > > + > > void *subdev_dev[MTK_VDEC_HW_MAX]; > > DECLARE_BITMAP(subdev_bitmap, MTK_VDEC_HW_MAX); > > }; > > diff --git a/drivers/media/platform/mtk-vcodec/vdec_msg_queue.c > > b/drivers/media/platform/mtk-vcodec/vdec_msg_queue.c > > new file mode 100644 > > index 000000000000..da4d114f7ad0 > > --- /dev/null > > +++ b/drivers/media/platform/mtk-vcodec/vdec_msg_queue.c > > @@ -0,0 +1,257 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Copyright (c) 2021 MediaTek Inc. > > + * Author: Yunfei Dong > > + */ > > + > > +#include > > +#include > > +#include > > + > > +#include "mtk_vcodec_dec_pm.h" > > +#include "mtk_vcodec_drv.h" > > +#include "vdec_msg_queue.h" > > + > > +/* the size used to store lat slice header information */ > > +#define VDEC_LAT_SLICE_HEADER_SZ (640 * SZ_1K) > > + > > +/* the size used to store avc error information */ > > +#define VDEC_ERR_MAP_SZ_AVC (17 * SZ_1K) > > + > > +/* core will read the trans buffer which decoded by lat to decode > > again. > > + * The trans buffer size of FHD and 4K bitstreams are different. > > + */ > > +static int vde_msg_queue_get_trans_size(int width, int height) > > +{ > > + if (width > 1920 || height > 1088) > > + return 30 * SZ_1M; > > + else > > + return 6 * SZ_1M; > > +} > > + > > +void vdec_msg_queue_init_ctx(struct vdec_msg_queue_ctx *ctx, > > + int hardware_index) > > +{ > > + init_waitqueue_head(&ctx->ready_to_use); > > + INIT_LIST_HEAD(&ctx->ready_queue); > > + spin_lock_init(&ctx->ready_lock); > > + ctx->ready_num = 0; > > + ctx->hardware_index = hardware_index; > > +} > > + > > +static struct list_head *vdec_get_buf_list(int hardware_index, > > + struct vdec_lat_buf *buf) > > +{ > > + switch (hardware_index) { > > + case MTK_VDEC_CORE: > > + return &buf->core_list; > > + case MTK_VDEC_LAT0: > > + return &buf->lat_list; > > + default: > > + return NULL; > > + } > > +} > > + > > +void vdec_msg_queue_qbuf(struct vdec_msg_queue_ctx *msg_ctx, > > + struct vdec_lat_buf *buf) > > This function can fail: it has to return an integer value. > > > +{ > > + struct list_head *head; > > + > > + head = vdec_get_buf_list(msg_ctx->hardware_index, buf); > > + if (!head) { > > + mtk_v4l2_err("fail to qbuf: %d",msg_ctx- > > >hardware_index); > > + return; > > + } > > + > > + spin_lock(&msg_ctx->ready_lock); > > + list_add_tail(head, &msg_ctx->ready_queue); > > + msg_ctx->ready_num++; > > + > > + if (msg_ctx->hardware_index != MTK_VDEC_CORE) > > + wake_up_all(&msg_ctx->ready_to_use); > > + > > + mtk_v4l2_debug(3, "enqueue buf type: %d addr: 0x%p num: %d", > > + msg_ctx->hardware_index, buf, msg_ctx->ready_num); > > + spin_unlock(&msg_ctx->ready_lock); > > +} > > + > > +static bool vdec_msg_queue_wait_event(struct vdec_msg_queue_ctx > > *msg_ctx) > > +{ > > + int ret; > > + > > + ret = wait_event_timeout(msg_ctx->ready_to_use, > > + !list_empty(&msg_ctx->ready_queue), > > + msecs_to_jiffies(1500)); > > At the beginning of this file: > #define VDEC_MSG_QUEUE_TIMEOUT_MS 1500 > Fix in patch v12. > ...then: > ret = wait_event_timeout(msg_ctx->ready_to_use, > > !list_empty(&msg_ctx->ready_queue), > > msecs_to_jiffies(VDEC_MSG_QUEUE_TIMEOU > T_MS)); > > > > + if (!ret) > > + return false; > > + > > + return true; > > +} > > + > > +struct vdec_lat_buf *vdec_msg_queue_dqbuf(struct > > vdec_msg_queue_ctx *msg_ctx) > > +{ > > + struct vdec_lat_buf *buf; > > + struct list_head *head; > > + int ret; > > + > > + spin_lock(&msg_ctx->ready_lock); > > + if (list_empty(&msg_ctx->ready_queue)) { > > + mtk_v4l2_debug(3, "queue is NULL, type:%d num: %d", > > + msg_ctx->hardware_index, msg_ctx->ready_num); > > + spin_unlock(&msg_ctx->ready_lock); > > + > > + if (msg_ctx->hardware_index == MTK_VDEC_CORE) > > + return NULL; > > + > > + ret = vdec_msg_queue_wait_event(msg_ctx); > > + if (!ret) > > + return NULL; > > + spin_lock(&msg_ctx->ready_lock); > > + } > > + > > + if (msg_ctx->hardware_index == MTK_VDEC_CORE) > > + buf = list_first_entry(&msg_ctx->ready_queue, > > + struct vdec_lat_buf, core_list); > > + else > > + buf = list_first_entry(&msg_ctx->ready_queue, > > + struct vdec_lat_buf, lat_list); > > + > > + head = vdec_get_buf_list(msg_ctx->hardware_index, buf); > > + if (!head) { > > + spin_unlock(&msg_ctx->ready_lock); > > + mtk_v4l2_err("fail to dqbuf: %d",msg_ctx- > > >hardware_index); > > + return NULL; > > + } > > + list_del(head); > > + > > + msg_ctx->ready_num--; > > + mtk_v4l2_debug(3, "dqueue buf type:%d addr: 0x%p num: %d", > > + msg_ctx->hardware_index, buf, msg_ctx->ready_num); > > + spin_unlock(&msg_ctx->ready_lock); > > + > > + return buf; > > +} > > + > > +void vdec_msg_queue_update_ube_rptr(struct vdec_msg_queue > > *msg_queue, > > + uint64_t ube_rptr) > > +{ > > + spin_lock(&msg_queue->lat_ctx.ready_lock); > > + msg_queue->wdma_rptr_addr = ube_rptr; > > + mtk_v4l2_debug(3, "update ube rprt (0x%llx)", ube_rptr); > > + spin_unlock(&msg_queue->lat_ctx.ready_lock); > > +} > > + > > +void vdec_msg_queue_update_ube_wptr(struct vdec_msg_queue > > *msg_queue, > > + uint64_t ube_wptr) > > +{ > > + spin_lock(&msg_queue->lat_ctx.ready_lock); > > + msg_queue->wdma_wptr_addr = ube_wptr; > > + mtk_v4l2_debug(3, "update ube wprt: (0x%llx 0x%llx) offset: > > 0x%llx", > > + msg_queue->wdma_rptr_addr, msg_queue->wdma_wptr_addr, > > ube_wptr); > > + spin_unlock(&msg_queue->lat_ctx.ready_lock); > > +} > > + > > +bool vdec_msg_queue_wait_lat_buf_full(struct vdec_msg_queue > > *msg_queue) > > +{ > > + long timeout_jiff; > > + int ret; > > + > > + timeout_jiff = msecs_to_jiffies(1000 * (NUM_BUFFER_COUNT + 2)); > > + ret = wait_event_timeout(msg_queue->lat_ctx.ready_to_use, > > + msg_queue->lat_ctx.ready_num == NUM_BUFFER_COUNT, > > + timeout_jiff); > > + if (ret) { > > + mtk_v4l2_debug(3, "success to get lat buf: %d", > > + msg_queue->lat_ctx.ready_num); > > + return true; > > + } > > + mtk_v4l2_err("failed with lat buf isn't full: %d", > > + msg_queue->lat_ctx.ready_num); > > + return false; > > +} > > + > > +void vdec_msg_queue_deinit( > > + struct vdec_msg_queue *msg_queue, > > + struct mtk_vcodec_ctx *ctx) > > +{ > > + struct vdec_lat_buf *lat_buf; > > + struct mtk_vcodec_mem *mem; > > + int i; > > + > > + mem = &msg_queue->wdma_addr; > > + if (mem->va) > > + mtk_vcodec_mem_free(ctx, mem); > > + for (i = 0; i < NUM_BUFFER_COUNT; i++) { > > + lat_buf = &msg_queue->lat_buf[i]; > > + > > + mem = &lat_buf->wdma_err_addr; > > + if (mem->va) > > + mtk_vcodec_mem_free(ctx, mem); > > + > > + mem = &lat_buf->slice_bc_addr; > > + if (mem->va) > > + mtk_vcodec_mem_free(ctx, mem); > > + > > + if (lat_buf->private_data) > > + kfree(lat_buf->private_data); > > + } > > +} > > + > > +int vdec_msg_queue_init( > > + struct vdec_msg_queue *msg_queue, > > + struct mtk_vcodec_ctx *ctx, > > + core_decode_cb_t core_decode, > > + int private_size) > > +{ > > + struct vdec_lat_buf *lat_buf; > > + int i, err; > > + > > + /* already init msg queue */ > > + if (msg_queue->wdma_addr.size) > > + return 0; > > + > > + vdec_msg_queue_init_ctx(&msg_queue->lat_ctx, MTK_VDEC_LAT0); > > + msg_queue->wdma_addr.size = vde_msg_queue_get_trans_size( > > + ctx->picinfo.buf_w, ctx->picinfo.buf_h); > > + > > + err = mtk_vcodec_mem_alloc(ctx, &msg_queue->wdma_addr); > > + if (err) { > > + mtk_v4l2_err("failed to allocate wdma_addr buf"); > > + return -ENOMEM; > > + } > > + msg_queue->wdma_rptr_addr = msg_queue->wdma_addr.dma_addr; > > + msg_queue->wdma_wptr_addr = msg_queue->wdma_addr.dma_addr; > > + > > + for (i = 0; i < NUM_BUFFER_COUNT; i++) { > > + lat_buf = &msg_queue->lat_buf[i]; > > + > > + lat_buf->wdma_err_addr.size = VDEC_ERR_MAP_SZ_AVC; > > + err = mtk_vcodec_mem_alloc(ctx, &lat_buf- > > >wdma_err_addr); > > + if (err) { > > + mtk_v4l2_err("failed to allocate wdma_err_addr > > buf[%d]", i); > > + goto mem_alloc_err; > > + } > > + > > + lat_buf->slice_bc_addr.size = VDEC_LAT_SLICE_HEADER_SZ; > > + err = mtk_vcodec_mem_alloc(ctx, &lat_buf- > > >slice_bc_addr); > > + if (err) { > > + mtk_v4l2_err("failed to allocate wdma_addr > > buf[%d]", i); > > + goto mem_alloc_err; > > + } > > + > > + lat_buf->private_data = kzalloc(private_size, > > GFP_KERNEL); > > + if (!lat_buf->private_data) { > > + mtk_v4l2_err("failed to allocate > > private_data[%d]", i); > > + goto mem_alloc_err; > > + } > > + > > + lat_buf->ctx = ctx; > > + lat_buf->core_decode = core_decode; > > + vdec_msg_queue_qbuf(&msg_queue->lat_ctx, lat_buf); > > If this function fails, there will be no buffer. In case of failure, > you should > take the appropriate action here, instead of going on with an invalid > buffer. > Add return value, Fix in patch v12. > > + } > > + return 0; > > + > > +mem_alloc_err: > > + vdec_msg_queue_deinit(msg_queue, ctx); > > + return -ENOMEM; > > +} > > diff --git a/drivers/media/platform/mtk-vcodec/vdec_msg_queue.h > > b/drivers/media/platform/mtk-vcodec/vdec_msg_queue.h > > new file mode 100644 > > index 000000000000..91a315ba0cba > > --- /dev/null > > +++ b/drivers/media/platform/mtk-vcodec/vdec_msg_queue.h > > @@ -0,0 +1,148 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Copyright (c) 2021 MediaTek Inc. > > + * Author: Yunfei Dong > > + */ > > + > > +#ifndef _VDEC_MSG_QUEUE_H_ > > +#define _VDEC_MSG_QUEUE_H_ > > + > > +#include > > +#include > > +#include > > +#include > > + > > +#include "mtk_vcodec_util.h" > > + > > +#define NUM_BUFFER_COUNT 3 > > + > > +struct vdec_lat_buf; > > +struct mtk_vcodec_ctx; > > +struct mtk_vcodec_dev; > > +typedef int (*core_decode_cb_t)(struct vdec_lat_buf *lat_buf); > > + > > +/** > > + * struct vdec_msg_queue_ctx - represents a queue for buffers > > ready to be processed > > + * @ready_used: ready used queue used to signalize when get a job > > queue > > + * @ready_queue: list of ready lat buffer queues > > + * @ready_lock: spin lock to protect the lat buffer usage > > + * @ready_num: number of buffers ready to be processed > > + * @hardware_index: hardware id that this queue is used for > > + */ > > +struct vdec_msg_queue_ctx { > > + wait_queue_head_t ready_to_use; > > + struct list_head ready_queue; > > + spinlock_t ready_lock; > > + int ready_num; > > + int hardware_index; > > +}; > > + > > +/** > > + * struct vdec_lat_buf - lat buffer message used to store lat info > > for core decode > > + * @wdma_err_addr: wdma error address used for lat hardware > > + * @slice_bc_addr: slice bc address used for lat hardware > > + * @ts_info: need to set timestamp from output to capture > > + * > > + * @private_data: shared information used to lat and core hardware > > + * @ctx: mtk vcodec context information > > + * @core_decode: different codec use different decode callback > > function > > + * @lat_list: add lat buffer to lat head list > > + * @core_list: add lat buffer to core head list > > + */ > > +struct vdec_lat_buf { > > + struct mtk_vcodec_mem wdma_err_addr; > > + struct mtk_vcodec_mem slice_bc_addr; > > + struct vb2_v4l2_buffer ts_info; > > + > > + void *private_data; > > + struct mtk_vcodec_ctx *ctx; > > + core_decode_cb_t core_decode; > > + struct list_head lat_list; > > + struct list_head core_list; > > +}; > > + > > +/** > > + * struct vdec_msg_queue - used to store lat buffer message > > + * @lat_buf: lat buffer used to store lat buffer information > > + * @wdma_addr: wdma address used for ube > > + * @wdma_rptr_addr: ube read point > > + * @wdma_wptr_addr: ube write point > > + * @lat_ctx: used to store lat buffer list > > + */ > > +struct vdec_msg_queue { > > + struct vdec_lat_buf lat_buf[NUM_BUFFER_COUNT]; > > + > > + struct mtk_vcodec_mem wdma_addr; > > + uint64_t wdma_rptr_addr; > > + uint64_t wdma_wptr_addr; > > + > > + struct vdec_msg_queue_ctx lat_ctx; > > +}; > > + > > +/** > > + * vdec_msg_queue_init - init lat buffer information. > > + * @msg_queue: used to store the lat buffer information > > + * @ctx: v4l2 ctx > > + * @core_decode: core decode callback for each codec > > + * @private_size: the private data size used to share with core > > + */ > > +int vdec_msg_queue_init( > > + struct vdec_msg_queue *msg_queue, > > + struct mtk_vcodec_ctx *ctx, > > + core_decode_cb_t core_decode, > > + int private_size); > > + > > int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue, > struct mtk_vcodec_ctx *ctx, > > core_decode_cb_t core_decode, int > private_size); > > > +/** > > + * vdec_msg_queue_init_ctx - used to init msg queue context > > information. > > + * @ctx: message queue context > > + * @hardware_index: hardware index > > + */ > > +void vdec_msg_queue_init_ctx(struct vdec_msg_queue_ctx *ctx, > > + int hardware_index); > > Don't break this line; even 90 columns is fine... > > > + > > +/** > > + * vdec_msg_queue_qbuf - enqueue lat buffer to queue list. > > + * @ctx: message queue context > > + * @buf: current lat buffer > > + */ > > +void vdec_msg_queue_qbuf(struct vdec_msg_queue_ctx *ctx, > > + struct vdec_lat_buf *buf); > > Same here. > > > + > > +/** > > + * vdec_msg_queue_dqbuf - dequeue lat buffer from queue list. > > + * @ctx: message queue context > > + */ > > +struct vdec_lat_buf *vdec_msg_queue_dqbuf(struct > > vdec_msg_queue_ctx *ctx); > > + > > +/** > > + * vdec_msg_queue_update_ube_rptr - used to updata the ube read > > point. > > + * @msg_queue: used to store the lat buffer information > > + * @ube_rptr: current ube read point > > + */ > > +void vdec_msg_queue_update_ube_rptr(struct vdec_msg_queue > > *msg_queue, > > + uint64_t ube_rptr); > > ... and again ... > Fix in patch v12. > > + > > +/** > > + * vdec_msg_queue_update_ube_wptr - used to updata the ube write > > point. > > + * @msg_queue: used to store the lat buffer information > > + * @ube_wptr: current ube write point > > + */ > > +void vdec_msg_queue_update_ube_wptr(struct vdec_msg_queue > > *msg_queue, > > + uint64_t ube_wptr); > > ... and again ... > > > + > > +/** > > + * vdec_msg_queue_wait_lat_buf_full - used to check whether all > > lat buffer > > + * in lat list. > > + * @msg_queue: used to store the lat buffer information > > + */ > > +bool vdec_msg_queue_wait_lat_buf_full(struct vdec_msg_queue > > *msg_queue); > > + > > +/** > > + * vdec_msg_queue_deinit - deinit lat buffer information. > > + * @msg_queue: used to store the lat buffer information > > + * @ctx: v4l2 ctx > > + */ > > +void vdec_msg_queue_deinit(struct vdec_msg_queue *msg_queue, > > + struct mtk_vcodec_ctx *ctx); > > ... and again. > > > + > > +#endif > > > Best Regards, Yunfei Dong > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel