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 X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DF1F0C2D0E7 for ; Wed, 25 Mar 2020 23:13:58 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 870E920737 for ; Wed, 25 Mar 2020 23:13:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="mJRqTPBz" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727580AbgCYXN5 (ORCPT ); Wed, 25 Mar 2020 19:13:57 -0400 Received: from mailgw01.mediatek.com ([216.200.240.184]:56392 "EHLO mailgw01.mediatek.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727389AbgCYXN5 (ORCPT ); Wed, 25 Mar 2020 19:13:57 -0400 X-Greylist: delayed 301 seconds by postgrey-1.27 at vger.kernel.org; Wed, 25 Mar 2020 19:13:56 EDT X-UUID: b439e49a007d41b4b341523e08f872ec-20200325 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=Dbph2QdkGB9v/7fOd6SwtLCWAnmMbcWZXZeUDFh9xKk=; b=mJRqTPBzSr0POGeLpIbQnO8Kx0ymGxNtgscZeRFpJKm/043i2s5Np03n1IW3Hwj2IvxGz9Cj9smoBtZZaLH9JCAorDOxb4Ya8BNZwqq0pQd0KGgpMOnIFSZbKrtSB3IopFdtNo7ucaijy9zpsd2RpXaGRSQoQ6nglBCX7Zqjbx4=; X-UUID: b439e49a007d41b4b341523e08f872ec-20200325 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 829830410; Wed, 25 Mar 2020 15:08:49 -0800 Received: from mtkcas09.mediatek.inc (172.21.101.178) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 25 Mar 2020 16:05:35 -0700 Received: from [172.21.77.4] (172.21.77.4) by mtkcas09.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Thu, 26 Mar 2020 07:05:32 +0800 Message-ID: <1585177534.26117.4.camel@mtksdaap41> Subject: Re: [PATCH v12 4/5] soc / drm: mediatek: Move routing control to mmsys device From: CK Hu To: Matthias Brugger CC: Enric Balletbo i Serra , , , , , , , , , "Allison Randal" , Matthias Brugger , , , , , , Greg Kroah-Hartman , Kate Stewart , , Thomas Gleixner , Weiyi Lu , Seiya Wang , Andrew-CT Chen , , , Daniel Vetter , , , "Minghsiu Tsai" , , , Mauro Carvalho Chehab , Collabora Kernel ML , Houlong Wei , , mtk01761 , Richard Fontana Date: Thu, 26 Mar 2020 07:05:34 +0800 In-Reply-To: <02290a21-7392-a2cf-576c-215091ec05e8@suse.com> References: <20200311165322.1594233-1-enric.balletbo@collabora.com> <20200311165322.1594233-5-enric.balletbo@collabora.com> <02290a21-7392-a2cf-576c-215091ec05e8@suse.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N Content-Transfer-Encoding: base64 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SGksIE1hdHRoaWFzOg0KDQpPbiBXZWQsIDIwMjAtMDMtMjUgYXQgMTc6MTYgKzAxMDAsIE1hdHRo aWFzIEJydWdnZXIgd3JvdGU6DQo+IA0KPiBPbiAxMS8wMy8yMDIwIDE3OjUzLCBFbnJpYyBCYWxs ZXRibyBpIFNlcnJhIHdyb3RlOg0KPiA+IFByb3ZpZGUgYSBtdGtfbW1zeXNfZGRwX2Nvbm5lY3Qo KSBhbmQgbXRrX21tc3lzX2Rpc2Nvbm5lY3QoKSBmdW5jdGlvbnMgdG8NCj4gPiByZXBsYWNlIG10 a19kZHBfYWRkX2NvbXBfdG9fcGF0aCgpIGFuZCBtdGtfZGRwX3JlbW92ZV9jb21wX2Zyb21fcGF0 aCgpLg0KPiA+IFRob3NlIGZ1bmN0aW9ucyB3aWxsIGFsbG93IERSTSBkcml2ZXIgYW5kIG90aGVy cyB0byBjb250cm9sIHRoZSBkYXRhDQo+ID4gcGF0aCByb3V0aW5nLg0KPiA+IA0KPiA+IFNpZ25l ZC1vZmYtYnk6IEVucmljIEJhbGxldGJvIGkgU2VycmEgPGVucmljLmJhbGxldGJvQGNvbGxhYm9y YS5jb20+DQo+ID4gUmV2aWV3ZWQtYnk6IE1hdHRoaWFzIEJydWdnZXIgPG1hdHRoaWFzLmJnZ0Bn bWFpbC5jb20+DQo+ID4gUmV2aWV3ZWQtYnk6IENLIEh1IDxjay5odUBtZWRpYXRlay5jb20+DQo+ ID4gQWNrZWQtYnk6IENLIEh1IDxjay5odUBtZWRpYXRlay5jb20+DQo+IA0KPiBUaGlzIHBhdGNo IGRvZXMgbm90IGFwcGx5IGFnYWluc3QgdjUuNi1yYzEuDQo+IFBsZWFzZSByZWJhc2UgYXMgdGhp cyBpcyBhIHF1aXRlIGJpZyBwYXRjaCBhbmQgaXQgd29uJ3QgYmUgZWFzeSB0byBkbyB0aGF0IGJ5 IGhhbmQuDQoNCkkgdGhpbmsgdGhpcyBwYXRjaCBkZXBlbmRzIG9uIFsxXSB3aGljaCBoYXMgYmVl biBhY2tlZCBieSBtZSBhbmQgSSBoYXZlDQpub3QgcGlja2VkIGl0LiBUaGUgc2ltcGxlIHdheSBp cyB0aGF0IHlvdSBwaWNrIFsxXSBmaXJzdCBhbmQgdGhlbiBwaWNrDQp0aGlzIHNlcmllcy4NCg0K WzFdIA0KaHR0cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wYXRjaC8xMTQwNjIyNy8NCg0KUmVn YXJkcywNCkNLDQoNCj4gDQo+IFJlZ2FyZHMsDQo+IE1hdHRoaWFzDQo+IA0KPiA+IC0tLQ0KPiA+ IA0KPiA+IENoYW5nZXMgaW4gdjEyOiBOb25lDQo+ID4gQ2hhbmdlcyBpbiB2MTA6DQo+ID4gLSBT ZWxlY3QgQ09ORklHX01US19NTVNZUyAoQ0spDQo+ID4gLSBQYXNzIGRldmljZSBwb2ludGVyIG9m IG1tc3lzIGRldmljZSBpbnN0ZWFkIG9mIGNvbmZpZyByZWdzIChDSykNCj4gPiANCj4gPiBDaGFu Z2VzIGluIHY5Og0KPiA+IC0gSW50cm9kdWNlZCBhIG5ldyBwYXRjaCB0byBtb3ZlIHJvdXRpbmcg Y29udHJvbCBpbnRvIG1tc3lzIGRyaXZlci4NCj4gPiAtIFJlbW92ZWQgdGhlIHBhdGNoIHRvIHVz ZSByZWdtYXAgYXMgaXMgbm90IG5lZWRlZCBhbnltb3JlLg0KPiA+IA0KPiA+IENoYW5nZXMgaW4g djg6IE5vbmUNCj4gPiBDaGFuZ2VzIGluIHY3OiBOb25lDQo+ID4gDQo+ID4gIGRyaXZlcnMvZ3B1 L2RybS9tZWRpYXRlay9LY29uZmlnICAgICAgICB8ICAgMSArDQo+ID4gIGRyaXZlcnMvZ3B1L2Ry bS9tZWRpYXRlay9tdGtfZHJtX2NydGMuYyB8ICAxOSArLQ0KPiA+ICBkcml2ZXJzL2dwdS9kcm0v bWVkaWF0ZWsvbXRrX2RybV9kZHAuYyAgfCAyNTYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiA+ ICBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kZHAuaCAgfCAgIDcgLQ0KPiA+ICBk cml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kcnYuYyAgfCAgMTQgKy0NCj4gPiAgZHJp dmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZHJ2LmggIHwgICAyICstDQo+ID4gIGRyaXZl cnMvc29jL21lZGlhdGVrL210ay1tbXN5cy5jICAgICAgICB8IDI3OSArKysrKysrKysrKysrKysr KysrKysrKysNCj4gPiAgaW5jbHVkZS9saW51eC9zb2MvbWVkaWF0ZWsvbXRrLW1tc3lzLmggIHwg IDIwICsrDQo+ID4gIDggZmlsZXMgY2hhbmdlZCwgMzE2IGluc2VydGlvbnMoKyksIDI4MiBkZWxl dGlvbnMoLSkNCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvbGludXgvc29jL21lZGlh dGVrL210ay1tbXN5cy5oDQo+ID4gDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9t ZWRpYXRlay9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL0tjb25maWcNCj4gPiBp bmRleCBmYTVmZmM0ZmU4MjMuLmM0MjBmNWEzZDMzYiAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJz L2dwdS9kcm0vbWVkaWF0ZWsvS2NvbmZpZw0KPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRp YXRlay9LY29uZmlnDQo+ID4gQEAgLTExLDYgKzExLDcgQEAgY29uZmlnIERSTV9NRURJQVRFSw0K PiA+ICAJc2VsZWN0IERSTV9NSVBJX0RTSQ0KPiA+ICAJc2VsZWN0IERSTV9QQU5FTA0KPiA+ICAJ c2VsZWN0IE1FTU9SWQ0KPiA+ICsJc2VsZWN0IE1US19NTVNZUw0KPiA+ICAJc2VsZWN0IE1US19T TUkNCj4gPiAgCXNlbGVjdCBWSURFT01PREVfSEVMUEVSUw0KPiA+ICAJaGVscA0KPiA+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9jcnRjLmMgYi9kcml2ZXJz L2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9jcnRjLmMNCj4gPiBpbmRleCAwZTA1NjgzZDdiNTMu LjU3OWE1YTVkNDQ3MiAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsv bXRrX2RybV9jcnRjLmMNCj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2Ry bV9jcnRjLmMNCj4gPiBAQCAtNiw2ICs2LDcgQEANCj4gPiAgI2luY2x1ZGUgPGxpbnV4L2Nsay5o Pg0KPiA+ICAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPg0KPiA+ICAjaW5jbHVkZSA8bGlu dXgvc29jL21lZGlhdGVrL210ay1jbWRxLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9zb2MvbWVk aWF0ZWsvbXRrLW1tc3lzLmg+DQo+ID4gIA0KPiA+ICAjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4N Cj4gPiAgI2luY2x1ZGUgPHNvYy9tZWRpYXRlay9zbWkuaD4NCj4gPiBAQCAtMjgsNyArMjksNyBA QA0KPiA+ICAgKiBAZW5hYmxlZDogcmVjb3JkcyB3aGV0aGVyIGNydGNfZW5hYmxlIHN1Y2NlZWRl ZA0KPiA+ICAgKiBAcGxhbmVzOiBhcnJheSBvZiA0IGRybV9wbGFuZSBzdHJ1Y3R1cmVzLCBvbmUg Zm9yIGVhY2ggb3ZlcmxheSBwbGFuZQ0KPiA+ICAgKiBAcGVuZGluZ19wbGFuZXM6IHdoZXRoZXIg YW55IHBsYW5lIGhhcyBwZW5kaW5nIGNoYW5nZXMgdG8gYmUgYXBwbGllZA0KPiA+IC0gKiBAY29u ZmlnX3JlZ3M6IG1lbW9yeSBtYXBwZWQgbW1zeXMgY29uZmlndXJhdGlvbiByZWdpc3RlciBzcGFj ZQ0KPiA+ICsgKiBAbW1zeXNfZGV2OiBwb2ludGVyIHRvIHRoZSBtbXN5cyBkZXZpY2UgZm9yIGNv bmZpZ3VyYXRpb24gcmVnaXN0ZXJzDQo+ID4gICAqIEBtdXRleDogaGFuZGxlIHRvIG9uZSBvZiB0 aGUgdGVuIGRpc3BfbXV0ZXggc3RyZWFtcw0KPiA+ICAgKiBAZGRwX2NvbXBfbnI6IG51bWJlciBv ZiBjb21wb25lbnRzIGluIGRkcF9jb21wDQo+ID4gICAqIEBkZHBfY29tcDogYXJyYXkgb2YgcG9p bnRlcnMgdGhlIG10a19kZHBfY29tcCBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhpcyBjcnRjDQo+ID4g QEAgLTUwLDcgKzUxLDcgQEAgc3RydWN0IG10a19kcm1fY3J0YyB7DQo+ID4gIAl1MzIJCQkJY21k cV9ldmVudDsNCj4gPiAgI2VuZGlmDQo+ID4gIA0KPiA+IC0Jdm9pZCBfX2lvbWVtCQkJKmNvbmZp Z19yZWdzOw0KPiA+ICsJc3RydWN0IGRldmljZQkJCSptbXN5c19kZXY7DQo+ID4gIAlzdHJ1Y3Qg bXRrX2Rpc3BfbXV0ZXgJCSptdXRleDsNCj4gPiAgCXVuc2lnbmVkIGludAkJCWRkcF9jb21wX25y Ow0KPiA+ICAJc3RydWN0IG10a19kZHBfY29tcAkJKipkZHBfY29tcDsNCj4gPiBAQCAtMjk2LDkg KzI5Nyw5IEBAIHN0YXRpYyBpbnQgbXRrX2NydGNfZGRwX2h3X2luaXQoc3RydWN0IG10a19kcm1f Y3J0YyAqbXRrX2NydGMpDQo+ID4gIAl9DQo+ID4gIA0KPiA+ICAJZm9yIChpID0gMDsgaSA8IG10 a19jcnRjLT5kZHBfY29tcF9uciAtIDE7IGkrKykgew0KPiA+IC0JCW10a19kZHBfYWRkX2NvbXBf dG9fcGF0aChtdGtfY3J0Yy0+Y29uZmlnX3JlZ3MsDQo+ID4gLQkJCQkJIG10a19jcnRjLT5kZHBf Y29tcFtpXS0+aWQsDQo+ID4gLQkJCQkJIG10a19jcnRjLT5kZHBfY29tcFtpICsgMV0tPmlkKTsN Cj4gPiArCQltdGtfbW1zeXNfZGRwX2Nvbm5lY3QobXRrX2NydGMtPm1tc3lzX2RldiwNCj4gPiAr CQkJCSAgICAgIG10a19jcnRjLT5kZHBfY29tcFtpXS0+aWQsDQo+ID4gKwkJCQkgICAgICBtdGtf Y3J0Yy0+ZGRwX2NvbXBbaSArIDFdLT5pZCk7DQo+ID4gIAkJbXRrX2Rpc3BfbXV0ZXhfYWRkX2Nv bXAobXRrX2NydGMtPm11dGV4LA0KPiA+ICAJCQkJCW10a19jcnRjLT5kZHBfY29tcFtpXS0+aWQp Ow0KPiA+ICAJfQ0KPiA+IEBAIC0zNTUsOSArMzU2LDkgQEAgc3RhdGljIHZvaWQgbXRrX2NydGNf ZGRwX2h3X2Zpbmkoc3RydWN0IG10a19kcm1fY3J0YyAqbXRrX2NydGMpDQo+ID4gIAkJCQkJICAg bXRrX2NydGMtPmRkcF9jb21wW2ldLT5pZCk7DQo+ID4gIAltdGtfZGlzcF9tdXRleF9kaXNhYmxl KG10a19jcnRjLT5tdXRleCk7DQo+ID4gIAlmb3IgKGkgPSAwOyBpIDwgbXRrX2NydGMtPmRkcF9j b21wX25yIC0gMTsgaSsrKSB7DQo+ID4gLQkJbXRrX2RkcF9yZW1vdmVfY29tcF9mcm9tX3BhdGgo bXRrX2NydGMtPmNvbmZpZ19yZWdzLA0KPiA+IC0JCQkJCSAgICAgIG10a19jcnRjLT5kZHBfY29t cFtpXS0+aWQsDQo+ID4gLQkJCQkJICAgICAgbXRrX2NydGMtPmRkcF9jb21wW2kgKyAxXS0+aWQp Ow0KPiA+ICsJCW10a19tbXN5c19kZHBfZGlzY29ubmVjdChtdGtfY3J0Yy0+bW1zeXNfZGV2LA0K PiA+ICsJCQkJCSBtdGtfY3J0Yy0+ZGRwX2NvbXBbaV0tPmlkLA0KPiA+ICsJCQkJCSBtdGtfY3J0 Yy0+ZGRwX2NvbXBbaSArIDFdLT5pZCk7DQo+ID4gIAkJbXRrX2Rpc3BfbXV0ZXhfcmVtb3ZlX2Nv bXAobXRrX2NydGMtPm11dGV4LA0KPiA+ICAJCQkJCSAgIG10a19jcnRjLT5kZHBfY29tcFtpXS0+ aWQpOw0KPiA+ICAJfQ0KPiA+IEBAIC03NjEsNyArNzYyLDcgQEAgaW50IG10a19kcm1fY3J0Y19j cmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYsDQo+ID4gIAlpZiAoIW10a19jcnRjKQ0K PiA+ICAJCXJldHVybiAtRU5PTUVNOw0KPiA+ICANCj4gPiAtCW10a19jcnRjLT5jb25maWdfcmVn cyA9IHByaXYtPmNvbmZpZ19yZWdzOw0KPiA+ICsJbXRrX2NydGMtPm1tc3lzX2RldiA9IHByaXYt Pm1tc3lzX2RldjsNCj4gPiAgCW10a19jcnRjLT5kZHBfY29tcF9uciA9IHBhdGhfbGVuOw0KPiA+ ICAJbXRrX2NydGMtPmRkcF9jb21wID0gZGV2bV9rbWFsbG9jX2FycmF5KGRldiwgbXRrX2NydGMt PmRkcF9jb21wX25yLA0KPiA+ICAJCQkJCQlzaXplb2YoKm10a19jcnRjLT5kZHBfY29tcCksDQo+ ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2RkcC5jIGIv ZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZGRwLmMNCj4gPiBpbmRleCBiODg1ZjYw ZjQ3NGMuLjAxNGMxYmJlMWRmMiAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWVk aWF0ZWsvbXRrX2RybV9kZHAuYw0KPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9t dGtfZHJtX2RkcC5jDQo+ID4gQEAgLTEzLDI2ICsxMyw2IEBADQo+ID4gICNpbmNsdWRlICJtdGtf ZHJtX2RkcC5oIg0KPiA+ICAjaW5jbHVkZSAibXRrX2RybV9kZHBfY29tcC5oIg0KPiA+ICANCj4g PiAtI2RlZmluZSBESVNQX1JFR19DT05GSUdfRElTUF9PVkwwX01PVVRfRU4JMHgwNDANCj4gPiAt I2RlZmluZSBESVNQX1JFR19DT05GSUdfRElTUF9PVkwxX01PVVRfRU4JMHgwNDQNCj4gPiAtI2Rl ZmluZSBESVNQX1JFR19DT05GSUdfRElTUF9PRF9NT1VUX0VOCQkweDA0OA0KPiA+IC0jZGVmaW5l IERJU1BfUkVHX0NPTkZJR19ESVNQX0dBTU1BX01PVVRfRU4JMHgwNGMNCj4gPiAtI2RlZmluZSBE SVNQX1JFR19DT05GSUdfRElTUF9VRk9FX01PVVRfRU4JMHgwNTANCj4gPiAtI2RlZmluZSBESVNQ X1JFR19DT05GSUdfRElTUF9DT0xPUjBfU0VMX0lOCTB4MDg0DQo+ID4gLSNkZWZpbmUgRElTUF9S RUdfQ09ORklHX0RJU1BfQ09MT1IxX1NFTF9JTgkweDA4OA0KPiA+IC0jZGVmaW5lIERJU1BfUkVH X0NPTkZJR19EU0lFX1NFTF9JTgkJMHgwYTQNCj4gPiAtI2RlZmluZSBESVNQX1JFR19DT05GSUdf RFNJT19TRUxfSU4JCTB4MGE4DQo+ID4gLSNkZWZpbmUgRElTUF9SRUdfQ09ORklHX0RQSV9TRUxf SU4JCTB4MGFjDQo+ID4gLSNkZWZpbmUgRElTUF9SRUdfQ09ORklHX0RJU1BfUkRNQTJfU09VVAkJ MHgwYjgNCj4gPiAtI2RlZmluZSBESVNQX1JFR19DT05GSUdfRElTUF9SRE1BMF9TT1VUX0VOCTB4 MGM0DQo+ID4gLSNkZWZpbmUgRElTUF9SRUdfQ09ORklHX0RJU1BfUkRNQTFfU09VVF9FTgkweDBj OA0KPiA+IC0jZGVmaW5lIERJU1BfUkVHX0NPTkZJR19NTVNZU19DR19DT04wCQkweDEwMA0KPiA+ IC0NCj4gPiAtI2RlZmluZSBESVNQX1JFR19DT05GSUdfRElTUF9PVkxfTU9VVF9FTgkweDAzMA0K PiA+IC0jZGVmaW5lIERJU1BfUkVHX0NPTkZJR19PVVRfU0VMCQkJMHgwNGMNCj4gPiAtI2RlZmlu ZSBESVNQX1JFR19DT05GSUdfRFNJX1NFTAkJCTB4MDUwDQo+ID4gLSNkZWZpbmUgRElTUF9SRUdf Q09ORklHX0RQSV9TRUwJCQkweDA2NA0KPiA+IC0NCj4gPiAgI2RlZmluZSBNVDI3MDFfRElTUF9N VVRFWDBfTU9EMAkJCTB4MmMNCj4gPiAgI2RlZmluZSBNVDI3MDFfRElTUF9NVVRFWDBfU09GMAkJ CTB4MzANCj4gPiAgDQo+ID4gQEAgLTk0LDQ4ICs3NCw2IEBADQo+ID4gICNkZWZpbmUgTVVURVhf U09GX0RTSTIJCQk1DQo+ID4gICNkZWZpbmUgTVVURVhfU09GX0RTSTMJCQk2DQo+ID4gIA0KPiA+ IC0jZGVmaW5lIE9WTDBfTU9VVF9FTl9DT0xPUjAJCTB4MQ0KPiA+IC0jZGVmaW5lIE9EX01PVVRf RU5fUkRNQTAJCTB4MQ0KPiA+IC0jZGVmaW5lIE9EMV9NT1VUX0VOX1JETUExCQlCSVQoMTYpDQo+ ID4gLSNkZWZpbmUgVUZPRV9NT1VUX0VOX0RTSTAJCTB4MQ0KPiA+IC0jZGVmaW5lIENPTE9SMF9T RUxfSU5fT1ZMMAkJMHgxDQo+ID4gLSNkZWZpbmUgT1ZMMV9NT1VUX0VOX0NPTE9SMQkJMHgxDQo+ ID4gLSNkZWZpbmUgR0FNTUFfTU9VVF9FTl9SRE1BMQkJMHgxDQo+ID4gLSNkZWZpbmUgUkRNQTBf U09VVF9EUEkwCQkJMHgyDQo+ID4gLSNkZWZpbmUgUkRNQTBfU09VVF9EUEkxCQkJMHgzDQo+ID4g LSNkZWZpbmUgUkRNQTBfU09VVF9EU0kxCQkJMHgxDQo+ID4gLSNkZWZpbmUgUkRNQTBfU09VVF9E U0kyCQkJMHg0DQo+ID4gLSNkZWZpbmUgUkRNQTBfU09VVF9EU0kzCQkJMHg1DQo+ID4gLSNkZWZp bmUgUkRNQTFfU09VVF9EUEkwCQkJMHgyDQo+ID4gLSNkZWZpbmUgUkRNQTFfU09VVF9EUEkxCQkJ MHgzDQo+ID4gLSNkZWZpbmUgUkRNQTFfU09VVF9EU0kxCQkJMHgxDQo+ID4gLSNkZWZpbmUgUkRN QTFfU09VVF9EU0kyCQkJMHg0DQo+ID4gLSNkZWZpbmUgUkRNQTFfU09VVF9EU0kzCQkJMHg1DQo+ ID4gLSNkZWZpbmUgUkRNQTJfU09VVF9EUEkwCQkJMHgyDQo+ID4gLSNkZWZpbmUgUkRNQTJfU09V VF9EUEkxCQkJMHgzDQo+ID4gLSNkZWZpbmUgUkRNQTJfU09VVF9EU0kxCQkJMHgxDQo+ID4gLSNk ZWZpbmUgUkRNQTJfU09VVF9EU0kyCQkJMHg0DQo+ID4gLSNkZWZpbmUgUkRNQTJfU09VVF9EU0kz CQkJMHg1DQo+ID4gLSNkZWZpbmUgRFBJMF9TRUxfSU5fUkRNQTEJCTB4MQ0KPiA+IC0jZGVmaW5l IERQSTBfU0VMX0lOX1JETUEyCQkweDMNCj4gPiAtI2RlZmluZSBEUEkxX1NFTF9JTl9SRE1BMQkJ KDB4MSA8PCA4KQ0KPiA+IC0jZGVmaW5lIERQSTFfU0VMX0lOX1JETUEyCQkoMHgzIDw8IDgpDQo+ ID4gLSNkZWZpbmUgRFNJMF9TRUxfSU5fUkRNQTEJCTB4MQ0KPiA+IC0jZGVmaW5lIERTSTBfU0VM X0lOX1JETUEyCQkweDQNCj4gPiAtI2RlZmluZSBEU0kxX1NFTF9JTl9SRE1BMQkJMHgxDQo+ID4g LSNkZWZpbmUgRFNJMV9TRUxfSU5fUkRNQTIJCTB4NA0KPiA+IC0jZGVmaW5lIERTSTJfU0VMX0lO X1JETUExCQkoMHgxIDw8IDE2KQ0KPiA+IC0jZGVmaW5lIERTSTJfU0VMX0lOX1JETUEyCQkoMHg0 IDw8IDE2KQ0KPiA+IC0jZGVmaW5lIERTSTNfU0VMX0lOX1JETUExCQkoMHgxIDw8IDE2KQ0KPiA+ IC0jZGVmaW5lIERTSTNfU0VMX0lOX1JETUEyCQkoMHg0IDw8IDE2KQ0KPiA+IC0jZGVmaW5lIENP TE9SMV9TRUxfSU5fT1ZMMQkJMHgxDQo+ID4gLQ0KPiA+IC0jZGVmaW5lIE9WTF9NT1VUX0VOX1JE TUEJCTB4MQ0KPiA+IC0jZGVmaW5lIEJMU19UT19EU0lfUkRNQTFfVE9fRFBJMQkweDgNCj4gPiAt I2RlZmluZSBCTFNfVE9fRFBJX1JETUExX1RPX0RTSQkJMHgyDQo+ID4gLSNkZWZpbmUgRFNJX1NF TF9JTl9CTFMJCQkweDANCj4gPiAtI2RlZmluZSBEUElfU0VMX0lOX0JMUwkJCTB4MA0KPiA+IC0j ZGVmaW5lIERTSV9TRUxfSU5fUkRNQQkJCTB4MQ0KPiA+ICANCj4gPiAgc3RydWN0IG10a19kaXNw X211dGV4IHsNCj4gPiAgCWludCBpZDsNCj4gPiBAQCAtMjQ2LDIwMCArMTg0LDYgQEAgc3RhdGlj IGNvbnN0IHN0cnVjdCBtdGtfZGRwX2RhdGEgbXQ4MTczX2RkcF9kcml2ZXJfZGF0YSA9IHsNCj4g PiAgCS5tdXRleF9zb2ZfcmVnID0gTVQyNzAxX0RJU1BfTVVURVgwX1NPRjAsDQo+ID4gIH07DQo+ ID4gIA0KPiA+IC1zdGF0aWMgdW5zaWduZWQgaW50IG10a19kZHBfbW91dF9lbihlbnVtIG10a19k ZHBfY29tcF9pZCBjdXIsDQo+ID4gLQkJCQkgICAgZW51bSBtdGtfZGRwX2NvbXBfaWQgbmV4dCwN Cj4gPiAtCQkJCSAgICB1bnNpZ25lZCBpbnQgKmFkZHIpDQo+ID4gLXsNCj4gPiAtCXVuc2lnbmVk IGludCB2YWx1ZTsNCj4gPiAtDQo+ID4gLQlpZiAoY3VyID09IEREUF9DT01QT05FTlRfT1ZMMCAm JiBuZXh0ID09IEREUF9DT01QT05FTlRfQ09MT1IwKSB7DQo+ID4gLQkJKmFkZHIgPSBESVNQX1JF R19DT05GSUdfRElTUF9PVkwwX01PVVRfRU47DQo+ID4gLQkJdmFsdWUgPSBPVkwwX01PVVRfRU5f Q09MT1IwOw0KPiA+IC0JfSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9PVkwwICYmIG5l eHQgPT0gRERQX0NPTVBPTkVOVF9SRE1BMCkgew0KPiA+IC0JCSphZGRyID0gRElTUF9SRUdfQ09O RklHX0RJU1BfT1ZMX01PVVRfRU47DQo+ID4gLQkJdmFsdWUgPSBPVkxfTU9VVF9FTl9SRE1BOw0K PiA+IC0JfSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9PRDAgJiYgbmV4dCA9PSBERFBf Q09NUE9ORU5UX1JETUEwKSB7DQo+ID4gLQkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRElTUF9P RF9NT1VUX0VOOw0KPiA+IC0JCXZhbHVlID0gT0RfTU9VVF9FTl9SRE1BMDsNCj4gPiAtCX0gZWxz ZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRfVUZPRSAmJiBuZXh0ID09IEREUF9DT01QT05FTlRf RFNJMCkgew0KPiA+IC0JCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RJU1BfVUZPRV9NT1VUX0VO Ow0KPiA+IC0JCXZhbHVlID0gVUZPRV9NT1VUX0VOX0RTSTA7DQo+ID4gLQl9IGVsc2UgaWYgKGN1 ciA9PSBERFBfQ09NUE9ORU5UX09WTDEgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0NPTE9SMSkg ew0KPiA+IC0JCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RJU1BfT1ZMMV9NT1VUX0VOOw0KPiA+ IC0JCXZhbHVlID0gT1ZMMV9NT1VUX0VOX0NPTE9SMTsNCj4gPiAtCX0gZWxzZSBpZiAoY3VyID09 IEREUF9DT01QT05FTlRfR0FNTUEgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX1JETUExKSB7DQo+ ID4gLQkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRElTUF9HQU1NQV9NT1VUX0VOOw0KPiA+IC0J CXZhbHVlID0gR0FNTUFfTU9VVF9FTl9SRE1BMTsNCj4gPiAtCX0gZWxzZSBpZiAoY3VyID09IERE UF9DT01QT05FTlRfT0QxICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9SRE1BMSkgew0KPiA+IC0J CSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RJU1BfT0RfTU9VVF9FTjsNCj4gPiAtCQl2YWx1ZSA9 IE9EMV9NT1VUX0VOX1JETUExOw0KPiA+IC0JfSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVO VF9SRE1BMCAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfRFBJMCkgew0KPiA+IC0JCSphZGRyID0g RElTUF9SRUdfQ09ORklHX0RJU1BfUkRNQTBfU09VVF9FTjsNCj4gPiAtCQl2YWx1ZSA9IFJETUEw X1NPVVRfRFBJMDsNCj4gPiAtCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRfUkRNQTAg JiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0RQSTEpIHsNCj4gPiAtCQkqYWRkciA9IERJU1BfUkVH X0NPTkZJR19ESVNQX1JETUEwX1NPVVRfRU47DQo+ID4gLQkJdmFsdWUgPSBSRE1BMF9TT1VUX0RQ STE7DQo+ID4gLQl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX1JETUEwICYmIG5leHQg PT0gRERQX0NPTVBPTkVOVF9EU0kxKSB7DQo+ID4gLQkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdf RElTUF9SRE1BMF9TT1VUX0VOOw0KPiA+IC0JCXZhbHVlID0gUkRNQTBfU09VVF9EU0kxOw0KPiA+ IC0JfSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9SRE1BMCAmJiBuZXh0ID09IEREUF9D T01QT05FTlRfRFNJMikgew0KPiA+IC0JCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RJU1BfUkRN QTBfU09VVF9FTjsNCj4gPiAtCQl2YWx1ZSA9IFJETUEwX1NPVVRfRFNJMjsNCj4gPiAtCX0gZWxz ZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRfUkRNQTAgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5U X0RTSTMpIHsNCj4gPiAtCQkqYWRkciA9IERJU1BfUkVHX0NPTkZJR19ESVNQX1JETUEwX1NPVVRf RU47DQo+ID4gLQkJdmFsdWUgPSBSRE1BMF9TT1VUX0RTSTM7DQo+ID4gLQl9IGVsc2UgaWYgKGN1 ciA9PSBERFBfQ09NUE9ORU5UX1JETUExICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9EU0kxKSB7 DQo+ID4gLQkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRElTUF9SRE1BMV9TT1VUX0VOOw0KPiA+ IC0JCXZhbHVlID0gUkRNQTFfU09VVF9EU0kxOw0KPiA+IC0JfSBlbHNlIGlmIChjdXIgPT0gRERQ X0NPTVBPTkVOVF9SRE1BMSAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfRFNJMikgew0KPiA+IC0J CSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RJU1BfUkRNQTFfU09VVF9FTjsNCj4gPiAtCQl2YWx1 ZSA9IFJETUExX1NPVVRfRFNJMjsNCj4gPiAtCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05F TlRfUkRNQTEgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0RTSTMpIHsNCj4gPiAtCQkqYWRkciA9 IERJU1BfUkVHX0NPTkZJR19ESVNQX1JETUExX1NPVVRfRU47DQo+ID4gLQkJdmFsdWUgPSBSRE1B MV9TT1VUX0RTSTM7DQo+ID4gLQl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX1JETUEx ICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9EUEkwKSB7DQo+ID4gLQkJKmFkZHIgPSBESVNQX1JF R19DT05GSUdfRElTUF9SRE1BMV9TT1VUX0VOOw0KPiA+IC0JCXZhbHVlID0gUkRNQTFfU09VVF9E UEkwOw0KPiA+IC0JfSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9SRE1BMSAmJiBuZXh0 ID09IEREUF9DT01QT05FTlRfRFBJMSkgew0KPiA+IC0JCSphZGRyID0gRElTUF9SRUdfQ09ORklH X0RJU1BfUkRNQTFfU09VVF9FTjsNCj4gPiAtCQl2YWx1ZSA9IFJETUExX1NPVVRfRFBJMTsNCj4g PiAtCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRfUkRNQTIgJiYgbmV4dCA9PSBERFBf Q09NUE9ORU5UX0RQSTApIHsNCj4gPiAtCQkqYWRkciA9IERJU1BfUkVHX0NPTkZJR19ESVNQX1JE TUEyX1NPVVQ7DQo+ID4gLQkJdmFsdWUgPSBSRE1BMl9TT1VUX0RQSTA7DQo+ID4gLQl9IGVsc2Ug aWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX1JETUEyICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9E UEkxKSB7DQo+ID4gLQkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRElTUF9SRE1BMl9TT1VUOw0K PiA+IC0JCXZhbHVlID0gUkRNQTJfU09VVF9EUEkxOw0KPiA+IC0JfSBlbHNlIGlmIChjdXIgPT0g RERQX0NPTVBPTkVOVF9SRE1BMiAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfRFNJMSkgew0KPiA+ IC0JCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RJU1BfUkRNQTJfU09VVDsNCj4gPiAtCQl2YWx1 ZSA9IFJETUEyX1NPVVRfRFNJMTsNCj4gPiAtCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05F TlRfUkRNQTIgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0RTSTIpIHsNCj4gPiAtCQkqYWRkciA9 IERJU1BfUkVHX0NPTkZJR19ESVNQX1JETUEyX1NPVVQ7DQo+ID4gLQkJdmFsdWUgPSBSRE1BMl9T T1VUX0RTSTI7DQo+ID4gLQl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX1JETUEyICYm IG5leHQgPT0gRERQX0NPTVBPTkVOVF9EU0kzKSB7DQo+ID4gLQkJKmFkZHIgPSBESVNQX1JFR19D T05GSUdfRElTUF9SRE1BMl9TT1VUOw0KPiA+IC0JCXZhbHVlID0gUkRNQTJfU09VVF9EU0kzOw0K PiA+IC0JfSBlbHNlIHsNCj4gPiAtCQl2YWx1ZSA9IDA7DQo+ID4gLQl9DQo+ID4gLQ0KPiA+IC0J cmV0dXJuIHZhbHVlOw0KPiA+IC19DQo+ID4gLQ0KPiA+IC1zdGF0aWMgdW5zaWduZWQgaW50IG10 a19kZHBfc2VsX2luKGVudW0gbXRrX2RkcF9jb21wX2lkIGN1ciwNCj4gPiAtCQkJCSAgIGVudW0g bXRrX2RkcF9jb21wX2lkIG5leHQsDQo+ID4gLQkJCQkgICB1bnNpZ25lZCBpbnQgKmFkZHIpDQo+ ID4gLXsNCj4gPiAtCXVuc2lnbmVkIGludCB2YWx1ZTsNCj4gPiAtDQo+ID4gLQlpZiAoY3VyID09 IEREUF9DT01QT05FTlRfT1ZMMCAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfQ09MT1IwKSB7DQo+ ID4gLQkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRElTUF9DT0xPUjBfU0VMX0lOOw0KPiA+IC0J CXZhbHVlID0gQ09MT1IwX1NFTF9JTl9PVkwwOw0KPiA+IC0JfSBlbHNlIGlmIChjdXIgPT0gRERQ X0NPTVBPTkVOVF9SRE1BMSAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfRFBJMCkgew0KPiA+IC0J CSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RQSV9TRUxfSU47DQo+ID4gLQkJdmFsdWUgPSBEUEkw X1NFTF9JTl9SRE1BMTsNCj4gPiAtCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRfUkRN QTEgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0RQSTEpIHsNCj4gPiAtCQkqYWRkciA9IERJU1Bf UkVHX0NPTkZJR19EUElfU0VMX0lOOw0KPiA+IC0JCXZhbHVlID0gRFBJMV9TRUxfSU5fUkRNQTE7 DQo+ID4gLQl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX1JETUExICYmIG5leHQgPT0g RERQX0NPTVBPTkVOVF9EU0kwKSB7DQo+ID4gLQkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRFNJ RV9TRUxfSU47DQo+ID4gLQkJdmFsdWUgPSBEU0kwX1NFTF9JTl9SRE1BMTsNCj4gPiAtCX0gZWxz ZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRfUkRNQTEgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5U X0RTSTEpIHsNCj4gPiAtCQkqYWRkciA9IERJU1BfUkVHX0NPTkZJR19EU0lPX1NFTF9JTjsNCj4g PiAtCQl2YWx1ZSA9IERTSTFfU0VMX0lOX1JETUExOw0KPiA+IC0JfSBlbHNlIGlmIChjdXIgPT0g RERQX0NPTVBPTkVOVF9SRE1BMSAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfRFNJMikgew0KPiA+ IC0JCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RTSUVfU0VMX0lOOw0KPiA+IC0JCXZhbHVlID0g RFNJMl9TRUxfSU5fUkRNQTE7DQo+ID4gLQl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5U X1JETUExICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9EU0kzKSB7DQo+ID4gLQkJKmFkZHIgPSBE SVNQX1JFR19DT05GSUdfRFNJT19TRUxfSU47DQo+ID4gLQkJdmFsdWUgPSBEU0kzX1NFTF9JTl9S RE1BMTsNCj4gPiAtCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRfUkRNQTIgJiYgbmV4 dCA9PSBERFBfQ09NUE9ORU5UX0RQSTApIHsNCj4gPiAtCQkqYWRkciA9IERJU1BfUkVHX0NPTkZJ R19EUElfU0VMX0lOOw0KPiA+IC0JCXZhbHVlID0gRFBJMF9TRUxfSU5fUkRNQTI7DQo+ID4gLQl9 IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX1JETUEyICYmIG5leHQgPT0gRERQX0NPTVBP TkVOVF9EUEkxKSB7DQo+ID4gLQkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRFBJX1NFTF9JTjsN Cj4gPiAtCQl2YWx1ZSA9IERQSTFfU0VMX0lOX1JETUEyOw0KPiA+IC0JfSBlbHNlIGlmIChjdXIg PT0gRERQX0NPTVBPTkVOVF9SRE1BMiAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfRFNJMCkgew0K PiA+IC0JCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RTSUVfU0VMX0lOOw0KPiA+IC0JCXZhbHVl ID0gRFNJMF9TRUxfSU5fUkRNQTI7DQo+ID4gLQl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9O RU5UX1JETUEyICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9EU0kxKSB7DQo+ID4gLQkJKmFkZHIg PSBESVNQX1JFR19DT05GSUdfRFNJT19TRUxfSU47DQo+ID4gLQkJdmFsdWUgPSBEU0kxX1NFTF9J Tl9SRE1BMjsNCj4gPiAtCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRfUkRNQTIgJiYg bmV4dCA9PSBERFBfQ09NUE9ORU5UX0RTSTIpIHsNCj4gPiAtCQkqYWRkciA9IERJU1BfUkVHX0NP TkZJR19EU0lFX1NFTF9JTjsNCj4gPiAtCQl2YWx1ZSA9IERTSTJfU0VMX0lOX1JETUEyOw0KPiA+ IC0JfSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9SRE1BMiAmJiBuZXh0ID09IEREUF9D T01QT05FTlRfRFNJMykgew0KPiA+IC0JCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RTSUVfU0VM X0lOOw0KPiA+IC0JCXZhbHVlID0gRFNJM19TRUxfSU5fUkRNQTI7DQo+ID4gLQl9IGVsc2UgaWYg KGN1ciA9PSBERFBfQ09NUE9ORU5UX09WTDEgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0NPTE9S MSkgew0KPiA+IC0JCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RJU1BfQ09MT1IxX1NFTF9JTjsN Cj4gPiAtCQl2YWx1ZSA9IENPTE9SMV9TRUxfSU5fT1ZMMTsNCj4gPiAtCX0gZWxzZSBpZiAoY3Vy ID09IEREUF9DT01QT05FTlRfQkxTICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9EU0kwKSB7DQo+ ID4gLQkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRFNJX1NFTDsNCj4gPiAtCQl2YWx1ZSA9IERT SV9TRUxfSU5fQkxTOw0KPiA+IC0JfSBlbHNlIHsNCj4gPiAtCQl2YWx1ZSA9IDA7DQo+ID4gLQl9 DQo+ID4gLQ0KPiA+IC0JcmV0dXJuIHZhbHVlOw0KPiA+IC19DQo+ID4gLQ0KPiA+IC1zdGF0aWMg dm9pZCBtdGtfZGRwX3NvdXRfc2VsKHZvaWQgX19pb21lbSAqY29uZmlnX3JlZ3MsDQo+ID4gLQkJ CSAgICAgZW51bSBtdGtfZGRwX2NvbXBfaWQgY3VyLA0KPiA+IC0JCQkgICAgIGVudW0gbXRrX2Rk cF9jb21wX2lkIG5leHQpDQo+ID4gLXsNCj4gPiAtCWlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9C TFMgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0RTSTApIHsNCj4gPiAtCQl3cml0ZWxfcmVsYXhl ZChCTFNfVE9fRFNJX1JETUExX1RPX0RQSTEsDQo+ID4gLQkJCSAgICAgICBjb25maWdfcmVncyAr IERJU1BfUkVHX0NPTkZJR19PVVRfU0VMKTsNCj4gPiAtCX0gZWxzZSBpZiAoY3VyID09IEREUF9D T01QT05FTlRfQkxTICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9EUEkwKSB7DQo+ID4gLQkJd3Jp dGVsX3JlbGF4ZWQoQkxTX1RPX0RQSV9SRE1BMV9UT19EU0ksDQo+ID4gLQkJCSAgICAgICBjb25m aWdfcmVncyArIERJU1BfUkVHX0NPTkZJR19PVVRfU0VMKTsNCj4gPiAtCQl3cml0ZWxfcmVsYXhl ZChEU0lfU0VMX0lOX1JETUEsDQo+ID4gLQkJCSAgICAgICBjb25maWdfcmVncyArIERJU1BfUkVH X0NPTkZJR19EU0lfU0VMKTsNCj4gPiAtCQl3cml0ZWxfcmVsYXhlZChEUElfU0VMX0lOX0JMUywN Cj4gPiAtCQkJICAgICAgIGNvbmZpZ19yZWdzICsgRElTUF9SRUdfQ09ORklHX0RQSV9TRUwpOw0K PiA+IC0JfQ0KPiA+IC19DQo+ID4gLQ0KPiA+IC12b2lkIG10a19kZHBfYWRkX2NvbXBfdG9fcGF0 aCh2b2lkIF9faW9tZW0gKmNvbmZpZ19yZWdzLA0KPiA+IC0JCQkgICAgICBlbnVtIG10a19kZHBf Y29tcF9pZCBjdXIsDQo+ID4gLQkJCSAgICAgIGVudW0gbXRrX2RkcF9jb21wX2lkIG5leHQpDQo+ ID4gLXsNCj4gPiAtCXVuc2lnbmVkIGludCBhZGRyLCB2YWx1ZSwgcmVnOw0KPiA+IC0NCj4gPiAt CXZhbHVlID0gbXRrX2RkcF9tb3V0X2VuKGN1ciwgbmV4dCwgJmFkZHIpOw0KPiA+IC0JaWYgKHZh bHVlKSB7DQo+ID4gLQkJcmVnID0gcmVhZGxfcmVsYXhlZChjb25maWdfcmVncyArIGFkZHIpIHwg dmFsdWU7DQo+ID4gLQkJd3JpdGVsX3JlbGF4ZWQocmVnLCBjb25maWdfcmVncyArIGFkZHIpOw0K PiA+IC0JfQ0KPiA+IC0NCj4gPiAtCW10a19kZHBfc291dF9zZWwoY29uZmlnX3JlZ3MsIGN1ciwg bmV4dCk7DQo+ID4gLQ0KPiA+IC0JdmFsdWUgPSBtdGtfZGRwX3NlbF9pbihjdXIsIG5leHQsICZh ZGRyKTsNCj4gPiAtCWlmICh2YWx1ZSkgew0KPiA+IC0JCXJlZyA9IHJlYWRsX3JlbGF4ZWQoY29u ZmlnX3JlZ3MgKyBhZGRyKSB8IHZhbHVlOw0KPiA+IC0JCXdyaXRlbF9yZWxheGVkKHJlZywgY29u ZmlnX3JlZ3MgKyBhZGRyKTsNCj4gPiAtCX0NCj4gPiAtfQ0KPiA+IC0NCj4gPiAtdm9pZCBtdGtf ZGRwX3JlbW92ZV9jb21wX2Zyb21fcGF0aCh2b2lkIF9faW9tZW0gKmNvbmZpZ19yZWdzLA0KPiA+ IC0JCQkJICAgZW51bSBtdGtfZGRwX2NvbXBfaWQgY3VyLA0KPiA+IC0JCQkJICAgZW51bSBtdGtf ZGRwX2NvbXBfaWQgbmV4dCkNCj4gPiAtew0KPiA+IC0JdW5zaWduZWQgaW50IGFkZHIsIHZhbHVl LCByZWc7DQo+ID4gLQ0KPiA+IC0JdmFsdWUgPSBtdGtfZGRwX21vdXRfZW4oY3VyLCBuZXh0LCAm YWRkcik7DQo+ID4gLQlpZiAodmFsdWUpIHsNCj4gPiAtCQlyZWcgPSByZWFkbF9yZWxheGVkKGNv bmZpZ19yZWdzICsgYWRkcikgJiB+dmFsdWU7DQo+ID4gLQkJd3JpdGVsX3JlbGF4ZWQocmVnLCBj b25maWdfcmVncyArIGFkZHIpOw0KPiA+IC0JfQ0KPiA+IC0NCj4gPiAtCXZhbHVlID0gbXRrX2Rk cF9zZWxfaW4oY3VyLCBuZXh0LCAmYWRkcik7DQo+ID4gLQlpZiAodmFsdWUpIHsNCj4gPiAtCQly ZWcgPSByZWFkbF9yZWxheGVkKGNvbmZpZ19yZWdzICsgYWRkcikgJiB+dmFsdWU7DQo+ID4gLQkJ d3JpdGVsX3JlbGF4ZWQocmVnLCBjb25maWdfcmVncyArIGFkZHIpOw0KPiA+IC0JfQ0KPiA+IC19 DQo+ID4gLQ0KPiA+ICBzdHJ1Y3QgbXRrX2Rpc3BfbXV0ZXggKm10a19kaXNwX211dGV4X2dldChz dHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpZCkNCj4gPiAgew0KPiA+ICAJc3RydWN0 IG10a19kZHAgKmRkcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOw0KPiA+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kZHAuaCBiL2RyaXZlcnMvZ3B1L2RybS9t ZWRpYXRlay9tdGtfZHJtX2RkcC5oDQo+ID4gaW5kZXggODI3YmU0MjRhMTQ4Li42YjY5MWE1N2Jl NGEgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZGRw LmgNCj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kZHAuaA0KPiA+ IEBAIC0xMiwxMyArMTIsNiBAQCBzdHJ1Y3QgcmVnbWFwOw0KPiA+ICBzdHJ1Y3QgZGV2aWNlOw0K PiA+ICBzdHJ1Y3QgbXRrX2Rpc3BfbXV0ZXg7DQo+ID4gIA0KPiA+IC12b2lkIG10a19kZHBfYWRk X2NvbXBfdG9fcGF0aCh2b2lkIF9faW9tZW0gKmNvbmZpZ19yZWdzLA0KPiA+IC0JCQkgICAgICBl bnVtIG10a19kZHBfY29tcF9pZCBjdXIsDQo+ID4gLQkJCSAgICAgIGVudW0gbXRrX2RkcF9jb21w X2lkIG5leHQpOw0KPiA+IC12b2lkIG10a19kZHBfcmVtb3ZlX2NvbXBfZnJvbV9wYXRoKHZvaWQg X19pb21lbSAqY29uZmlnX3JlZ3MsDQo+ID4gLQkJCQkgICBlbnVtIG10a19kZHBfY29tcF9pZCBj dXIsDQo+ID4gLQkJCQkgICBlbnVtIG10a19kZHBfY29tcF9pZCBuZXh0KTsNCj4gPiAtDQo+ID4g IHN0cnVjdCBtdGtfZGlzcF9tdXRleCAqbXRrX2Rpc3BfbXV0ZXhfZ2V0KHN0cnVjdCBkZXZpY2Ug KmRldiwgdW5zaWduZWQgaW50IGlkKTsNCj4gPiAgaW50IG10a19kaXNwX211dGV4X3ByZXBhcmUo c3RydWN0IG10a19kaXNwX211dGV4ICptdXRleCk7DQo+ID4gIHZvaWQgbXRrX2Rpc3BfbXV0ZXhf YWRkX2NvbXAoc3RydWN0IG10a19kaXNwX211dGV4ICptdXRleCwNCj4gPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0v bWVkaWF0ZWsvbXRrX2RybV9kcnYuYw0KPiA+IGluZGV4IDhlMmQzY2I2MmFkNS4uMjA4ZjljNTI1 NmVmIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2Ry di5jDQo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZHJ2LmMNCj4g PiBAQCAtMTAsNiArMTAsNyBAQA0KPiA+ICAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPg0K PiA+ICAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4NCj4gPiAgI2luY2x1ZGUgPGxpbnV4 L3BtX3J1bnRpbWUuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L3NvYy9tZWRpYXRlay9tdGstbW1z eXMuaD4NCj4gPiAgI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+DQo+ID4gIA0KPiA+ICAj aW5jbHVkZSA8ZHJtL2RybV9hdG9taWMuaD4NCj4gPiBAQCAtNDI1LDcgKzQyNiw2IEBAIHN0YXRp YyBpbnQgbXRrX2RybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQ0KPiA+ICB7 DQo+ID4gIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Ow0KPiA+ICAJc3RydWN0IG10 a19kcm1fcHJpdmF0ZSAqcHJpdmF0ZTsNCj4gPiAtCXN0cnVjdCByZXNvdXJjZSAqbWVtOw0KPiA+ ICAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOw0KPiA+ICAJc3RydWN0IGNvbXBvbmVudF9tYXRj aCAqbWF0Y2ggPSBOVUxMOw0KPiA+ICAJaW50IHJldDsNCj4gPiBAQCAtNDM2LDE0ICs0MzYsMTAg QEAgc3RhdGljIGludCBtdGtfZHJtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYp DQo+ID4gIAkJcmV0dXJuIC1FTk9NRU07DQo+ID4gIA0KPiA+ICAJcHJpdmF0ZS0+ZGF0YSA9IG9m X2RldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYpOw0KPiA+IC0NCj4gPiAtCW1lbSA9IHBsYXRmb3Jt X2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7DQo+ID4gLQlwcml2YXRlLT5j b25maWdfcmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIG1lbSk7DQo+ID4gLQlpZiAo SVNfRVJSKHByaXZhdGUtPmNvbmZpZ19yZWdzKSkgew0KPiA+IC0JCXJldCA9IFBUUl9FUlIocHJp dmF0ZS0+Y29uZmlnX3JlZ3MpOw0KPiA+IC0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGlvcmVt YXAgbW1zeXMtY29uZmlnIHJlc291cmNlOiAlZFxuIiwNCj4gPiAtCQkJcmV0KTsNCj4gPiAtCQly ZXR1cm4gcmV0Ow0KPiA+ICsJcHJpdmF0ZS0+bW1zeXNfZGV2ID0gZGV2LT5wYXJlbnQ7DQo+ID4g KwlpZiAoIXByaXZhdGUtPm1tc3lzX2Rldikgew0KPiA+ICsJCWRldl9lcnIoZGV2LCAiRmFpbGVk IHRvIGdldCBNTVNZUyBkZXZpY2VcbiIpOw0KPiA+ICsJCXJldHVybiAtRU5PREVWOw0KPiA+ICAJ fQ0KPiA+ICANCj4gPiAgCS8qIEl0ZXJhdGUgb3ZlciBzaWJsaW5nIERJU1AgZnVuY3Rpb24gYmxv Y2tzICovDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJt X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZHJ2LmgNCj4gPiBpbmRl eCAxN2JjOTliOWY1ZDQuLmI1YmU2M2U1MzE3NiAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kcnYuaA0KPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9t ZWRpYXRlay9tdGtfZHJtX2Rydi5oDQo+ID4gQEAgLTM5LDcgKzM5LDcgQEAgc3RydWN0IG10a19k cm1fcHJpdmF0ZSB7DQo+ID4gIA0KPiA+ICAJc3RydWN0IGRldmljZV9ub2RlICptdXRleF9ub2Rl Ow0KPiA+ICAJc3RydWN0IGRldmljZSAqbXV0ZXhfZGV2Ow0KPiA+IC0Jdm9pZCBfX2lvbWVtICpj b25maWdfcmVnczsNCj4gPiArCXN0cnVjdCBkZXZpY2UgKm1tc3lzX2RldjsNCj4gPiAgCXN0cnVj dCBkZXZpY2Vfbm9kZSAqY29tcF9ub2RlW0REUF9DT01QT05FTlRfSURfTUFYXTsNCj4gPiAgCXN0 cnVjdCBtdGtfZGRwX2NvbXAgKmRkcF9jb21wW0REUF9DT01QT05FTlRfSURfTUFYXTsNCj4gPiAg CWNvbnN0IHN0cnVjdCBtdGtfbW1zeXNfZHJpdmVyX2RhdGEgKmRhdGE7DQo+ID4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvc29jL21lZGlhdGVrL210ay1tbXN5cy5jIGIvZHJpdmVycy9zb2MvbWVkaWF0 ZWsvbXRrLW1tc3lzLmMNCj4gPiBpbmRleCBkYmRmZWRkMzAyZmEuLjRiMjg2YjUyNWNkMyAxMDA2 NDQNCj4gPiAtLS0gYS9kcml2ZXJzL3NvYy9tZWRpYXRlay9tdGstbW1zeXMuYw0KPiA+ICsrKyBi L2RyaXZlcnMvc29jL21lZGlhdGVrL210ay1tbXN5cy5jDQo+ID4gQEAgLTUsOCArNSw3NiBAQA0K PiA+ICAgKi8NCj4gPiAgDQo+ID4gICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4NCj4g PiArI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPg0KPiA+ICAjaW5jbHVkZSA8bGludXgvb2ZfZGV2 aWNlLmg+DQo+ID4gICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4NCj4gPiArI2lu Y2x1ZGUgPGxpbnV4L3NvYy9tZWRpYXRlay9tdGstbW1zeXMuaD4NCj4gPiArDQo+ID4gKyNpbmNs dWRlICIuLi8uLi9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZGRwLmgiDQo+ID4gKyNpbmNsdWRl ICIuLi8uLi9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZGRwX2NvbXAuaCINCj4gPiArDQo+ID4g KyNkZWZpbmUgRElTUF9SRUdfQ09ORklHX0RJU1BfT1ZMMF9NT1VUX0VOCTB4MDQwDQo+ID4gKyNk ZWZpbmUgRElTUF9SRUdfQ09ORklHX0RJU1BfT1ZMMV9NT1VUX0VOCTB4MDQ0DQo+ID4gKyNkZWZp bmUgRElTUF9SRUdfQ09ORklHX0RJU1BfT0RfTU9VVF9FTgkJMHgwNDgNCj4gPiArI2RlZmluZSBE SVNQX1JFR19DT05GSUdfRElTUF9HQU1NQV9NT1VUX0VOCTB4MDRjDQo+ID4gKyNkZWZpbmUgRElT UF9SRUdfQ09ORklHX0RJU1BfVUZPRV9NT1VUX0VOCTB4MDUwDQo+ID4gKyNkZWZpbmUgRElTUF9S RUdfQ09ORklHX0RJU1BfQ09MT1IwX1NFTF9JTgkweDA4NA0KPiA+ICsjZGVmaW5lIERJU1BfUkVH X0NPTkZJR19ESVNQX0NPTE9SMV9TRUxfSU4JMHgwODgNCj4gPiArI2RlZmluZSBESVNQX1JFR19D T05GSUdfRFNJRV9TRUxfSU4JCTB4MGE0DQo+ID4gKyNkZWZpbmUgRElTUF9SRUdfQ09ORklHX0RT SU9fU0VMX0lOCQkweDBhOA0KPiA+ICsjZGVmaW5lIERJU1BfUkVHX0NPTkZJR19EUElfU0VMX0lO CQkweDBhYw0KPiA+ICsjZGVmaW5lIERJU1BfUkVHX0NPTkZJR19ESVNQX1JETUEyX1NPVVQJCTB4 MGI4DQo+ID4gKyNkZWZpbmUgRElTUF9SRUdfQ09ORklHX0RJU1BfUkRNQTBfU09VVF9FTgkweDBj NA0KPiA+ICsjZGVmaW5lIERJU1BfUkVHX0NPTkZJR19ESVNQX1JETUExX1NPVVRfRU4JMHgwYzgN Cj4gPiArI2RlZmluZSBESVNQX1JFR19DT05GSUdfTU1TWVNfQ0dfQ09OMAkJMHgxMDANCj4gPiAr DQo+ID4gKyNkZWZpbmUgRElTUF9SRUdfQ09ORklHX0RJU1BfT1ZMX01PVVRfRU4JMHgwMzANCj4g PiArI2RlZmluZSBESVNQX1JFR19DT05GSUdfT1VUX1NFTAkJCTB4MDRjDQo+ID4gKyNkZWZpbmUg RElTUF9SRUdfQ09ORklHX0RTSV9TRUwJCQkweDA1MA0KPiA+ICsjZGVmaW5lIERJU1BfUkVHX0NP TkZJR19EUElfU0VMCQkJMHgwNjQNCj4gPiArDQo+ID4gKyNkZWZpbmUgT1ZMMF9NT1VUX0VOX0NP TE9SMAkJCTB4MQ0KPiA+ICsjZGVmaW5lIE9EX01PVVRfRU5fUkRNQTAJCQkweDENCj4gPiArI2Rl ZmluZSBPRDFfTU9VVF9FTl9SRE1BMQkJCUJJVCgxNikNCj4gPiArI2RlZmluZSBVRk9FX01PVVRf RU5fRFNJMAkJCTB4MQ0KPiA+ICsjZGVmaW5lIENPTE9SMF9TRUxfSU5fT1ZMMAkJCTB4MQ0KPiA+ ICsjZGVmaW5lIE9WTDFfTU9VVF9FTl9DT0xPUjEJCQkweDENCj4gPiArI2RlZmluZSBHQU1NQV9N T1VUX0VOX1JETUExCQkJMHgxDQo+ID4gKyNkZWZpbmUgUkRNQTBfU09VVF9EUEkwCQkJCTB4Mg0K PiA+ICsjZGVmaW5lIFJETUEwX1NPVVRfRFBJMQkJCQkweDMNCj4gPiArI2RlZmluZSBSRE1BMF9T T1VUX0RTSTEJCQkJMHgxDQo+ID4gKyNkZWZpbmUgUkRNQTBfU09VVF9EU0kyCQkJCTB4NA0KPiA+ ICsjZGVmaW5lIFJETUEwX1NPVVRfRFNJMwkJCQkweDUNCj4gPiArI2RlZmluZSBSRE1BMV9TT1VU X0RQSTAJCQkJMHgyDQo+ID4gKyNkZWZpbmUgUkRNQTFfU09VVF9EUEkxCQkJCTB4Mw0KPiA+ICsj ZGVmaW5lIFJETUExX1NPVVRfRFNJMQkJCQkweDENCj4gPiArI2RlZmluZSBSRE1BMV9TT1VUX0RT STIJCQkJMHg0DQo+ID4gKyNkZWZpbmUgUkRNQTFfU09VVF9EU0kzCQkJCTB4NQ0KPiA+ICsjZGVm aW5lIFJETUEyX1NPVVRfRFBJMAkJCQkweDINCj4gPiArI2RlZmluZSBSRE1BMl9TT1VUX0RQSTEJ CQkJMHgzDQo+ID4gKyNkZWZpbmUgUkRNQTJfU09VVF9EU0kxCQkJCTB4MQ0KPiA+ICsjZGVmaW5l IFJETUEyX1NPVVRfRFNJMgkJCQkweDQNCj4gPiArI2RlZmluZSBSRE1BMl9TT1VUX0RTSTMJCQkJ MHg1DQo+ID4gKyNkZWZpbmUgRFBJMF9TRUxfSU5fUkRNQTEJCQkweDENCj4gPiArI2RlZmluZSBE UEkwX1NFTF9JTl9SRE1BMgkJCTB4Mw0KPiA+ICsjZGVmaW5lIERQSTFfU0VMX0lOX1JETUExCQkJ KDB4MSA8PCA4KQ0KPiA+ICsjZGVmaW5lIERQSTFfU0VMX0lOX1JETUEyCQkJKDB4MyA8PCA4KQ0K PiA+ICsjZGVmaW5lIERTSTBfU0VMX0lOX1JETUExCQkJMHgxDQo+ID4gKyNkZWZpbmUgRFNJMF9T RUxfSU5fUkRNQTIJCQkweDQNCj4gPiArI2RlZmluZSBEU0kxX1NFTF9JTl9SRE1BMQkJCTB4MQ0K PiA+ICsjZGVmaW5lIERTSTFfU0VMX0lOX1JETUEyCQkJMHg0DQo+ID4gKyNkZWZpbmUgRFNJMl9T RUxfSU5fUkRNQTEJCQkoMHgxIDw8IDE2KQ0KPiA+ICsjZGVmaW5lIERTSTJfU0VMX0lOX1JETUEy CQkJKDB4NCA8PCAxNikNCj4gPiArI2RlZmluZSBEU0kzX1NFTF9JTl9SRE1BMQkJCSgweDEgPDwg MTYpDQo+ID4gKyNkZWZpbmUgRFNJM19TRUxfSU5fUkRNQTIJCQkoMHg0IDw8IDE2KQ0KPiA+ICsj ZGVmaW5lIENPTE9SMV9TRUxfSU5fT1ZMMQkJCTB4MQ0KPiA+ICsNCj4gPiArI2RlZmluZSBPVkxf TU9VVF9FTl9SRE1BCQkJMHgxDQo+ID4gKyNkZWZpbmUgQkxTX1RPX0RTSV9SRE1BMV9UT19EUEkx CQkweDgNCj4gPiArI2RlZmluZSBCTFNfVE9fRFBJX1JETUExX1RPX0RTSQkJCTB4Mg0KPiA+ICsj ZGVmaW5lIERTSV9TRUxfSU5fQkxTCQkJCTB4MA0KPiA+ICsjZGVmaW5lIERQSV9TRUxfSU5fQkxT CQkJCTB4MA0KPiA+ICsjZGVmaW5lIERTSV9TRUxfSU5fUkRNQQkJCQkweDENCj4gPiAgDQo+ID4g IHN0cnVjdCBtdGtfbW1zeXNfZHJpdmVyX2RhdGEgew0KPiA+ICAJY29uc3QgY2hhciAqY2xrX2Ry aXZlcjsNCj4gPiBAQCAtMTYsMTAgKzg0LDIyMSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IG10a19t bXN5c19kcml2ZXJfZGF0YSBtdDgxNzNfbW1zeXNfZHJpdmVyX2RhdGEgPSB7DQo+ID4gIAkuY2xr X2RyaXZlciA9ICJjbGstbXQ4MTczLW1tIiwNCj4gPiAgfTsNCj4gPiAgDQo+ID4gK3N0YXRpYyB1 bnNpZ25lZCBpbnQgbXRrX21tc3lzX2RkcF9tb3V0X2VuKGVudW0gbXRrX2RkcF9jb21wX2lkIGN1 ciwNCj4gPiArCQkJCQkgIGVudW0gbXRrX2RkcF9jb21wX2lkIG5leHQsDQo+ID4gKwkJCQkJICB1 bnNpZ25lZCBpbnQgKmFkZHIpDQo+ID4gK3sNCj4gPiArCXVuc2lnbmVkIGludCB2YWx1ZTsNCj4g PiArDQo+ID4gKwlpZiAoY3VyID09IEREUF9DT01QT05FTlRfT1ZMMCAmJiBuZXh0ID09IEREUF9D T01QT05FTlRfQ09MT1IwKSB7DQo+ID4gKwkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRElTUF9P VkwwX01PVVRfRU47DQo+ID4gKwkJdmFsdWUgPSBPVkwwX01PVVRfRU5fQ09MT1IwOw0KPiA+ICsJ fSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9PVkwwICYmIG5leHQgPT0gRERQX0NPTVBP TkVOVF9SRE1BMCkgew0KPiA+ICsJCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RJU1BfT1ZMX01P VVRfRU47DQo+ID4gKwkJdmFsdWUgPSBPVkxfTU9VVF9FTl9SRE1BOw0KPiA+ICsJfSBlbHNlIGlm IChjdXIgPT0gRERQX0NPTVBPTkVOVF9PRDAgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX1JETUEw KSB7DQo+ID4gKwkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRElTUF9PRF9NT1VUX0VOOw0KPiA+ ICsJCXZhbHVlID0gT0RfTU9VVF9FTl9SRE1BMDsNCj4gPiArCX0gZWxzZSBpZiAoY3VyID09IERE UF9DT01QT05FTlRfVUZPRSAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfRFNJMCkgew0KPiA+ICsJ CSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RJU1BfVUZPRV9NT1VUX0VOOw0KPiA+ICsJCXZhbHVl ID0gVUZPRV9NT1VUX0VOX0RTSTA7DQo+ID4gKwl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9O RU5UX09WTDEgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0NPTE9SMSkgew0KPiA+ICsJCSphZGRy ID0gRElTUF9SRUdfQ09ORklHX0RJU1BfT1ZMMV9NT1VUX0VOOw0KPiA+ICsJCXZhbHVlID0gT1ZM MV9NT1VUX0VOX0NPTE9SMTsNCj4gPiArCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRf R0FNTUEgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX1JETUExKSB7DQo+ID4gKwkJKmFkZHIgPSBE SVNQX1JFR19DT05GSUdfRElTUF9HQU1NQV9NT1VUX0VOOw0KPiA+ICsJCXZhbHVlID0gR0FNTUFf TU9VVF9FTl9SRE1BMTsNCj4gPiArCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRfT0Qx ICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9SRE1BMSkgew0KPiA+ICsJCSphZGRyID0gRElTUF9S RUdfQ09ORklHX0RJU1BfT0RfTU9VVF9FTjsNCj4gPiArCQl2YWx1ZSA9IE9EMV9NT1VUX0VOX1JE TUExOw0KPiA+ICsJfSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9SRE1BMCAmJiBuZXh0 ID09IEREUF9DT01QT05FTlRfRFBJMCkgew0KPiA+ICsJCSphZGRyID0gRElTUF9SRUdfQ09ORklH X0RJU1BfUkRNQTBfU09VVF9FTjsNCj4gPiArCQl2YWx1ZSA9IFJETUEwX1NPVVRfRFBJMDsNCj4g PiArCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRfUkRNQTAgJiYgbmV4dCA9PSBERFBf Q09NUE9ORU5UX0RQSTEpIHsNCj4gPiArCQkqYWRkciA9IERJU1BfUkVHX0NPTkZJR19ESVNQX1JE TUEwX1NPVVRfRU47DQo+ID4gKwkJdmFsdWUgPSBSRE1BMF9TT1VUX0RQSTE7DQo+ID4gKwl9IGVs c2UgaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX1JETUEwICYmIG5leHQgPT0gRERQX0NPTVBPTkVO VF9EU0kxKSB7DQo+ID4gKwkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRElTUF9SRE1BMF9TT1VU X0VOOw0KPiA+ICsJCXZhbHVlID0gUkRNQTBfU09VVF9EU0kxOw0KPiA+ICsJfSBlbHNlIGlmIChj dXIgPT0gRERQX0NPTVBPTkVOVF9SRE1BMCAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfRFNJMikg ew0KPiA+ICsJCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RJU1BfUkRNQTBfU09VVF9FTjsNCj4g PiArCQl2YWx1ZSA9IFJETUEwX1NPVVRfRFNJMjsNCj4gPiArCX0gZWxzZSBpZiAoY3VyID09IERE UF9DT01QT05FTlRfUkRNQTAgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0RTSTMpIHsNCj4gPiAr CQkqYWRkciA9IERJU1BfUkVHX0NPTkZJR19ESVNQX1JETUEwX1NPVVRfRU47DQo+ID4gKwkJdmFs dWUgPSBSRE1BMF9TT1VUX0RTSTM7DQo+ID4gKwl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9O RU5UX1JETUExICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9EU0kxKSB7DQo+ID4gKwkJKmFkZHIg PSBESVNQX1JFR19DT05GSUdfRElTUF9SRE1BMV9TT1VUX0VOOw0KPiA+ICsJCXZhbHVlID0gUkRN QTFfU09VVF9EU0kxOw0KPiA+ICsJfSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9SRE1B MSAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfRFNJMikgew0KPiA+ICsJCSphZGRyID0gRElTUF9S RUdfQ09ORklHX0RJU1BfUkRNQTFfU09VVF9FTjsNCj4gPiArCQl2YWx1ZSA9IFJETUExX1NPVVRf RFNJMjsNCj4gPiArCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRfUkRNQTEgJiYgbmV4 dCA9PSBERFBfQ09NUE9ORU5UX0RTSTMpIHsNCj4gPiArCQkqYWRkciA9IERJU1BfUkVHX0NPTkZJ R19ESVNQX1JETUExX1NPVVRfRU47DQo+ID4gKwkJdmFsdWUgPSBSRE1BMV9TT1VUX0RTSTM7DQo+ ID4gKwl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX1JETUExICYmIG5leHQgPT0gRERQ X0NPTVBPTkVOVF9EUEkwKSB7DQo+ID4gKwkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRElTUF9S RE1BMV9TT1VUX0VOOw0KPiA+ICsJCXZhbHVlID0gUkRNQTFfU09VVF9EUEkwOw0KPiA+ICsJfSBl bHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9SRE1BMSAmJiBuZXh0ID09IEREUF9DT01QT05F TlRfRFBJMSkgew0KPiA+ICsJCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RJU1BfUkRNQTFfU09V VF9FTjsNCj4gPiArCQl2YWx1ZSA9IFJETUExX1NPVVRfRFBJMTsNCj4gPiArCX0gZWxzZSBpZiAo Y3VyID09IEREUF9DT01QT05FTlRfUkRNQTIgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0RQSTAp IHsNCj4gPiArCQkqYWRkciA9IERJU1BfUkVHX0NPTkZJR19ESVNQX1JETUEyX1NPVVQ7DQo+ID4g KwkJdmFsdWUgPSBSRE1BMl9TT1VUX0RQSTA7DQo+ID4gKwl9IGVsc2UgaWYgKGN1ciA9PSBERFBf Q09NUE9ORU5UX1JETUEyICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9EUEkxKSB7DQo+ID4gKwkJ KmFkZHIgPSBESVNQX1JFR19DT05GSUdfRElTUF9SRE1BMl9TT1VUOw0KPiA+ICsJCXZhbHVlID0g UkRNQTJfU09VVF9EUEkxOw0KPiA+ICsJfSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9S RE1BMiAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfRFNJMSkgew0KPiA+ICsJCSphZGRyID0gRElT UF9SRUdfQ09ORklHX0RJU1BfUkRNQTJfU09VVDsNCj4gPiArCQl2YWx1ZSA9IFJETUEyX1NPVVRf RFNJMTsNCj4gPiArCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRfUkRNQTIgJiYgbmV4 dCA9PSBERFBfQ09NUE9ORU5UX0RTSTIpIHsNCj4gPiArCQkqYWRkciA9IERJU1BfUkVHX0NPTkZJ R19ESVNQX1JETUEyX1NPVVQ7DQo+ID4gKwkJdmFsdWUgPSBSRE1BMl9TT1VUX0RTSTI7DQo+ID4g Kwl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX1JETUEyICYmIG5leHQgPT0gRERQX0NP TVBPTkVOVF9EU0kzKSB7DQo+ID4gKwkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRElTUF9SRE1B Ml9TT1VUOw0KPiA+ICsJCXZhbHVlID0gUkRNQTJfU09VVF9EU0kzOw0KPiA+ICsJfSBlbHNlIHsN Cj4gPiArCQl2YWx1ZSA9IDA7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJcmV0dXJuIHZhbHVlOw0K PiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgdW5zaWduZWQgaW50IG10a19tbXN5c19kZHBfc2Vs X2luKGVudW0gbXRrX2RkcF9jb21wX2lkIGN1ciwNCj4gPiArCQkJCQkgZW51bSBtdGtfZGRwX2Nv bXBfaWQgbmV4dCwNCj4gPiArCQkJCQkgdW5zaWduZWQgaW50ICphZGRyKQ0KPiA+ICt7DQo+ID4g Kwl1bnNpZ25lZCBpbnQgdmFsdWU7DQo+ID4gKw0KPiA+ICsJaWYgKGN1ciA9PSBERFBfQ09NUE9O RU5UX09WTDAgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0NPTE9SMCkgew0KPiA+ICsJCSphZGRy ID0gRElTUF9SRUdfQ09ORklHX0RJU1BfQ09MT1IwX1NFTF9JTjsNCj4gPiArCQl2YWx1ZSA9IENP TE9SMF9TRUxfSU5fT1ZMMDsNCj4gPiArCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05FTlRf UkRNQTEgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0RQSTApIHsNCj4gPiArCQkqYWRkciA9IERJ U1BfUkVHX0NPTkZJR19EUElfU0VMX0lOOw0KPiA+ICsJCXZhbHVlID0gRFBJMF9TRUxfSU5fUkRN QTE7DQo+ID4gKwl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX1JETUExICYmIG5leHQg PT0gRERQX0NPTVBPTkVOVF9EUEkxKSB7DQo+ID4gKwkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdf RFBJX1NFTF9JTjsNCj4gPiArCQl2YWx1ZSA9IERQSTFfU0VMX0lOX1JETUExOw0KPiA+ICsJfSBl bHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9SRE1BMSAmJiBuZXh0ID09IEREUF9DT01QT05F TlRfRFNJMCkgew0KPiA+ICsJCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RTSUVfU0VMX0lOOw0K PiA+ICsJCXZhbHVlID0gRFNJMF9TRUxfSU5fUkRNQTE7DQo+ID4gKwl9IGVsc2UgaWYgKGN1ciA9 PSBERFBfQ09NUE9ORU5UX1JETUExICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9EU0kxKSB7DQo+ ID4gKwkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRFNJT19TRUxfSU47DQo+ID4gKwkJdmFsdWUg PSBEU0kxX1NFTF9JTl9SRE1BMTsNCj4gPiArCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01QT05F TlRfUkRNQTEgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0RTSTIpIHsNCj4gPiArCQkqYWRkciA9 IERJU1BfUkVHX0NPTkZJR19EU0lFX1NFTF9JTjsNCj4gPiArCQl2YWx1ZSA9IERTSTJfU0VMX0lO X1JETUExOw0KPiA+ICsJfSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9SRE1BMSAmJiBu ZXh0ID09IEREUF9DT01QT05FTlRfRFNJMykgew0KPiA+ICsJCSphZGRyID0gRElTUF9SRUdfQ09O RklHX0RTSU9fU0VMX0lOOw0KPiA+ICsJCXZhbHVlID0gRFNJM19TRUxfSU5fUkRNQTE7DQo+ID4g Kwl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX1JETUEyICYmIG5leHQgPT0gRERQX0NP TVBPTkVOVF9EUEkwKSB7DQo+ID4gKwkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRFBJX1NFTF9J TjsNCj4gPiArCQl2YWx1ZSA9IERQSTBfU0VMX0lOX1JETUEyOw0KPiA+ICsJfSBlbHNlIGlmIChj dXIgPT0gRERQX0NPTVBPTkVOVF9SRE1BMiAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfRFBJMSkg ew0KPiA+ICsJCSphZGRyID0gRElTUF9SRUdfQ09ORklHX0RQSV9TRUxfSU47DQo+ID4gKwkJdmFs dWUgPSBEUEkxX1NFTF9JTl9SRE1BMjsNCj4gPiArCX0gZWxzZSBpZiAoY3VyID09IEREUF9DT01Q T05FTlRfUkRNQTIgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0RTSTApIHsNCj4gPiArCQkqYWRk ciA9IERJU1BfUkVHX0NPTkZJR19EU0lFX1NFTF9JTjsNCj4gPiArCQl2YWx1ZSA9IERTSTBfU0VM X0lOX1JETUEyOw0KPiA+ICsJfSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVOVF9SRE1BMiAm JiBuZXh0ID09IEREUF9DT01QT05FTlRfRFNJMSkgew0KPiA+ICsJCSphZGRyID0gRElTUF9SRUdf Q09ORklHX0RTSU9fU0VMX0lOOw0KPiA+ICsJCXZhbHVlID0gRFNJMV9TRUxfSU5fUkRNQTI7DQo+ ID4gKwl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX1JETUEyICYmIG5leHQgPT0gRERQ X0NPTVBPTkVOVF9EU0kyKSB7DQo+ID4gKwkJKmFkZHIgPSBESVNQX1JFR19DT05GSUdfRFNJRV9T RUxfSU47DQo+ID4gKwkJdmFsdWUgPSBEU0kyX1NFTF9JTl9SRE1BMjsNCj4gPiArCX0gZWxzZSBp ZiAoY3VyID09IEREUF9DT01QT05FTlRfUkRNQTIgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0RT STMpIHsNCj4gPiArCQkqYWRkciA9IERJU1BfUkVHX0NPTkZJR19EU0lFX1NFTF9JTjsNCj4gPiAr CQl2YWx1ZSA9IERTSTNfU0VMX0lOX1JETUEyOw0KPiA+ICsJfSBlbHNlIGlmIChjdXIgPT0gRERQ X0NPTVBPTkVOVF9PVkwxICYmIG5leHQgPT0gRERQX0NPTVBPTkVOVF9DT0xPUjEpIHsNCj4gPiAr CQkqYWRkciA9IERJU1BfUkVHX0NPTkZJR19ESVNQX0NPTE9SMV9TRUxfSU47DQo+ID4gKwkJdmFs dWUgPSBDT0xPUjFfU0VMX0lOX09WTDE7DQo+ID4gKwl9IGVsc2UgaWYgKGN1ciA9PSBERFBfQ09N UE9ORU5UX0JMUyAmJiBuZXh0ID09IEREUF9DT01QT05FTlRfRFNJMCkgew0KPiA+ICsJCSphZGRy ID0gRElTUF9SRUdfQ09ORklHX0RTSV9TRUw7DQo+ID4gKwkJdmFsdWUgPSBEU0lfU0VMX0lOX0JM UzsNCj4gPiArCX0gZWxzZSB7DQo+ID4gKwkJdmFsdWUgPSAwOw0KPiA+ICsJfQ0KPiA+ICsNCj4g PiArCXJldHVybiB2YWx1ZTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQgbXRrX21t c3lzX2RkcF9zb3V0X3NlbCh2b2lkIF9faW9tZW0gKmNvbmZpZ19yZWdzLA0KPiA+ICsJCQkJICAg ZW51bSBtdGtfZGRwX2NvbXBfaWQgY3VyLA0KPiA+ICsJCQkJICAgZW51bSBtdGtfZGRwX2NvbXBf aWQgbmV4dCkNCj4gPiArew0KPiA+ICsJaWYgKGN1ciA9PSBERFBfQ09NUE9ORU5UX0JMUyAmJiBu ZXh0ID09IEREUF9DT01QT05FTlRfRFNJMCkgew0KPiA+ICsJCXdyaXRlbF9yZWxheGVkKEJMU19U T19EU0lfUkRNQTFfVE9fRFBJMSwNCj4gPiArCQkJICAgICAgIGNvbmZpZ19yZWdzICsgRElTUF9S RUdfQ09ORklHX09VVF9TRUwpOw0KPiA+ICsJfSBlbHNlIGlmIChjdXIgPT0gRERQX0NPTVBPTkVO VF9CTFMgJiYgbmV4dCA9PSBERFBfQ09NUE9ORU5UX0RQSTApIHsNCj4gPiArCQl3cml0ZWxfcmVs YXhlZChCTFNfVE9fRFBJX1JETUExX1RPX0RTSSwNCj4gPiArCQkJICAgICAgIGNvbmZpZ19yZWdz ICsgRElTUF9SRUdfQ09ORklHX09VVF9TRUwpOw0KPiA+ICsJCXdyaXRlbF9yZWxheGVkKERTSV9T RUxfSU5fUkRNQSwNCj4gPiArCQkJICAgICAgIGNvbmZpZ19yZWdzICsgRElTUF9SRUdfQ09ORklH X0RTSV9TRUwpOw0KPiA+ICsJCXdyaXRlbF9yZWxheGVkKERQSV9TRUxfSU5fQkxTLA0KPiA+ICsJ CQkgICAgICAgY29uZmlnX3JlZ3MgKyBESVNQX1JFR19DT05GSUdfRFBJX1NFTCk7DQo+ID4gKwl9 DQo+ID4gK30NCj4gPiArDQo+ID4gK3ZvaWQgbXRrX21tc3lzX2RkcF9jb25uZWN0KHN0cnVjdCBk ZXZpY2UgKmRldiwNCj4gPiArCQkJICAgZW51bSBtdGtfZGRwX2NvbXBfaWQgY3VyLA0KPiA+ICsJ CQkgICBlbnVtIG10a19kZHBfY29tcF9pZCBuZXh0KQ0KPiA+ICt7DQo+ID4gKwl2b2lkIF9faW9t ZW0gKmNvbmZpZ19yZWdzID0gZGV2X2dldF9kcnZkYXRhKGRldik7DQo+ID4gKwl1bnNpZ25lZCBp bnQgYWRkciwgdmFsdWUsIHJlZzsNCj4gPiArDQo+ID4gKwl2YWx1ZSA9IG10a19tbXN5c19kZHBf bW91dF9lbihjdXIsIG5leHQsICZhZGRyKTsNCj4gPiArCWlmICh2YWx1ZSkgew0KPiA+ICsJCXJl ZyA9IHJlYWRsX3JlbGF4ZWQoY29uZmlnX3JlZ3MgKyBhZGRyKSB8IHZhbHVlOw0KPiA+ICsJCXdy aXRlbF9yZWxheGVkKHJlZywgY29uZmlnX3JlZ3MgKyBhZGRyKTsNCj4gPiArCX0NCj4gPiArDQo+ ID4gKwltdGtfbW1zeXNfZGRwX3NvdXRfc2VsKGNvbmZpZ19yZWdzLCBjdXIsIG5leHQpOw0KPiA+ ICsNCj4gPiArCXZhbHVlID0gbXRrX21tc3lzX2RkcF9zZWxfaW4oY3VyLCBuZXh0LCAmYWRkcik7 DQo+ID4gKwlpZiAodmFsdWUpIHsNCj4gPiArCQlyZWcgPSByZWFkbF9yZWxheGVkKGNvbmZpZ19y ZWdzICsgYWRkcikgfCB2YWx1ZTsNCj4gPiArCQl3cml0ZWxfcmVsYXhlZChyZWcsIGNvbmZpZ19y ZWdzICsgYWRkcik7DQo+ID4gKwl9DQo+ID4gK30NCj4gPiArDQo+ID4gK3ZvaWQgbXRrX21tc3lz X2RkcF9kaXNjb25uZWN0KHN0cnVjdCBkZXZpY2UgKmRldiwNCj4gPiArCQkJICAgICAgZW51bSBt dGtfZGRwX2NvbXBfaWQgY3VyLA0KPiA+ICsJCQkgICAgICBlbnVtIG10a19kZHBfY29tcF9pZCBu ZXh0KQ0KPiA+ICt7DQo+ID4gKwl2b2lkIF9faW9tZW0gKmNvbmZpZ19yZWdzID0gZGV2X2dldF9k cnZkYXRhKGRldik7DQo+ID4gKwl1bnNpZ25lZCBpbnQgYWRkciwgdmFsdWUsIHJlZzsNCj4gPiAr DQo+ID4gKwl2YWx1ZSA9IG10a19tbXN5c19kZHBfbW91dF9lbihjdXIsIG5leHQsICZhZGRyKTsN Cj4gPiArCWlmICh2YWx1ZSkgew0KPiA+ICsJCXJlZyA9IHJlYWRsX3JlbGF4ZWQoY29uZmlnX3Jl Z3MgKyBhZGRyKSAmIH52YWx1ZTsNCj4gPiArCQl3cml0ZWxfcmVsYXhlZChyZWcsIGNvbmZpZ19y ZWdzICsgYWRkcik7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJdmFsdWUgPSBtdGtfbW1zeXNfZGRw X3NlbF9pbihjdXIsIG5leHQsICZhZGRyKTsNCj4gPiArCWlmICh2YWx1ZSkgew0KPiA+ICsJCXJl ZyA9IHJlYWRsX3JlbGF4ZWQoY29uZmlnX3JlZ3MgKyBhZGRyKSAmIH52YWx1ZTsNCj4gPiArCQl3 cml0ZWxfcmVsYXhlZChyZWcsIGNvbmZpZ19yZWdzICsgYWRkcik7DQo+ID4gKwl9DQo+ID4gK30N Cj4gPiArDQo+ID4gIHN0YXRpYyBpbnQgbXRrX21tc3lzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpDQo+ID4gIHsNCj4gPiAgCWNvbnN0IHN0cnVjdCBtdGtfbW1zeXNfZHJpdmVy X2RhdGEgKmRhdGE7DQo+ID4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Ow0KPiA+ ICAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY2xrczsNCj4gPiArCXZvaWQgX19pb21lbSAqY29u ZmlnX3JlZ3M7DQo+ID4gKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsNCj4gPiArCWludCByZXQ7DQo+ ID4gKw0KPiA+ICsJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0Vf TUVNLCAwKTsNCj4gPiArCWNvbmZpZ19yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwg bWVtKTsNCj4gPiArCWlmIChJU19FUlIoY29uZmlnX3JlZ3MpKSB7DQo+ID4gKwkJcmV0ID0gUFRS X0VSUihjb25maWdfcmVncyk7DQo+ID4gKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gaW9yZW1h cCBtbXN5cy1jb25maWcgcmVzb3VyY2U6ICVkXG4iLA0KPiA+ICsJCQlyZXQpOw0KPiA+ICsJCXJl dHVybiByZXQ7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRl diwgY29uZmlnX3JlZ3MpOw0KPiA+ICANCj4gPiAgCWRhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNo X2RhdGEoJnBkZXYtPmRldik7DQo+ID4gIA0KPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4 L3NvYy9tZWRpYXRlay9tdGstbW1zeXMuaCBiL2luY2x1ZGUvbGludXgvc29jL21lZGlhdGVrL210 ay1tbXN5cy5oDQo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwMDAw MDAuLjdiYWI1ZDlhM2QzMQ0KPiA+IC0tLSAvZGV2L251bGwNCj4gPiArKysgYi9pbmNsdWRlL2xp bnV4L3NvYy9tZWRpYXRlay9tdGstbW1zeXMuaA0KPiA+IEBAIC0wLDAgKzEsMjAgQEANCj4gPiAr LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqLw0KPiA+ICsvKg0KPiA+ ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTUgTWVkaWFUZWsgSW5jLg0KPiA+ICsgKi8NCj4gPiArDQo+ ID4gKyNpZm5kZWYgX19NVEtfTU1TWVNfSA0KPiA+ICsjZGVmaW5lIF9fTVRLX01NU1lTX0gNCj4g PiArDQo+ID4gK2VudW0gbXRrX2RkcF9jb21wX2lkOw0KPiA+ICtzdHJ1Y3QgZGV2aWNlOw0KPiA+ ICsNCj4gPiArdm9pZCBtdGtfbW1zeXNfZGRwX2Nvbm5lY3Qoc3RydWN0IGRldmljZSAqZGV2LA0K PiA+ICsJCQkgICBlbnVtIG10a19kZHBfY29tcF9pZCBjdXIsDQo+ID4gKwkJCSAgIGVudW0gbXRr X2RkcF9jb21wX2lkIG5leHQpOw0KPiA+ICsNCj4gPiArdm9pZCBtdGtfbW1zeXNfZGRwX2Rpc2Nv bm5lY3Qoc3RydWN0IGRldmljZSAqZGV2LA0KPiA+ICsJCQkgICAgICBlbnVtIG10a19kZHBfY29t cF9pZCBjdXIsDQo+ID4gKwkJCSAgICAgIGVudW0gbXRrX2RkcF9jb21wX2lkIG5leHQpOw0KPiA+ ICsNCj4gPiArI2VuZGlmIC8qIF9fTVRLX01NU1lTX0ggKi8NCj4gPiANCg0K 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 X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AA1A6C43331 for ; Wed, 25 Mar 2020 23:06:05 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 734A820737 for ; Wed, 25 Mar 2020 23:06:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="LRM4/Apk"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="mJRqTPBz" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 734A820737 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date: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=bD/OLr+lz2q99O6pq4viO9RWQhFMUoz+tGyuWIeNrgs=; b=LRM4/ApkS3nk91 C0giac0UHlzs6GngOqQ1ySzju2YelxLMEwVUmv7XWKcW+Lxif0vmYKI+Xl1IzxTqobRTP5l6TrjTu PwxZCzAj2zEYzpeYu6B/c9KkHybtl0GPbpuACdEUEGMFyKTW3vZ2EsHt2v/vPDFPVMZ2ZtPyWsSEY X0Axy3cEp7Gi0CdDKytyjtpQO9nyGsVORxp5y8us90Txm7a24oCMVFfU6p+Uksrw1GWSYEDfuFNmM k4hu4N2Q+J4OveNCmdb++wcp4N2deZBIUQdQ0xBIjyGWE5I1UC+htygAbkC5QmSCqnR3dOJBdjK0W SEy5wQbdm/Wd2U5key+w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jHF5s-0002Nx-QB; Wed, 25 Mar 2020 23:05:52 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jHF5g-0002FY-Hj; Wed, 25 Mar 2020 23:05:43 +0000 X-UUID: 0e821f2a58a74552bbb89a0f18924792-20200325 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=Dbph2QdkGB9v/7fOd6SwtLCWAnmMbcWZXZeUDFh9xKk=; b=mJRqTPBzSr0POGeLpIbQnO8Kx0ymGxNtgscZeRFpJKm/043i2s5Np03n1IW3Hwj2IvxGz9Cj9smoBtZZaLH9JCAorDOxb4Ya8BNZwqq0pQd0KGgpMOnIFSZbKrtSB3IopFdtNo7ucaijy9zpsd2RpXaGRSQoQ6nglBCX7Zqjbx4=; X-UUID: 0e821f2a58a74552bbb89a0f18924792-20200325 Received: from mtkcas68.mediatek.inc [(172.29.94.19)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1842101904; Wed, 25 Mar 2020 15:05:38 -0800 Received: from mtkcas09.mediatek.inc (172.21.101.178) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 25 Mar 2020 16:05:35 -0700 Received: from [172.21.77.4] (172.21.77.4) by mtkcas09.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Thu, 26 Mar 2020 07:05:32 +0800 Message-ID: <1585177534.26117.4.camel@mtksdaap41> Subject: Re: [PATCH v12 4/5] soc / drm: mediatek: Move routing control to mmsys device From: CK Hu To: Matthias Brugger Date: Thu, 26 Mar 2020 07:05:34 +0800 In-Reply-To: <02290a21-7392-a2cf-576c-215091ec05e8@suse.com> References: <20200311165322.1594233-1-enric.balletbo@collabora.com> <20200311165322.1594233-5-enric.balletbo@collabora.com> <02290a21-7392-a2cf-576c-215091ec05e8@suse.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200325_160540_614616_A58CD391 X-CRM114-Status: GOOD ( 24.93 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, Kate Stewart , Minghsiu Tsai , Andrew-CT Chen , airlied@linux.ie, mturquette@baylibre.com, dri-devel@lists.freedesktop.org, Richard Fontana , laurent.pinchart@ideasonboard.com, ulrich.hecht+renesas@gmail.com, Collabora Kernel ML , linux-clk@vger.kernel.org, Weiyi Lu , wens@csie.org, linux-arm-kernel@lists.infradead.org, mtk01761 , linux-media@vger.kernel.org, devicetree@vger.kernel.org, Daniel Vetter , frank-w@public-files.de, Seiya Wang , sean.wang@mediatek.com, Houlong Wei , robh+dt@kernel.org, linux-mediatek@lists.infradead.org, hsinyi@chromium.org, Matthias Brugger , Thomas Gleixner , Mauro Carvalho Chehab , Allison Randal , sboyd@kernel.org, Greg Kroah-Hartman , rdunlap@infradead.org, linux-kernel@vger.kernel.org, p.zabel@pengutronix.de, matthias.bgg@kernel.org, Enric Balletbo i Serra 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, Matthias: On Wed, 2020-03-25 at 17:16 +0100, Matthias Brugger wrote: > > On 11/03/2020 17:53, Enric Balletbo i Serra wrote: > > Provide a mtk_mmsys_ddp_connect() and mtk_mmsys_disconnect() functions to > > replace mtk_ddp_add_comp_to_path() and mtk_ddp_remove_comp_from_path(). > > Those functions will allow DRM driver and others to control the data > > path routing. > > > > Signed-off-by: Enric Balletbo i Serra > > Reviewed-by: Matthias Brugger > > Reviewed-by: CK Hu > > Acked-by: CK Hu > > This patch does not apply against v5.6-rc1. > Please rebase as this is a quite big patch and it won't be easy to do that by hand. I think this patch depends on [1] which has been acked by me and I have not picked it. The simple way is that you pick [1] first and then pick this series. [1] https://patchwork.kernel.org/patch/11406227/ Regards, CK > > Regards, > Matthias > > > --- > > > > Changes in v12: None > > Changes in v10: > > - Select CONFIG_MTK_MMSYS (CK) > > - Pass device pointer of mmsys device instead of config regs (CK) > > > > Changes in v9: > > - Introduced a new patch to move routing control into mmsys driver. > > - Removed the patch to use regmap as is not needed anymore. > > > > Changes in v8: None > > Changes in v7: None > > > > drivers/gpu/drm/mediatek/Kconfig | 1 + > > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 19 +- > > drivers/gpu/drm/mediatek/mtk_drm_ddp.c | 256 ---------------------- > > drivers/gpu/drm/mediatek/mtk_drm_ddp.h | 7 - > > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 14 +- > > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 2 +- > > drivers/soc/mediatek/mtk-mmsys.c | 279 ++++++++++++++++++++++++ > > include/linux/soc/mediatek/mtk-mmsys.h | 20 ++ > > 8 files changed, 316 insertions(+), 282 deletions(-) > > create mode 100644 include/linux/soc/mediatek/mtk-mmsys.h > > > > diff --git a/drivers/gpu/drm/mediatek/Kconfig b/drivers/gpu/drm/mediatek/Kconfig > > index fa5ffc4fe823..c420f5a3d33b 100644 > > --- a/drivers/gpu/drm/mediatek/Kconfig > > +++ b/drivers/gpu/drm/mediatek/Kconfig > > @@ -11,6 +11,7 @@ config DRM_MEDIATEK > > select DRM_MIPI_DSI > > select DRM_PANEL > > select MEMORY > > + select MTK_MMSYS > > select MTK_SMI > > select VIDEOMODE_HELPERS > > help > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > index 0e05683d7b53..579a5a5d4472 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > @@ -6,6 +6,7 @@ > > #include > > #include > > #include > > +#include > > > > #include > > #include > > @@ -28,7 +29,7 @@ > > * @enabled: records whether crtc_enable succeeded > > * @planes: array of 4 drm_plane structures, one for each overlay plane > > * @pending_planes: whether any plane has pending changes to be applied > > - * @config_regs: memory mapped mmsys configuration register space > > + * @mmsys_dev: pointer to the mmsys device for configuration registers > > * @mutex: handle to one of the ten disp_mutex streams > > * @ddp_comp_nr: number of components in ddp_comp > > * @ddp_comp: array of pointers the mtk_ddp_comp structures used by this crtc > > @@ -50,7 +51,7 @@ struct mtk_drm_crtc { > > u32 cmdq_event; > > #endif > > > > - void __iomem *config_regs; > > + struct device *mmsys_dev; > > struct mtk_disp_mutex *mutex; > > unsigned int ddp_comp_nr; > > struct mtk_ddp_comp **ddp_comp; > > @@ -296,9 +297,9 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) > > } > > > > for (i = 0; i < mtk_crtc->ddp_comp_nr - 1; i++) { > > - mtk_ddp_add_comp_to_path(mtk_crtc->config_regs, > > - mtk_crtc->ddp_comp[i]->id, > > - mtk_crtc->ddp_comp[i + 1]->id); > > + mtk_mmsys_ddp_connect(mtk_crtc->mmsys_dev, > > + mtk_crtc->ddp_comp[i]->id, > > + mtk_crtc->ddp_comp[i + 1]->id); > > mtk_disp_mutex_add_comp(mtk_crtc->mutex, > > mtk_crtc->ddp_comp[i]->id); > > } > > @@ -355,9 +356,9 @@ static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc) > > mtk_crtc->ddp_comp[i]->id); > > mtk_disp_mutex_disable(mtk_crtc->mutex); > > for (i = 0; i < mtk_crtc->ddp_comp_nr - 1; i++) { > > - mtk_ddp_remove_comp_from_path(mtk_crtc->config_regs, > > - mtk_crtc->ddp_comp[i]->id, > > - mtk_crtc->ddp_comp[i + 1]->id); > > + mtk_mmsys_ddp_disconnect(mtk_crtc->mmsys_dev, > > + mtk_crtc->ddp_comp[i]->id, > > + mtk_crtc->ddp_comp[i + 1]->id); > > mtk_disp_mutex_remove_comp(mtk_crtc->mutex, > > mtk_crtc->ddp_comp[i]->id); > > } > > @@ -761,7 +762,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, > > if (!mtk_crtc) > > return -ENOMEM; > > > > - mtk_crtc->config_regs = priv->config_regs; > > + mtk_crtc->mmsys_dev = priv->mmsys_dev; > > mtk_crtc->ddp_comp_nr = path_len; > > mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc->ddp_comp_nr, > > sizeof(*mtk_crtc->ddp_comp), > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > index b885f60f474c..014c1bbe1df2 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > @@ -13,26 +13,6 @@ > > #include "mtk_drm_ddp.h" > > #include "mtk_drm_ddp_comp.h" > > > > -#define DISP_REG_CONFIG_DISP_OVL0_MOUT_EN 0x040 > > -#define DISP_REG_CONFIG_DISP_OVL1_MOUT_EN 0x044 > > -#define DISP_REG_CONFIG_DISP_OD_MOUT_EN 0x048 > > -#define DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN 0x04c > > -#define DISP_REG_CONFIG_DISP_UFOE_MOUT_EN 0x050 > > -#define DISP_REG_CONFIG_DISP_COLOR0_SEL_IN 0x084 > > -#define DISP_REG_CONFIG_DISP_COLOR1_SEL_IN 0x088 > > -#define DISP_REG_CONFIG_DSIE_SEL_IN 0x0a4 > > -#define DISP_REG_CONFIG_DSIO_SEL_IN 0x0a8 > > -#define DISP_REG_CONFIG_DPI_SEL_IN 0x0ac > > -#define DISP_REG_CONFIG_DISP_RDMA2_SOUT 0x0b8 > > -#define DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN 0x0c4 > > -#define DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN 0x0c8 > > -#define DISP_REG_CONFIG_MMSYS_CG_CON0 0x100 > > - > > -#define DISP_REG_CONFIG_DISP_OVL_MOUT_EN 0x030 > > -#define DISP_REG_CONFIG_OUT_SEL 0x04c > > -#define DISP_REG_CONFIG_DSI_SEL 0x050 > > -#define DISP_REG_CONFIG_DPI_SEL 0x064 > > - > > #define MT2701_DISP_MUTEX0_MOD0 0x2c > > #define MT2701_DISP_MUTEX0_SOF0 0x30 > > > > @@ -94,48 +74,6 @@ > > #define MUTEX_SOF_DSI2 5 > > #define MUTEX_SOF_DSI3 6 > > > > -#define OVL0_MOUT_EN_COLOR0 0x1 > > -#define OD_MOUT_EN_RDMA0 0x1 > > -#define OD1_MOUT_EN_RDMA1 BIT(16) > > -#define UFOE_MOUT_EN_DSI0 0x1 > > -#define COLOR0_SEL_IN_OVL0 0x1 > > -#define OVL1_MOUT_EN_COLOR1 0x1 > > -#define GAMMA_MOUT_EN_RDMA1 0x1 > > -#define RDMA0_SOUT_DPI0 0x2 > > -#define RDMA0_SOUT_DPI1 0x3 > > -#define RDMA0_SOUT_DSI1 0x1 > > -#define RDMA0_SOUT_DSI2 0x4 > > -#define RDMA0_SOUT_DSI3 0x5 > > -#define RDMA1_SOUT_DPI0 0x2 > > -#define RDMA1_SOUT_DPI1 0x3 > > -#define RDMA1_SOUT_DSI1 0x1 > > -#define RDMA1_SOUT_DSI2 0x4 > > -#define RDMA1_SOUT_DSI3 0x5 > > -#define RDMA2_SOUT_DPI0 0x2 > > -#define RDMA2_SOUT_DPI1 0x3 > > -#define RDMA2_SOUT_DSI1 0x1 > > -#define RDMA2_SOUT_DSI2 0x4 > > -#define RDMA2_SOUT_DSI3 0x5 > > -#define DPI0_SEL_IN_RDMA1 0x1 > > -#define DPI0_SEL_IN_RDMA2 0x3 > > -#define DPI1_SEL_IN_RDMA1 (0x1 << 8) > > -#define DPI1_SEL_IN_RDMA2 (0x3 << 8) > > -#define DSI0_SEL_IN_RDMA1 0x1 > > -#define DSI0_SEL_IN_RDMA2 0x4 > > -#define DSI1_SEL_IN_RDMA1 0x1 > > -#define DSI1_SEL_IN_RDMA2 0x4 > > -#define DSI2_SEL_IN_RDMA1 (0x1 << 16) > > -#define DSI2_SEL_IN_RDMA2 (0x4 << 16) > > -#define DSI3_SEL_IN_RDMA1 (0x1 << 16) > > -#define DSI3_SEL_IN_RDMA2 (0x4 << 16) > > -#define COLOR1_SEL_IN_OVL1 0x1 > > - > > -#define OVL_MOUT_EN_RDMA 0x1 > > -#define BLS_TO_DSI_RDMA1_TO_DPI1 0x8 > > -#define BLS_TO_DPI_RDMA1_TO_DSI 0x2 > > -#define DSI_SEL_IN_BLS 0x0 > > -#define DPI_SEL_IN_BLS 0x0 > > -#define DSI_SEL_IN_RDMA 0x1 > > > > struct mtk_disp_mutex { > > int id; > > @@ -246,200 +184,6 @@ static const struct mtk_ddp_data mt8173_ddp_driver_data = { > > .mutex_sof_reg = MT2701_DISP_MUTEX0_SOF0, > > }; > > > > -static unsigned int mtk_ddp_mout_en(enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next, > > - unsigned int *addr) > > -{ > > - unsigned int value; > > - > > - if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) { > > - *addr = DISP_REG_CONFIG_DISP_OVL0_MOUT_EN; > > - value = OVL0_MOUT_EN_COLOR0; > > - } else if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_RDMA0) { > > - *addr = DISP_REG_CONFIG_DISP_OVL_MOUT_EN; > > - value = OVL_MOUT_EN_RDMA; > > - } else if (cur == DDP_COMPONENT_OD0 && next == DDP_COMPONENT_RDMA0) { > > - *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN; > > - value = OD_MOUT_EN_RDMA0; > > - } else if (cur == DDP_COMPONENT_UFOE && next == DDP_COMPONENT_DSI0) { > > - *addr = DISP_REG_CONFIG_DISP_UFOE_MOUT_EN; > > - value = UFOE_MOUT_EN_DSI0; > > - } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) { > > - *addr = DISP_REG_CONFIG_DISP_OVL1_MOUT_EN; > > - value = OVL1_MOUT_EN_COLOR1; > > - } else if (cur == DDP_COMPONENT_GAMMA && next == DDP_COMPONENT_RDMA1) { > > - *addr = DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN; > > - value = GAMMA_MOUT_EN_RDMA1; > > - } else if (cur == DDP_COMPONENT_OD1 && next == DDP_COMPONENT_RDMA1) { > > - *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN; > > - value = OD1_MOUT_EN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DPI0; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DPI1; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DSI1; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DSI2; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DSI3; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DSI1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DSI2; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DSI3; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DPI0; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DPI1; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DPI0; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DPI1; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DSI1; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DSI2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DSI3; > > - } else { > > - value = 0; > > - } > > - > > - return value; > > -} > > - > > -static unsigned int mtk_ddp_sel_in(enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next, > > - unsigned int *addr) > > -{ > > - unsigned int value; > > - > > - if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) { > > - *addr = DISP_REG_CONFIG_DISP_COLOR0_SEL_IN; > > - value = COLOR0_SEL_IN_OVL0; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > - value = DPI0_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > - value = DPI1_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI0) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI0_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > - value = DSI1_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI2_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > - value = DSI3_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > - value = DPI0_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > - value = DPI1_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI0) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI0_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > - value = DSI1_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI2_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI3_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) { > > - *addr = DISP_REG_CONFIG_DISP_COLOR1_SEL_IN; > > - value = COLOR1_SEL_IN_OVL1; > > - } else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) { > > - *addr = DISP_REG_CONFIG_DSI_SEL; > > - value = DSI_SEL_IN_BLS; > > - } else { > > - value = 0; > > - } > > - > > - return value; > > -} > > - > > -static void mtk_ddp_sout_sel(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next) > > -{ > > - if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) { > > - writel_relaxed(BLS_TO_DSI_RDMA1_TO_DPI1, > > - config_regs + DISP_REG_CONFIG_OUT_SEL); > > - } else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DPI0) { > > - writel_relaxed(BLS_TO_DPI_RDMA1_TO_DSI, > > - config_regs + DISP_REG_CONFIG_OUT_SEL); > > - writel_relaxed(DSI_SEL_IN_RDMA, > > - config_regs + DISP_REG_CONFIG_DSI_SEL); > > - writel_relaxed(DPI_SEL_IN_BLS, > > - config_regs + DISP_REG_CONFIG_DPI_SEL); > > - } > > -} > > - > > -void mtk_ddp_add_comp_to_path(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next) > > -{ > > - unsigned int addr, value, reg; > > - > > - value = mtk_ddp_mout_en(cur, next, &addr); > > - if (value) { > > - reg = readl_relaxed(config_regs + addr) | value; > > - writel_relaxed(reg, config_regs + addr); > > - } > > - > > - mtk_ddp_sout_sel(config_regs, cur, next); > > - > > - value = mtk_ddp_sel_in(cur, next, &addr); > > - if (value) { > > - reg = readl_relaxed(config_regs + addr) | value; > > - writel_relaxed(reg, config_regs + addr); > > - } > > -} > > - > > -void mtk_ddp_remove_comp_from_path(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next) > > -{ > > - unsigned int addr, value, reg; > > - > > - value = mtk_ddp_mout_en(cur, next, &addr); > > - if (value) { > > - reg = readl_relaxed(config_regs + addr) & ~value; > > - writel_relaxed(reg, config_regs + addr); > > - } > > - > > - value = mtk_ddp_sel_in(cur, next, &addr); > > - if (value) { > > - reg = readl_relaxed(config_regs + addr) & ~value; > > - writel_relaxed(reg, config_regs + addr); > > - } > > -} > > - > > struct mtk_disp_mutex *mtk_disp_mutex_get(struct device *dev, unsigned int id) > > { > > struct mtk_ddp *ddp = dev_get_drvdata(dev); > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp.h > > index 827be424a148..6b691a57be4a 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp.h > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp.h > > @@ -12,13 +12,6 @@ struct regmap; > > struct device; > > struct mtk_disp_mutex; > > > > -void mtk_ddp_add_comp_to_path(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next); > > -void mtk_ddp_remove_comp_from_path(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next); > > - > > struct mtk_disp_mutex *mtk_disp_mutex_get(struct device *dev, unsigned int id); > > int mtk_disp_mutex_prepare(struct mtk_disp_mutex *mutex); > > void mtk_disp_mutex_add_comp(struct mtk_disp_mutex *mutex, > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > index 8e2d3cb62ad5..208f9c5256ef 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > @@ -10,6 +10,7 @@ > > #include > > #include > > #include > > +#include > > #include > > > > #include > > @@ -425,7 +426,6 @@ static int mtk_drm_probe(struct platform_device *pdev) > > { > > struct device *dev = &pdev->dev; > > struct mtk_drm_private *private; > > - struct resource *mem; > > struct device_node *node; > > struct component_match *match = NULL; > > int ret; > > @@ -436,14 +436,10 @@ static int mtk_drm_probe(struct platform_device *pdev) > > return -ENOMEM; > > > > private->data = of_device_get_match_data(dev); > > - > > - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > - private->config_regs = devm_ioremap_resource(dev, mem); > > - if (IS_ERR(private->config_regs)) { > > - ret = PTR_ERR(private->config_regs); > > - dev_err(dev, "Failed to ioremap mmsys-config resource: %d\n", > > - ret); > > - return ret; > > + private->mmsys_dev = dev->parent; > > + if (!private->mmsys_dev) { > > + dev_err(dev, "Failed to get MMSYS device\n"); > > + return -ENODEV; > > } > > > > /* Iterate over sibling DISP function blocks */ > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > index 17bc99b9f5d4..b5be63e53176 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > @@ -39,7 +39,7 @@ struct mtk_drm_private { > > > > struct device_node *mutex_node; > > struct device *mutex_dev; > > - void __iomem *config_regs; > > + struct device *mmsys_dev; > > struct device_node *comp_node[DDP_COMPONENT_ID_MAX]; > > struct mtk_ddp_comp *ddp_comp[DDP_COMPONENT_ID_MAX]; > > const struct mtk_mmsys_driver_data *data; > > diff --git a/drivers/soc/mediatek/mtk-mmsys.c b/drivers/soc/mediatek/mtk-mmsys.c > > index dbdfedd302fa..4b286b525cd3 100644 > > --- a/drivers/soc/mediatek/mtk-mmsys.c > > +++ b/drivers/soc/mediatek/mtk-mmsys.c > > @@ -5,8 +5,76 @@ > > */ > > > > #include > > +#include > > #include > > #include > > +#include > > + > > +#include "../../gpu/drm/mediatek/mtk_drm_ddp.h" > > +#include "../../gpu/drm/mediatek/mtk_drm_ddp_comp.h" > > + > > +#define DISP_REG_CONFIG_DISP_OVL0_MOUT_EN 0x040 > > +#define DISP_REG_CONFIG_DISP_OVL1_MOUT_EN 0x044 > > +#define DISP_REG_CONFIG_DISP_OD_MOUT_EN 0x048 > > +#define DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN 0x04c > > +#define DISP_REG_CONFIG_DISP_UFOE_MOUT_EN 0x050 > > +#define DISP_REG_CONFIG_DISP_COLOR0_SEL_IN 0x084 > > +#define DISP_REG_CONFIG_DISP_COLOR1_SEL_IN 0x088 > > +#define DISP_REG_CONFIG_DSIE_SEL_IN 0x0a4 > > +#define DISP_REG_CONFIG_DSIO_SEL_IN 0x0a8 > > +#define DISP_REG_CONFIG_DPI_SEL_IN 0x0ac > > +#define DISP_REG_CONFIG_DISP_RDMA2_SOUT 0x0b8 > > +#define DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN 0x0c4 > > +#define DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN 0x0c8 > > +#define DISP_REG_CONFIG_MMSYS_CG_CON0 0x100 > > + > > +#define DISP_REG_CONFIG_DISP_OVL_MOUT_EN 0x030 > > +#define DISP_REG_CONFIG_OUT_SEL 0x04c > > +#define DISP_REG_CONFIG_DSI_SEL 0x050 > > +#define DISP_REG_CONFIG_DPI_SEL 0x064 > > + > > +#define OVL0_MOUT_EN_COLOR0 0x1 > > +#define OD_MOUT_EN_RDMA0 0x1 > > +#define OD1_MOUT_EN_RDMA1 BIT(16) > > +#define UFOE_MOUT_EN_DSI0 0x1 > > +#define COLOR0_SEL_IN_OVL0 0x1 > > +#define OVL1_MOUT_EN_COLOR1 0x1 > > +#define GAMMA_MOUT_EN_RDMA1 0x1 > > +#define RDMA0_SOUT_DPI0 0x2 > > +#define RDMA0_SOUT_DPI1 0x3 > > +#define RDMA0_SOUT_DSI1 0x1 > > +#define RDMA0_SOUT_DSI2 0x4 > > +#define RDMA0_SOUT_DSI3 0x5 > > +#define RDMA1_SOUT_DPI0 0x2 > > +#define RDMA1_SOUT_DPI1 0x3 > > +#define RDMA1_SOUT_DSI1 0x1 > > +#define RDMA1_SOUT_DSI2 0x4 > > +#define RDMA1_SOUT_DSI3 0x5 > > +#define RDMA2_SOUT_DPI0 0x2 > > +#define RDMA2_SOUT_DPI1 0x3 > > +#define RDMA2_SOUT_DSI1 0x1 > > +#define RDMA2_SOUT_DSI2 0x4 > > +#define RDMA2_SOUT_DSI3 0x5 > > +#define DPI0_SEL_IN_RDMA1 0x1 > > +#define DPI0_SEL_IN_RDMA2 0x3 > > +#define DPI1_SEL_IN_RDMA1 (0x1 << 8) > > +#define DPI1_SEL_IN_RDMA2 (0x3 << 8) > > +#define DSI0_SEL_IN_RDMA1 0x1 > > +#define DSI0_SEL_IN_RDMA2 0x4 > > +#define DSI1_SEL_IN_RDMA1 0x1 > > +#define DSI1_SEL_IN_RDMA2 0x4 > > +#define DSI2_SEL_IN_RDMA1 (0x1 << 16) > > +#define DSI2_SEL_IN_RDMA2 (0x4 << 16) > > +#define DSI3_SEL_IN_RDMA1 (0x1 << 16) > > +#define DSI3_SEL_IN_RDMA2 (0x4 << 16) > > +#define COLOR1_SEL_IN_OVL1 0x1 > > + > > +#define OVL_MOUT_EN_RDMA 0x1 > > +#define BLS_TO_DSI_RDMA1_TO_DPI1 0x8 > > +#define BLS_TO_DPI_RDMA1_TO_DSI 0x2 > > +#define DSI_SEL_IN_BLS 0x0 > > +#define DPI_SEL_IN_BLS 0x0 > > +#define DSI_SEL_IN_RDMA 0x1 > > > > struct mtk_mmsys_driver_data { > > const char *clk_driver; > > @@ -16,10 +84,221 @@ static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = { > > .clk_driver = "clk-mt8173-mm", > > }; > > > > +static unsigned int mtk_mmsys_ddp_mout_en(enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next, > > + unsigned int *addr) > > +{ > > + unsigned int value; > > + > > + if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) { > > + *addr = DISP_REG_CONFIG_DISP_OVL0_MOUT_EN; > > + value = OVL0_MOUT_EN_COLOR0; > > + } else if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_RDMA0) { > > + *addr = DISP_REG_CONFIG_DISP_OVL_MOUT_EN; > > + value = OVL_MOUT_EN_RDMA; > > + } else if (cur == DDP_COMPONENT_OD0 && next == DDP_COMPONENT_RDMA0) { > > + *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN; > > + value = OD_MOUT_EN_RDMA0; > > + } else if (cur == DDP_COMPONENT_UFOE && next == DDP_COMPONENT_DSI0) { > > + *addr = DISP_REG_CONFIG_DISP_UFOE_MOUT_EN; > > + value = UFOE_MOUT_EN_DSI0; > > + } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) { > > + *addr = DISP_REG_CONFIG_DISP_OVL1_MOUT_EN; > > + value = OVL1_MOUT_EN_COLOR1; > > + } else if (cur == DDP_COMPONENT_GAMMA && next == DDP_COMPONENT_RDMA1) { > > + *addr = DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN; > > + value = GAMMA_MOUT_EN_RDMA1; > > + } else if (cur == DDP_COMPONENT_OD1 && next == DDP_COMPONENT_RDMA1) { > > + *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN; > > + value = OD1_MOUT_EN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DPI0; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DPI1; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DSI1; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DSI2; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DSI3; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DSI1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DSI2; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DSI3; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DPI0; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DPI1; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DPI0; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DPI1; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DSI1; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DSI2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DSI3; > > + } else { > > + value = 0; > > + } > > + > > + return value; > > +} > > + > > +static unsigned int mtk_mmsys_ddp_sel_in(enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next, > > + unsigned int *addr) > > +{ > > + unsigned int value; > > + > > + if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) { > > + *addr = DISP_REG_CONFIG_DISP_COLOR0_SEL_IN; > > + value = COLOR0_SEL_IN_OVL0; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > + value = DPI0_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > + value = DPI1_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI0) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI0_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > + value = DSI1_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI2_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > + value = DSI3_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > + value = DPI0_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > + value = DPI1_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI0) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI0_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > + value = DSI1_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI2_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI3_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) { > > + *addr = DISP_REG_CONFIG_DISP_COLOR1_SEL_IN; > > + value = COLOR1_SEL_IN_OVL1; > > + } else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) { > > + *addr = DISP_REG_CONFIG_DSI_SEL; > > + value = DSI_SEL_IN_BLS; > > + } else { > > + value = 0; > > + } > > + > > + return value; > > +} > > + > > +static void mtk_mmsys_ddp_sout_sel(void __iomem *config_regs, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next) > > +{ > > + if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) { > > + writel_relaxed(BLS_TO_DSI_RDMA1_TO_DPI1, > > + config_regs + DISP_REG_CONFIG_OUT_SEL); > > + } else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DPI0) { > > + writel_relaxed(BLS_TO_DPI_RDMA1_TO_DSI, > > + config_regs + DISP_REG_CONFIG_OUT_SEL); > > + writel_relaxed(DSI_SEL_IN_RDMA, > > + config_regs + DISP_REG_CONFIG_DSI_SEL); > > + writel_relaxed(DPI_SEL_IN_BLS, > > + config_regs + DISP_REG_CONFIG_DPI_SEL); > > + } > > +} > > + > > +void mtk_mmsys_ddp_connect(struct device *dev, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next) > > +{ > > + void __iomem *config_regs = dev_get_drvdata(dev); > > + unsigned int addr, value, reg; > > + > > + value = mtk_mmsys_ddp_mout_en(cur, next, &addr); > > + if (value) { > > + reg = readl_relaxed(config_regs + addr) | value; > > + writel_relaxed(reg, config_regs + addr); > > + } > > + > > + mtk_mmsys_ddp_sout_sel(config_regs, cur, next); > > + > > + value = mtk_mmsys_ddp_sel_in(cur, next, &addr); > > + if (value) { > > + reg = readl_relaxed(config_regs + addr) | value; > > + writel_relaxed(reg, config_regs + addr); > > + } > > +} > > + > > +void mtk_mmsys_ddp_disconnect(struct device *dev, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next) > > +{ > > + void __iomem *config_regs = dev_get_drvdata(dev); > > + unsigned int addr, value, reg; > > + > > + value = mtk_mmsys_ddp_mout_en(cur, next, &addr); > > + if (value) { > > + reg = readl_relaxed(config_regs + addr) & ~value; > > + writel_relaxed(reg, config_regs + addr); > > + } > > + > > + value = mtk_mmsys_ddp_sel_in(cur, next, &addr); > > + if (value) { > > + reg = readl_relaxed(config_regs + addr) & ~value; > > + writel_relaxed(reg, config_regs + addr); > > + } > > +} > > + > > static int mtk_mmsys_probe(struct platform_device *pdev) > > { > > const struct mtk_mmsys_driver_data *data; > > + struct device *dev = &pdev->dev; > > struct platform_device *clks; > > + void __iomem *config_regs; > > + struct resource *mem; > > + int ret; > > + > > + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > + config_regs = devm_ioremap_resource(dev, mem); > > + if (IS_ERR(config_regs)) { > > + ret = PTR_ERR(config_regs); > > + dev_err(dev, "Failed to ioremap mmsys-config resource: %d\n", > > + ret); > > + return ret; > > + } > > + > > + platform_set_drvdata(pdev, config_regs); > > > > data = of_device_get_match_data(&pdev->dev); > > > > diff --git a/include/linux/soc/mediatek/mtk-mmsys.h b/include/linux/soc/mediatek/mtk-mmsys.h > > new file mode 100644 > > index 000000000000..7bab5d9a3d31 > > --- /dev/null > > +++ b/include/linux/soc/mediatek/mtk-mmsys.h > > @@ -0,0 +1,20 @@ > > +/* SPDX-License-Identifier: GPL-2.0-only */ > > +/* > > + * Copyright (c) 2015 MediaTek Inc. > > + */ > > + > > +#ifndef __MTK_MMSYS_H > > +#define __MTK_MMSYS_H > > + > > +enum mtk_ddp_comp_id; > > +struct device; > > + > > +void mtk_mmsys_ddp_connect(struct device *dev, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next); > > + > > +void mtk_mmsys_ddp_disconnect(struct device *dev, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next); > > + > > +#endif /* __MTK_MMSYS_H */ > > _______________________________________________ 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 X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A13A0C43331 for ; Wed, 25 Mar 2020 23:05:46 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 6D12520737 for ; Wed, 25 Mar 2020 23:05:46 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="jE/EiD31"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="mJRqTPBz" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6D12520737 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date: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=FO6wC4ZhX1v1NsYkVMiVMp/FGH1mOx4nIWjabSzeeTc=; b=jE/EiD31JH0B71 4TFhk87CAZ/5LuEeyKmx2HUBJb9+/JnZO41UHwWOFwkZACgk+uHLyf3k2lfofGdG5r8kAW9ldENp5 BjCB7+4xsjgb7td1lCtgW1kT/OKoxbUKu+rWlQLBlCbLG9HiCH+qb1QVgSZ2DO5ImHfW0bBsFWEEZ Ym4jwPy0MT/jvHBd3Mxp27HuKvOE1TJIl8+i5FUcm558QfOsZ/Kyilz/8RvA7oUJ5ORUZmVS7D/QA JrSSE8zxrglAQrqtBeuyiACv1qI6HENzQOVnxRBXgU89dxpaegq0o72HQuL734TxwKeDa2PHvkoQ+ aZk80gWiUE8ZsZGSXpuw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jHF5l-0002G1-3r; Wed, 25 Mar 2020 23:05:45 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jHF5g-0002FY-Hj; Wed, 25 Mar 2020 23:05:43 +0000 X-UUID: 0e821f2a58a74552bbb89a0f18924792-20200325 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=Dbph2QdkGB9v/7fOd6SwtLCWAnmMbcWZXZeUDFh9xKk=; b=mJRqTPBzSr0POGeLpIbQnO8Kx0ymGxNtgscZeRFpJKm/043i2s5Np03n1IW3Hwj2IvxGz9Cj9smoBtZZaLH9JCAorDOxb4Ya8BNZwqq0pQd0KGgpMOnIFSZbKrtSB3IopFdtNo7ucaijy9zpsd2RpXaGRSQoQ6nglBCX7Zqjbx4=; X-UUID: 0e821f2a58a74552bbb89a0f18924792-20200325 Received: from mtkcas68.mediatek.inc [(172.29.94.19)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1842101904; Wed, 25 Mar 2020 15:05:38 -0800 Received: from mtkcas09.mediatek.inc (172.21.101.178) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 25 Mar 2020 16:05:35 -0700 Received: from [172.21.77.4] (172.21.77.4) by mtkcas09.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Thu, 26 Mar 2020 07:05:32 +0800 Message-ID: <1585177534.26117.4.camel@mtksdaap41> Subject: Re: [PATCH v12 4/5] soc / drm: mediatek: Move routing control to mmsys device From: CK Hu To: Matthias Brugger Date: Thu, 26 Mar 2020 07:05:34 +0800 In-Reply-To: <02290a21-7392-a2cf-576c-215091ec05e8@suse.com> References: <20200311165322.1594233-1-enric.balletbo@collabora.com> <20200311165322.1594233-5-enric.balletbo@collabora.com> <02290a21-7392-a2cf-576c-215091ec05e8@suse.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200325_160540_614616_A58CD391 X-CRM114-Status: GOOD ( 24.93 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, Kate Stewart , Minghsiu Tsai , Andrew-CT Chen , airlied@linux.ie, mturquette@baylibre.com, dri-devel@lists.freedesktop.org, Richard Fontana , laurent.pinchart@ideasonboard.com, ulrich.hecht+renesas@gmail.com, Collabora Kernel ML , linux-clk@vger.kernel.org, Weiyi Lu , wens@csie.org, linux-arm-kernel@lists.infradead.org, mtk01761 , linux-media@vger.kernel.org, devicetree@vger.kernel.org, Daniel Vetter , frank-w@public-files.de, Seiya Wang , sean.wang@mediatek.com, Houlong Wei , robh+dt@kernel.org, linux-mediatek@lists.infradead.org, hsinyi@chromium.org, Matthias Brugger , Thomas Gleixner , Mauro Carvalho Chehab , Allison Randal , sboyd@kernel.org, Greg Kroah-Hartman , rdunlap@infradead.org, linux-kernel@vger.kernel.org, p.zabel@pengutronix.de, matthias.bgg@kernel.org, Enric Balletbo i Serra Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi, Matthias: On Wed, 2020-03-25 at 17:16 +0100, Matthias Brugger wrote: > > On 11/03/2020 17:53, Enric Balletbo i Serra wrote: > > Provide a mtk_mmsys_ddp_connect() and mtk_mmsys_disconnect() functions to > > replace mtk_ddp_add_comp_to_path() and mtk_ddp_remove_comp_from_path(). > > Those functions will allow DRM driver and others to control the data > > path routing. > > > > Signed-off-by: Enric Balletbo i Serra > > Reviewed-by: Matthias Brugger > > Reviewed-by: CK Hu > > Acked-by: CK Hu > > This patch does not apply against v5.6-rc1. > Please rebase as this is a quite big patch and it won't be easy to do that by hand. I think this patch depends on [1] which has been acked by me and I have not picked it. The simple way is that you pick [1] first and then pick this series. [1] https://patchwork.kernel.org/patch/11406227/ Regards, CK > > Regards, > Matthias > > > --- > > > > Changes in v12: None > > Changes in v10: > > - Select CONFIG_MTK_MMSYS (CK) > > - Pass device pointer of mmsys device instead of config regs (CK) > > > > Changes in v9: > > - Introduced a new patch to move routing control into mmsys driver. > > - Removed the patch to use regmap as is not needed anymore. > > > > Changes in v8: None > > Changes in v7: None > > > > drivers/gpu/drm/mediatek/Kconfig | 1 + > > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 19 +- > > drivers/gpu/drm/mediatek/mtk_drm_ddp.c | 256 ---------------------- > > drivers/gpu/drm/mediatek/mtk_drm_ddp.h | 7 - > > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 14 +- > > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 2 +- > > drivers/soc/mediatek/mtk-mmsys.c | 279 ++++++++++++++++++++++++ > > include/linux/soc/mediatek/mtk-mmsys.h | 20 ++ > > 8 files changed, 316 insertions(+), 282 deletions(-) > > create mode 100644 include/linux/soc/mediatek/mtk-mmsys.h > > > > diff --git a/drivers/gpu/drm/mediatek/Kconfig b/drivers/gpu/drm/mediatek/Kconfig > > index fa5ffc4fe823..c420f5a3d33b 100644 > > --- a/drivers/gpu/drm/mediatek/Kconfig > > +++ b/drivers/gpu/drm/mediatek/Kconfig > > @@ -11,6 +11,7 @@ config DRM_MEDIATEK > > select DRM_MIPI_DSI > > select DRM_PANEL > > select MEMORY > > + select MTK_MMSYS > > select MTK_SMI > > select VIDEOMODE_HELPERS > > help > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > index 0e05683d7b53..579a5a5d4472 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > @@ -6,6 +6,7 @@ > > #include > > #include > > #include > > +#include > > > > #include > > #include > > @@ -28,7 +29,7 @@ > > * @enabled: records whether crtc_enable succeeded > > * @planes: array of 4 drm_plane structures, one for each overlay plane > > * @pending_planes: whether any plane has pending changes to be applied > > - * @config_regs: memory mapped mmsys configuration register space > > + * @mmsys_dev: pointer to the mmsys device for configuration registers > > * @mutex: handle to one of the ten disp_mutex streams > > * @ddp_comp_nr: number of components in ddp_comp > > * @ddp_comp: array of pointers the mtk_ddp_comp structures used by this crtc > > @@ -50,7 +51,7 @@ struct mtk_drm_crtc { > > u32 cmdq_event; > > #endif > > > > - void __iomem *config_regs; > > + struct device *mmsys_dev; > > struct mtk_disp_mutex *mutex; > > unsigned int ddp_comp_nr; > > struct mtk_ddp_comp **ddp_comp; > > @@ -296,9 +297,9 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) > > } > > > > for (i = 0; i < mtk_crtc->ddp_comp_nr - 1; i++) { > > - mtk_ddp_add_comp_to_path(mtk_crtc->config_regs, > > - mtk_crtc->ddp_comp[i]->id, > > - mtk_crtc->ddp_comp[i + 1]->id); > > + mtk_mmsys_ddp_connect(mtk_crtc->mmsys_dev, > > + mtk_crtc->ddp_comp[i]->id, > > + mtk_crtc->ddp_comp[i + 1]->id); > > mtk_disp_mutex_add_comp(mtk_crtc->mutex, > > mtk_crtc->ddp_comp[i]->id); > > } > > @@ -355,9 +356,9 @@ static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc) > > mtk_crtc->ddp_comp[i]->id); > > mtk_disp_mutex_disable(mtk_crtc->mutex); > > for (i = 0; i < mtk_crtc->ddp_comp_nr - 1; i++) { > > - mtk_ddp_remove_comp_from_path(mtk_crtc->config_regs, > > - mtk_crtc->ddp_comp[i]->id, > > - mtk_crtc->ddp_comp[i + 1]->id); > > + mtk_mmsys_ddp_disconnect(mtk_crtc->mmsys_dev, > > + mtk_crtc->ddp_comp[i]->id, > > + mtk_crtc->ddp_comp[i + 1]->id); > > mtk_disp_mutex_remove_comp(mtk_crtc->mutex, > > mtk_crtc->ddp_comp[i]->id); > > } > > @@ -761,7 +762,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, > > if (!mtk_crtc) > > return -ENOMEM; > > > > - mtk_crtc->config_regs = priv->config_regs; > > + mtk_crtc->mmsys_dev = priv->mmsys_dev; > > mtk_crtc->ddp_comp_nr = path_len; > > mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc->ddp_comp_nr, > > sizeof(*mtk_crtc->ddp_comp), > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > index b885f60f474c..014c1bbe1df2 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > @@ -13,26 +13,6 @@ > > #include "mtk_drm_ddp.h" > > #include "mtk_drm_ddp_comp.h" > > > > -#define DISP_REG_CONFIG_DISP_OVL0_MOUT_EN 0x040 > > -#define DISP_REG_CONFIG_DISP_OVL1_MOUT_EN 0x044 > > -#define DISP_REG_CONFIG_DISP_OD_MOUT_EN 0x048 > > -#define DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN 0x04c > > -#define DISP_REG_CONFIG_DISP_UFOE_MOUT_EN 0x050 > > -#define DISP_REG_CONFIG_DISP_COLOR0_SEL_IN 0x084 > > -#define DISP_REG_CONFIG_DISP_COLOR1_SEL_IN 0x088 > > -#define DISP_REG_CONFIG_DSIE_SEL_IN 0x0a4 > > -#define DISP_REG_CONFIG_DSIO_SEL_IN 0x0a8 > > -#define DISP_REG_CONFIG_DPI_SEL_IN 0x0ac > > -#define DISP_REG_CONFIG_DISP_RDMA2_SOUT 0x0b8 > > -#define DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN 0x0c4 > > -#define DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN 0x0c8 > > -#define DISP_REG_CONFIG_MMSYS_CG_CON0 0x100 > > - > > -#define DISP_REG_CONFIG_DISP_OVL_MOUT_EN 0x030 > > -#define DISP_REG_CONFIG_OUT_SEL 0x04c > > -#define DISP_REG_CONFIG_DSI_SEL 0x050 > > -#define DISP_REG_CONFIG_DPI_SEL 0x064 > > - > > #define MT2701_DISP_MUTEX0_MOD0 0x2c > > #define MT2701_DISP_MUTEX0_SOF0 0x30 > > > > @@ -94,48 +74,6 @@ > > #define MUTEX_SOF_DSI2 5 > > #define MUTEX_SOF_DSI3 6 > > > > -#define OVL0_MOUT_EN_COLOR0 0x1 > > -#define OD_MOUT_EN_RDMA0 0x1 > > -#define OD1_MOUT_EN_RDMA1 BIT(16) > > -#define UFOE_MOUT_EN_DSI0 0x1 > > -#define COLOR0_SEL_IN_OVL0 0x1 > > -#define OVL1_MOUT_EN_COLOR1 0x1 > > -#define GAMMA_MOUT_EN_RDMA1 0x1 > > -#define RDMA0_SOUT_DPI0 0x2 > > -#define RDMA0_SOUT_DPI1 0x3 > > -#define RDMA0_SOUT_DSI1 0x1 > > -#define RDMA0_SOUT_DSI2 0x4 > > -#define RDMA0_SOUT_DSI3 0x5 > > -#define RDMA1_SOUT_DPI0 0x2 > > -#define RDMA1_SOUT_DPI1 0x3 > > -#define RDMA1_SOUT_DSI1 0x1 > > -#define RDMA1_SOUT_DSI2 0x4 > > -#define RDMA1_SOUT_DSI3 0x5 > > -#define RDMA2_SOUT_DPI0 0x2 > > -#define RDMA2_SOUT_DPI1 0x3 > > -#define RDMA2_SOUT_DSI1 0x1 > > -#define RDMA2_SOUT_DSI2 0x4 > > -#define RDMA2_SOUT_DSI3 0x5 > > -#define DPI0_SEL_IN_RDMA1 0x1 > > -#define DPI0_SEL_IN_RDMA2 0x3 > > -#define DPI1_SEL_IN_RDMA1 (0x1 << 8) > > -#define DPI1_SEL_IN_RDMA2 (0x3 << 8) > > -#define DSI0_SEL_IN_RDMA1 0x1 > > -#define DSI0_SEL_IN_RDMA2 0x4 > > -#define DSI1_SEL_IN_RDMA1 0x1 > > -#define DSI1_SEL_IN_RDMA2 0x4 > > -#define DSI2_SEL_IN_RDMA1 (0x1 << 16) > > -#define DSI2_SEL_IN_RDMA2 (0x4 << 16) > > -#define DSI3_SEL_IN_RDMA1 (0x1 << 16) > > -#define DSI3_SEL_IN_RDMA2 (0x4 << 16) > > -#define COLOR1_SEL_IN_OVL1 0x1 > > - > > -#define OVL_MOUT_EN_RDMA 0x1 > > -#define BLS_TO_DSI_RDMA1_TO_DPI1 0x8 > > -#define BLS_TO_DPI_RDMA1_TO_DSI 0x2 > > -#define DSI_SEL_IN_BLS 0x0 > > -#define DPI_SEL_IN_BLS 0x0 > > -#define DSI_SEL_IN_RDMA 0x1 > > > > struct mtk_disp_mutex { > > int id; > > @@ -246,200 +184,6 @@ static const struct mtk_ddp_data mt8173_ddp_driver_data = { > > .mutex_sof_reg = MT2701_DISP_MUTEX0_SOF0, > > }; > > > > -static unsigned int mtk_ddp_mout_en(enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next, > > - unsigned int *addr) > > -{ > > - unsigned int value; > > - > > - if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) { > > - *addr = DISP_REG_CONFIG_DISP_OVL0_MOUT_EN; > > - value = OVL0_MOUT_EN_COLOR0; > > - } else if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_RDMA0) { > > - *addr = DISP_REG_CONFIG_DISP_OVL_MOUT_EN; > > - value = OVL_MOUT_EN_RDMA; > > - } else if (cur == DDP_COMPONENT_OD0 && next == DDP_COMPONENT_RDMA0) { > > - *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN; > > - value = OD_MOUT_EN_RDMA0; > > - } else if (cur == DDP_COMPONENT_UFOE && next == DDP_COMPONENT_DSI0) { > > - *addr = DISP_REG_CONFIG_DISP_UFOE_MOUT_EN; > > - value = UFOE_MOUT_EN_DSI0; > > - } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) { > > - *addr = DISP_REG_CONFIG_DISP_OVL1_MOUT_EN; > > - value = OVL1_MOUT_EN_COLOR1; > > - } else if (cur == DDP_COMPONENT_GAMMA && next == DDP_COMPONENT_RDMA1) { > > - *addr = DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN; > > - value = GAMMA_MOUT_EN_RDMA1; > > - } else if (cur == DDP_COMPONENT_OD1 && next == DDP_COMPONENT_RDMA1) { > > - *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN; > > - value = OD1_MOUT_EN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DPI0; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DPI1; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DSI1; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DSI2; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DSI3; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DSI1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DSI2; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DSI3; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DPI0; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DPI1; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DPI0; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DPI1; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DSI1; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DSI2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DSI3; > > - } else { > > - value = 0; > > - } > > - > > - return value; > > -} > > - > > -static unsigned int mtk_ddp_sel_in(enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next, > > - unsigned int *addr) > > -{ > > - unsigned int value; > > - > > - if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) { > > - *addr = DISP_REG_CONFIG_DISP_COLOR0_SEL_IN; > > - value = COLOR0_SEL_IN_OVL0; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > - value = DPI0_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > - value = DPI1_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI0) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI0_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > - value = DSI1_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI2_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > - value = DSI3_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > - value = DPI0_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > - value = DPI1_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI0) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI0_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > - value = DSI1_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI2_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI3_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) { > > - *addr = DISP_REG_CONFIG_DISP_COLOR1_SEL_IN; > > - value = COLOR1_SEL_IN_OVL1; > > - } else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) { > > - *addr = DISP_REG_CONFIG_DSI_SEL; > > - value = DSI_SEL_IN_BLS; > > - } else { > > - value = 0; > > - } > > - > > - return value; > > -} > > - > > -static void mtk_ddp_sout_sel(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next) > > -{ > > - if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) { > > - writel_relaxed(BLS_TO_DSI_RDMA1_TO_DPI1, > > - config_regs + DISP_REG_CONFIG_OUT_SEL); > > - } else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DPI0) { > > - writel_relaxed(BLS_TO_DPI_RDMA1_TO_DSI, > > - config_regs + DISP_REG_CONFIG_OUT_SEL); > > - writel_relaxed(DSI_SEL_IN_RDMA, > > - config_regs + DISP_REG_CONFIG_DSI_SEL); > > - writel_relaxed(DPI_SEL_IN_BLS, > > - config_regs + DISP_REG_CONFIG_DPI_SEL); > > - } > > -} > > - > > -void mtk_ddp_add_comp_to_path(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next) > > -{ > > - unsigned int addr, value, reg; > > - > > - value = mtk_ddp_mout_en(cur, next, &addr); > > - if (value) { > > - reg = readl_relaxed(config_regs + addr) | value; > > - writel_relaxed(reg, config_regs + addr); > > - } > > - > > - mtk_ddp_sout_sel(config_regs, cur, next); > > - > > - value = mtk_ddp_sel_in(cur, next, &addr); > > - if (value) { > > - reg = readl_relaxed(config_regs + addr) | value; > > - writel_relaxed(reg, config_regs + addr); > > - } > > -} > > - > > -void mtk_ddp_remove_comp_from_path(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next) > > -{ > > - unsigned int addr, value, reg; > > - > > - value = mtk_ddp_mout_en(cur, next, &addr); > > - if (value) { > > - reg = readl_relaxed(config_regs + addr) & ~value; > > - writel_relaxed(reg, config_regs + addr); > > - } > > - > > - value = mtk_ddp_sel_in(cur, next, &addr); > > - if (value) { > > - reg = readl_relaxed(config_regs + addr) & ~value; > > - writel_relaxed(reg, config_regs + addr); > > - } > > -} > > - > > struct mtk_disp_mutex *mtk_disp_mutex_get(struct device *dev, unsigned int id) > > { > > struct mtk_ddp *ddp = dev_get_drvdata(dev); > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp.h > > index 827be424a148..6b691a57be4a 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp.h > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp.h > > @@ -12,13 +12,6 @@ struct regmap; > > struct device; > > struct mtk_disp_mutex; > > > > -void mtk_ddp_add_comp_to_path(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next); > > -void mtk_ddp_remove_comp_from_path(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next); > > - > > struct mtk_disp_mutex *mtk_disp_mutex_get(struct device *dev, unsigned int id); > > int mtk_disp_mutex_prepare(struct mtk_disp_mutex *mutex); > > void mtk_disp_mutex_add_comp(struct mtk_disp_mutex *mutex, > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > index 8e2d3cb62ad5..208f9c5256ef 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > @@ -10,6 +10,7 @@ > > #include > > #include > > #include > > +#include > > #include > > > > #include > > @@ -425,7 +426,6 @@ static int mtk_drm_probe(struct platform_device *pdev) > > { > > struct device *dev = &pdev->dev; > > struct mtk_drm_private *private; > > - struct resource *mem; > > struct device_node *node; > > struct component_match *match = NULL; > > int ret; > > @@ -436,14 +436,10 @@ static int mtk_drm_probe(struct platform_device *pdev) > > return -ENOMEM; > > > > private->data = of_device_get_match_data(dev); > > - > > - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > - private->config_regs = devm_ioremap_resource(dev, mem); > > - if (IS_ERR(private->config_regs)) { > > - ret = PTR_ERR(private->config_regs); > > - dev_err(dev, "Failed to ioremap mmsys-config resource: %d\n", > > - ret); > > - return ret; > > + private->mmsys_dev = dev->parent; > > + if (!private->mmsys_dev) { > > + dev_err(dev, "Failed to get MMSYS device\n"); > > + return -ENODEV; > > } > > > > /* Iterate over sibling DISP function blocks */ > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > index 17bc99b9f5d4..b5be63e53176 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > @@ -39,7 +39,7 @@ struct mtk_drm_private { > > > > struct device_node *mutex_node; > > struct device *mutex_dev; > > - void __iomem *config_regs; > > + struct device *mmsys_dev; > > struct device_node *comp_node[DDP_COMPONENT_ID_MAX]; > > struct mtk_ddp_comp *ddp_comp[DDP_COMPONENT_ID_MAX]; > > const struct mtk_mmsys_driver_data *data; > > diff --git a/drivers/soc/mediatek/mtk-mmsys.c b/drivers/soc/mediatek/mtk-mmsys.c > > index dbdfedd302fa..4b286b525cd3 100644 > > --- a/drivers/soc/mediatek/mtk-mmsys.c > > +++ b/drivers/soc/mediatek/mtk-mmsys.c > > @@ -5,8 +5,76 @@ > > */ > > > > #include > > +#include > > #include > > #include > > +#include > > + > > +#include "../../gpu/drm/mediatek/mtk_drm_ddp.h" > > +#include "../../gpu/drm/mediatek/mtk_drm_ddp_comp.h" > > + > > +#define DISP_REG_CONFIG_DISP_OVL0_MOUT_EN 0x040 > > +#define DISP_REG_CONFIG_DISP_OVL1_MOUT_EN 0x044 > > +#define DISP_REG_CONFIG_DISP_OD_MOUT_EN 0x048 > > +#define DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN 0x04c > > +#define DISP_REG_CONFIG_DISP_UFOE_MOUT_EN 0x050 > > +#define DISP_REG_CONFIG_DISP_COLOR0_SEL_IN 0x084 > > +#define DISP_REG_CONFIG_DISP_COLOR1_SEL_IN 0x088 > > +#define DISP_REG_CONFIG_DSIE_SEL_IN 0x0a4 > > +#define DISP_REG_CONFIG_DSIO_SEL_IN 0x0a8 > > +#define DISP_REG_CONFIG_DPI_SEL_IN 0x0ac > > +#define DISP_REG_CONFIG_DISP_RDMA2_SOUT 0x0b8 > > +#define DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN 0x0c4 > > +#define DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN 0x0c8 > > +#define DISP_REG_CONFIG_MMSYS_CG_CON0 0x100 > > + > > +#define DISP_REG_CONFIG_DISP_OVL_MOUT_EN 0x030 > > +#define DISP_REG_CONFIG_OUT_SEL 0x04c > > +#define DISP_REG_CONFIG_DSI_SEL 0x050 > > +#define DISP_REG_CONFIG_DPI_SEL 0x064 > > + > > +#define OVL0_MOUT_EN_COLOR0 0x1 > > +#define OD_MOUT_EN_RDMA0 0x1 > > +#define OD1_MOUT_EN_RDMA1 BIT(16) > > +#define UFOE_MOUT_EN_DSI0 0x1 > > +#define COLOR0_SEL_IN_OVL0 0x1 > > +#define OVL1_MOUT_EN_COLOR1 0x1 > > +#define GAMMA_MOUT_EN_RDMA1 0x1 > > +#define RDMA0_SOUT_DPI0 0x2 > > +#define RDMA0_SOUT_DPI1 0x3 > > +#define RDMA0_SOUT_DSI1 0x1 > > +#define RDMA0_SOUT_DSI2 0x4 > > +#define RDMA0_SOUT_DSI3 0x5 > > +#define RDMA1_SOUT_DPI0 0x2 > > +#define RDMA1_SOUT_DPI1 0x3 > > +#define RDMA1_SOUT_DSI1 0x1 > > +#define RDMA1_SOUT_DSI2 0x4 > > +#define RDMA1_SOUT_DSI3 0x5 > > +#define RDMA2_SOUT_DPI0 0x2 > > +#define RDMA2_SOUT_DPI1 0x3 > > +#define RDMA2_SOUT_DSI1 0x1 > > +#define RDMA2_SOUT_DSI2 0x4 > > +#define RDMA2_SOUT_DSI3 0x5 > > +#define DPI0_SEL_IN_RDMA1 0x1 > > +#define DPI0_SEL_IN_RDMA2 0x3 > > +#define DPI1_SEL_IN_RDMA1 (0x1 << 8) > > +#define DPI1_SEL_IN_RDMA2 (0x3 << 8) > > +#define DSI0_SEL_IN_RDMA1 0x1 > > +#define DSI0_SEL_IN_RDMA2 0x4 > > +#define DSI1_SEL_IN_RDMA1 0x1 > > +#define DSI1_SEL_IN_RDMA2 0x4 > > +#define DSI2_SEL_IN_RDMA1 (0x1 << 16) > > +#define DSI2_SEL_IN_RDMA2 (0x4 << 16) > > +#define DSI3_SEL_IN_RDMA1 (0x1 << 16) > > +#define DSI3_SEL_IN_RDMA2 (0x4 << 16) > > +#define COLOR1_SEL_IN_OVL1 0x1 > > + > > +#define OVL_MOUT_EN_RDMA 0x1 > > +#define BLS_TO_DSI_RDMA1_TO_DPI1 0x8 > > +#define BLS_TO_DPI_RDMA1_TO_DSI 0x2 > > +#define DSI_SEL_IN_BLS 0x0 > > +#define DPI_SEL_IN_BLS 0x0 > > +#define DSI_SEL_IN_RDMA 0x1 > > > > struct mtk_mmsys_driver_data { > > const char *clk_driver; > > @@ -16,10 +84,221 @@ static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = { > > .clk_driver = "clk-mt8173-mm", > > }; > > > > +static unsigned int mtk_mmsys_ddp_mout_en(enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next, > > + unsigned int *addr) > > +{ > > + unsigned int value; > > + > > + if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) { > > + *addr = DISP_REG_CONFIG_DISP_OVL0_MOUT_EN; > > + value = OVL0_MOUT_EN_COLOR0; > > + } else if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_RDMA0) { > > + *addr = DISP_REG_CONFIG_DISP_OVL_MOUT_EN; > > + value = OVL_MOUT_EN_RDMA; > > + } else if (cur == DDP_COMPONENT_OD0 && next == DDP_COMPONENT_RDMA0) { > > + *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN; > > + value = OD_MOUT_EN_RDMA0; > > + } else if (cur == DDP_COMPONENT_UFOE && next == DDP_COMPONENT_DSI0) { > > + *addr = DISP_REG_CONFIG_DISP_UFOE_MOUT_EN; > > + value = UFOE_MOUT_EN_DSI0; > > + } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) { > > + *addr = DISP_REG_CONFIG_DISP_OVL1_MOUT_EN; > > + value = OVL1_MOUT_EN_COLOR1; > > + } else if (cur == DDP_COMPONENT_GAMMA && next == DDP_COMPONENT_RDMA1) { > > + *addr = DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN; > > + value = GAMMA_MOUT_EN_RDMA1; > > + } else if (cur == DDP_COMPONENT_OD1 && next == DDP_COMPONENT_RDMA1) { > > + *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN; > > + value = OD1_MOUT_EN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DPI0; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DPI1; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DSI1; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DSI2; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DSI3; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DSI1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DSI2; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DSI3; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DPI0; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DPI1; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DPI0; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DPI1; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DSI1; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DSI2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DSI3; > > + } else { > > + value = 0; > > + } > > + > > + return value; > > +} > > + > > +static unsigned int mtk_mmsys_ddp_sel_in(enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next, > > + unsigned int *addr) > > +{ > > + unsigned int value; > > + > > + if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) { > > + *addr = DISP_REG_CONFIG_DISP_COLOR0_SEL_IN; > > + value = COLOR0_SEL_IN_OVL0; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > + value = DPI0_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > + value = DPI1_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI0) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI0_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > + value = DSI1_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI2_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > + value = DSI3_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > + value = DPI0_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > + value = DPI1_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI0) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI0_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > + value = DSI1_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI2_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI3_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) { > > + *addr = DISP_REG_CONFIG_DISP_COLOR1_SEL_IN; > > + value = COLOR1_SEL_IN_OVL1; > > + } else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) { > > + *addr = DISP_REG_CONFIG_DSI_SEL; > > + value = DSI_SEL_IN_BLS; > > + } else { > > + value = 0; > > + } > > + > > + return value; > > +} > > + > > +static void mtk_mmsys_ddp_sout_sel(void __iomem *config_regs, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next) > > +{ > > + if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) { > > + writel_relaxed(BLS_TO_DSI_RDMA1_TO_DPI1, > > + config_regs + DISP_REG_CONFIG_OUT_SEL); > > + } else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DPI0) { > > + writel_relaxed(BLS_TO_DPI_RDMA1_TO_DSI, > > + config_regs + DISP_REG_CONFIG_OUT_SEL); > > + writel_relaxed(DSI_SEL_IN_RDMA, > > + config_regs + DISP_REG_CONFIG_DSI_SEL); > > + writel_relaxed(DPI_SEL_IN_BLS, > > + config_regs + DISP_REG_CONFIG_DPI_SEL); > > + } > > +} > > + > > +void mtk_mmsys_ddp_connect(struct device *dev, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next) > > +{ > > + void __iomem *config_regs = dev_get_drvdata(dev); > > + unsigned int addr, value, reg; > > + > > + value = mtk_mmsys_ddp_mout_en(cur, next, &addr); > > + if (value) { > > + reg = readl_relaxed(config_regs + addr) | value; > > + writel_relaxed(reg, config_regs + addr); > > + } > > + > > + mtk_mmsys_ddp_sout_sel(config_regs, cur, next); > > + > > + value = mtk_mmsys_ddp_sel_in(cur, next, &addr); > > + if (value) { > > + reg = readl_relaxed(config_regs + addr) | value; > > + writel_relaxed(reg, config_regs + addr); > > + } > > +} > > + > > +void mtk_mmsys_ddp_disconnect(struct device *dev, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next) > > +{ > > + void __iomem *config_regs = dev_get_drvdata(dev); > > + unsigned int addr, value, reg; > > + > > + value = mtk_mmsys_ddp_mout_en(cur, next, &addr); > > + if (value) { > > + reg = readl_relaxed(config_regs + addr) & ~value; > > + writel_relaxed(reg, config_regs + addr); > > + } > > + > > + value = mtk_mmsys_ddp_sel_in(cur, next, &addr); > > + if (value) { > > + reg = readl_relaxed(config_regs + addr) & ~value; > > + writel_relaxed(reg, config_regs + addr); > > + } > > +} > > + > > static int mtk_mmsys_probe(struct platform_device *pdev) > > { > > const struct mtk_mmsys_driver_data *data; > > + struct device *dev = &pdev->dev; > > struct platform_device *clks; > > + void __iomem *config_regs; > > + struct resource *mem; > > + int ret; > > + > > + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > + config_regs = devm_ioremap_resource(dev, mem); > > + if (IS_ERR(config_regs)) { > > + ret = PTR_ERR(config_regs); > > + dev_err(dev, "Failed to ioremap mmsys-config resource: %d\n", > > + ret); > > + return ret; > > + } > > + > > + platform_set_drvdata(pdev, config_regs); > > > > data = of_device_get_match_data(&pdev->dev); > > > > diff --git a/include/linux/soc/mediatek/mtk-mmsys.h b/include/linux/soc/mediatek/mtk-mmsys.h > > new file mode 100644 > > index 000000000000..7bab5d9a3d31 > > --- /dev/null > > +++ b/include/linux/soc/mediatek/mtk-mmsys.h > > @@ -0,0 +1,20 @@ > > +/* SPDX-License-Identifier: GPL-2.0-only */ > > +/* > > + * Copyright (c) 2015 MediaTek Inc. > > + */ > > + > > +#ifndef __MTK_MMSYS_H > > +#define __MTK_MMSYS_H > > + > > +enum mtk_ddp_comp_id; > > +struct device; > > + > > +void mtk_mmsys_ddp_connect(struct device *dev, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next); > > + > > +void mtk_mmsys_ddp_disconnect(struct device *dev, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next); > > + > > +#endif /* __MTK_MMSYS_H */ > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel 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 X-Spam-Level: X-Spam-Status: No, score=-8.0 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8A3DDC43331 for ; Wed, 25 Mar 2020 23:13:54 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 573CF20737 for ; Wed, 25 Mar 2020 23:13:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="mJRqTPBz" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 573CF20737 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 75CD76E860; Wed, 25 Mar 2020 23:13:53 +0000 (UTC) X-Greylist: delayed 301 seconds by postgrey-1.36 at gabe; Wed, 25 Mar 2020 23:13:52 UTC Received: from mailgw01.mediatek.com (mailgw01.mediatek.com [216.200.240.184]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7A04D6E860 for ; Wed, 25 Mar 2020 23:13:52 +0000 (UTC) X-UUID: b439e49a007d41b4b341523e08f872ec-20200325 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=Dbph2QdkGB9v/7fOd6SwtLCWAnmMbcWZXZeUDFh9xKk=; b=mJRqTPBzSr0POGeLpIbQnO8Kx0ymGxNtgscZeRFpJKm/043i2s5Np03n1IW3Hwj2IvxGz9Cj9smoBtZZaLH9JCAorDOxb4Ya8BNZwqq0pQd0KGgpMOnIFSZbKrtSB3IopFdtNo7ucaijy9zpsd2RpXaGRSQoQ6nglBCX7Zqjbx4=; X-UUID: b439e49a007d41b4b341523e08f872ec-20200325 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 829830410; Wed, 25 Mar 2020 15:08:49 -0800 Received: from mtkcas09.mediatek.inc (172.21.101.178) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 25 Mar 2020 16:05:35 -0700 Received: from [172.21.77.4] (172.21.77.4) by mtkcas09.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Thu, 26 Mar 2020 07:05:32 +0800 Message-ID: <1585177534.26117.4.camel@mtksdaap41> Subject: Re: [PATCH v12 4/5] soc / drm: mediatek: Move routing control to mmsys device From: CK Hu To: Matthias Brugger Date: Thu, 26 Mar 2020 07:05:34 +0800 In-Reply-To: <02290a21-7392-a2cf-576c-215091ec05e8@suse.com> References: <20200311165322.1594233-1-enric.balletbo@collabora.com> <20200311165322.1594233-5-enric.balletbo@collabora.com> <02290a21-7392-a2cf-576c-215091ec05e8@suse.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N 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: mark.rutland@arm.com, Kate Stewart , Minghsiu Tsai , Andrew-CT Chen , airlied@linux.ie, mturquette@baylibre.com, dri-devel@lists.freedesktop.org, Richard Fontana , laurent.pinchart@ideasonboard.com, ulrich.hecht+renesas@gmail.com, Collabora Kernel ML , linux-clk@vger.kernel.org, Weiyi Lu , wens@csie.org, linux-arm-kernel@lists.infradead.org, mtk01761 , linux-media@vger.kernel.org, devicetree@vger.kernel.org, frank-w@public-files.de, Seiya Wang , sean.wang@mediatek.com, Houlong Wei , robh+dt@kernel.org, linux-mediatek@lists.infradead.org, hsinyi@chromium.org, Matthias Brugger , Thomas Gleixner , Mauro Carvalho Chehab , Allison Randal , sboyd@kernel.org, Greg Kroah-Hartman , rdunlap@infradead.org, linux-kernel@vger.kernel.org, matthias.bgg@kernel.org, Enric Balletbo i Serra Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Hi, Matthias: On Wed, 2020-03-25 at 17:16 +0100, Matthias Brugger wrote: > > On 11/03/2020 17:53, Enric Balletbo i Serra wrote: > > Provide a mtk_mmsys_ddp_connect() and mtk_mmsys_disconnect() functions to > > replace mtk_ddp_add_comp_to_path() and mtk_ddp_remove_comp_from_path(). > > Those functions will allow DRM driver and others to control the data > > path routing. > > > > Signed-off-by: Enric Balletbo i Serra > > Reviewed-by: Matthias Brugger > > Reviewed-by: CK Hu > > Acked-by: CK Hu > > This patch does not apply against v5.6-rc1. > Please rebase as this is a quite big patch and it won't be easy to do that by hand. I think this patch depends on [1] which has been acked by me and I have not picked it. The simple way is that you pick [1] first and then pick this series. [1] https://patchwork.kernel.org/patch/11406227/ Regards, CK > > Regards, > Matthias > > > --- > > > > Changes in v12: None > > Changes in v10: > > - Select CONFIG_MTK_MMSYS (CK) > > - Pass device pointer of mmsys device instead of config regs (CK) > > > > Changes in v9: > > - Introduced a new patch to move routing control into mmsys driver. > > - Removed the patch to use regmap as is not needed anymore. > > > > Changes in v8: None > > Changes in v7: None > > > > drivers/gpu/drm/mediatek/Kconfig | 1 + > > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 19 +- > > drivers/gpu/drm/mediatek/mtk_drm_ddp.c | 256 ---------------------- > > drivers/gpu/drm/mediatek/mtk_drm_ddp.h | 7 - > > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 14 +- > > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 2 +- > > drivers/soc/mediatek/mtk-mmsys.c | 279 ++++++++++++++++++++++++ > > include/linux/soc/mediatek/mtk-mmsys.h | 20 ++ > > 8 files changed, 316 insertions(+), 282 deletions(-) > > create mode 100644 include/linux/soc/mediatek/mtk-mmsys.h > > > > diff --git a/drivers/gpu/drm/mediatek/Kconfig b/drivers/gpu/drm/mediatek/Kconfig > > index fa5ffc4fe823..c420f5a3d33b 100644 > > --- a/drivers/gpu/drm/mediatek/Kconfig > > +++ b/drivers/gpu/drm/mediatek/Kconfig > > @@ -11,6 +11,7 @@ config DRM_MEDIATEK > > select DRM_MIPI_DSI > > select DRM_PANEL > > select MEMORY > > + select MTK_MMSYS > > select MTK_SMI > > select VIDEOMODE_HELPERS > > help > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > index 0e05683d7b53..579a5a5d4472 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > @@ -6,6 +6,7 @@ > > #include > > #include > > #include > > +#include > > > > #include > > #include > > @@ -28,7 +29,7 @@ > > * @enabled: records whether crtc_enable succeeded > > * @planes: array of 4 drm_plane structures, one for each overlay plane > > * @pending_planes: whether any plane has pending changes to be applied > > - * @config_regs: memory mapped mmsys configuration register space > > + * @mmsys_dev: pointer to the mmsys device for configuration registers > > * @mutex: handle to one of the ten disp_mutex streams > > * @ddp_comp_nr: number of components in ddp_comp > > * @ddp_comp: array of pointers the mtk_ddp_comp structures used by this crtc > > @@ -50,7 +51,7 @@ struct mtk_drm_crtc { > > u32 cmdq_event; > > #endif > > > > - void __iomem *config_regs; > > + struct device *mmsys_dev; > > struct mtk_disp_mutex *mutex; > > unsigned int ddp_comp_nr; > > struct mtk_ddp_comp **ddp_comp; > > @@ -296,9 +297,9 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) > > } > > > > for (i = 0; i < mtk_crtc->ddp_comp_nr - 1; i++) { > > - mtk_ddp_add_comp_to_path(mtk_crtc->config_regs, > > - mtk_crtc->ddp_comp[i]->id, > > - mtk_crtc->ddp_comp[i + 1]->id); > > + mtk_mmsys_ddp_connect(mtk_crtc->mmsys_dev, > > + mtk_crtc->ddp_comp[i]->id, > > + mtk_crtc->ddp_comp[i + 1]->id); > > mtk_disp_mutex_add_comp(mtk_crtc->mutex, > > mtk_crtc->ddp_comp[i]->id); > > } > > @@ -355,9 +356,9 @@ static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc) > > mtk_crtc->ddp_comp[i]->id); > > mtk_disp_mutex_disable(mtk_crtc->mutex); > > for (i = 0; i < mtk_crtc->ddp_comp_nr - 1; i++) { > > - mtk_ddp_remove_comp_from_path(mtk_crtc->config_regs, > > - mtk_crtc->ddp_comp[i]->id, > > - mtk_crtc->ddp_comp[i + 1]->id); > > + mtk_mmsys_ddp_disconnect(mtk_crtc->mmsys_dev, > > + mtk_crtc->ddp_comp[i]->id, > > + mtk_crtc->ddp_comp[i + 1]->id); > > mtk_disp_mutex_remove_comp(mtk_crtc->mutex, > > mtk_crtc->ddp_comp[i]->id); > > } > > @@ -761,7 +762,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, > > if (!mtk_crtc) > > return -ENOMEM; > > > > - mtk_crtc->config_regs = priv->config_regs; > > + mtk_crtc->mmsys_dev = priv->mmsys_dev; > > mtk_crtc->ddp_comp_nr = path_len; > > mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc->ddp_comp_nr, > > sizeof(*mtk_crtc->ddp_comp), > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > index b885f60f474c..014c1bbe1df2 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > @@ -13,26 +13,6 @@ > > #include "mtk_drm_ddp.h" > > #include "mtk_drm_ddp_comp.h" > > > > -#define DISP_REG_CONFIG_DISP_OVL0_MOUT_EN 0x040 > > -#define DISP_REG_CONFIG_DISP_OVL1_MOUT_EN 0x044 > > -#define DISP_REG_CONFIG_DISP_OD_MOUT_EN 0x048 > > -#define DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN 0x04c > > -#define DISP_REG_CONFIG_DISP_UFOE_MOUT_EN 0x050 > > -#define DISP_REG_CONFIG_DISP_COLOR0_SEL_IN 0x084 > > -#define DISP_REG_CONFIG_DISP_COLOR1_SEL_IN 0x088 > > -#define DISP_REG_CONFIG_DSIE_SEL_IN 0x0a4 > > -#define DISP_REG_CONFIG_DSIO_SEL_IN 0x0a8 > > -#define DISP_REG_CONFIG_DPI_SEL_IN 0x0ac > > -#define DISP_REG_CONFIG_DISP_RDMA2_SOUT 0x0b8 > > -#define DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN 0x0c4 > > -#define DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN 0x0c8 > > -#define DISP_REG_CONFIG_MMSYS_CG_CON0 0x100 > > - > > -#define DISP_REG_CONFIG_DISP_OVL_MOUT_EN 0x030 > > -#define DISP_REG_CONFIG_OUT_SEL 0x04c > > -#define DISP_REG_CONFIG_DSI_SEL 0x050 > > -#define DISP_REG_CONFIG_DPI_SEL 0x064 > > - > > #define MT2701_DISP_MUTEX0_MOD0 0x2c > > #define MT2701_DISP_MUTEX0_SOF0 0x30 > > > > @@ -94,48 +74,6 @@ > > #define MUTEX_SOF_DSI2 5 > > #define MUTEX_SOF_DSI3 6 > > > > -#define OVL0_MOUT_EN_COLOR0 0x1 > > -#define OD_MOUT_EN_RDMA0 0x1 > > -#define OD1_MOUT_EN_RDMA1 BIT(16) > > -#define UFOE_MOUT_EN_DSI0 0x1 > > -#define COLOR0_SEL_IN_OVL0 0x1 > > -#define OVL1_MOUT_EN_COLOR1 0x1 > > -#define GAMMA_MOUT_EN_RDMA1 0x1 > > -#define RDMA0_SOUT_DPI0 0x2 > > -#define RDMA0_SOUT_DPI1 0x3 > > -#define RDMA0_SOUT_DSI1 0x1 > > -#define RDMA0_SOUT_DSI2 0x4 > > -#define RDMA0_SOUT_DSI3 0x5 > > -#define RDMA1_SOUT_DPI0 0x2 > > -#define RDMA1_SOUT_DPI1 0x3 > > -#define RDMA1_SOUT_DSI1 0x1 > > -#define RDMA1_SOUT_DSI2 0x4 > > -#define RDMA1_SOUT_DSI3 0x5 > > -#define RDMA2_SOUT_DPI0 0x2 > > -#define RDMA2_SOUT_DPI1 0x3 > > -#define RDMA2_SOUT_DSI1 0x1 > > -#define RDMA2_SOUT_DSI2 0x4 > > -#define RDMA2_SOUT_DSI3 0x5 > > -#define DPI0_SEL_IN_RDMA1 0x1 > > -#define DPI0_SEL_IN_RDMA2 0x3 > > -#define DPI1_SEL_IN_RDMA1 (0x1 << 8) > > -#define DPI1_SEL_IN_RDMA2 (0x3 << 8) > > -#define DSI0_SEL_IN_RDMA1 0x1 > > -#define DSI0_SEL_IN_RDMA2 0x4 > > -#define DSI1_SEL_IN_RDMA1 0x1 > > -#define DSI1_SEL_IN_RDMA2 0x4 > > -#define DSI2_SEL_IN_RDMA1 (0x1 << 16) > > -#define DSI2_SEL_IN_RDMA2 (0x4 << 16) > > -#define DSI3_SEL_IN_RDMA1 (0x1 << 16) > > -#define DSI3_SEL_IN_RDMA2 (0x4 << 16) > > -#define COLOR1_SEL_IN_OVL1 0x1 > > - > > -#define OVL_MOUT_EN_RDMA 0x1 > > -#define BLS_TO_DSI_RDMA1_TO_DPI1 0x8 > > -#define BLS_TO_DPI_RDMA1_TO_DSI 0x2 > > -#define DSI_SEL_IN_BLS 0x0 > > -#define DPI_SEL_IN_BLS 0x0 > > -#define DSI_SEL_IN_RDMA 0x1 > > > > struct mtk_disp_mutex { > > int id; > > @@ -246,200 +184,6 @@ static const struct mtk_ddp_data mt8173_ddp_driver_data = { > > .mutex_sof_reg = MT2701_DISP_MUTEX0_SOF0, > > }; > > > > -static unsigned int mtk_ddp_mout_en(enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next, > > - unsigned int *addr) > > -{ > > - unsigned int value; > > - > > - if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) { > > - *addr = DISP_REG_CONFIG_DISP_OVL0_MOUT_EN; > > - value = OVL0_MOUT_EN_COLOR0; > > - } else if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_RDMA0) { > > - *addr = DISP_REG_CONFIG_DISP_OVL_MOUT_EN; > > - value = OVL_MOUT_EN_RDMA; > > - } else if (cur == DDP_COMPONENT_OD0 && next == DDP_COMPONENT_RDMA0) { > > - *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN; > > - value = OD_MOUT_EN_RDMA0; > > - } else if (cur == DDP_COMPONENT_UFOE && next == DDP_COMPONENT_DSI0) { > > - *addr = DISP_REG_CONFIG_DISP_UFOE_MOUT_EN; > > - value = UFOE_MOUT_EN_DSI0; > > - } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) { > > - *addr = DISP_REG_CONFIG_DISP_OVL1_MOUT_EN; > > - value = OVL1_MOUT_EN_COLOR1; > > - } else if (cur == DDP_COMPONENT_GAMMA && next == DDP_COMPONENT_RDMA1) { > > - *addr = DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN; > > - value = GAMMA_MOUT_EN_RDMA1; > > - } else if (cur == DDP_COMPONENT_OD1 && next == DDP_COMPONENT_RDMA1) { > > - *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN; > > - value = OD1_MOUT_EN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DPI0; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DPI1; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DSI1; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DSI2; > > - } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > - value = RDMA0_SOUT_DSI3; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DSI1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DSI2; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DSI3; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DPI0; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > - value = RDMA1_SOUT_DPI1; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DPI0; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DPI1; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DSI1; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DSI2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > - value = RDMA2_SOUT_DSI3; > > - } else { > > - value = 0; > > - } > > - > > - return value; > > -} > > - > > -static unsigned int mtk_ddp_sel_in(enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next, > > - unsigned int *addr) > > -{ > > - unsigned int value; > > - > > - if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) { > > - *addr = DISP_REG_CONFIG_DISP_COLOR0_SEL_IN; > > - value = COLOR0_SEL_IN_OVL0; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > - value = DPI0_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > - value = DPI1_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI0) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI0_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > - value = DSI1_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI2_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > - value = DSI3_SEL_IN_RDMA1; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) { > > - *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > - value = DPI0_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) { > > - *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > - value = DPI1_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI0) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI0_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) { > > - *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > - value = DSI1_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI2_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) { > > - *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > - value = DSI3_SEL_IN_RDMA2; > > - } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) { > > - *addr = DISP_REG_CONFIG_DISP_COLOR1_SEL_IN; > > - value = COLOR1_SEL_IN_OVL1; > > - } else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) { > > - *addr = DISP_REG_CONFIG_DSI_SEL; > > - value = DSI_SEL_IN_BLS; > > - } else { > > - value = 0; > > - } > > - > > - return value; > > -} > > - > > -static void mtk_ddp_sout_sel(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next) > > -{ > > - if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) { > > - writel_relaxed(BLS_TO_DSI_RDMA1_TO_DPI1, > > - config_regs + DISP_REG_CONFIG_OUT_SEL); > > - } else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DPI0) { > > - writel_relaxed(BLS_TO_DPI_RDMA1_TO_DSI, > > - config_regs + DISP_REG_CONFIG_OUT_SEL); > > - writel_relaxed(DSI_SEL_IN_RDMA, > > - config_regs + DISP_REG_CONFIG_DSI_SEL); > > - writel_relaxed(DPI_SEL_IN_BLS, > > - config_regs + DISP_REG_CONFIG_DPI_SEL); > > - } > > -} > > - > > -void mtk_ddp_add_comp_to_path(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next) > > -{ > > - unsigned int addr, value, reg; > > - > > - value = mtk_ddp_mout_en(cur, next, &addr); > > - if (value) { > > - reg = readl_relaxed(config_regs + addr) | value; > > - writel_relaxed(reg, config_regs + addr); > > - } > > - > > - mtk_ddp_sout_sel(config_regs, cur, next); > > - > > - value = mtk_ddp_sel_in(cur, next, &addr); > > - if (value) { > > - reg = readl_relaxed(config_regs + addr) | value; > > - writel_relaxed(reg, config_regs + addr); > > - } > > -} > > - > > -void mtk_ddp_remove_comp_from_path(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next) > > -{ > > - unsigned int addr, value, reg; > > - > > - value = mtk_ddp_mout_en(cur, next, &addr); > > - if (value) { > > - reg = readl_relaxed(config_regs + addr) & ~value; > > - writel_relaxed(reg, config_regs + addr); > > - } > > - > > - value = mtk_ddp_sel_in(cur, next, &addr); > > - if (value) { > > - reg = readl_relaxed(config_regs + addr) & ~value; > > - writel_relaxed(reg, config_regs + addr); > > - } > > -} > > - > > struct mtk_disp_mutex *mtk_disp_mutex_get(struct device *dev, unsigned int id) > > { > > struct mtk_ddp *ddp = dev_get_drvdata(dev); > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp.h > > index 827be424a148..6b691a57be4a 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp.h > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp.h > > @@ -12,13 +12,6 @@ struct regmap; > > struct device; > > struct mtk_disp_mutex; > > > > -void mtk_ddp_add_comp_to_path(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next); > > -void mtk_ddp_remove_comp_from_path(void __iomem *config_regs, > > - enum mtk_ddp_comp_id cur, > > - enum mtk_ddp_comp_id next); > > - > > struct mtk_disp_mutex *mtk_disp_mutex_get(struct device *dev, unsigned int id); > > int mtk_disp_mutex_prepare(struct mtk_disp_mutex *mutex); > > void mtk_disp_mutex_add_comp(struct mtk_disp_mutex *mutex, > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > index 8e2d3cb62ad5..208f9c5256ef 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > @@ -10,6 +10,7 @@ > > #include > > #include > > #include > > +#include > > #include > > > > #include > > @@ -425,7 +426,6 @@ static int mtk_drm_probe(struct platform_device *pdev) > > { > > struct device *dev = &pdev->dev; > > struct mtk_drm_private *private; > > - struct resource *mem; > > struct device_node *node; > > struct component_match *match = NULL; > > int ret; > > @@ -436,14 +436,10 @@ static int mtk_drm_probe(struct platform_device *pdev) > > return -ENOMEM; > > > > private->data = of_device_get_match_data(dev); > > - > > - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > - private->config_regs = devm_ioremap_resource(dev, mem); > > - if (IS_ERR(private->config_regs)) { > > - ret = PTR_ERR(private->config_regs); > > - dev_err(dev, "Failed to ioremap mmsys-config resource: %d\n", > > - ret); > > - return ret; > > + private->mmsys_dev = dev->parent; > > + if (!private->mmsys_dev) { > > + dev_err(dev, "Failed to get MMSYS device\n"); > > + return -ENODEV; > > } > > > > /* Iterate over sibling DISP function blocks */ > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > index 17bc99b9f5d4..b5be63e53176 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > @@ -39,7 +39,7 @@ struct mtk_drm_private { > > > > struct device_node *mutex_node; > > struct device *mutex_dev; > > - void __iomem *config_regs; > > + struct device *mmsys_dev; > > struct device_node *comp_node[DDP_COMPONENT_ID_MAX]; > > struct mtk_ddp_comp *ddp_comp[DDP_COMPONENT_ID_MAX]; > > const struct mtk_mmsys_driver_data *data; > > diff --git a/drivers/soc/mediatek/mtk-mmsys.c b/drivers/soc/mediatek/mtk-mmsys.c > > index dbdfedd302fa..4b286b525cd3 100644 > > --- a/drivers/soc/mediatek/mtk-mmsys.c > > +++ b/drivers/soc/mediatek/mtk-mmsys.c > > @@ -5,8 +5,76 @@ > > */ > > > > #include > > +#include > > #include > > #include > > +#include > > + > > +#include "../../gpu/drm/mediatek/mtk_drm_ddp.h" > > +#include "../../gpu/drm/mediatek/mtk_drm_ddp_comp.h" > > + > > +#define DISP_REG_CONFIG_DISP_OVL0_MOUT_EN 0x040 > > +#define DISP_REG_CONFIG_DISP_OVL1_MOUT_EN 0x044 > > +#define DISP_REG_CONFIG_DISP_OD_MOUT_EN 0x048 > > +#define DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN 0x04c > > +#define DISP_REG_CONFIG_DISP_UFOE_MOUT_EN 0x050 > > +#define DISP_REG_CONFIG_DISP_COLOR0_SEL_IN 0x084 > > +#define DISP_REG_CONFIG_DISP_COLOR1_SEL_IN 0x088 > > +#define DISP_REG_CONFIG_DSIE_SEL_IN 0x0a4 > > +#define DISP_REG_CONFIG_DSIO_SEL_IN 0x0a8 > > +#define DISP_REG_CONFIG_DPI_SEL_IN 0x0ac > > +#define DISP_REG_CONFIG_DISP_RDMA2_SOUT 0x0b8 > > +#define DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN 0x0c4 > > +#define DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN 0x0c8 > > +#define DISP_REG_CONFIG_MMSYS_CG_CON0 0x100 > > + > > +#define DISP_REG_CONFIG_DISP_OVL_MOUT_EN 0x030 > > +#define DISP_REG_CONFIG_OUT_SEL 0x04c > > +#define DISP_REG_CONFIG_DSI_SEL 0x050 > > +#define DISP_REG_CONFIG_DPI_SEL 0x064 > > + > > +#define OVL0_MOUT_EN_COLOR0 0x1 > > +#define OD_MOUT_EN_RDMA0 0x1 > > +#define OD1_MOUT_EN_RDMA1 BIT(16) > > +#define UFOE_MOUT_EN_DSI0 0x1 > > +#define COLOR0_SEL_IN_OVL0 0x1 > > +#define OVL1_MOUT_EN_COLOR1 0x1 > > +#define GAMMA_MOUT_EN_RDMA1 0x1 > > +#define RDMA0_SOUT_DPI0 0x2 > > +#define RDMA0_SOUT_DPI1 0x3 > > +#define RDMA0_SOUT_DSI1 0x1 > > +#define RDMA0_SOUT_DSI2 0x4 > > +#define RDMA0_SOUT_DSI3 0x5 > > +#define RDMA1_SOUT_DPI0 0x2 > > +#define RDMA1_SOUT_DPI1 0x3 > > +#define RDMA1_SOUT_DSI1 0x1 > > +#define RDMA1_SOUT_DSI2 0x4 > > +#define RDMA1_SOUT_DSI3 0x5 > > +#define RDMA2_SOUT_DPI0 0x2 > > +#define RDMA2_SOUT_DPI1 0x3 > > +#define RDMA2_SOUT_DSI1 0x1 > > +#define RDMA2_SOUT_DSI2 0x4 > > +#define RDMA2_SOUT_DSI3 0x5 > > +#define DPI0_SEL_IN_RDMA1 0x1 > > +#define DPI0_SEL_IN_RDMA2 0x3 > > +#define DPI1_SEL_IN_RDMA1 (0x1 << 8) > > +#define DPI1_SEL_IN_RDMA2 (0x3 << 8) > > +#define DSI0_SEL_IN_RDMA1 0x1 > > +#define DSI0_SEL_IN_RDMA2 0x4 > > +#define DSI1_SEL_IN_RDMA1 0x1 > > +#define DSI1_SEL_IN_RDMA2 0x4 > > +#define DSI2_SEL_IN_RDMA1 (0x1 << 16) > > +#define DSI2_SEL_IN_RDMA2 (0x4 << 16) > > +#define DSI3_SEL_IN_RDMA1 (0x1 << 16) > > +#define DSI3_SEL_IN_RDMA2 (0x4 << 16) > > +#define COLOR1_SEL_IN_OVL1 0x1 > > + > > +#define OVL_MOUT_EN_RDMA 0x1 > > +#define BLS_TO_DSI_RDMA1_TO_DPI1 0x8 > > +#define BLS_TO_DPI_RDMA1_TO_DSI 0x2 > > +#define DSI_SEL_IN_BLS 0x0 > > +#define DPI_SEL_IN_BLS 0x0 > > +#define DSI_SEL_IN_RDMA 0x1 > > > > struct mtk_mmsys_driver_data { > > const char *clk_driver; > > @@ -16,10 +84,221 @@ static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = { > > .clk_driver = "clk-mt8173-mm", > > }; > > > > +static unsigned int mtk_mmsys_ddp_mout_en(enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next, > > + unsigned int *addr) > > +{ > > + unsigned int value; > > + > > + if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) { > > + *addr = DISP_REG_CONFIG_DISP_OVL0_MOUT_EN; > > + value = OVL0_MOUT_EN_COLOR0; > > + } else if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_RDMA0) { > > + *addr = DISP_REG_CONFIG_DISP_OVL_MOUT_EN; > > + value = OVL_MOUT_EN_RDMA; > > + } else if (cur == DDP_COMPONENT_OD0 && next == DDP_COMPONENT_RDMA0) { > > + *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN; > > + value = OD_MOUT_EN_RDMA0; > > + } else if (cur == DDP_COMPONENT_UFOE && next == DDP_COMPONENT_DSI0) { > > + *addr = DISP_REG_CONFIG_DISP_UFOE_MOUT_EN; > > + value = UFOE_MOUT_EN_DSI0; > > + } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) { > > + *addr = DISP_REG_CONFIG_DISP_OVL1_MOUT_EN; > > + value = OVL1_MOUT_EN_COLOR1; > > + } else if (cur == DDP_COMPONENT_GAMMA && next == DDP_COMPONENT_RDMA1) { > > + *addr = DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN; > > + value = GAMMA_MOUT_EN_RDMA1; > > + } else if (cur == DDP_COMPONENT_OD1 && next == DDP_COMPONENT_RDMA1) { > > + *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN; > > + value = OD1_MOUT_EN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DPI0; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DPI1; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DSI1; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DSI2; > > + } else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN; > > + value = RDMA0_SOUT_DSI3; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DSI1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DSI2; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DSI3; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DPI0; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN; > > + value = RDMA1_SOUT_DPI1; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DPI0; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DPI1; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DSI1; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DSI2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT; > > + value = RDMA2_SOUT_DSI3; > > + } else { > > + value = 0; > > + } > > + > > + return value; > > +} > > + > > +static unsigned int mtk_mmsys_ddp_sel_in(enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next, > > + unsigned int *addr) > > +{ > > + unsigned int value; > > + > > + if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) { > > + *addr = DISP_REG_CONFIG_DISP_COLOR0_SEL_IN; > > + value = COLOR0_SEL_IN_OVL0; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > + value = DPI0_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > + value = DPI1_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI0) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI0_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > + value = DSI1_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI2_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > + value = DSI3_SEL_IN_RDMA1; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) { > > + *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > + value = DPI0_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) { > > + *addr = DISP_REG_CONFIG_DPI_SEL_IN; > > + value = DPI1_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI0) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI0_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) { > > + *addr = DISP_REG_CONFIG_DSIO_SEL_IN; > > + value = DSI1_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI2_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) { > > + *addr = DISP_REG_CONFIG_DSIE_SEL_IN; > > + value = DSI3_SEL_IN_RDMA2; > > + } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) { > > + *addr = DISP_REG_CONFIG_DISP_COLOR1_SEL_IN; > > + value = COLOR1_SEL_IN_OVL1; > > + } else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) { > > + *addr = DISP_REG_CONFIG_DSI_SEL; > > + value = DSI_SEL_IN_BLS; > > + } else { > > + value = 0; > > + } > > + > > + return value; > > +} > > + > > +static void mtk_mmsys_ddp_sout_sel(void __iomem *config_regs, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next) > > +{ > > + if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) { > > + writel_relaxed(BLS_TO_DSI_RDMA1_TO_DPI1, > > + config_regs + DISP_REG_CONFIG_OUT_SEL); > > + } else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DPI0) { > > + writel_relaxed(BLS_TO_DPI_RDMA1_TO_DSI, > > + config_regs + DISP_REG_CONFIG_OUT_SEL); > > + writel_relaxed(DSI_SEL_IN_RDMA, > > + config_regs + DISP_REG_CONFIG_DSI_SEL); > > + writel_relaxed(DPI_SEL_IN_BLS, > > + config_regs + DISP_REG_CONFIG_DPI_SEL); > > + } > > +} > > + > > +void mtk_mmsys_ddp_connect(struct device *dev, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next) > > +{ > > + void __iomem *config_regs = dev_get_drvdata(dev); > > + unsigned int addr, value, reg; > > + > > + value = mtk_mmsys_ddp_mout_en(cur, next, &addr); > > + if (value) { > > + reg = readl_relaxed(config_regs + addr) | value; > > + writel_relaxed(reg, config_regs + addr); > > + } > > + > > + mtk_mmsys_ddp_sout_sel(config_regs, cur, next); > > + > > + value = mtk_mmsys_ddp_sel_in(cur, next, &addr); > > + if (value) { > > + reg = readl_relaxed(config_regs + addr) | value; > > + writel_relaxed(reg, config_regs + addr); > > + } > > +} > > + > > +void mtk_mmsys_ddp_disconnect(struct device *dev, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next) > > +{ > > + void __iomem *config_regs = dev_get_drvdata(dev); > > + unsigned int addr, value, reg; > > + > > + value = mtk_mmsys_ddp_mout_en(cur, next, &addr); > > + if (value) { > > + reg = readl_relaxed(config_regs + addr) & ~value; > > + writel_relaxed(reg, config_regs + addr); > > + } > > + > > + value = mtk_mmsys_ddp_sel_in(cur, next, &addr); > > + if (value) { > > + reg = readl_relaxed(config_regs + addr) & ~value; > > + writel_relaxed(reg, config_regs + addr); > > + } > > +} > > + > > static int mtk_mmsys_probe(struct platform_device *pdev) > > { > > const struct mtk_mmsys_driver_data *data; > > + struct device *dev = &pdev->dev; > > struct platform_device *clks; > > + void __iomem *config_regs; > > + struct resource *mem; > > + int ret; > > + > > + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > + config_regs = devm_ioremap_resource(dev, mem); > > + if (IS_ERR(config_regs)) { > > + ret = PTR_ERR(config_regs); > > + dev_err(dev, "Failed to ioremap mmsys-config resource: %d\n", > > + ret); > > + return ret; > > + } > > + > > + platform_set_drvdata(pdev, config_regs); > > > > data = of_device_get_match_data(&pdev->dev); > > > > diff --git a/include/linux/soc/mediatek/mtk-mmsys.h b/include/linux/soc/mediatek/mtk-mmsys.h > > new file mode 100644 > > index 000000000000..7bab5d9a3d31 > > --- /dev/null > > +++ b/include/linux/soc/mediatek/mtk-mmsys.h > > @@ -0,0 +1,20 @@ > > +/* SPDX-License-Identifier: GPL-2.0-only */ > > +/* > > + * Copyright (c) 2015 MediaTek Inc. > > + */ > > + > > +#ifndef __MTK_MMSYS_H > > +#define __MTK_MMSYS_H > > + > > +enum mtk_ddp_comp_id; > > +struct device; > > + > > +void mtk_mmsys_ddp_connect(struct device *dev, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next); > > + > > +void mtk_mmsys_ddp_disconnect(struct device *dev, > > + enum mtk_ddp_comp_id cur, > > + enum mtk_ddp_comp_id next); > > + > > +#endif /* __MTK_MMSYS_H */ > > _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel