From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [RFC] drm: Parse HDMI 2.0 YCbCr 4:2:0 VDB and VCB Date: Wed, 4 Jan 2017 15:22:25 +0200 Message-ID: <20170104132225.GE31595@intel.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7059A6E260 for ; Wed, 4 Jan 2017 13:22:31 +0000 (UTC) Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jose Abreu Cc: Daniel Vetter , Carlos Palminha , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org T24gRnJpLCBEZWMgMzAsIDIwMTYgYXQgMDQ6NTM6MTZQTSArMDAwMCwgSm9zZSBBYnJldSB3cm90 ZToKPiBIRE1JIDIuMCBpbnRyb2R1Y2VzIGEgbmV3IHNhbXBsaW5nIG1vZGUgY2FsbGVkIFlDYkNy IDQ6MjowLgo+IEFjY29yZGluZyB0byB0aGUgc3BlYyB0aGUgRURJRCBtYXkgY29udGFpbiB0d28g YmxvY2tzIHRoYXQKPiBzaWduYWwgdGhpcyBzYW1wbGluZyBtb2RlOgo+IAktIFlDYkNyIDQ6Mjow IFZpZGVvIERhdGEgQmxvY2sKPiAJLSBZQ2JDciA0OjI6MCBWaWRlbyBDYXBhYmlsaXR5IE1hcCBE YXRhIEJsb2NrCj4gCj4gVGhlIHZpZGVvIGRhdGEgYmxvY2sgY29udGFpbnMgdGhlIGxpc3Qgb2Yg dmljJ3Mgd2VyZQo+IG9ubHkgWUNiQ3IgNDoyOjAgc2FtcGxpbmcgbW9kZSBzaGFsbCBiZSB1c2Vk IHdoaWxlIHRoZQo+IHZpZGVvIGNhcGFiaWxpdHkgbWFwIGRhdGEgYmxvY2sgY29udGFpbnMgYSBt YXNrIHdlcmUKPiBZQ2JDciA0OjI6MCBzYW1wbGluZyBtb2RlIG1heSBiZSB1c2VkLgo+IAo+IFRo aXMgUkZDIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgcGFyc2luZyB0aGVzZSB0d28gbmV3IGJsb2Nr cwo+IGFuZCBpbnRyb2R1Y2VzIG5ldyBmbGFncyB0byBzaWduYWwgdGhlIGRyaXZlcnMgaWYgdGhl Cj4gbW9kZSBpcyA0OjI6MCdvbmx5IG9yIDQ6MjowJ2FibGUuCj4gCj4gVGhlIHJlYXNvbiB0aGlz IGlzIHN0aWxsIGEgUkZDIGlzIGJlY2F1c2UgdGhlcmUgaXMgbm8KPiByZWZlcmVuY2UgaW4ga2Vy bmVsIGZvciB0aGlzIG5ldyBzYW1wbGluZyBtb2RlIChzcGVjaWFsbHkgaW4KPiBBVkkgaW5mb2Zy YW1lIHBhcnQpLCBzbywgSSB3YXMgaG9waW5nIHRvIGhlYXIgc29tZSBmZWVkYmFjawo+IGZpcnN0 Lgo+IAo+IFRlc3RlZCBpbiBhIEhETUkgMi4wIGNvbXBsaWFuY2Ugc2NlbmFyaW8uCj4gCj4gU2ln bmVkLW9mZi1ieTogSm9zZSBBYnJldSA8am9hYnJldUBzeW5vcHN5cy5jb20+Cj4gQ2M6IENhcmxv cyBQYWxtaW5oYSA8cGFsbWluaGFAc3lub3BzeXMuY29tPgo+IENjOiBEYW5pZWwgVmV0dGVyIDxk YW5pZWwudmV0dGVyQGludGVsLmNvbT4KPiBDYzogSmFuaSBOaWt1bGEgPGphbmkubmlrdWxhQGxp bnV4LmludGVsLmNvbT4KPiBDYzogU2VhbiBQYXVsIDxzZWFucGF1bEBjaHJvbWl1bS5vcmc+Cj4g Q2M6IERhdmlkIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KPiBDYzogZHJpLWRldmVsQGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwo+IENjOiBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCj4gLS0t Cj4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jICB8IDEzOSArKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrLQo+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMg fCAgMTAgKysrLQo+ICBpbmNsdWRlL3VhcGkvZHJtL2RybV9tb2RlLmggfCAgIDYgKysKPiAgMyBm aWxlcyBjaGFuZ2VkLCAxNTEgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKPiAKPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJt X2VkaWQuYwo+IGluZGV4IDY3ZDZhNzMuLjZjZTFhMzggMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9n cHUvZHJtL2RybV9lZGlkLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYwo+IEBA IC0yNTQ5LDYgKzI1NDksOCBAQCBzdGF0aWMgaW50IGRybV9jdnRfbW9kZXMoc3RydWN0IGRybV9j b25uZWN0b3IgKmNvbm5lY3RvciwKPiAgI2RlZmluZSBWRU5ET1JfQkxPQ0sgICAgMHgwMwo+ICAj ZGVmaW5lIFNQRUFLRVJfQkxPQ0sJMHgwNAo+ICAjZGVmaW5lIFZJREVPX0NBUEFCSUxJVFlfQkxP Q0sJMHgwNwo+ICsjZGVmaW5lIFZJREVPX0RBVEFfQkxPQ0tfNDIwCTB4MEUKPiArI2RlZmluZSBW SURFT19DQVBfQkxPQ0tfNDIwCTB4MEYKPiAgI2RlZmluZSBFRElEX0JBU0lDX0FVRElPCSgxIDw8 IDYpCj4gICNkZWZpbmUgRURJRF9DRUFfWUNSQ0I0NDQJKDEgPDwgNSkKPiAgI2RlZmluZSBFRElE X0NFQV9ZQ1JDQjQyMgkoMSA8PCA0KQo+IEBAIC0zMDUwLDYgKzMwNTIsOTggQEAgc3RhdGljIGlu dCBhZGRfM2Rfc3RydWN0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHUx NiBzdHJ1Y3R1cmUsCj4gIAlyZXR1cm4gbW9kZXM7Cj4gIH0KPiAgCj4gK3N0YXRpYyBpbnQgYWRk XzQyMF9tb2RlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHU4IHZpYykKPiArewo+ ICsJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2Owo+ICsJc3RydWN0IGRy bV9kaXNwbGF5X21vZGUgKm5ld21vZGU7Cj4gKwo+ICsJaWYgKCFkcm1fdmFsaWRfY2VhX3ZpYyh2 aWMpKQo+ICsJCXJldHVybiAwOwo+ICsKPiArCW5ld21vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUo ZGV2LCAmZWRpZF9jZWFfbW9kZXNbdmljXSk7Cj4gKwlpZiAoIW5ld21vZGUpCj4gKwkJcmV0dXJu IDA7Cj4gKwo+ICsJbmV3bW9kZS0+ZmxhZ3MgfD0gRFJNX01PREVfRkxBR180MjBfT05MWTsKCldo eSBkb2VzIHVzZXJzcGFjZSBuZWVkIHRvIGtub3cgdGhpcz8gTXkgdGhpbmtpbmcgaGFzIGJlZW4g dGhhdCB0aGUKZHJpdmVyIHdvdWxkIGRvIHRoZSByaWdodCB0aGluZyBhdXRvbWFnaWNhbGx5LgoK V2UgZG8gcHJvYmFibHkgd2FudCBzb21lIGtpbmQgb2Ygb3V0cHV0IGNvbG9yc3BhY2UgcHJvcGVy dHkgdG8gYWxsb3cgdGhlCnVzZXIgdG8gc2VsZWN0IGJldHdlZW4gUkdCIHZzLiBZQ2JDciBldGMu IEJ1dCBJIHRoaW5rIGV2ZW4gd2l0aCB0aGF0IHdlCnNob3VsZCBzdGlsbCBhbGxvdyB0aGUgZHJp dmVyIHRvIGF1dG9tYWdpY2FsbHkgc2VsZWN0IFlDYkNyIDQ6MjowIG91dHB1dApzaW5jZSB0aGF0 J3MgdGhlIG9ubHkgd2F5IHRoZSBtb2RlIHdpbGwgd29yay4KCj4gKwlkcm1fbW9kZV9wcm9iZWRf YWRkKGNvbm5lY3RvciwgbmV3bW9kZSk7Cj4gKwo+ICsJcmV0dXJuIDE7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgYWRkXzQyMF92ZGJfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rv ciwgY29uc3QgdTggKnN2ZHMsCj4gKwkJdTggc3Zkc19sZW4pCj4gK3sKPiArCWludCBtb2RlcyA9 IDAsIGk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IHN2ZHNfbGVuOyBpKyspCj4gKwkJbW9kZXMg Kz0gYWRkXzQyMF9tb2RlKGNvbm5lY3Rvciwgc3Zkc1tpXSk7Cj4gKwo+ICsJcmV0dXJuIG1vZGVz Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGFkZF80MjBfdmNiX21vZGVzKHN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3IsIGNvbnN0IHU4ICpzdmRzLAo+ICsJCXU4IHN2ZHNfbGVuLCBjb25z dCB1OCAqdmlkZW9fZGIsIHU4IHZpZGVvX2xlbikKPiArewo+ICsJc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgKm5ld21vZGUgPSBOVUxMOwo+ICsJaW50IG1vZGVzID0gMCwgaSwgajsKPiArCj4gKwlm b3IgKGkgPSAwOyBpIDwgc3Zkc19sZW47IGkrKykgewo+ICsJCXU4IG1hc2sgPSBzdmRzW2ldOwo+ ICsJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKPiArCQkJaWYgKG1hc2sgJiAoMSA8PCBqKSkg ewo+ICsJCQkJbmV3bW9kZSA9IGRybV9kaXNwbGF5X21vZGVfZnJvbV92aWNfaW5kZXgoCj4gKwkJ CQkJCWNvbm5lY3RvciwgdmlkZW9fZGIsIHZpZGVvX2xlbiwKPiArCQkJCQkJaSAqIDggKyBqKTsK PiArCQkJCWlmIChuZXdtb2RlKSB7Cj4gKwkJCQkJbmV3bW9kZS0+ZmxhZ3MgfD0gRFJNX01PREVf RkxBR180MjA7Cj4gKwkJCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG5ld21vZGUp Owo+ICsJCQkJCW1vZGVzKys7Cj4gKwkJCQl9Cj4gKwkJCX0KPiArCQl9Cj4gKwl9Cj4gKwo+ICsJ cmV0dXJuIG1vZGVzOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGFkZF80MjBfdmNiX21vZGVzX2Fs bChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ICsJCWNvbnN0IHU4ICp2aWRlb19k YiwgdTggdmlkZW9fbGVuKQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmV3bW9k ZSA9IE5VTEw7Cj4gKwlpbnQgbW9kZXMgPSAwLCBpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCB2 aWRlb19sZW47IGkrKykgewo+ICsJCW5ld21vZGUgPSBkcm1fZGlzcGxheV9tb2RlX2Zyb21fdmlj X2luZGV4KGNvbm5lY3RvciwgdmlkZW9fZGIsCj4gKwkJCQl2aWRlb19sZW4sIGkpOwo+ICsJCWlm IChuZXdtb2RlKSB7Cj4gKwkJCW5ld21vZGUtPmZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfNDIwOwo+ ICsJCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbmV3bW9kZSk7Cj4gKwkJCW1vZGVz Kys7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVybiBtb2RlczsKPiArfQo+ICsKPiArc3RhdGlj IGludCBkb19oZG1pXzQyMF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBj b25zdCB1OCAqdmRiLAo+ICsJCXU4IHZkYl9sZW4sIGNvbnN0IHU4ICp2Y2IsIHU4IHZjYl9sZW4s IGNvbnN0IHU4ICp2aWRlb19kYiwKPiArCQl1OCB2aWRlb19sZW4pCj4gK3sKPiArCWludCBtb2Rl cyA9IDA7Cj4gKwo+ICsJaWYgKHZkYiAmJiAodmRiX2xlbiA+IDEpKSAvKiBBZGQgNDoyOjAgbW9k ZXMgcHJlc2VudCBpbiBFRElEICovCj4gKwkJbW9kZXMgKz0gYWRkXzQyMF92ZGJfbW9kZXMoY29u bmVjdG9yLCAmdmRiWzJdLCB2ZGJfbGVuIC0gMSk7Cj4gKwo+ICsJaWYgKHZjYiAmJiAodmNiX2xl biA+IDEpKSAvKiBQYXJzZSBiaXQgbWFzayBvZiBzdXBwb3J0ZWQgbW9kZXMgKi8KPiArCQltb2Rl cyArPSBhZGRfNDIwX3ZjYl9tb2Rlcyhjb25uZWN0b3IsICZ2Y2JbMl0sIHZjYl9sZW4gLSAxLAo+ ICsJCQkJdmlkZW9fZGIsIHZpZGVvX2xlbik7Cj4gKwllbHNlIGlmICh2Y2IpIC8qIEFsbCBtb2Rl cyBzdXBwb3J0IDQ6MjowIG1vZGUgKi8KPiArCQltb2RlcyArPSBhZGRfNDIwX3ZjYl9tb2Rlc19h bGwoY29ubmVjdG9yLCB2aWRlb19kYiwgdmlkZW9fbGVuKTsKPiArCj4gKwlEUk1fREVCVUcoImFk ZGVkICVkIDQ6MjowIG1vZGVzXG4iLCBtb2Rlcyk7Cj4gKwlyZXR1cm4gbW9kZXM7Cj4gK30KPiAr Cj4gIC8qCj4gICAqIGRvX2hkbWlfdnNkYl9tb2RlcyAtIFBhcnNlIHRoZSBIRE1JIFZlbmRvciBT cGVjaWZpYyBkYXRhIGJsb2NrCj4gICAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciBjb3JyZXNwb25k aW5nIHRvIHRoZSBIRE1JIHNpbmsKPiBAQCAtMzIwNiw2ICszMzAwLDEyIEBAIHN0YXRpYyBpbnQg YWRkXzNkX3N0cnVjdF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCB1MTYg c3RydWN0dXJlLAo+ICB9Cj4gIAo+ICBzdGF0aWMgaW50Cj4gK2NlYV9kYl9leHRlbmRlZF90YWco Y29uc3QgdTggKmRiKQo+ICt7Cj4gKwlyZXR1cm4gZGJbMV07Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQKPiAgY2VhX3JldmlzaW9uKGNvbnN0IHU4ICpjZWEpCj4gIHsKPiAgCXJldHVybiBjZWFbMV07 Cj4gQEAgLTMyMzksNiArMzMzOSwyOCBAQCBzdGF0aWMgYm9vbCBjZWFfZGJfaXNfaGRtaV92c2Ri KGNvbnN0IHU4ICpkYikKPiAgCXJldHVybiBoZG1pX2lkID09IEhETUlfSUVFRV9PVUk7Cj4gIH0K PiAgCj4gK3N0YXRpYyBib29sIGNlYV9kYl9pc19oZG1pX3ZkYjQyMChjb25zdCB1OCAqZGIpCj4g K3sKPiArCWlmIChjZWFfZGJfdGFnKGRiKSAhPSBWSURFT19DQVBBQklMSVRZX0JMT0NLKQo+ICsJ CXJldHVybiBmYWxzZTsKPiArCj4gKwlpZiAoY2VhX2RiX2V4dGVuZGVkX3RhZyhkYikgIT0gVklE RU9fREFUQV9CTE9DS180MjApCj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsKPiArCXJldHVybiB0cnVl Owo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBjZWFfZGJfaXNfaGRtaV92Y2I0MjAoY29uc3QgdTgg KmRiKQo+ICt7Cj4gKwlpZiAoY2VhX2RiX3RhZyhkYikgIT0gVklERU9fQ0FQQUJJTElUWV9CTE9D SykKPiArCQlyZXR1cm4gZmFsc2U7Cj4gKwo+ICsJaWYgKGNlYV9kYl9leHRlbmRlZF90YWcoZGIp ICE9IFZJREVPX0NBUF9CTE9DS180MjApCj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsKPiArCXJldHVy biB0cnVlOwo+ICt9Cj4gKwo+ICAjZGVmaW5lIGZvcl9lYWNoX2NlYV9kYihjZWEsIGksIHN0YXJ0 LCBlbmQpIFwKPiAgCWZvciAoKGkpID0gKHN0YXJ0KTsgKGkpIDwgKGVuZCkgJiYgKGkpICsgY2Vh X2RiX3BheWxvYWRfbGVuKCYoY2VhKVsoaSldKSA8IChlbmQpOyAoaSkgKz0gY2VhX2RiX3BheWxv YWRfbGVuKCYoY2VhKVsoaSldKSArIDEpCj4gIAo+IEBAIC0zMjQ2LDggKzMzNjgsOSBAQCBzdGF0 aWMgYm9vbCBjZWFfZGJfaXNfaGRtaV92c2RiKGNvbnN0IHU4ICpkYikKPiAgYWRkX2NlYV9tb2Rl cyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgZWRpZCAqZWRpZCkKPiAg ewo+ICAJY29uc3QgdTggKmNlYSA9IGRybV9maW5kX2NlYV9leHRlbnNpb24oZWRpZCk7Cj4gLQlj b25zdCB1OCAqZGIsICpoZG1pID0gTlVMTCwgKnZpZGVvID0gTlVMTDsKPiAtCXU4IGRibCwgaGRt aV9sZW4sIHZpZGVvX2xlbiA9IDA7Cj4gKwljb25zdCB1OCAqZGIsICpoZG1pID0gTlVMTCwgKnZp ZGVvID0gTlVMTCwgKnZkYjQyMCA9IE5VTEwsCj4gKwkgICAgICAqdmNiNDIwID0gTlVMTDsKPiAr CXU4IGRibCwgaGRtaV9sZW4sIHZpZGVvX2xlbiA9IDAsIHZkYjQyMF9sZW4gPSAwLCB2Y2I0MjBf bGVuID0gMDsKPiAgCWludCBtb2RlcyA9IDA7Cj4gIAo+ICAJaWYgKGNlYSAmJiBjZWFfcmV2aXNp b24oY2VhKSA+PSAzKSB7Cj4gQEAgLTMyNjksNiArMzM5MiwxNCBAQCBzdGF0aWMgYm9vbCBjZWFf ZGJfaXNfaGRtaV92c2RiKGNvbnN0IHU4ICpkYikKPiAgCQkJCWhkbWkgPSBkYjsKPiAgCQkJCWhk bWlfbGVuID0gZGJsOwo+ICAJCQl9Cj4gKwkJCWVsc2UgaWYgKGNlYV9kYl9pc19oZG1pX3ZkYjQy MChkYikpIHsKPiArCQkJCXZkYjQyMCA9IGRiOwo+ICsJCQkJdmRiNDIwX2xlbiA9IGRibDsKPiAr CQkJfQo+ICsJCQllbHNlIGlmIChjZWFfZGJfaXNfaGRtaV92Y2I0MjAoZGIpKSB7Cj4gKwkJCQl2 Y2I0MjAgPSBkYjsKPiArCQkJCXZjYjQyMF9sZW4gPSBkYmw7Cj4gKwkJCX0KPiAgCQl9Cj4gIAl9 Cj4gIAo+IEBAIC0zMjgwLDYgKzM0MTEsMTAgQEAgc3RhdGljIGJvb2wgY2VhX2RiX2lzX2hkbWlf dnNkYihjb25zdCB1OCAqZGIpCj4gIAkJbW9kZXMgKz0gZG9faGRtaV92c2RiX21vZGVzKGNvbm5l Y3RvciwgaGRtaSwgaGRtaV9sZW4sIHZpZGVvLAo+ICAJCQkJCSAgICB2aWRlb19sZW4pOwo+ICAK PiArCWlmICh2ZGI0MjAgfHwgdmNiNDIwKQo+ICsJCW1vZGVzICs9IGRvX2hkbWlfNDIwX21vZGVz KGNvbm5lY3RvciwgdmRiNDIwLCB2ZGI0MjBfbGVuLAo+ICsJCQkJdmNiNDIwLCB2Y2I0MjBfbGVu LCB2aWRlbywgdmlkZW9fbGVuKTsKPiArCj4gIAlyZXR1cm4gbW9kZXM7Cj4gIH0KPiAgCj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9k cm1fbW9kZXMuYwo+IGluZGV4IGFjNmEzNTIuLjUzYzY1ZjYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2RybV9tb2Rlcy5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tb2Rlcy5j Cj4gQEAgLTk2Nyw2ICs5NjcsMTAgQEAgYm9vbCBkcm1fbW9kZV9lcXVhbF9ub19jbG9ja3MoY29u c3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUxLCBjb25zdCBzdHJ1Y3QKPiAgCSAgICAo bW9kZTItPmZsYWdzICYgRFJNX01PREVfRkxBR18zRF9NQVNLKSkKPiAgCQlyZXR1cm4gZmFsc2U7 Cj4gIAo+ICsJaWYgKChtb2RlMS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHXzQyMF9NQVNLKSAhPQo+ ICsJICAgIChtb2RlMi0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHXzQyMF9NQVNLKSkKPiArCQlyZXR1 cm4gZmFsc2U7Cj4gKwo+ICAJcmV0dXJuIGRybV9tb2RlX2VxdWFsX25vX2Nsb2Nrc19ub19zdGVy ZW8obW9kZTEsIG1vZGUyKTsKPiAgfQo+ICBFWFBPUlRfU1lNQk9MKGRybV9tb2RlX2VxdWFsX25v X2Nsb2Nrcyk7Cj4gQEAgLTk4NSw2ICs5ODksOSBAQCBib29sIGRybV9tb2RlX2VxdWFsX25vX2Ns b2Nrcyhjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTEsIGNvbnN0IHN0cnVjdAo+ ICBib29sIGRybV9tb2RlX2VxdWFsX25vX2Nsb2Nrc19ub19zdGVyZW8oY29uc3Qgc3RydWN0IGRy bV9kaXNwbGF5X21vZGUgKm1vZGUxLAo+ICAJCQkJCWNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9t b2RlICptb2RlMikKPiAgewo+ICsJdW5zaWduZWQgaW50IGZsYWdzX21hc2sgPQo+ICsJCX4oRFJN X01PREVfRkxBR18zRF9NQVNLIHwgRFJNX01PREVfRkxBR180MjBfTUFTSyk7Cj4gKwo+ICAJaWYg KG1vZGUxLT5oZGlzcGxheSA9PSBtb2RlMi0+aGRpc3BsYXkgJiYKPiAgCSAgICBtb2RlMS0+aHN5 bmNfc3RhcnQgPT0gbW9kZTItPmhzeW5jX3N0YXJ0ICYmCj4gIAkgICAgbW9kZTEtPmhzeW5jX2Vu ZCA9PSBtb2RlMi0+aHN5bmNfZW5kICYmCj4gQEAgLTk5NSw4ICsxMDAyLDcgQEAgYm9vbCBkcm1f bW9kZV9lcXVhbF9ub19jbG9ja3Nfbm9fc3RlcmVvKGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9t b2RlICptb2RlMSwKPiAgCSAgICBtb2RlMS0+dnN5bmNfZW5kID09IG1vZGUyLT52c3luY19lbmQg JiYKPiAgCSAgICBtb2RlMS0+dnRvdGFsID09IG1vZGUyLT52dG90YWwgJiYKPiAgCSAgICBtb2Rl MS0+dnNjYW4gPT0gbW9kZTItPnZzY2FuICYmCj4gLQkgICAgKG1vZGUxLT5mbGFncyAmIH5EUk1f TU9ERV9GTEFHXzNEX01BU0spID09Cj4gLQkgICAgIChtb2RlMi0+ZmxhZ3MgJiB+RFJNX01PREVf RkxBR18zRF9NQVNLKSkKPiArCSAgICAobW9kZTEtPmZsYWdzICYgZmxhZ3NfbWFzaykgPT0gKG1v ZGUyLT5mbGFncyAmIGZsYWdzX21hc2spKQo+ICAJCXJldHVybiB0cnVlOwo+ICAKPiAgCXJldHVy biBmYWxzZTsKPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2RybS9kcm1fbW9kZS5oIGIvaW5j bHVkZS91YXBpL2RybS9kcm1fbW9kZS5oCj4gaW5kZXggY2U3ZWZlMi4uZGM4ZTI4NSAxMDA2NDQK PiAtLS0gYS9pbmNsdWRlL3VhcGkvZHJtL2RybV9tb2RlLmgKPiArKysgYi9pbmNsdWRlL3VhcGkv ZHJtL2RybV9tb2RlLmgKPiBAQCAtODQsNiArODQsMTIgQEAKPiAgI2RlZmluZSAgRFJNX01PREVf RkxBR18zRF9MX0RFUFRIX0dGWF9HRlhfREVQVEgJKDY8PDE0KQo+ICAjZGVmaW5lICBEUk1fTU9E RV9GTEFHXzNEX1RPUF9BTkRfQk9UVE9NCSg3PDwxNCkKPiAgI2RlZmluZSAgRFJNX01PREVfRkxB R18zRF9TSURFX0JZX1NJREVfSEFMRgkoODw8MTQpCj4gKy8qCj4gKyAqIEhETUkgMi4wCj4gKyAq Lwo+ICsjZGVmaW5lIERSTV9NT0RFX0ZMQUdfNDIwX01BU0sJCQkoMHgwMzw8MTkpCj4gKyNkZWZp bmUgIERSTV9NT0RFX0ZMQUdfNDIwCQkJKDE8PDE5KQo+ICsjZGVmaW5lICBEUk1fTU9ERV9GTEFH XzQyMF9PTkxZCQkJKDE8PDIwKQo+ICAKPiAgLyogUGljdHVyZSBhc3BlY3QgcmF0aW8gb3B0aW9u cyAqLwo+ICAjZGVmaW5lIERSTV9NT0RFX1BJQ1RVUkVfQVNQRUNUX05PTkUJCTAKPiAtLSAKPiAx LjkuMQo+IAo+IAo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCj4gZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+IGRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3Rv cC5vcmcKPiBodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2Ry aS1kZXZlbAoKLS0gClZpbGxlIFN5cmrDpGzDpApJbnRlbCBPVEMKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmkt ZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3Jn L21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030381AbdADNY0 (ORCPT ); Wed, 4 Jan 2017 08:24:26 -0500 Received: from mga05.intel.com ([192.55.52.43]:49490 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S967679AbdADNX4 (ORCPT ); Wed, 4 Jan 2017 08:23:56 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,459,1477983600"; d="scan'208";a="805017155" Date: Wed, 4 Jan 2017 15:22:25 +0200 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= To: Jose Abreu Cc: dri-devel@lists.freedesktop.org, Carlos Palminha , linux-kernel@vger.kernel.org, Daniel Vetter Subject: Re: [RFC] drm: Parse HDMI 2.0 YCbCr 4:2:0 VDB and VCB Message-ID: <20170104132225.GE31595@intel.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Dec 30, 2016 at 04:53:16PM +0000, Jose Abreu wrote: > HDMI 2.0 introduces a new sampling mode called YCbCr 4:2:0. > According to the spec the EDID may contain two blocks that > signal this sampling mode: > - YCbCr 4:2:0 Video Data Block > - YCbCr 4:2:0 Video Capability Map Data Block > > The video data block contains the list of vic's were > only YCbCr 4:2:0 sampling mode shall be used while the > video capability map data block contains a mask were > YCbCr 4:2:0 sampling mode may be used. > > This RFC patch adds support for parsing these two new blocks > and introduces new flags to signal the drivers if the > mode is 4:2:0'only or 4:2:0'able. > > The reason this is still a RFC is because there is no > reference in kernel for this new sampling mode (specially in > AVI infoframe part), so, I was hoping to hear some feedback > first. > > Tested in a HDMI 2.0 compliance scenario. > > Signed-off-by: Jose Abreu > Cc: Carlos Palminha > Cc: Daniel Vetter > Cc: Jani Nikula > Cc: Sean Paul > Cc: David Airlie > Cc: dri-devel@lists.freedesktop.org > Cc: linux-kernel@vger.kernel.org > --- > drivers/gpu/drm/drm_edid.c | 139 +++++++++++++++++++++++++++++++++++++++++++- > drivers/gpu/drm/drm_modes.c | 10 +++- > include/uapi/drm/drm_mode.h | 6 ++ > 3 files changed, 151 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c > index 67d6a73..6ce1a38 100644 > --- a/drivers/gpu/drm/drm_edid.c > +++ b/drivers/gpu/drm/drm_edid.c > @@ -2549,6 +2549,8 @@ static int drm_cvt_modes(struct drm_connector *connector, > #define VENDOR_BLOCK 0x03 > #define SPEAKER_BLOCK 0x04 > #define VIDEO_CAPABILITY_BLOCK 0x07 > +#define VIDEO_DATA_BLOCK_420 0x0E > +#define VIDEO_CAP_BLOCK_420 0x0F > #define EDID_BASIC_AUDIO (1 << 6) > #define EDID_CEA_YCRCB444 (1 << 5) > #define EDID_CEA_YCRCB422 (1 << 4) > @@ -3050,6 +3052,98 @@ static int add_3d_struct_modes(struct drm_connector *connector, u16 structure, > return modes; > } > > +static int add_420_mode(struct drm_connector *connector, u8 vic) > +{ > + struct drm_device *dev = connector->dev; > + struct drm_display_mode *newmode; > + > + if (!drm_valid_cea_vic(vic)) > + return 0; > + > + newmode = drm_mode_duplicate(dev, &edid_cea_modes[vic]); > + if (!newmode) > + return 0; > + > + newmode->flags |= DRM_MODE_FLAG_420_ONLY; Why does userspace need to know this? My thinking has been that the driver would do the right thing automagically. We do probably want some kind of output colorspace property to allow the user to select between RGB vs. YCbCr etc. But I think even with that we should still allow the driver to automagically select YCbCr 4:2:0 output since that's the only way the mode will work. > + drm_mode_probed_add(connector, newmode); > + > + return 1; > +} > + > +static int add_420_vdb_modes(struct drm_connector *connector, const u8 *svds, > + u8 svds_len) > +{ > + int modes = 0, i; > + > + for (i = 0; i < svds_len; i++) > + modes += add_420_mode(connector, svds[i]); > + > + return modes; > +} > + > +static int add_420_vcb_modes(struct drm_connector *connector, const u8 *svds, > + u8 svds_len, const u8 *video_db, u8 video_len) > +{ > + struct drm_display_mode *newmode = NULL; > + int modes = 0, i, j; > + > + for (i = 0; i < svds_len; i++) { > + u8 mask = svds[i]; > + for (j = 0; j < 8; j++) { > + if (mask & (1 << j)) { > + newmode = drm_display_mode_from_vic_index( > + connector, video_db, video_len, > + i * 8 + j); > + if (newmode) { > + newmode->flags |= DRM_MODE_FLAG_420; > + drm_mode_probed_add(connector, newmode); > + modes++; > + } > + } > + } > + } > + > + return modes; > +} > + > +static int add_420_vcb_modes_all(struct drm_connector *connector, > + const u8 *video_db, u8 video_len) > +{ > + struct drm_display_mode *newmode = NULL; > + int modes = 0, i; > + > + for (i = 0; i < video_len; i++) { > + newmode = drm_display_mode_from_vic_index(connector, video_db, > + video_len, i); > + if (newmode) { > + newmode->flags |= DRM_MODE_FLAG_420; > + drm_mode_probed_add(connector, newmode); > + modes++; > + } > + } > + > + return modes; > +} > + > +static int do_hdmi_420_modes(struct drm_connector *connector, const u8 *vdb, > + u8 vdb_len, const u8 *vcb, u8 vcb_len, const u8 *video_db, > + u8 video_len) > +{ > + int modes = 0; > + > + if (vdb && (vdb_len > 1)) /* Add 4:2:0 modes present in EDID */ > + modes += add_420_vdb_modes(connector, &vdb[2], vdb_len - 1); > + > + if (vcb && (vcb_len > 1)) /* Parse bit mask of supported modes */ > + modes += add_420_vcb_modes(connector, &vcb[2], vcb_len - 1, > + video_db, video_len); > + else if (vcb) /* All modes support 4:2:0 mode */ > + modes += add_420_vcb_modes_all(connector, video_db, video_len); > + > + DRM_DEBUG("added %d 4:2:0 modes\n", modes); > + return modes; > +} > + > /* > * do_hdmi_vsdb_modes - Parse the HDMI Vendor Specific data block > * @connector: connector corresponding to the HDMI sink > @@ -3206,6 +3300,12 @@ static int add_3d_struct_modes(struct drm_connector *connector, u16 structure, > } > > static int > +cea_db_extended_tag(const u8 *db) > +{ > + return db[1]; > +} > + > +static int > cea_revision(const u8 *cea) > { > return cea[1]; > @@ -3239,6 +3339,28 @@ static bool cea_db_is_hdmi_vsdb(const u8 *db) > return hdmi_id == HDMI_IEEE_OUI; > } > > +static bool cea_db_is_hdmi_vdb420(const u8 *db) > +{ > + if (cea_db_tag(db) != VIDEO_CAPABILITY_BLOCK) > + return false; > + > + if (cea_db_extended_tag(db) != VIDEO_DATA_BLOCK_420) > + return false; > + > + return true; > +} > + > +static bool cea_db_is_hdmi_vcb420(const u8 *db) > +{ > + if (cea_db_tag(db) != VIDEO_CAPABILITY_BLOCK) > + return false; > + > + if (cea_db_extended_tag(db) != VIDEO_CAP_BLOCK_420) > + return false; > + > + return true; > +} > + > #define for_each_cea_db(cea, i, start, end) \ > for ((i) = (start); (i) < (end) && (i) + cea_db_payload_len(&(cea)[(i)]) < (end); (i) += cea_db_payload_len(&(cea)[(i)]) + 1) > > @@ -3246,8 +3368,9 @@ static bool cea_db_is_hdmi_vsdb(const u8 *db) > add_cea_modes(struct drm_connector *connector, struct edid *edid) > { > const u8 *cea = drm_find_cea_extension(edid); > - const u8 *db, *hdmi = NULL, *video = NULL; > - u8 dbl, hdmi_len, video_len = 0; > + const u8 *db, *hdmi = NULL, *video = NULL, *vdb420 = NULL, > + *vcb420 = NULL; > + u8 dbl, hdmi_len, video_len = 0, vdb420_len = 0, vcb420_len = 0; > int modes = 0; > > if (cea && cea_revision(cea) >= 3) { > @@ -3269,6 +3392,14 @@ static bool cea_db_is_hdmi_vsdb(const u8 *db) > hdmi = db; > hdmi_len = dbl; > } > + else if (cea_db_is_hdmi_vdb420(db)) { > + vdb420 = db; > + vdb420_len = dbl; > + } > + else if (cea_db_is_hdmi_vcb420(db)) { > + vcb420 = db; > + vcb420_len = dbl; > + } > } > } > > @@ -3280,6 +3411,10 @@ static bool cea_db_is_hdmi_vsdb(const u8 *db) > modes += do_hdmi_vsdb_modes(connector, hdmi, hdmi_len, video, > video_len); > > + if (vdb420 || vcb420) > + modes += do_hdmi_420_modes(connector, vdb420, vdb420_len, > + vcb420, vcb420_len, video, video_len); > + > return modes; > } > > diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c > index ac6a352..53c65f6 100644 > --- a/drivers/gpu/drm/drm_modes.c > +++ b/drivers/gpu/drm/drm_modes.c > @@ -967,6 +967,10 @@ bool drm_mode_equal_no_clocks(const struct drm_display_mode *mode1, const struct > (mode2->flags & DRM_MODE_FLAG_3D_MASK)) > return false; > > + if ((mode1->flags & DRM_MODE_FLAG_420_MASK) != > + (mode2->flags & DRM_MODE_FLAG_420_MASK)) > + return false; > + > return drm_mode_equal_no_clocks_no_stereo(mode1, mode2); > } > EXPORT_SYMBOL(drm_mode_equal_no_clocks); > @@ -985,6 +989,9 @@ bool drm_mode_equal_no_clocks(const struct drm_display_mode *mode1, const struct > bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, > const struct drm_display_mode *mode2) > { > + unsigned int flags_mask = > + ~(DRM_MODE_FLAG_3D_MASK | DRM_MODE_FLAG_420_MASK); > + > if (mode1->hdisplay == mode2->hdisplay && > mode1->hsync_start == mode2->hsync_start && > mode1->hsync_end == mode2->hsync_end && > @@ -995,8 +1002,7 @@ bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, > mode1->vsync_end == mode2->vsync_end && > mode1->vtotal == mode2->vtotal && > mode1->vscan == mode2->vscan && > - (mode1->flags & ~DRM_MODE_FLAG_3D_MASK) == > - (mode2->flags & ~DRM_MODE_FLAG_3D_MASK)) > + (mode1->flags & flags_mask) == (mode2->flags & flags_mask)) > return true; > > return false; > diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h > index ce7efe2..dc8e285 100644 > --- a/include/uapi/drm/drm_mode.h > +++ b/include/uapi/drm/drm_mode.h > @@ -84,6 +84,12 @@ > #define DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH (6<<14) > #define DRM_MODE_FLAG_3D_TOP_AND_BOTTOM (7<<14) > #define DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF (8<<14) > +/* > + * HDMI 2.0 > + */ > +#define DRM_MODE_FLAG_420_MASK (0x03<<19) > +#define DRM_MODE_FLAG_420 (1<<19) > +#define DRM_MODE_FLAG_420_ONLY (1<<20) > > /* Picture aspect ratio options */ > #define DRM_MODE_PICTURE_ASPECT_NONE 0 > -- > 1.9.1 > > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Ville Syrjälä Intel OTC