From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [PATCH] drm/i915/dp: Fix dsc bpp calculations, v3. Date: Mon, 23 Sep 2019 16:03:07 +0300 Message-ID: <20190923130307.GK1208@intel.com> References: <20190920163814.GD1208@intel.com> <20190923125252.25913-1-maarten.lankhorst@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTPS id 40E796E8E9 for ; Mon, 23 Sep 2019 13:03:11 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20190923125252.25913-1-maarten.lankhorst@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Maarten Lankhorst Cc: intel-gfx@lists.freedesktop.org, stable@vger.kernel.org List-Id: intel-gfx@lists.freedesktop.org T24gTW9uLCBTZXAgMjMsIDIwMTkgYXQgMDI6NTI6NTJQTSArMDIwMCwgTWFhcnRlbiBMYW5raG9y c3Qgd3JvdGU6Cj4gVGhlcmUgd2FzIGEgaW50ZWdlciB3cmFwYXJvdW5kIHdoZW4gbW9kZV9jbG9j ayBiZWNhbWUgdG9vIGhpZ2gsCj4gYW5kIHdlIGRpZG4ndCBjb3JyZWN0IGZvciB0aGUgRkVDIG92 ZXJoZWFkIGZhY3RvciB3aGVuIGRpdmlkaW5nLAo+IHdpdGggdGhlIGNhbGN1bGF0aW9ucyBicmVh a2luZyBhdCBIQlIzLgo+IAo+IEFzIGEgcmVzdWx0IG91ciBjYWxjdWxhdGVkIGJwcCB3YXMgd2F5 IHRvbyBoaWdoLCBhbmQgdGhlIGxpbmsgd2lkdGgKPiBsaW1pdGF0aW9uIG5ldmVyIGNhbWUgaW50 byBlZmZlY3QuCj4gCj4gUHJpbnQgb3V0IHRoZSByZXN1bHRpbmcgYnBwIGNhbGN1bHVsYXRpb25z IGFzIGEgc2FuaXR5IGNoZWNrLCBqdXN0Cj4gaW4gY2FzZSB3ZSBldmVyIGhhdmUgdG8gZGVidWcg aXQgbGF0ZXIgb24gYWdhaW4uCj4gCj4gV2UgYWxzbyB1c2VkIHRoZSB3cm9uZyBmYWN0b3IgZm9y IEZFQy4gV2hpbGUgYnNwZWMgbWVudGlvbnMgMi40JSwKPiBhbGwgdGhlIGNhbGN1bGF0aW9ucyB1 c2UgMS8wLjk3MjI2MSwgYW5kIHRoZSBzYW1lIHJhdGlvIHNob3VsZCBiZQo+IGFwcGxpZWQgdG8g ZGF0YSBNL04gYXMgd2VsbCwgc28gdXNlIGl0IHRoZXJlIHdoZW4gRkVDIGlzIGVuYWJsZWQuCj4g Cj4gTWFrZSBzdXJlIHdlIGRvbid0IGJyZWFrIGh3IHJlYWRvdXQsIGFuZCByZWFkIG91dCBGRUMg ZW5hYmxlIHN0YXRlCj4gYW5kIGNvcnJlY3QgdGhlIERESSBjbG9jayByZWFkb3V0IGZvciB0aGUg bmV3IHZhbHVlcy4KPiAKPiBUaGlzIGZpeGVzIHRoZSBGSUZPIHVuZGVycnVuIHdlIGFyZSBzZWVp bmcgd2l0aCBGRUMgZW5hYmxlZC4KPiAKPiBDaGFuZ2VzIHNpbmNlIHYyOgo+IC0gSGFuZGxlIGZl Y19lbmFibGUgaW4gaW50ZWxfbGlua19jb21wdXRlX21fbiwgc28gb25seSBkYXRhIE0vTiBpcyBh ZGp1c3RlZC4gKFZpbGxlKQo+IC0gRml4IGluaXRpYWwgaGFyZHdhcmUgcmVhZG91dCBmb3IgRkVD LiAoVmlsbGUpCj4gCj4gU2lnbmVkLW9mZi1ieTogTWFhcnRlbiBMYW5raG9yc3QgPG1hYXJ0ZW4u bGFua2hvcnN0QGxpbnV4LmludGVsLmNvbT4KPiBGaXhlczogZDkyMThjOGY2Y2Y0ICgiZHJtL2k5 MTUvZHA6IEFkZCBoZWxwZXJzIGZvciBDb21wcmVzc2VkIEJQUCBhbmQgU2xpY2UgQ291bnQgZm9y IERTQyIpCj4gQ2M6IDxzdGFibGVAdmdlci5rZXJuZWwub3JnPiAjIHY1LjArCj4gQ2M6IE1hbmFz aSBOYXZhcmUgPG1hbmFzaS5kLm5hdmFyZUBpbnRlbC5jb20+Cj4gLS0tCj4gVGhhbmtzLCB0aGF0 IGZpeGVkIHRoZSBGSUZPIHVuZGVycnVuLCBtYWtpbmcgdGhlIGRpc2FibGVtZW50IHBhdGNoIG9i c29sZXRlLgo+IEJpZ2pvaW5lciBpcyBub3cgY29tcGxldGVseSB3b3JraW5nIGFzIGludGVuZGVk LiA6KQo+IAo+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2RkaS5jICAgICB8 ICAyMSArKwo+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rpc3BsYXkuYyB8 ICAxMyArLQo+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rpc3BsYXkuaCB8 ICAgMiArLQo+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwLmMgICAgICB8 IDE5MSArKysrKysrKysrLS0tLS0tLS0tCj4gIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2Rpc3BsYXkv aW50ZWxfZHAuaCAgICAgIHwgICA3ICstCj4gIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2Rpc3BsYXkv aW50ZWxfZHBfbXN0LmMgIHwgICAyICstCj4gIDYgZmlsZXMgY2hhbmdlZCwgMTM3IGluc2VydGlv bnMoKyksIDk5IGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9kaXNwbGF5L2ludGVsX2RkaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9p bnRlbF9kZGkuYwo+IGluZGV4IDBjMGRhOWY2YzJlOC4uM2U3N2IzMGQ5MWQ1IDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZGRpLmMKPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2RkaS5jCj4gQEAgLTE0NzksNiArMTQ3OSwx MCBAQCBzdGF0aWMgdm9pZCBkZGlfZG90Y2xvY2tfZ2V0KHN0cnVjdCBpbnRlbF9jcnRjX3N0YXRl ICpwaXBlX2NvbmZpZykKPiAgCWlmIChwaXBlX2NvbmZpZy0+cGl4ZWxfbXVsdGlwbGllcikKPiAg CQlkb3RjbG9jayAvPSBwaXBlX2NvbmZpZy0+cGl4ZWxfbXVsdGlwbGllcjsKPiAgCj4gKwkvKiBm ZWMgYWRkcyBvdmVyaGVhZCB0byB0aGUgZGF0YSBNL04gdmFsdWVzLCBjb3JyZWN0IGZvciBpdCAq Lwo+ICsJaWYgKHBpcGVfY29uZmlnLT5mZWNfZW5hYmxlKQo+ICsJCWRvdGNsb2NrID0gaW50ZWxf ZHBfZmVjX3RvX21vZGVfY2xvY2soZG90Y2xvY2spOwoKVGhhdCdzIHN0aWxsIG5vbnNlbnNlLgoK PiArCj4gIAlwaXBlX2NvbmZpZy0+YmFzZS5hZGp1c3RlZF9tb2RlLmNydGNfY2xvY2sgPSBkb3Rj bG9jazsKPiAgfQo+ICAKPiBAQCAtNDA0NSw2ICs0MDQ5LDIzIEBAIHZvaWQgaW50ZWxfZGRpX2dl dF9jb25maWcoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIsCj4gIAkJcGlwZV9jb25maWct PmxhbmVfY291bnQgPQo+ICAJCQkoKHRlbXAgJiBERElfUE9SVF9XSURUSF9NQVNLKSA+PiBERElf UE9SVF9XSURUSF9TSElGVCkgKyAxOwo+ICAJCWludGVsX2RwX2dldF9tX24oaW50ZWxfY3J0Yywg cGlwZV9jb25maWcpOwo+ICsKPiArCQlpZiAoSU5URUxfR0VOKGRldl9wcml2KSA+PSAxMSkgewo+ ICsJCQlpOTE1X3JlZ190IGRwX3RwX2N0bDsKPiArCj4gKwkJCWlmIChJU19HRU4oZGV2X3ByaXYs IDExKSkKPiArCQkJCWRwX3RwX2N0bCA9IERQX1RQX0NUTChwaXBlX2NvbmZpZy0+Y3B1X3RyYW5z Y29kZXIpOwo+ICsJCQllbHNlCj4gKwkJCQlkcF90cF9jdGwgPSBUR0xfRFBfVFBfQ1RMKHBpcGVf Y29uZmlnLT5jcHVfdHJhbnNjb2Rlcik7Cj4gKwo+ICsJCQlwaXBlX2NvbmZpZy0+ZmVjX2VuYWJs ZSA9Cj4gKwkJCQlJOTE1X1JFQUQoZHBfdHBfY3RsKSAmIERQX1RQX0NUTF9GRUNfRU5BQkxFOwo+ ICsKPiArCQkJRFJNX0RFQlVHX0tNUygiW0VOQ09ERVI6JWQ6JXNdIEZlYyBzdGF0dXM6ICV1XG4i LAo+ICsJCQkJICAgICAgZW5jb2Rlci0+YmFzZS5iYXNlLmlkLCBlbmNvZGVyLT5iYXNlLm5hbWUs Cj4gKwkJCQkgICAgICBwaXBlX2NvbmZpZy0+ZmVjX2VuYWJsZSk7Cj4gKwkJfQo+ICsKPiAgCQli cmVhazsKPiAgCWNhc2UgVFJBTlNfRERJX01PREVfU0VMRUNUX0RQX01TVDoKPiAgCQlwaXBlX2Nv bmZpZy0+b3V0cHV0X3R5cGVzIHw9IEJJVChJTlRFTF9PVVRQVVRfRFBfTVNUKTsKPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kaXNwbGF5LmMgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2Rpc3BsYXkuYwo+IGluZGV4IDVlY2Y1NDI3 MDE4MS4uMzE2OThhNTc3NzNmIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2Rp c3BsYXkvaW50ZWxfZGlzcGxheS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxh eS9pbnRlbF9kaXNwbGF5LmMKPiBAQCAtNzI5MSw3ICs3MjkxLDcgQEAgc3RhdGljIGludCBpcm9u bGFrZV9mZGlfY29tcHV0ZV9jb25maWcoc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMsCj4g IAlwaXBlX2NvbmZpZy0+ZmRpX2xhbmVzID0gbGFuZTsKPiAgCj4gIAlpbnRlbF9saW5rX2NvbXB1 dGVfbV9uKHBpcGVfY29uZmlnLT5waXBlX2JwcCwgbGFuZSwgZmRpX2RvdGNsb2NrLAo+IC0JCQkg ICAgICAgbGlua19idywgJnBpcGVfY29uZmlnLT5mZGlfbV9uLCBmYWxzZSk7Cj4gKwkJCSAgICAg ICBsaW5rX2J3LCAmcGlwZV9jb25maWctPmZkaV9tX24sIGZhbHNlLCBmYWxzZSk7Cj4gIAo+ICAJ cmV0ID0gaXJvbmxha2VfY2hlY2tfZmRpX2xhbmVzKGRldiwgaW50ZWxfY3J0Yy0+cGlwZSwgcGlw ZV9jb25maWcpOwo+ICAJaWYgKHJldCA9PSAtRURFQURMSykKPiBAQCAtNzUzOCwxMSArNzUzOCwx NSBAQCB2b2lkCj4gIGludGVsX2xpbmtfY29tcHV0ZV9tX24odTE2IGJpdHNfcGVyX3BpeGVsLCBp bnQgbmxhbmVzLAo+ICAJCSAgICAgICBpbnQgcGl4ZWxfY2xvY2ssIGludCBsaW5rX2Nsb2NrLAo+ ICAJCSAgICAgICBzdHJ1Y3QgaW50ZWxfbGlua19tX24gKm1fbiwKPiAtCQkgICAgICAgYm9vbCBj b25zdGFudF9uKQo+ICsJCSAgICAgICBib29sIGNvbnN0YW50X24sIGJvb2wgZmVjX2VuYWJsZSkK PiAgewo+IC0JbV9uLT50dSA9IDY0Owo+ICsJdTMyIGRhdGFfY2xvY2sgPSBiaXRzX3Blcl9waXhl bCAqIHBpeGVsX2Nsb2NrOwo+ICsKPiArCWlmIChmZWNfZW5hYmxlKQo+ICsJCWRhdGFfY2xvY2sg PSBpbnRlbF9kcF9tb2RlX3RvX2ZlY19jbG9jayhkYXRhX2Nsb2NrKTsKPiAgCj4gLQljb21wdXRl X21fbihiaXRzX3Blcl9waXhlbCAqIHBpeGVsX2Nsb2NrLAo+ICsJbV9uLT50dSA9IDY0Owo+ICsJ Y29tcHV0ZV9tX24oZGF0YV9jbG9jaywKPiAgCQkgICAgbGlua19jbG9jayAqIG5sYW5lcyAqIDgs Cj4gIAkJICAgICZtX24tPmdtY2hfbSwgJm1fbi0+Z21jaF9uLAo+ICAJCSAgICBjb25zdGFudF9u KTsKPiBAQCAtMTI4MzIsNiArMTI4MzYsNyBAQCBpbnRlbF9waXBlX2NvbmZpZ19jb21wYXJlKGNv bnN0IHN0cnVjdCBpbnRlbF9jcnRjX3N0YXRlICpjdXJyZW50X2NvbmZpZywKPiAgCVBJUEVfQ09O Rl9DSEVDS19CT09MKGhkbWlfc2NyYW1ibGluZyk7Cj4gIAlQSVBFX0NPTkZfQ0hFQ0tfQk9PTCho ZG1pX2hpZ2hfdG1kc19jbG9ja19yYXRpbyk7Cj4gIAlQSVBFX0NPTkZfQ0hFQ0tfQk9PTChoYXNf aW5mb2ZyYW1lKTsKPiArCVBJUEVfQ09ORl9DSEVDS19CT09MKGZlY19lbmFibGUpOwo+ICAKPiAg CVBJUEVfQ09ORl9DSEVDS19CT09MX0lOQ09NUExFVEUoaGFzX2F1ZGlvKTsKPiAgCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZGlzcGxheS5oIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kaXNwbGF5LmgKPiBpbmRleCA1Y2VhNmY4 ZTEwN2EuLjRiOWUxOGU1YTI2MyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9k aXNwbGF5L2ludGVsX2Rpc3BsYXkuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2Rpc3Bs YXkvaW50ZWxfZGlzcGxheS5oCj4gQEAgLTQ0Myw3ICs0NDMsNyBAQCBlbnVtIHBoeV9maWEgewo+ ICB2b2lkIGludGVsX2xpbmtfY29tcHV0ZV9tX24odTE2IGJwcCwgaW50IG5sYW5lcywKPiAgCQkJ ICAgIGludCBwaXhlbF9jbG9jaywgaW50IGxpbmtfY2xvY2ssCj4gIAkJCSAgICBzdHJ1Y3QgaW50 ZWxfbGlua19tX24gKm1fbiwKPiAtCQkJICAgIGJvb2wgY29uc3RhbnRfbik7Cj4gKwkJCSAgICBi b29sIGNvbnN0YW50X24sIGJvb2wgZmVjX2VuYWJsZSk7Cj4gIGJvb2wgaXNfY2NzX21vZGlmaWVy KHU2NCBtb2RpZmllcik7Cj4gIHZvaWQgbHB0X2Rpc2FibGVfY2xrb3V0X2RwKHN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICpkZXZfcHJpdik7Cj4gIHUzMiBpbnRlbF9wbGFuZV9mYl9tYXhfc3RyaWRl KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv ZGlzcGxheS9pbnRlbF9kcC5jCj4gaW5kZXggODI5NTU5Zjk3NDQwLi4yZDNmNDE4M2Y5OWQgMTAw NjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcC5jCj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcC5jCj4gQEAgLTc2LDggKzc2 LDggQEAKPiAgI2RlZmluZSBEUF9EU0NfTUFYX0VOQ19USFJPVUdIUFVUXzAJCTM0MDAwMAo+ICAj ZGVmaW5lIERQX0RTQ19NQVhfRU5DX1RIUk9VR0hQVVRfMQkJNDAwMDAwCj4gIAo+IC0vKiBEUCBE U0MgRkVDIE92ZXJoZWFkIGZhY3RvciA9ICgxMDAgLSAyLjQpLzEwMCAqLwo+IC0jZGVmaW5lIERQ X0RTQ19GRUNfT1ZFUkhFQURfRkFDVE9SCQk5NzYKPiArLyogRFAgRFNDIEZFQyBPdmVyaGVhZCBm YWN0b3IgPSAxLygwLjk3MjI2MSkgKi8KPiArI2RlZmluZSBEUF9EU0NfRkVDX09WRVJIRUFEX0ZB Q1RPUgkJOTcyMjYxCj4gIAo+ICAvKiBDb21wbGlhbmNlIHRlc3Qgc3RhdHVzIGJpdHMgICovCj4g ICNkZWZpbmUgSU5URUxfRFBfUkVTT0xVVElPTl9TSElGVF9NQVNLCTAKPiBAQCAtNDkyLDYgKzQ5 MiwxMDQgQEAgaW50IGludGVsX2RwX2dldF9saW5rX3RyYWluX2ZhbGxiYWNrX3ZhbHVlcyhzdHJ1 Y3QgaW50ZWxfZHAgKmludGVsX2RwLAo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gK3UzMiBpbnRl bF9kcF9tb2RlX3RvX2ZlY19jbG9jayh1MzIgbW9kZV9jbG9jaykKPiArewo+ICsJcmV0dXJuIGRp dl91NjQobXVsX3UzMl91MzIobW9kZV9jbG9jaywgMTAwMDAwMFUpLAo+ICsJCSAgICAgICBEUF9E U0NfRkVDX09WRVJIRUFEX0ZBQ1RPUik7Cj4gK30KPiArCj4gK3UzMiBpbnRlbF9kcF9mZWNfdG9f bW9kZV9jbG9jayh1MzIgZmVjX2Nsb2NrKQo+ICt7Cj4gKwlyZXR1cm4gZGl2X3U2NChtdWxfdTMy X3UzMihmZWNfY2xvY2ssCj4gKwkJCQkgICBEUF9EU0NfRkVDX09WRVJIRUFEX0ZBQ1RPUiksCj4g KwkJICAgICAgIDEwMDAwMDBVKTsKPiArfQo+ICsKPiArc3RhdGljIHUxNiBpbnRlbF9kcF9kc2Nf Z2V0X291dHB1dF9icHAodTMyIGxpbmtfY2xvY2ssIHUzMiBsYW5lX2NvdW50LAo+ICsJCQkJICAg ICAgIHUzMiBtb2RlX2Nsb2NrLCB1MzIgbW9kZV9oZGlzcGxheSkKPiArewo+ICsJdTMyIGJpdHNf cGVyX3BpeGVsLCBtYXhfYnBwX3NtYWxsX2pvaW5lcl9yYW07Cj4gKwlpbnQgaTsKPiArCj4gKwkv Kgo+ICsJICogQXZhaWxhYmxlIExpbmsgQmFuZHdpZHRoKEtiaXRzL3NlYykgPSAoTnVtYmVyT2ZM YW5lcykqCj4gKwkgKiAoTGlua1N5bWJvbENsb2NrKSogOCAqIChUaW1lU2xvdHNQZXJNVFApCj4g KwkgKiBmb3IgU1NUIC0+IFRpbWVTbG90c1Blck1UUCBpcyAxLAo+ICsJICogZm9yIE1TVCAtPiBU aW1lU2xvdHNQZXJNVFAgaGFzIHRvIGJlIGNhbGN1bGF0ZWQKPiArCSAqLwo+ICsJYml0c19wZXJf cGl4ZWwgPSAobGlua19jbG9jayAqIGxhbmVfY291bnQgKiA4KSAvCj4gKwkJCSBpbnRlbF9kcF9t b2RlX3RvX2ZlY19jbG9jayhtb2RlX2Nsb2NrKTsKPiArCURSTV9ERUJVR19LTVMoIk1heCBsaW5r IGJwcDogJXVcbiIsIGJpdHNfcGVyX3BpeGVsKTsKPiArCj4gKwkvKiBTbWFsbCBKb2luZXIgQ2hl Y2s6IG91dHB1dCBicHAgPD0gam9pbmVyIFJBTSAoYml0cykgLyBIb3Jpei4gd2lkdGggKi8KPiAr CW1heF9icHBfc21hbGxfam9pbmVyX3JhbSA9IERQX0RTQ19NQVhfU01BTExfSk9JTkVSX1JBTV9C VUZGRVIgLyBtb2RlX2hkaXNwbGF5Owo+ICsJRFJNX0RFQlVHX0tNUygiTWF4IHNtYWxsIGpvaW5l ciBicHA6ICV1XG4iLCBtYXhfYnBwX3NtYWxsX2pvaW5lcl9yYW0pOwo+ICsKPiArCS8qCj4gKwkg KiBHcmVhdGVzdCBhbGxvd2VkIERTQyBCUFAgPSBNSU4gKG91dHB1dCBCUFAgZnJvbSBhdmFpbGFi bGUgTGluayBCVwo+ICsJICogY2hlY2ssIG91dHB1dCBicHAgZnJvbSBzbWFsbCBqb2luZXIgUkFN IGNoZWNrKQo+ICsJICovCj4gKwliaXRzX3Blcl9waXhlbCA9IG1pbihiaXRzX3Blcl9waXhlbCwg bWF4X2JwcF9zbWFsbF9qb2luZXJfcmFtKTsKPiArCj4gKwkvKiBFcnJvciBvdXQgaWYgdGhlIG1h eCBicHAgaXMgbGVzcyB0aGFuIHNtYWxsZXN0IGFsbG93ZWQgdmFsaWQgYnBwICovCj4gKwlpZiAo Yml0c19wZXJfcGl4ZWwgPCB2YWxpZF9kc2NfYnBwWzBdKSB7Cj4gKwkJRFJNX0RFQlVHX0tNUygi VW5zdXBwb3J0ZWQgQlBQICV1LCBtaW4gJXVcbiIsCj4gKwkJCSAgICAgIGJpdHNfcGVyX3BpeGVs LCB2YWxpZF9kc2NfYnBwWzBdKTsKPiArCQlyZXR1cm4gMDsKPiArCX0KPiArCj4gKwkvKiBGaW5k IHRoZSBuZWFyZXN0IG1hdGNoIGluIHRoZSBhcnJheSBvZiBrbm93biBCUFBzIGZyb20gVkVTQSAq Lwo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmFsaWRfZHNjX2JwcCkgLSAxOyBpKysp IHsKPiArCQlpZiAoYml0c19wZXJfcGl4ZWwgPCB2YWxpZF9kc2NfYnBwW2kgKyAxXSkKPiArCQkJ YnJlYWs7Cj4gKwl9Cj4gKwliaXRzX3Blcl9waXhlbCA9IHZhbGlkX2RzY19icHBbaV07Cj4gKwo+ ICsJLyoKPiArCSAqIENvbXByZXNzZWQgQlBQIGluIFU2LjQgZm9ybWF0IHNvIG11bHRpcGx5IGJ5 IDE2LCBmb3IgR2VuIDExLAo+ICsJICogZnJhY3Rpb25hbCBwYXJ0IGlzIDAKPiArCSAqLwo+ICsJ cmV0dXJuIGJpdHNfcGVyX3BpeGVsIDw8IDQ7Cj4gK30KPiArCj4gK3N0YXRpYyB1OCBpbnRlbF9k cF9kc2NfZ2V0X3NsaWNlX2NvdW50KHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsCj4gKwkJCQkg ICAgICAgaW50IG1vZGVfY2xvY2ssIGludCBtb2RlX2hkaXNwbGF5KQo+ICt7Cj4gKwl1OCBtaW5f c2xpY2VfY291bnQsIGk7Cj4gKwlpbnQgbWF4X3NsaWNlX3dpZHRoOwo+ICsKPiArCWlmIChtb2Rl X2Nsb2NrIDw9IERQX0RTQ19QRUFLX1BJWEVMX1JBVEUpCj4gKwkJbWluX3NsaWNlX2NvdW50ID0g RElWX1JPVU5EX1VQKG1vZGVfY2xvY2ssCj4gKwkJCQkJICAgICAgIERQX0RTQ19NQVhfRU5DX1RI Uk9VR0hQVVRfMCk7Cj4gKwllbHNlCj4gKwkJbWluX3NsaWNlX2NvdW50ID0gRElWX1JPVU5EX1VQ KG1vZGVfY2xvY2ssCj4gKwkJCQkJICAgICAgIERQX0RTQ19NQVhfRU5DX1RIUk9VR0hQVVRfMSk7 Cj4gKwo+ICsJbWF4X3NsaWNlX3dpZHRoID0gZHJtX2RwX2RzY19zaW5rX21heF9zbGljZV93aWR0 aChpbnRlbF9kcC0+ZHNjX2RwY2QpOwo+ICsJaWYgKG1heF9zbGljZV93aWR0aCA8IERQX0RTQ19N SU5fU0xJQ0VfV0lEVEhfVkFMVUUpIHsKPiArCQlEUk1fREVCVUdfS01TKCJVbnN1cHBvcnRlZCBz bGljZSB3aWR0aCAlZCBieSBEUCBEU0MgU2luayBkZXZpY2VcbiIsCj4gKwkJCSAgICAgIG1heF9z bGljZV93aWR0aCk7Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwkvKiBBbHNvIHRha2UgaW50byBh Y2NvdW50IG1heCBzbGljZSB3aWR0aCAqLwo+ICsJbWluX3NsaWNlX2NvdW50ID0gbWluX3QodTgs IG1pbl9zbGljZV9jb3VudCwKPiArCQkJCURJVl9ST1VORF9VUChtb2RlX2hkaXNwbGF5LAo+ICsJ CQkJCSAgICAgbWF4X3NsaWNlX3dpZHRoKSk7Cj4gKwo+ICsJLyogRmluZCB0aGUgY2xvc2VzdCBt YXRjaCB0byB0aGUgdmFsaWQgc2xpY2UgY291bnQgdmFsdWVzICovCj4gKwlmb3IgKGkgPSAwOyBp IDwgQVJSQVlfU0laRSh2YWxpZF9kc2Nfc2xpY2Vjb3VudCk7IGkrKykgewo+ICsJCWlmICh2YWxp ZF9kc2Nfc2xpY2Vjb3VudFtpXSA+Cj4gKwkJICAgIGRybV9kcF9kc2Nfc2lua19tYXhfc2xpY2Vf Y291bnQoaW50ZWxfZHAtPmRzY19kcGNkLAo+ICsJCQkJCQkgICAgZmFsc2UpKQo+ICsJCQlicmVh azsKPiArCQlpZiAobWluX3NsaWNlX2NvdW50ICA8PSB2YWxpZF9kc2Nfc2xpY2Vjb3VudFtpXSkK PiArCQkJcmV0dXJuIHZhbGlkX2RzY19zbGljZWNvdW50W2ldOwo+ICsJfQo+ICsKPiArCURSTV9E RUJVR19LTVMoIlVuc3VwcG9ydGVkIFNsaWNlIENvdW50ICVkXG4iLCBtaW5fc2xpY2VfY291bnQp Owo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gIHN0YXRpYyBlbnVtIGRybV9tb2RlX3N0YXR1cwo+ ICBpbnRlbF9kcF9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4g IAkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQo+IEBAIC0yMjU5LDcgKzIzNTcs NyBAQCBpbnRlbF9kcF9jb21wdXRlX2NvbmZpZyhzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2Rl ciwKPiAgCQkJICAgICAgIGFkanVzdGVkX21vZGUtPmNydGNfY2xvY2ssCj4gIAkJCSAgICAgICBw aXBlX2NvbmZpZy0+cG9ydF9jbG9jaywKPiAgCQkJICAgICAgICZwaXBlX2NvbmZpZy0+ZHBfbV9u LAo+IC0JCQkgICAgICAgY29uc3RhbnRfbik7Cj4gKwkJCSAgICAgICBjb25zdGFudF9uLCBwaXBl X2NvbmZpZy0+ZmVjX2VuYWJsZSk7Cj4gIAo+ICAJaWYgKGludGVsX2Nvbm5lY3Rvci0+cGFuZWwu ZG93bmNsb2NrX21vZGUgIT0gTlVMTCAmJgo+ICAJCWRldl9wcml2LT5kcnJzLnR5cGUgPT0gU0VB TUxFU1NfRFJSU19TVVBQT1JUKSB7Cj4gQEAgLTIyNjksNyArMjM2Nyw3IEBAIGludGVsX2RwX2Nv bXB1dGVfY29uZmlnKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyLAo+ICAJCQkJCSAgICAg ICBpbnRlbF9jb25uZWN0b3ItPnBhbmVsLmRvd25jbG9ja19tb2RlLT5jbG9jaywKPiAgCQkJCQkg ICAgICAgcGlwZV9jb25maWctPnBvcnRfY2xvY2ssCj4gIAkJCQkJICAgICAgICZwaXBlX2NvbmZp Zy0+ZHBfbTJfbjIsCj4gLQkJCQkJICAgICAgIGNvbnN0YW50X24pOwo+ICsJCQkJCSAgICAgICBj b25zdGFudF9uLCBwaXBlX2NvbmZpZy0+ZmVjX2VuYWJsZSk7Cj4gIAl9Cj4gIAo+ICAJaWYgKCFI QVNfRERJKGRldl9wcml2KSkKPiBAQCAtNDM3Myw5MSArNDQ3MSw2IEBAIGludGVsX2RwX2dldF9z aW5rX2lycV9lc2koc3RydWN0IGludGVsX2RwICppbnRlbF9kcCwgdTggKnNpbmtfaXJxX3ZlY3Rv cikKPiAgCQlEUF9EUFJYX0VTSV9MRU47Cj4gIH0KPiAgCj4gLXUxNiBpbnRlbF9kcF9kc2NfZ2V0 X291dHB1dF9icHAoaW50IGxpbmtfY2xvY2ssIHU4IGxhbmVfY291bnQsCj4gLQkJCQlpbnQgbW9k ZV9jbG9jaywgaW50IG1vZGVfaGRpc3BsYXkpCj4gLXsKPiAtCXUxNiBiaXRzX3Blcl9waXhlbCwg bWF4X2JwcF9zbWFsbF9qb2luZXJfcmFtOwo+IC0JaW50IGk7Cj4gLQo+IC0JLyoKPiAtCSAqIEF2 YWlsYWJsZSBMaW5rIEJhbmR3aWR0aChLYml0cy9zZWMpID0gKE51bWJlck9mTGFuZXMpKgo+IC0J ICogKExpbmtTeW1ib2xDbG9jaykqIDggKiAoKDEwMC1GRUNPdmVyaGVhZCkvMTAwKSooVGltZVNs b3RzUGVyTVRQKQo+IC0JICogRkVDT3ZlcmhlYWQgPSAyLjQlLCBmb3IgU1NUIC0+IFRpbWVTbG90 c1Blck1UUCBpcyAxLAo+IC0JICogZm9yIE1TVCAtPiBUaW1lU2xvdHNQZXJNVFAgaGFzIHRvIGJl IGNhbGN1bGF0ZWQKPiAtCSAqLwo+IC0JYml0c19wZXJfcGl4ZWwgPSAobGlua19jbG9jayAqIGxh bmVfY291bnQgKiA4ICoKPiAtCQkJICBEUF9EU0NfRkVDX09WRVJIRUFEX0ZBQ1RPUikgLwo+IC0J CW1vZGVfY2xvY2s7Cj4gLQo+IC0JLyogU21hbGwgSm9pbmVyIENoZWNrOiBvdXRwdXQgYnBwIDw9 IGpvaW5lciBSQU0gKGJpdHMpIC8gSG9yaXouIHdpZHRoICovCj4gLQltYXhfYnBwX3NtYWxsX2pv aW5lcl9yYW0gPSBEUF9EU0NfTUFYX1NNQUxMX0pPSU5FUl9SQU1fQlVGRkVSIC8KPiAtCQltb2Rl X2hkaXNwbGF5Owo+IC0KPiAtCS8qCj4gLQkgKiBHcmVhdGVzdCBhbGxvd2VkIERTQyBCUFAgPSBN SU4gKG91dHB1dCBCUFAgZnJvbSBhdmFpYWxibGUgTGluayBCVwo+IC0JICogY2hlY2ssIG91dHB1 dCBicHAgZnJvbSBzbWFsbCBqb2luZXIgUkFNIGNoZWNrKQo+IC0JICovCj4gLQliaXRzX3Blcl9w aXhlbCA9IG1pbihiaXRzX3Blcl9waXhlbCwgbWF4X2JwcF9zbWFsbF9qb2luZXJfcmFtKTsKPiAt Cj4gLQkvKiBFcnJvciBvdXQgaWYgdGhlIG1heCBicHAgaXMgbGVzcyB0aGFuIHNtYWxsZXN0IGFs bG93ZWQgdmFsaWQgYnBwICovCj4gLQlpZiAoYml0c19wZXJfcGl4ZWwgPCB2YWxpZF9kc2NfYnBw WzBdKSB7Cj4gLQkJRFJNX0RFQlVHX0tNUygiVW5zdXBwb3J0ZWQgQlBQICVkXG4iLCBiaXRzX3Bl cl9waXhlbCk7Cj4gLQkJcmV0dXJuIDA7Cj4gLQl9Cj4gLQo+IC0JLyogRmluZCB0aGUgbmVhcmVz dCBtYXRjaCBpbiB0aGUgYXJyYXkgb2Yga25vd24gQlBQcyBmcm9tIFZFU0EgKi8KPiAtCWZvciAo aSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZhbGlkX2RzY19icHApIC0gMTsgaSsrKSB7Cj4gLQkJaWYg KGJpdHNfcGVyX3BpeGVsIDwgdmFsaWRfZHNjX2JwcFtpICsgMV0pCj4gLQkJCWJyZWFrOwo+IC0J fQo+IC0JYml0c19wZXJfcGl4ZWwgPSB2YWxpZF9kc2NfYnBwW2ldOwo+IC0KPiAtCS8qCj4gLQkg KiBDb21wcmVzc2VkIEJQUCBpbiBVNi40IGZvcm1hdCBzbyBtdWx0aXBseSBieSAxNiwgZm9yIEdl biAxMSwKPiAtCSAqIGZyYWN0aW9uYWwgcGFydCBpcyAwCj4gLQkgKi8KPiAtCXJldHVybiBiaXRz X3Blcl9waXhlbCA8PCA0Owo+IC19Cj4gLQo+IC11OCBpbnRlbF9kcF9kc2NfZ2V0X3NsaWNlX2Nv dW50KHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsCj4gLQkJCQlpbnQgbW9kZV9jbG9jaywKPiAt CQkJCWludCBtb2RlX2hkaXNwbGF5KQo+IC17Cj4gLQl1OCBtaW5fc2xpY2VfY291bnQsIGk7Cj4g LQlpbnQgbWF4X3NsaWNlX3dpZHRoOwo+IC0KPiAtCWlmIChtb2RlX2Nsb2NrIDw9IERQX0RTQ19Q RUFLX1BJWEVMX1JBVEUpCj4gLQkJbWluX3NsaWNlX2NvdW50ID0gRElWX1JPVU5EX1VQKG1vZGVf Y2xvY2ssCj4gLQkJCQkJICAgICAgIERQX0RTQ19NQVhfRU5DX1RIUk9VR0hQVVRfMCk7Cj4gLQll bHNlCj4gLQkJbWluX3NsaWNlX2NvdW50ID0gRElWX1JPVU5EX1VQKG1vZGVfY2xvY2ssCj4gLQkJ CQkJICAgICAgIERQX0RTQ19NQVhfRU5DX1RIUk9VR0hQVVRfMSk7Cj4gLQo+IC0JbWF4X3NsaWNl X3dpZHRoID0gZHJtX2RwX2RzY19zaW5rX21heF9zbGljZV93aWR0aChpbnRlbF9kcC0+ZHNjX2Rw Y2QpOwo+IC0JaWYgKG1heF9zbGljZV93aWR0aCA8IERQX0RTQ19NSU5fU0xJQ0VfV0lEVEhfVkFM VUUpIHsKPiAtCQlEUk1fREVCVUdfS01TKCJVbnN1cHBvcnRlZCBzbGljZSB3aWR0aCAlZCBieSBE UCBEU0MgU2luayBkZXZpY2VcbiIsCj4gLQkJCSAgICAgIG1heF9zbGljZV93aWR0aCk7Cj4gLQkJ cmV0dXJuIDA7Cj4gLQl9Cj4gLQkvKiBBbHNvIHRha2UgaW50byBhY2NvdW50IG1heCBzbGljZSB3 aWR0aCAqLwo+IC0JbWluX3NsaWNlX2NvdW50ID0gbWluX3QodTgsIG1pbl9zbGljZV9jb3VudCwK PiAtCQkJCURJVl9ST1VORF9VUChtb2RlX2hkaXNwbGF5LAo+IC0JCQkJCSAgICAgbWF4X3NsaWNl X3dpZHRoKSk7Cj4gLQo+IC0JLyogRmluZCB0aGUgY2xvc2VzdCBtYXRjaCB0byB0aGUgdmFsaWQg c2xpY2UgY291bnQgdmFsdWVzICovCj4gLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2YWxp ZF9kc2Nfc2xpY2Vjb3VudCk7IGkrKykgewo+IC0JCWlmICh2YWxpZF9kc2Nfc2xpY2Vjb3VudFtp XSA+Cj4gLQkJICAgIGRybV9kcF9kc2Nfc2lua19tYXhfc2xpY2VfY291bnQoaW50ZWxfZHAtPmRz Y19kcGNkLAo+IC0JCQkJCQkgICAgZmFsc2UpKQo+IC0JCQlicmVhazsKPiAtCQlpZiAobWluX3Ns aWNlX2NvdW50ICA8PSB2YWxpZF9kc2Nfc2xpY2Vjb3VudFtpXSkKPiAtCQkJcmV0dXJuIHZhbGlk X2RzY19zbGljZWNvdW50W2ldOwo+IC0JfQo+IC0KPiAtCURSTV9ERUJVR19LTVMoIlVuc3VwcG9y dGVkIFNsaWNlIENvdW50ICVkXG4iLCBtaW5fc2xpY2VfY291bnQpOwo+IC0JcmV0dXJuIDA7Cj4g LX0KPiAtCj4gIHN0YXRpYyB2b2lkCj4gIGludGVsX3BpeGVsX2VuY29kaW5nX3NldHVwX3ZzYyhz dHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwLAo+ICAJCQkgICAgICAgY29uc3Qgc3RydWN0IGludGVs X2NydGNfc3RhdGUgKmNydGNfc3RhdGUpCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2Rpc3BsYXkvaW50ZWxfZHAuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2Rpc3BsYXkvaW50 ZWxfZHAuaAo+IGluZGV4IGUwMWQxZjg5NDA5ZC4uMjE0N2QzYzE0ODcwIDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZHAuaAo+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZHAuaAo+IEBAIC0xMDMsMTAgKzEwMyw2IEBAIGJv b2wgaW50ZWxfZHBfc291cmNlX3N1cHBvcnRzX2hicjIoc3RydWN0IGludGVsX2RwICppbnRlbF9k cCk7Cj4gIGJvb2wgaW50ZWxfZHBfc291cmNlX3N1cHBvcnRzX2hicjMoc3RydWN0IGludGVsX2Rw ICppbnRlbF9kcCk7Cj4gIGJvb2wKPiAgaW50ZWxfZHBfZ2V0X2xpbmtfc3RhdHVzKHN0cnVjdCBp bnRlbF9kcCAqaW50ZWxfZHAsIHU4ICpsaW5rX3N0YXR1cyk7Cj4gLXUxNiBpbnRlbF9kcF9kc2Nf Z2V0X291dHB1dF9icHAoaW50IGxpbmtfY2xvY2ssIHU4IGxhbmVfY291bnQsCj4gLQkJCQlpbnQg bW9kZV9jbG9jaywgaW50IG1vZGVfaGRpc3BsYXkpOwo+IC11OCBpbnRlbF9kcF9kc2NfZ2V0X3Ns aWNlX2NvdW50KHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsIGludCBtb2RlX2Nsb2NrLAo+IC0J CQkJaW50IG1vZGVfaGRpc3BsYXkpOwo+ICAKPiAgYm9vbCBpbnRlbF9kcF9yZWFkX2RwY2Qoc3Ry dWN0IGludGVsX2RwICppbnRlbF9kcCk7Cj4gIGJvb2wgaW50ZWxfZHBfZ2V0X2NvbG9yaW1ldHJ5 X3N0YXR1cyhzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKTsKPiBAQCAtMTE5LDQgKzExNSw3IEBA IHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGludGVsX2RwX3VudXNlZF9sYW5lX21hc2soaW50 IGxhbmVfY291bnQpCj4gIAlyZXR1cm4gfigoMSA8PCBsYW5lX2NvdW50KSAtIDEpICYgMHhmOwo+ ICB9Cj4gIAo+ICt1MzIgaW50ZWxfZHBfZmVjX3RvX21vZGVfY2xvY2sodTMyIGZlY19jbG9jayk7 Cj4gK3UzMiBpbnRlbF9kcF9tb2RlX3RvX2ZlY19jbG9jayh1MzIgbW9kZV9jbG9jayk7Cj4gKwo+ ICAjZW5kaWYgLyogX19JTlRFTF9EUF9IX18gKi8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcF9tc3QuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2Rp c3BsYXkvaW50ZWxfZHBfbXN0LmMKPiBpbmRleCBlZWViM2Y5MzNhYTQuLmNmNGQ4NTFhNTEzOSAx MDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwX21zdC5j Cj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcF9tc3QuYwo+IEBA IC04MSw3ICs4MSw3IEBAIHN0YXRpYyBpbnQgaW50ZWxfZHBfbXN0X2NvbXB1dGVfbGlua19jb25m aWcoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIsCj4gIAkJCSAgICAgICBhZGp1c3RlZF9t b2RlLT5jcnRjX2Nsb2NrLAo+ICAJCQkgICAgICAgY3J0Y19zdGF0ZS0+cG9ydF9jbG9jaywKPiAg CQkJICAgICAgICZjcnRjX3N0YXRlLT5kcF9tX24sCj4gLQkJCSAgICAgICBjb25zdGFudF9uKTsK PiArCQkJICAgICAgIGNvbnN0YW50X24sIGNydGNfc3RhdGUtPmZlY19lbmFibGUpOwo+ICAJY3J0 Y19zdGF0ZS0+ZHBfbV9uLnR1ID0gc2xvdHM7Cj4gIAo+ICAJcmV0dXJuIDA7Cj4gLS0gCj4gMi4y MC4xCgotLSAKVmlsbGUgU3lyasOkbMOkCkludGVsCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxp c3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2ludGVsLWdmeA== 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=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 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 A4F86C04EBF for ; Mon, 23 Sep 2019 13:03:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6F3D0207FD for ; Mon, 23 Sep 2019 13:03:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2394987AbfIWNDL (ORCPT ); Mon, 23 Sep 2019 09:03:11 -0400 Received: from mga01.intel.com ([192.55.52.88]:43027 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2394984AbfIWNDL (ORCPT ); Mon, 23 Sep 2019 09:03:11 -0400 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Sep 2019 06:03:10 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,539,1559545200"; d="scan'208";a="179119220" Received: from stinkbox.fi.intel.com (HELO stinkbox) ([10.237.72.174]) by orsmga007.jf.intel.com with SMTP; 23 Sep 2019 06:03:07 -0700 Received: by stinkbox (sSMTP sendmail emulation); Mon, 23 Sep 2019 16:03:07 +0300 Date: Mon, 23 Sep 2019 16:03:07 +0300 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= To: Maarten Lankhorst Cc: intel-gfx@lists.freedesktop.org, stable@vger.kernel.org, Manasi Navare Subject: Re: [PATCH] drm/i915/dp: Fix dsc bpp calculations, v3. Message-ID: <20190923130307.GK1208@intel.com> References: <20190920163814.GD1208@intel.com> <20190923125252.25913-1-maarten.lankhorst@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20190923125252.25913-1-maarten.lankhorst@linux.intel.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: stable-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org On Mon, Sep 23, 2019 at 02:52:52PM +0200, Maarten Lankhorst wrote: > There was a integer wraparound when mode_clock became too high, > and we didn't correct for the FEC overhead factor when dividing, > with the calculations breaking at HBR3. > > As a result our calculated bpp was way too high, and the link width > limitation never came into effect. > > Print out the resulting bpp calcululations as a sanity check, just > in case we ever have to debug it later on again. > > We also used the wrong factor for FEC. While bspec mentions 2.4%, > all the calculations use 1/0.972261, and the same ratio should be > applied to data M/N as well, so use it there when FEC is enabled. > > Make sure we don't break hw readout, and read out FEC enable state > and correct the DDI clock readout for the new values. > > This fixes the FIFO underrun we are seeing with FEC enabled. > > Changes since v2: > - Handle fec_enable in intel_link_compute_m_n, so only data M/N is adjusted. (Ville) > - Fix initial hardware readout for FEC. (Ville) > > Signed-off-by: Maarten Lankhorst > Fixes: d9218c8f6cf4 ("drm/i915/dp: Add helpers for Compressed BPP and Slice Count for DSC") > Cc: # v5.0+ > Cc: Manasi Navare > --- > Thanks, that fixed the FIFO underrun, making the disablement patch obsolete. > Bigjoiner is now completely working as intended. :) > > drivers/gpu/drm/i915/display/intel_ddi.c | 21 ++ > drivers/gpu/drm/i915/display/intel_display.c | 13 +- > drivers/gpu/drm/i915/display/intel_display.h | 2 +- > drivers/gpu/drm/i915/display/intel_dp.c | 191 ++++++++++--------- > drivers/gpu/drm/i915/display/intel_dp.h | 7 +- > drivers/gpu/drm/i915/display/intel_dp_mst.c | 2 +- > 6 files changed, 137 insertions(+), 99 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c > index 0c0da9f6c2e8..3e77b30d91d5 100644 > --- a/drivers/gpu/drm/i915/display/intel_ddi.c > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c > @@ -1479,6 +1479,10 @@ static void ddi_dotclock_get(struct intel_crtc_state *pipe_config) > if (pipe_config->pixel_multiplier) > dotclock /= pipe_config->pixel_multiplier; > > + /* fec adds overhead to the data M/N values, correct for it */ > + if (pipe_config->fec_enable) > + dotclock = intel_dp_fec_to_mode_clock(dotclock); That's still nonsense. > + > pipe_config->base.adjusted_mode.crtc_clock = dotclock; > } > > @@ -4045,6 +4049,23 @@ void intel_ddi_get_config(struct intel_encoder *encoder, > pipe_config->lane_count = > ((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1; > intel_dp_get_m_n(intel_crtc, pipe_config); > + > + if (INTEL_GEN(dev_priv) >= 11) { > + i915_reg_t dp_tp_ctl; > + > + if (IS_GEN(dev_priv, 11)) > + dp_tp_ctl = DP_TP_CTL(pipe_config->cpu_transcoder); > + else > + dp_tp_ctl = TGL_DP_TP_CTL(pipe_config->cpu_transcoder); > + > + pipe_config->fec_enable = > + I915_READ(dp_tp_ctl) & DP_TP_CTL_FEC_ENABLE; > + > + DRM_DEBUG_KMS("[ENCODER:%d:%s] Fec status: %u\n", > + encoder->base.base.id, encoder->base.name, > + pipe_config->fec_enable); > + } > + > break; > case TRANS_DDI_MODE_SELECT_DP_MST: > pipe_config->output_types |= BIT(INTEL_OUTPUT_DP_MST); > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > index 5ecf54270181..31698a57773f 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -7291,7 +7291,7 @@ static int ironlake_fdi_compute_config(struct intel_crtc *intel_crtc, > pipe_config->fdi_lanes = lane; > > intel_link_compute_m_n(pipe_config->pipe_bpp, lane, fdi_dotclock, > - link_bw, &pipe_config->fdi_m_n, false); > + link_bw, &pipe_config->fdi_m_n, false, false); > > ret = ironlake_check_fdi_lanes(dev, intel_crtc->pipe, pipe_config); > if (ret == -EDEADLK) > @@ -7538,11 +7538,15 @@ void > intel_link_compute_m_n(u16 bits_per_pixel, int nlanes, > int pixel_clock, int link_clock, > struct intel_link_m_n *m_n, > - bool constant_n) > + bool constant_n, bool fec_enable) > { > - m_n->tu = 64; > + u32 data_clock = bits_per_pixel * pixel_clock; > + > + if (fec_enable) > + data_clock = intel_dp_mode_to_fec_clock(data_clock); > > - compute_m_n(bits_per_pixel * pixel_clock, > + m_n->tu = 64; > + compute_m_n(data_clock, > link_clock * nlanes * 8, > &m_n->gmch_m, &m_n->gmch_n, > constant_n); > @@ -12832,6 +12836,7 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config, > PIPE_CONF_CHECK_BOOL(hdmi_scrambling); > PIPE_CONF_CHECK_BOOL(hdmi_high_tmds_clock_ratio); > PIPE_CONF_CHECK_BOOL(has_infoframe); > + PIPE_CONF_CHECK_BOOL(fec_enable); > > PIPE_CONF_CHECK_BOOL_INCOMPLETE(has_audio); > > diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h > index 5cea6f8e107a..4b9e18e5a263 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.h > +++ b/drivers/gpu/drm/i915/display/intel_display.h > @@ -443,7 +443,7 @@ enum phy_fia { > void intel_link_compute_m_n(u16 bpp, int nlanes, > int pixel_clock, int link_clock, > struct intel_link_m_n *m_n, > - bool constant_n); > + bool constant_n, bool fec_enable); > bool is_ccs_modifier(u64 modifier); > void lpt_disable_clkout_dp(struct drm_i915_private *dev_priv); > u32 intel_plane_fb_max_stride(struct drm_i915_private *dev_priv, > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c > index 829559f97440..2d3f4183f99d 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > @@ -76,8 +76,8 @@ > #define DP_DSC_MAX_ENC_THROUGHPUT_0 340000 > #define DP_DSC_MAX_ENC_THROUGHPUT_1 400000 > > -/* DP DSC FEC Overhead factor = (100 - 2.4)/100 */ > -#define DP_DSC_FEC_OVERHEAD_FACTOR 976 > +/* DP DSC FEC Overhead factor = 1/(0.972261) */ > +#define DP_DSC_FEC_OVERHEAD_FACTOR 972261 > > /* Compliance test status bits */ > #define INTEL_DP_RESOLUTION_SHIFT_MASK 0 > @@ -492,6 +492,104 @@ int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp, > return 0; > } > > +u32 intel_dp_mode_to_fec_clock(u32 mode_clock) > +{ > + return div_u64(mul_u32_u32(mode_clock, 1000000U), > + DP_DSC_FEC_OVERHEAD_FACTOR); > +} > + > +u32 intel_dp_fec_to_mode_clock(u32 fec_clock) > +{ > + return div_u64(mul_u32_u32(fec_clock, > + DP_DSC_FEC_OVERHEAD_FACTOR), > + 1000000U); > +} > + > +static u16 intel_dp_dsc_get_output_bpp(u32 link_clock, u32 lane_count, > + u32 mode_clock, u32 mode_hdisplay) > +{ > + u32 bits_per_pixel, max_bpp_small_joiner_ram; > + int i; > + > + /* > + * Available Link Bandwidth(Kbits/sec) = (NumberOfLanes)* > + * (LinkSymbolClock)* 8 * (TimeSlotsPerMTP) > + * for SST -> TimeSlotsPerMTP is 1, > + * for MST -> TimeSlotsPerMTP has to be calculated > + */ > + bits_per_pixel = (link_clock * lane_count * 8) / > + intel_dp_mode_to_fec_clock(mode_clock); > + DRM_DEBUG_KMS("Max link bpp: %u\n", bits_per_pixel); > + > + /* Small Joiner Check: output bpp <= joiner RAM (bits) / Horiz. width */ > + max_bpp_small_joiner_ram = DP_DSC_MAX_SMALL_JOINER_RAM_BUFFER / mode_hdisplay; > + DRM_DEBUG_KMS("Max small joiner bpp: %u\n", max_bpp_small_joiner_ram); > + > + /* > + * Greatest allowed DSC BPP = MIN (output BPP from available Link BW > + * check, output bpp from small joiner RAM check) > + */ > + bits_per_pixel = min(bits_per_pixel, max_bpp_small_joiner_ram); > + > + /* Error out if the max bpp is less than smallest allowed valid bpp */ > + if (bits_per_pixel < valid_dsc_bpp[0]) { > + DRM_DEBUG_KMS("Unsupported BPP %u, min %u\n", > + bits_per_pixel, valid_dsc_bpp[0]); > + return 0; > + } > + > + /* Find the nearest match in the array of known BPPs from VESA */ > + for (i = 0; i < ARRAY_SIZE(valid_dsc_bpp) - 1; i++) { > + if (bits_per_pixel < valid_dsc_bpp[i + 1]) > + break; > + } > + bits_per_pixel = valid_dsc_bpp[i]; > + > + /* > + * Compressed BPP in U6.4 format so multiply by 16, for Gen 11, > + * fractional part is 0 > + */ > + return bits_per_pixel << 4; > +} > + > +static u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp, > + int mode_clock, int mode_hdisplay) > +{ > + u8 min_slice_count, i; > + int max_slice_width; > + > + if (mode_clock <= DP_DSC_PEAK_PIXEL_RATE) > + min_slice_count = DIV_ROUND_UP(mode_clock, > + DP_DSC_MAX_ENC_THROUGHPUT_0); > + else > + min_slice_count = DIV_ROUND_UP(mode_clock, > + DP_DSC_MAX_ENC_THROUGHPUT_1); > + > + max_slice_width = drm_dp_dsc_sink_max_slice_width(intel_dp->dsc_dpcd); > + if (max_slice_width < DP_DSC_MIN_SLICE_WIDTH_VALUE) { > + DRM_DEBUG_KMS("Unsupported slice width %d by DP DSC Sink device\n", > + max_slice_width); > + return 0; > + } > + /* Also take into account max slice width */ > + min_slice_count = min_t(u8, min_slice_count, > + DIV_ROUND_UP(mode_hdisplay, > + max_slice_width)); > + > + /* Find the closest match to the valid slice count values */ > + for (i = 0; i < ARRAY_SIZE(valid_dsc_slicecount); i++) { > + if (valid_dsc_slicecount[i] > > + drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd, > + false)) > + break; > + if (min_slice_count <= valid_dsc_slicecount[i]) > + return valid_dsc_slicecount[i]; > + } > + > + DRM_DEBUG_KMS("Unsupported Slice Count %d\n", min_slice_count); > + return 0; > +} > + > static enum drm_mode_status > intel_dp_mode_valid(struct drm_connector *connector, > struct drm_display_mode *mode) > @@ -2259,7 +2357,7 @@ intel_dp_compute_config(struct intel_encoder *encoder, > adjusted_mode->crtc_clock, > pipe_config->port_clock, > &pipe_config->dp_m_n, > - constant_n); > + constant_n, pipe_config->fec_enable); > > if (intel_connector->panel.downclock_mode != NULL && > dev_priv->drrs.type == SEAMLESS_DRRS_SUPPORT) { > @@ -2269,7 +2367,7 @@ intel_dp_compute_config(struct intel_encoder *encoder, > intel_connector->panel.downclock_mode->clock, > pipe_config->port_clock, > &pipe_config->dp_m2_n2, > - constant_n); > + constant_n, pipe_config->fec_enable); > } > > if (!HAS_DDI(dev_priv)) > @@ -4373,91 +4471,6 @@ intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *sink_irq_vector) > DP_DPRX_ESI_LEN; > } > > -u16 intel_dp_dsc_get_output_bpp(int link_clock, u8 lane_count, > - int mode_clock, int mode_hdisplay) > -{ > - u16 bits_per_pixel, max_bpp_small_joiner_ram; > - int i; > - > - /* > - * Available Link Bandwidth(Kbits/sec) = (NumberOfLanes)* > - * (LinkSymbolClock)* 8 * ((100-FECOverhead)/100)*(TimeSlotsPerMTP) > - * FECOverhead = 2.4%, for SST -> TimeSlotsPerMTP is 1, > - * for MST -> TimeSlotsPerMTP has to be calculated > - */ > - bits_per_pixel = (link_clock * lane_count * 8 * > - DP_DSC_FEC_OVERHEAD_FACTOR) / > - mode_clock; > - > - /* Small Joiner Check: output bpp <= joiner RAM (bits) / Horiz. width */ > - max_bpp_small_joiner_ram = DP_DSC_MAX_SMALL_JOINER_RAM_BUFFER / > - mode_hdisplay; > - > - /* > - * Greatest allowed DSC BPP = MIN (output BPP from avaialble Link BW > - * check, output bpp from small joiner RAM check) > - */ > - bits_per_pixel = min(bits_per_pixel, max_bpp_small_joiner_ram); > - > - /* Error out if the max bpp is less than smallest allowed valid bpp */ > - if (bits_per_pixel < valid_dsc_bpp[0]) { > - DRM_DEBUG_KMS("Unsupported BPP %d\n", bits_per_pixel); > - return 0; > - } > - > - /* Find the nearest match in the array of known BPPs from VESA */ > - for (i = 0; i < ARRAY_SIZE(valid_dsc_bpp) - 1; i++) { > - if (bits_per_pixel < valid_dsc_bpp[i + 1]) > - break; > - } > - bits_per_pixel = valid_dsc_bpp[i]; > - > - /* > - * Compressed BPP in U6.4 format so multiply by 16, for Gen 11, > - * fractional part is 0 > - */ > - return bits_per_pixel << 4; > -} > - > -u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp, > - int mode_clock, > - int mode_hdisplay) > -{ > - u8 min_slice_count, i; > - int max_slice_width; > - > - if (mode_clock <= DP_DSC_PEAK_PIXEL_RATE) > - min_slice_count = DIV_ROUND_UP(mode_clock, > - DP_DSC_MAX_ENC_THROUGHPUT_0); > - else > - min_slice_count = DIV_ROUND_UP(mode_clock, > - DP_DSC_MAX_ENC_THROUGHPUT_1); > - > - max_slice_width = drm_dp_dsc_sink_max_slice_width(intel_dp->dsc_dpcd); > - if (max_slice_width < DP_DSC_MIN_SLICE_WIDTH_VALUE) { > - DRM_DEBUG_KMS("Unsupported slice width %d by DP DSC Sink device\n", > - max_slice_width); > - return 0; > - } > - /* Also take into account max slice width */ > - min_slice_count = min_t(u8, min_slice_count, > - DIV_ROUND_UP(mode_hdisplay, > - max_slice_width)); > - > - /* Find the closest match to the valid slice count values */ > - for (i = 0; i < ARRAY_SIZE(valid_dsc_slicecount); i++) { > - if (valid_dsc_slicecount[i] > > - drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd, > - false)) > - break; > - if (min_slice_count <= valid_dsc_slicecount[i]) > - return valid_dsc_slicecount[i]; > - } > - > - DRM_DEBUG_KMS("Unsupported Slice Count %d\n", min_slice_count); > - return 0; > -} > - > static void > intel_pixel_encoding_setup_vsc(struct intel_dp *intel_dp, > const struct intel_crtc_state *crtc_state) > diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h > index e01d1f89409d..2147d3c14870 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.h > +++ b/drivers/gpu/drm/i915/display/intel_dp.h > @@ -103,10 +103,6 @@ bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp); > bool intel_dp_source_supports_hbr3(struct intel_dp *intel_dp); > bool > intel_dp_get_link_status(struct intel_dp *intel_dp, u8 *link_status); > -u16 intel_dp_dsc_get_output_bpp(int link_clock, u8 lane_count, > - int mode_clock, int mode_hdisplay); > -u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp, int mode_clock, > - int mode_hdisplay); > > bool intel_dp_read_dpcd(struct intel_dp *intel_dp); > bool intel_dp_get_colorimetry_status(struct intel_dp *intel_dp); > @@ -119,4 +115,7 @@ static inline unsigned int intel_dp_unused_lane_mask(int lane_count) > return ~((1 << lane_count) - 1) & 0xf; > } > > +u32 intel_dp_fec_to_mode_clock(u32 fec_clock); > +u32 intel_dp_mode_to_fec_clock(u32 mode_clock); > + > #endif /* __INTEL_DP_H__ */ > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c > index eeeb3f933aa4..cf4d851a5139 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c > @@ -81,7 +81,7 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder, > adjusted_mode->crtc_clock, > crtc_state->port_clock, > &crtc_state->dp_m_n, > - constant_n); > + constant_n, crtc_state->fec_enable); > crtc_state->dp_m_n.tu = slots; > > return 0; > -- > 2.20.1 -- Ville Syrjälä Intel