From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bibby Hsieh Subject: [PATCH v4 4/4] drm/mediatek: set mt8173 dithering function Date: Thu, 28 Jul 2016 10:22:55 +0800 Message-ID: <1469672575-5847-5-git-send-email-bibby.hsieh@mediatek.com> References: <1469672575-5847-1-git-send-email-bibby.hsieh@mediatek.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1469672575-5847-1-git-send-email-bibby.hsieh@mediatek.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: David Airlie , Matthias Brugger , Daniel Vetter , dri-devel@lists.freedesktop.org, linux-mediatek@lists.infradead.org Cc: linux-kernel@vger.kernel.org, Cawa Cheng , Mao Huang , Yingjoe Chen , Sascha Hauer , linux-arm-kernel@lists.infradead.org List-Id: linux-mediatek@lists.infradead.org U29tZSBwYW5lbHMgb25seSBhY2NlcHQgYnBjIChiaXQgcGVyIGNvbG9yKSA2LWJpdC4KQnV0LCB0 aGUgZGVmYXVsdCBicGMgaW4gbXQ4MTczIGRpc3BsYXkgZGF0YSBwYXRoIGlzIDgtYml0LgpJZiB3 ZSBkaWRuJ3QgZW5hYmxlIGRpdGhlcmluZyBmdW5jdGlvbiB0byBjb252ZXJ0IGJwYywKZGlzcGxh eSBjYW5ub3Qgc2hvdyB0aGUgc21vb3RoIGdyYXlzY2FsZSBpbWFnZS4KCkluIG10ODE3MywgdGhl IGRpdGhlcmluZyBmdW5jdGlvbiBpbiBPRCAoT3ZlckRyaXZlKSBhbmQKR0FNTUEgbW9kdWxlLCB3 ZSBoYXZlIHRvIGNvbmZpZyB0aGVtIHdpdGgKY29ubmVjdG9yLT5kaXNwbGF5X21vZGUuYnBjIHdo ZW4gQ1JUQyBpbml0aWFsLgoKMS4gQ2xlYXIgdGhlIGRlZmF1bHQgdmFsdWUgYXQgKl9ESVRIRVJf NSBhbmQgKl9ESVRIRVJfNyByZWdpc3Rlci4KMi4gQ2FsY3VsYXRlIHRoZSBMU0JfRVJSX1NISUZU IGJpdHMgYW5kIEFERF9MU0hJRlQgYml0cyB0d28gdmFsdWVzLgppLmUuIElucHV0IGJwYyBvZiBP RCBpcyAxMCBiaXRzLCB3ZSBhc3N1bWUgdGhlIGJwYyBvZiBwYW5lbCBpcyA2LWJpdCwKc28sIHdl IG5lZWQgdG8gc2V0IDQtYml0IHRvIExTQl9FUlJfU0hJRlQgYW5kIEFERF9MU0hJRlQgYml0cyBy ZXNwZWN0aXZlbHkuCjMuIFRoZW4sIHNldCB0aGUgT0Qgb3IgR0FNTUEgdG8gZGl0aGVyaW5nIG1v ZGUgZGVwZW5kcyBvbiBwYXRoLTEgb3IgcGF0aC0yLgoKU2lnbmVkLW9mZi1ieTogQmliYnkgSHNp ZWggPGJpYmJ5LmhzaWVoQG1lZGlhdGVrLmNvbT4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0 ZWsvbXRrX2Rpc3Bfb3ZsLmMgICAgIHwgICAgMyArLQogZHJpdmVycy9ncHUvZHJtL21lZGlhdGVr L210a19kaXNwX3JkbWEuYyAgICB8ICAgIDMgKy0KIGRyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9t dGtfZHJtX2NydGMuYyAgICAgfCAgIDIxICsrKysrKy0tCiBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0 ZWsvbXRrX2RybV9jcnRjLmggICAgIHwgICAgMiArCiBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsv bXRrX2RybV9kZHBfY29tcC5jIHwgICA3MiArKysrKysrKysrKysrKysrKysrKysrLS0tLS0KIGRy aXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2RkcF9jb21wLmggfCAgICA4ICstLQogNiBm aWxlcyBjaGFuZ2VkLCA4OSBpbnNlcnRpb25zKCspLCAyMCBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2Rpc3Bfb3ZsLmMgYi9kcml2ZXJzL2dw dS9kcm0vbWVkaWF0ZWsvbXRrX2Rpc3Bfb3ZsLmMKaW5kZXggOGY2MjY3MWYuLjAxOWI3Y2EgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZGlzcF9vdmwuYworKysgYi9k cml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2Rpc3Bfb3ZsLmMKQEAgLTEwMyw3ICsxMDMsOCBA QCBzdGF0aWMgdm9pZCBtdGtfb3ZsX3N0b3Aoc3RydWN0IG10a19kZHBfY29tcCAqY29tcCkKIH0K IAogc3RhdGljIHZvaWQgbXRrX292bF9jb25maWcoc3RydWN0IG10a19kZHBfY29tcCAqY29tcCwg dW5zaWduZWQgaW50IHcsCi0JCQkgICB1bnNpZ25lZCBpbnQgaCwgdW5zaWduZWQgaW50IHZyZWZy ZXNoKQorCQkJICAgdW5zaWduZWQgaW50IGgsIHVuc2lnbmVkIGludCB2cmVmcmVzaCwKKwkJCSAg IHVuc2lnbmVkIGludCBicGMpCiB7CiAJaWYgKHcgIT0gMCAmJiBoICE9IDApCiAJCXdyaXRlbF9y ZWxheGVkKGggPDwgMTYgfCB3LCBjb21wLT5yZWdzICsgRElTUF9SRUdfT1ZMX1JPSV9TSVpFKTsK ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZGlzcF9yZG1hLmMgYi9k cml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2Rpc3BfcmRtYS5jCmluZGV4IDVmYjgwY2IuLjBk ZjA1ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZGlzcF9yZG1h LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kaXNwX3JkbWEuYwpAQCAtMTA2 LDcgKzEwNiw4IEBAIHN0YXRpYyB2b2lkIG10a19yZG1hX3N0b3Aoc3RydWN0IG10a19kZHBfY29t cCAqY29tcCkKIH0KIAogc3RhdGljIHZvaWQgbXRrX3JkbWFfY29uZmlnKHN0cnVjdCBtdGtfZGRw X2NvbXAgKmNvbXAsIHVuc2lnbmVkIGludCB3aWR0aCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgaGVp Z2h0LCB1bnNpZ25lZCBpbnQgdnJlZnJlc2gpCisJCQkgICAgdW5zaWduZWQgaW50IGhlaWdodCwg dW5zaWduZWQgaW50IHZyZWZyZXNoLAorCQkJICAgIHVuc2lnbmVkIGludCBicGMpCiB7CiAJdW5z aWduZWQgaW50IHRocmVzaG9sZDsKIAl1bnNpZ25lZCBpbnQgcmVnOwpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL21l ZGlhdGVrL210a19kcm1fY3J0Yy5jCmluZGV4IGNiYjQ2MGE1Li5lNTExNzZlOCAxMDA2NDQKLS0t IGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fY3J0Yy5jCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2NydGMuYwpAQCAtMjIyLDcgKzIyMiw5IEBAIHN0YXRp YyB2b2lkIG10a19jcnRjX2RkcF9jbGtfZGlzYWJsZShzdHJ1Y3QgbXRrX2RybV9jcnRjICptdGtf Y3J0YykKIHN0YXRpYyBpbnQgbXRrX2NydGNfZGRwX2h3X2luaXQoc3RydWN0IG10a19kcm1fY3J0 YyAqbXRrX2NydGMpCiB7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjID0gJm10a19jcnRjLT5iYXNl OwotCXVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0LCB2cmVmcmVzaDsKKwlzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwl1bnNp Z25lZCBpbnQgd2lkdGgsIGhlaWdodCwgdnJlZnJlc2gsIGJwYyA9IE1US19NQVhfQlBDOwogCWlu dCByZXQ7CiAJaW50IGk7CiAKQEAgLTIzNCw2ICsyMzYsMTkgQEAgc3RhdGljIGludCBtdGtfY3J0 Y19kZHBfaHdfaW5pdChzdHJ1Y3QgbXRrX2RybV9jcnRjICptdGtfY3J0YykKIAloZWlnaHQgPSBj cnRjLT5zdGF0ZS0+YWRqdXN0ZWRfbW9kZS52ZGlzcGxheTsKIAl2cmVmcmVzaCA9IGNydGMtPnN0 YXRlLT5hZGp1c3RlZF9tb2RlLnZyZWZyZXNoOwogCisJZHJtX2Zvcl9lYWNoX2VuY29kZXIoZW5j b2RlciwgY3J0Yy0+ZGV2KSB7CisJCWlmIChlbmNvZGVyLT5jcnRjICE9IGNydGMpCisJCQljb250 aW51ZTsKKworCQlkcm1fZm9yX2VhY2hfY29ubmVjdG9yKGNvbm5lY3RvciwgY3J0Yy0+ZGV2KSB7 CisJCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyICE9IGVuY29kZXIpCisJCQkJY29udGludWU7CisJ CQlpZiAoY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uYnBjICE9IDAgJiYKKwkJCSAgICBicGMgPiBj b25uZWN0b3ItPmRpc3BsYXlfaW5mby5icGMpCisJCQkJYnBjID0gY29ubmVjdG9yLT5kaXNwbGF5 X2luZm8uYnBjOworCQl9CisJfQorCiAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhjcnRjLT5k ZXYtPmRldik7CiAJaWYgKHJldCA8IDApIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gZW5hYmxl IHBvd2VyIGRvbWFpbjogJWRcbiIsIHJldCk7CkBAIC0yNjYsNyArMjgxLDcgQEAgc3RhdGljIGlu dCBtdGtfY3J0Y19kZHBfaHdfaW5pdChzdHJ1Y3QgbXRrX2RybV9jcnRjICptdGtfY3J0YykKIAlm b3IgKGkgPSAwOyBpIDwgbXRrX2NydGMtPmRkcF9jb21wX25yOyBpKyspIHsKIAkJc3RydWN0IG10 a19kZHBfY29tcCAqY29tcCA9IG10a19jcnRjLT5kZHBfY29tcFtpXTsKIAotCQltdGtfZGRwX2Nv bXBfY29uZmlnKGNvbXAsIHdpZHRoLCBoZWlnaHQsIHZyZWZyZXNoKTsKKwkJbXRrX2RkcF9jb21w X2NvbmZpZyhjb21wLCB3aWR0aCwgaGVpZ2h0LCB2cmVmcmVzaCwgYnBjKTsKIAkJbXRrX2RkcF9j b21wX3N0YXJ0KGNvbXApOwogCX0KIApAQCAtNDY4LDcgKzQ4Myw3IEBAIHZvaWQgbXRrX2NydGNf ZGRwX2lycShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBtdGtfZGRwX2NvbXAgKm92bCkK IAlpZiAoc3RhdGUtPnBlbmRpbmdfY29uZmlnKSB7CiAJCW10a19kZHBfY29tcF9jb25maWcob3Zs LCBzdGF0ZS0+cGVuZGluZ193aWR0aCwKIAkJCQkgICAgc3RhdGUtPnBlbmRpbmdfaGVpZ2h0LAot CQkJCSAgICBzdGF0ZS0+cGVuZGluZ192cmVmcmVzaCk7CisJCQkJICAgIHN0YXRlLT5wZW5kaW5n X3ZyZWZyZXNoLCAwKTsKIAogCQlzdGF0ZS0+cGVuZGluZ19jb25maWcgPSBmYWxzZTsKIAl9CmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9jcnRjLmggYi9kcml2 ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9jcnRjLmgKaW5kZXggZDMzMjU2NC4uMzNmNmFi NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fY3J0Yy5oCisr KyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2NydGMuaApAQCAtMjAsNiArMjAs OCBAQAogCiAjZGVmaW5lIE9WTF9MQVlFUl9OUgk0CiAjZGVmaW5lIE1US19MVVRfU0laRQk1MTIK KyNkZWZpbmUgTVRLX01BWF9CUEMJMTAKKyNkZWZpbmUgTVRLX01JTl9CUEMJMwogCiBpbnQgbXRr X2RybV9jcnRjX2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgdW5zaWduZWQg aW50IHBpcGUpOwogdm9pZCBtdGtfZHJtX2NydGNfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9k ZXZpY2UgKmRybSwgdW5zaWduZWQgaW50IHBpcGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL21lZGlhdGVrL210a19kcm1fZGRwX2NvbXAuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRl ay9tdGtfZHJtX2RkcF9jb21wLmMKaW5kZXggNDJjZDU4Ny4uZGYzM2IzYyAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZGRwX2NvbXAuYworKysgYi9kcml2ZXJz L2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kZHBfY29tcC5jCkBAIC0zMSw2ICszMSwxMCBAQAog I2RlZmluZSBESVNQX09EX0lOVFNUQQkJCQkweDAwMGMKICNkZWZpbmUgRElTUF9PRF9DRkcJCQkJ MHgwMDIwCiAjZGVmaW5lIERJU1BfT0RfU0laRQkJCQkweDAwMzAKKyNkZWZpbmUgRElTUF9ESVRI RVJfNQkJCQkweDAxMTQKKyNkZWZpbmUgRElTUF9ESVRIRVJfNwkJCQkweDAxMWMKKyNkZWZpbmUg RElTUF9ESVRIRVJfMTUJCQkJMHgwMTNjCisjZGVmaW5lIERJU1BfRElUSEVSXzE2CQkJCTB4MDE0 MAogCiAjZGVmaW5lIERJU1BfUkVHX1VGT19TVEFSVAkJCTB4MDAwMAogCkBAIC00OSwyMCArNTMs NTkgQEAKIAogI2RlZmluZSBMVVRfMTBCSVRfTUFTSwkJCQkweDAzZmYKIAotI2RlZmluZQlPRF9S RUxBWV9NT0RFCQlCSVQoMCkKKyNkZWZpbmUgQ09MT1JfQllQQVNTX0FMTAkJCUJJVCg3KQorI2Rl ZmluZSBDT0xPUl9TRVFfU0VMCQkJCUJJVCgxMykKIAotI2RlZmluZQlVRk9fQllQQVNTCQlCSVQo MikKKyNkZWZpbmUgT0RfUkVMQVlNT0RFCQkJCUJJVCgwKQogCi0jZGVmaW5lCUNPTE9SX0JZUEFT U19BTEwJQklUKDcpCi0jZGVmaW5lCUNPTE9SX1NFUV9TRUwJCUJJVCgxMykKKyNkZWZpbmUgVUZP X0JZUEFTUwkJCQlCSVQoMikKIAotI2RlZmluZSBBQUxfRU4JCQlCSVQoMCkKKyNkZWZpbmUgQUFM X0VOCQkJCQlCSVQoMCkKIAotI2RlZmluZSBHQU1NQV9FTgkJQklUKDApCi0jZGVmaW5lIEdBTU1B X0xVVF9FTgkJQklUKDEpCisjZGVmaW5lIEdBTU1BX0VOCQkJCUJJVCgwKQorI2RlZmluZSBHQU1N QV9MVVRfRU4JCQkJQklUKDEpCisKKyNkZWZpbmUgRElTUF9ESVRIRVJJTkcJCQkJQklUKDIpCisj ZGVmaW5lIERJVEhFUl9MU0JfRVJSX1NISUZUX1IoeCkJCSgoKHgpICYgMHg3KSA8PCAyOCkKKyNk ZWZpbmUgRElUSEVSX09WRkxXX0JJVF9SKHgpCQkJKCgoeCkgJiAweDcpIDw8IDI0KQorI2RlZmlu ZSBESVRIRVJfQUREX0xTSElGVF9SKHgpCQkJKCgoeCkgJiAweDcpIDw8IDIwKQorI2RlZmluZSBE SVRIRVJfQUREX1JTSElGVF9SKHgpCQkJKCgoeCkgJiAweDcpIDw8IDE2KQorI2RlZmluZSBESVRI RVJfTkVXX0JJVF9NT0RFCQkJQklUKDApCisjZGVmaW5lIERJVEhFUl9MU0JfRVJSX1NISUZUX0Io eCkJCSgoKHgpICYgMHg3KSA8PCAyOCkKKyNkZWZpbmUgRElUSEVSX09WRkxXX0JJVF9CKHgpCQkJ KCgoeCkgJiAweDcpIDw8IDI0KQorI2RlZmluZSBESVRIRVJfQUREX0xTSElGVF9CKHgpCQkJKCgo eCkgJiAweDcpIDw8IDIwKQorI2RlZmluZSBESVRIRVJfQUREX1JTSElGVF9CKHgpCQkJKCgoeCkg JiAweDcpIDw8IDE2KQorI2RlZmluZSBESVRIRVJfTFNCX0VSUl9TSElGVF9HKHgpCQkoKCh4KSAm IDB4NykgPDwgMTIpCisjZGVmaW5lIERJVEhFUl9PVkZMV19CSVRfRyh4KQkJCSgoKHgpICYgMHg3 KSA8PCA4KQorI2RlZmluZSBESVRIRVJfQUREX0xTSElGVF9HKHgpCQkJKCgoeCkgJiAweDcpIDw8 IDQpCisjZGVmaW5lIERJVEhFUl9BRERfUlNISUZUX0coeCkJCQkoKCh4KSAmIDB4NykgPDwgMCkK Kwordm9pZCBtdGtfZGl0aGVyX3NldChzdHJ1Y3QgbXRrX2RkcF9jb21wICpjb21wLCB1bnNpZ25l ZCBpbnQgYnBjLAorCQkgICAgdW5zaWduZWQgaW50IENGRykKK3sKKwkvKiBJZiBicGMgZXF1YWwg dG8gMCwgdGhlIGRpdGhlcmluZyBmdW5jdGlvbiBkaWRuJ3QgYmUgZW5hYmxlZCAqLworCWlmIChi cGMgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGJwYyA+PSBNVEtfTUlOX0JQQykgeworCQl3cml0 ZWwoMCwgY29tcC0+cmVncyArIERJU1BfRElUSEVSXzUpOworCQl3cml0ZWwoMCwgY29tcC0+cmVn cyArIERJU1BfRElUSEVSXzcpOworCQl3cml0ZWwoRElUSEVSX0xTQl9FUlJfU0hJRlRfUihNVEtf TUFYX0JQQyAtIGJwYykgfAorCQkgICAgICAgRElUSEVSX0FERF9MU0hJRlRfUihNVEtfTUFYX0JQ QyAtIGJwYykgfAorCQkgICAgICAgRElUSEVSX05FV19CSVRfTU9ERSwKKwkJICAgICAgIGNvbXAt PnJlZ3MgKyBESVNQX0RJVEhFUl8xNSk7CisJCXdyaXRlbChESVRIRVJfTFNCX0VSUl9TSElGVF9C KE1US19NQVhfQlBDIC0gYnBjKSB8CisJCSAgICAgICBESVRIRVJfQUREX0xTSElGVF9CKE1US19N QVhfQlBDIC0gYnBjKSB8CisJCSAgICAgICBESVRIRVJfTFNCX0VSUl9TSElGVF9HKE1US19NQVhf QlBDIC0gYnBjKSB8CisJCSAgICAgICBESVRIRVJfQUREX0xTSElGVF9HKE1US19NQVhfQlBDIC0g YnBjKSwKKwkJICAgICAgIGNvbXAtPnJlZ3MgKyBESVNQX0RJVEhFUl8xNik7CisJCXdyaXRlbChE SVNQX0RJVEhFUklORywgY29tcC0+cmVncyArIENGRyk7CisJfQorfQogCiBzdGF0aWMgdm9pZCBt dGtfY29sb3JfY29uZmlnKHN0cnVjdCBtdGtfZGRwX2NvbXAgKmNvbXAsIHVuc2lnbmVkIGludCB3 LAotCQkJICAgICB1bnNpZ25lZCBpbnQgaCwgdW5zaWduZWQgaW50IHZyZWZyZXNoKQorCQkJICAg ICB1bnNpZ25lZCBpbnQgaCwgdW5zaWduZWQgaW50IHZyZWZyZXNoLAorCQkJICAgICB1bnNpZ25l ZCBpbnQgYnBjKQogewogCXdyaXRlbCh3LCBjb21wLT5yZWdzICsgRElTUF9DT0xPUl9XSURUSCk7 CiAJd3JpdGVsKGgsIGNvbXAtPnJlZ3MgKyBESVNQX0NPTE9SX0hFSUdIVCk7CkBAIC03NiwxNCAr MTE5LDE2IEBAIHN0YXRpYyB2b2lkIG10a19jb2xvcl9zdGFydChzdHJ1Y3QgbXRrX2RkcF9jb21w ICpjb21wKQogfQogCiBzdGF0aWMgdm9pZCBtdGtfb2RfY29uZmlnKHN0cnVjdCBtdGtfZGRwX2Nv bXAgKmNvbXAsIHVuc2lnbmVkIGludCB3LAotCQkJICB1bnNpZ25lZCBpbnQgaCwgdW5zaWduZWQg aW50IHZyZWZyZXNoKQorCQkJICB1bnNpZ25lZCBpbnQgaCwgdW5zaWduZWQgaW50IHZyZWZyZXNo LAorCQkJICB1bnNpZ25lZCBpbnQgYnBjKQogewogCXdyaXRlbCh3IDw8IDE2IHwgaCwgY29tcC0+ cmVncyArIERJU1BfT0RfU0laRSk7CisJd3JpdGVsKE9EX1JFTEFZTU9ERSwgY29tcC0+cmVncyAr IE9EX1JFTEFZTU9ERSk7CisJbXRrX2RpdGhlcl9zZXQoY29tcCwgYnBjLCBESVNQX09EX0NGRyk7 CiB9CiAKIHN0YXRpYyB2b2lkIG10a19vZF9zdGFydChzdHJ1Y3QgbXRrX2RkcF9jb21wICpjb21w KQogewotCXdyaXRlbChPRF9SRUxBWV9NT0RFLCBjb21wLT5yZWdzICsgRElTUF9PRF9DRkcpOwog CXdyaXRlbCgxLCBjb21wLT5yZWdzICsgRElTUF9PRF9FTik7CiB9CiAKQEAgLTkzLDcgKzEzOCw4 IEBAIHN0YXRpYyB2b2lkIG10a191Zm9lX3N0YXJ0KHN0cnVjdCBtdGtfZGRwX2NvbXAgKmNvbXAp CiB9CiAKIHN0YXRpYyB2b2lkIG10a19hYWxfY29uZmlnKHN0cnVjdCBtdGtfZGRwX2NvbXAgKmNv bXAsIHVuc2lnbmVkIGludCB3LAotCQkJICAgdW5zaWduZWQgaW50IGgsIHVuc2lnbmVkIGludCB2 cmVmcmVzaCkKKwkJCSAgIHVuc2lnbmVkIGludCBoLCB1bnNpZ25lZCBpbnQgdnJlZnJlc2gsCisJ CQkgICB1bnNpZ25lZCBpbnQgYnBjKQogewogCXdyaXRlbChoIDw8IDE2IHwgdywgY29tcC0+cmVn cyArIERJU1BfQUFMX1NJWkUpOwogfQpAQCAtMTA5LDkgKzE1NSwxMSBAQCBzdGF0aWMgdm9pZCBt dGtfYWFsX3N0b3Aoc3RydWN0IG10a19kZHBfY29tcCAqY29tcCkKIH0KIAogc3RhdGljIHZvaWQg bXRrX2dhbW1hX2NvbmZpZyhzdHJ1Y3QgbXRrX2RkcF9jb21wICpjb21wLCB1bnNpZ25lZCBpbnQg dywKLQkJCSAgICAgdW5zaWduZWQgaW50IGgsIHVuc2lnbmVkIGludCB2cmVmcmVzaCkKKwkJCSAg ICAgdW5zaWduZWQgaW50IGgsIHVuc2lnbmVkIGludCB2cmVmcmVzaCwKKwkJCSAgICAgdW5zaWdu ZWQgaW50IGJwYykKIHsKIAl3cml0ZWwoaCA8PCAxNiB8IHcsIGNvbXAtPnJlZ3MgKyBESVNQX0dB TU1BX1NJWkUpOworCW10a19kaXRoZXJfc2V0KGNvbXAsIGJwYywgRElTUF9HQU1NQV9DRkcpOwog fQogCiBzdGF0aWMgdm9pZCBtdGtfZ2FtbWFfc3RhcnQoc3RydWN0IG10a19kZHBfY29tcCAqY29t cCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2RkcF9jb21w LmggYi9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kZHBfY29tcC5oCmluZGV4IGY0 YjdlMGEuLjIyYTMzZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtf ZHJtX2RkcF9jb21wLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZGRw X2NvbXAuaApAQCAtNjUsNyArNjUsNyBAQCBzdHJ1Y3QgbXRrX2RkcF9jb21wOwogCiBzdHJ1Y3Qg bXRrX2RkcF9jb21wX2Z1bmNzIHsKIAl2b2lkICgqY29uZmlnKShzdHJ1Y3QgbXRrX2RkcF9jb21w ICpjb21wLCB1bnNpZ25lZCBpbnQgdywKLQkJICAgICAgIHVuc2lnbmVkIGludCBoLCB1bnNpZ25l ZCBpbnQgdnJlZnJlc2gpOworCQkgICAgICAgdW5zaWduZWQgaW50IGgsIHVuc2lnbmVkIGludCB2 cmVmcmVzaCwgdW5zaWduZWQgaW50IGJwYyk7CiAJdm9pZCAoKnN0YXJ0KShzdHJ1Y3QgbXRrX2Rk cF9jb21wICpjb21wKTsKIAl2b2lkICgqc3RvcCkoc3RydWN0IG10a19kZHBfY29tcCAqY29tcCk7 CiAJdm9pZCAoKmVuYWJsZV92YmxhbmspKHN0cnVjdCBtdGtfZGRwX2NvbXAgKmNvbXAsIHN0cnVj dCBkcm1fY3J0YyAqY3J0Yyk7CkBAIC04OSwxMCArODksMTAgQEAgc3RydWN0IG10a19kZHBfY29t cCB7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtdGtfZGRwX2NvbXBfY29uZmlnKHN0cnVjdCBtdGtf ZGRwX2NvbXAgKmNvbXAsCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCB3LCB1bnNpZ25lZCBpbnQg aCwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IHZyZWZyZXNoKQorCQkJCSAgICAgICB1bnNpZ25l ZCBpbnQgdnJlZnJlc2gsIHVuc2lnbmVkIGludCBicGMpCiB7CiAJaWYgKGNvbXAtPmZ1bmNzICYm IGNvbXAtPmZ1bmNzLT5jb25maWcpCi0JCWNvbXAtPmZ1bmNzLT5jb25maWcoY29tcCwgdywgaCwg dnJlZnJlc2gpOworCQljb21wLT5mdW5jcy0+Y29uZmlnKGNvbXAsIHcsIGgsIHZyZWZyZXNoLCBi cGMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbXRrX2RkcF9jb21wX3N0YXJ0KHN0cnVjdCBt dGtfZGRwX2NvbXAgKmNvbXApCkBAIC0xNTYsNSArMTU2LDcgQEAgaW50IG10a19kZHBfY29tcF9p bml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9ub2RlICpjb21wX25vZGUsCiAJ CSAgICAgIGNvbnN0IHN0cnVjdCBtdGtfZGRwX2NvbXBfZnVuY3MgKmZ1bmNzKTsKIGludCBtdGtf ZGRwX2NvbXBfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgc3RydWN0IG10a19kZHBf Y29tcCAqY29tcCk7CiB2b2lkIG10a19kZHBfY29tcF91bnJlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2 aWNlICpkcm0sIHN0cnVjdCBtdGtfZGRwX2NvbXAgKmNvbXApOwordm9pZCBtdGtfZGl0aGVyX3Nl dChzdHJ1Y3QgbXRrX2RkcF9jb21wICpjb21wLCB1bnNpZ25lZCBpbnQgYnBjLAorCQkgICAgdW5z aWduZWQgaW50IENGRyk7CiAKICNlbmRpZiAvKiBNVEtfRFJNX0REUF9DT01QX0ggKi8KLS0gCjEu Ny45LjUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRy aS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw czovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: bibby.hsieh@mediatek.com (Bibby Hsieh) Date: Thu, 28 Jul 2016 10:22:55 +0800 Subject: [PATCH v4 4/4] drm/mediatek: set mt8173 dithering function In-Reply-To: <1469672575-5847-1-git-send-email-bibby.hsieh@mediatek.com> References: <1469672575-5847-1-git-send-email-bibby.hsieh@mediatek.com> Message-ID: <1469672575-5847-5-git-send-email-bibby.hsieh@mediatek.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Some panels only accept bpc (bit per color) 6-bit. But, the default bpc in mt8173 display data path is 8-bit. If we didn't enable dithering function to convert bpc, display cannot show the smooth grayscale image. In mt8173, the dithering function in OD (OverDrive) and GAMMA module, we have to config them with connector->display_mode.bpc when CRTC initial. 1. Clear the default value at *_DITHER_5 and *_DITHER_7 register. 2. Calculate the LSB_ERR_SHIFT bits and ADD_LSHIFT bits two values. i.e. Input bpc of OD is 10 bits, we assume the bpc of panel is 6-bit, so, we need to set 4-bit to LSB_ERR_SHIFT and ADD_LSHIFT bits respectively. 3. Then, set the OD or GAMMA to dithering mode depends on path-1 or path-2. Signed-off-by: Bibby Hsieh --- drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 3 +- drivers/gpu/drm/mediatek/mtk_disp_rdma.c | 3 +- drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 21 ++++++-- drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 2 + drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 72 ++++++++++++++++++++++----- drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 8 +-- 6 files changed, 89 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c index 8f62671f..019b7ca 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c @@ -103,7 +103,8 @@ static void mtk_ovl_stop(struct mtk_ddp_comp *comp) } static void mtk_ovl_config(struct mtk_ddp_comp *comp, unsigned int w, - unsigned int h, unsigned int vrefresh) + unsigned int h, unsigned int vrefresh, + unsigned int bpc) { if (w != 0 && h != 0) writel_relaxed(h << 16 | w, comp->regs + DISP_REG_OVL_ROI_SIZE); diff --git a/drivers/gpu/drm/mediatek/mtk_disp_rdma.c b/drivers/gpu/drm/mediatek/mtk_disp_rdma.c index 5fb80cb..0df05f9 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_rdma.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_rdma.c @@ -106,7 +106,8 @@ static void mtk_rdma_stop(struct mtk_ddp_comp *comp) } static void mtk_rdma_config(struct mtk_ddp_comp *comp, unsigned int width, - unsigned int height, unsigned int vrefresh) + unsigned int height, unsigned int vrefresh, + unsigned int bpc) { unsigned int threshold; unsigned int reg; diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c index cbb460a5..e51176e8 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c @@ -222,7 +222,9 @@ static void mtk_crtc_ddp_clk_disable(struct mtk_drm_crtc *mtk_crtc) static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) { struct drm_crtc *crtc = &mtk_crtc->base; - unsigned int width, height, vrefresh; + struct drm_connector *connector; + struct drm_encoder *encoder; + unsigned int width, height, vrefresh, bpc = MTK_MAX_BPC; int ret; int i; @@ -234,6 +236,19 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) height = crtc->state->adjusted_mode.vdisplay; vrefresh = crtc->state->adjusted_mode.vrefresh; + drm_for_each_encoder(encoder, crtc->dev) { + if (encoder->crtc != crtc) + continue; + + drm_for_each_connector(connector, crtc->dev) { + if (connector->encoder != encoder) + continue; + if (connector->display_info.bpc != 0 && + bpc > connector->display_info.bpc) + bpc = connector->display_info.bpc; + } + } + ret = pm_runtime_get_sync(crtc->dev->dev); if (ret < 0) { DRM_ERROR("Failed to enable power domain: %d\n", ret); @@ -266,7 +281,7 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) { struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[i]; - mtk_ddp_comp_config(comp, width, height, vrefresh); + mtk_ddp_comp_config(comp, width, height, vrefresh, bpc); mtk_ddp_comp_start(comp); } @@ -468,7 +483,7 @@ void mtk_crtc_ddp_irq(struct drm_crtc *crtc, struct mtk_ddp_comp *ovl) if (state->pending_config) { mtk_ddp_comp_config(ovl, state->pending_width, state->pending_height, - state->pending_vrefresh); + state->pending_vrefresh, 0); state->pending_config = false; } diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h index d332564..33f6ab6 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h @@ -20,6 +20,8 @@ #define OVL_LAYER_NR 4 #define MTK_LUT_SIZE 512 +#define MTK_MAX_BPC 10 +#define MTK_MIN_BPC 3 int mtk_drm_crtc_enable_vblank(struct drm_device *drm, unsigned int pipe); void mtk_drm_crtc_disable_vblank(struct drm_device *drm, unsigned int pipe); diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c index 42cd587..df33b3c 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c @@ -31,6 +31,10 @@ #define DISP_OD_INTSTA 0x000c #define DISP_OD_CFG 0x0020 #define DISP_OD_SIZE 0x0030 +#define DISP_DITHER_5 0x0114 +#define DISP_DITHER_7 0x011c +#define DISP_DITHER_15 0x013c +#define DISP_DITHER_16 0x0140 #define DISP_REG_UFO_START 0x0000 @@ -49,20 +53,59 @@ #define LUT_10BIT_MASK 0x03ff -#define OD_RELAY_MODE BIT(0) +#define COLOR_BYPASS_ALL BIT(7) +#define COLOR_SEQ_SEL BIT(13) -#define UFO_BYPASS BIT(2) +#define OD_RELAYMODE BIT(0) -#define COLOR_BYPASS_ALL BIT(7) -#define COLOR_SEQ_SEL BIT(13) +#define UFO_BYPASS BIT(2) -#define AAL_EN BIT(0) +#define AAL_EN BIT(0) -#define GAMMA_EN BIT(0) -#define GAMMA_LUT_EN BIT(1) +#define GAMMA_EN BIT(0) +#define GAMMA_LUT_EN BIT(1) + +#define DISP_DITHERING BIT(2) +#define DITHER_LSB_ERR_SHIFT_R(x) (((x) & 0x7) << 28) +#define DITHER_OVFLW_BIT_R(x) (((x) & 0x7) << 24) +#define DITHER_ADD_LSHIFT_R(x) (((x) & 0x7) << 20) +#define DITHER_ADD_RSHIFT_R(x) (((x) & 0x7) << 16) +#define DITHER_NEW_BIT_MODE BIT(0) +#define DITHER_LSB_ERR_SHIFT_B(x) (((x) & 0x7) << 28) +#define DITHER_OVFLW_BIT_B(x) (((x) & 0x7) << 24) +#define DITHER_ADD_LSHIFT_B(x) (((x) & 0x7) << 20) +#define DITHER_ADD_RSHIFT_B(x) (((x) & 0x7) << 16) +#define DITHER_LSB_ERR_SHIFT_G(x) (((x) & 0x7) << 12) +#define DITHER_OVFLW_BIT_G(x) (((x) & 0x7) << 8) +#define DITHER_ADD_LSHIFT_G(x) (((x) & 0x7) << 4) +#define DITHER_ADD_RSHIFT_G(x) (((x) & 0x7) << 0) + +void mtk_dither_set(struct mtk_ddp_comp *comp, unsigned int bpc, + unsigned int CFG) +{ + /* If bpc equal to 0, the dithering function didn't be enabled */ + if (bpc == 0) + return; + + if (bpc >= MTK_MIN_BPC) { + writel(0, comp->regs + DISP_DITHER_5); + writel(0, comp->regs + DISP_DITHER_7); + writel(DITHER_LSB_ERR_SHIFT_R(MTK_MAX_BPC - bpc) | + DITHER_ADD_LSHIFT_R(MTK_MAX_BPC - bpc) | + DITHER_NEW_BIT_MODE, + comp->regs + DISP_DITHER_15); + writel(DITHER_LSB_ERR_SHIFT_B(MTK_MAX_BPC - bpc) | + DITHER_ADD_LSHIFT_B(MTK_MAX_BPC - bpc) | + DITHER_LSB_ERR_SHIFT_G(MTK_MAX_BPC - bpc) | + DITHER_ADD_LSHIFT_G(MTK_MAX_BPC - bpc), + comp->regs + DISP_DITHER_16); + writel(DISP_DITHERING, comp->regs + CFG); + } +} static void mtk_color_config(struct mtk_ddp_comp *comp, unsigned int w, - unsigned int h, unsigned int vrefresh) + unsigned int h, unsigned int vrefresh, + unsigned int bpc) { writel(w, comp->regs + DISP_COLOR_WIDTH); writel(h, comp->regs + DISP_COLOR_HEIGHT); @@ -76,14 +119,16 @@ static void mtk_color_start(struct mtk_ddp_comp *comp) } static void mtk_od_config(struct mtk_ddp_comp *comp, unsigned int w, - unsigned int h, unsigned int vrefresh) + unsigned int h, unsigned int vrefresh, + unsigned int bpc) { writel(w << 16 | h, comp->regs + DISP_OD_SIZE); + writel(OD_RELAYMODE, comp->regs + OD_RELAYMODE); + mtk_dither_set(comp, bpc, DISP_OD_CFG); } static void mtk_od_start(struct mtk_ddp_comp *comp) { - writel(OD_RELAY_MODE, comp->regs + DISP_OD_CFG); writel(1, comp->regs + DISP_OD_EN); } @@ -93,7 +138,8 @@ static void mtk_ufoe_start(struct mtk_ddp_comp *comp) } static void mtk_aal_config(struct mtk_ddp_comp *comp, unsigned int w, - unsigned int h, unsigned int vrefresh) + unsigned int h, unsigned int vrefresh, + unsigned int bpc) { writel(h << 16 | w, comp->regs + DISP_AAL_SIZE); } @@ -109,9 +155,11 @@ static void mtk_aal_stop(struct mtk_ddp_comp *comp) } static void mtk_gamma_config(struct mtk_ddp_comp *comp, unsigned int w, - unsigned int h, unsigned int vrefresh) + unsigned int h, unsigned int vrefresh, + unsigned int bpc) { writel(h << 16 | w, comp->regs + DISP_GAMMA_SIZE); + mtk_dither_set(comp, bpc, DISP_GAMMA_CFG); } static void mtk_gamma_start(struct mtk_ddp_comp *comp) diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h index f4b7e0a..22a33ee 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h @@ -65,7 +65,7 @@ struct mtk_ddp_comp; struct mtk_ddp_comp_funcs { void (*config)(struct mtk_ddp_comp *comp, unsigned int w, - unsigned int h, unsigned int vrefresh); + unsigned int h, unsigned int vrefresh, unsigned int bpc); void (*start)(struct mtk_ddp_comp *comp); void (*stop)(struct mtk_ddp_comp *comp); void (*enable_vblank)(struct mtk_ddp_comp *comp, struct drm_crtc *crtc); @@ -89,10 +89,10 @@ struct mtk_ddp_comp { static inline void mtk_ddp_comp_config(struct mtk_ddp_comp *comp, unsigned int w, unsigned int h, - unsigned int vrefresh) + unsigned int vrefresh, unsigned int bpc) { if (comp->funcs && comp->funcs->config) - comp->funcs->config(comp, w, h, vrefresh); + comp->funcs->config(comp, w, h, vrefresh, bpc); } static inline void mtk_ddp_comp_start(struct mtk_ddp_comp *comp) @@ -156,5 +156,7 @@ int mtk_ddp_comp_init(struct device *dev, struct device_node *comp_node, const struct mtk_ddp_comp_funcs *funcs); int mtk_ddp_comp_register(struct drm_device *drm, struct mtk_ddp_comp *comp); void mtk_ddp_comp_unregister(struct drm_device *drm, struct mtk_ddp_comp *comp); +void mtk_dither_set(struct mtk_ddp_comp *comp, unsigned int bpc, + unsigned int CFG); #endif /* MTK_DRM_DDP_COMP_H */ -- 1.7.9.5 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759356AbcG1CX6 (ORCPT ); Wed, 27 Jul 2016 22:23:58 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:25331 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1758868AbcG1CXE (ORCPT ); Wed, 27 Jul 2016 22:23:04 -0400 From: Bibby Hsieh To: David Airlie , Matthias Brugger , Daniel Vetter , , CC: Yingjoe Chen , Cawa Cheng , Daniel Kurtz , Bibby Hsieh , Philipp Zabel , YT Shen , Thierry Reding , CK Hu , Mao Huang , , , Sascha Hauer Subject: [PATCH v4 4/4] drm/mediatek: set mt8173 dithering function Date: Thu, 28 Jul 2016 10:22:55 +0800 Message-ID: <1469672575-5847-5-git-send-email-bibby.hsieh@mediatek.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1469672575-5847-1-git-send-email-bibby.hsieh@mediatek.com> References: <1469672575-5847-1-git-send-email-bibby.hsieh@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some panels only accept bpc (bit per color) 6-bit. But, the default bpc in mt8173 display data path is 8-bit. If we didn't enable dithering function to convert bpc, display cannot show the smooth grayscale image. In mt8173, the dithering function in OD (OverDrive) and GAMMA module, we have to config them with connector->display_mode.bpc when CRTC initial. 1. Clear the default value at *_DITHER_5 and *_DITHER_7 register. 2. Calculate the LSB_ERR_SHIFT bits and ADD_LSHIFT bits two values. i.e. Input bpc of OD is 10 bits, we assume the bpc of panel is 6-bit, so, we need to set 4-bit to LSB_ERR_SHIFT and ADD_LSHIFT bits respectively. 3. Then, set the OD or GAMMA to dithering mode depends on path-1 or path-2. Signed-off-by: Bibby Hsieh --- drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 3 +- drivers/gpu/drm/mediatek/mtk_disp_rdma.c | 3 +- drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 21 ++++++-- drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 2 + drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 72 ++++++++++++++++++++++----- drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 8 +-- 6 files changed, 89 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c index 8f62671f..019b7ca 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c @@ -103,7 +103,8 @@ static void mtk_ovl_stop(struct mtk_ddp_comp *comp) } static void mtk_ovl_config(struct mtk_ddp_comp *comp, unsigned int w, - unsigned int h, unsigned int vrefresh) + unsigned int h, unsigned int vrefresh, + unsigned int bpc) { if (w != 0 && h != 0) writel_relaxed(h << 16 | w, comp->regs + DISP_REG_OVL_ROI_SIZE); diff --git a/drivers/gpu/drm/mediatek/mtk_disp_rdma.c b/drivers/gpu/drm/mediatek/mtk_disp_rdma.c index 5fb80cb..0df05f9 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_rdma.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_rdma.c @@ -106,7 +106,8 @@ static void mtk_rdma_stop(struct mtk_ddp_comp *comp) } static void mtk_rdma_config(struct mtk_ddp_comp *comp, unsigned int width, - unsigned int height, unsigned int vrefresh) + unsigned int height, unsigned int vrefresh, + unsigned int bpc) { unsigned int threshold; unsigned int reg; diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c index cbb460a5..e51176e8 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c @@ -222,7 +222,9 @@ static void mtk_crtc_ddp_clk_disable(struct mtk_drm_crtc *mtk_crtc) static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) { struct drm_crtc *crtc = &mtk_crtc->base; - unsigned int width, height, vrefresh; + struct drm_connector *connector; + struct drm_encoder *encoder; + unsigned int width, height, vrefresh, bpc = MTK_MAX_BPC; int ret; int i; @@ -234,6 +236,19 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) height = crtc->state->adjusted_mode.vdisplay; vrefresh = crtc->state->adjusted_mode.vrefresh; + drm_for_each_encoder(encoder, crtc->dev) { + if (encoder->crtc != crtc) + continue; + + drm_for_each_connector(connector, crtc->dev) { + if (connector->encoder != encoder) + continue; + if (connector->display_info.bpc != 0 && + bpc > connector->display_info.bpc) + bpc = connector->display_info.bpc; + } + } + ret = pm_runtime_get_sync(crtc->dev->dev); if (ret < 0) { DRM_ERROR("Failed to enable power domain: %d\n", ret); @@ -266,7 +281,7 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) { struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[i]; - mtk_ddp_comp_config(comp, width, height, vrefresh); + mtk_ddp_comp_config(comp, width, height, vrefresh, bpc); mtk_ddp_comp_start(comp); } @@ -468,7 +483,7 @@ void mtk_crtc_ddp_irq(struct drm_crtc *crtc, struct mtk_ddp_comp *ovl) if (state->pending_config) { mtk_ddp_comp_config(ovl, state->pending_width, state->pending_height, - state->pending_vrefresh); + state->pending_vrefresh, 0); state->pending_config = false; } diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h index d332564..33f6ab6 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h @@ -20,6 +20,8 @@ #define OVL_LAYER_NR 4 #define MTK_LUT_SIZE 512 +#define MTK_MAX_BPC 10 +#define MTK_MIN_BPC 3 int mtk_drm_crtc_enable_vblank(struct drm_device *drm, unsigned int pipe); void mtk_drm_crtc_disable_vblank(struct drm_device *drm, unsigned int pipe); diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c index 42cd587..df33b3c 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c @@ -31,6 +31,10 @@ #define DISP_OD_INTSTA 0x000c #define DISP_OD_CFG 0x0020 #define DISP_OD_SIZE 0x0030 +#define DISP_DITHER_5 0x0114 +#define DISP_DITHER_7 0x011c +#define DISP_DITHER_15 0x013c +#define DISP_DITHER_16 0x0140 #define DISP_REG_UFO_START 0x0000 @@ -49,20 +53,59 @@ #define LUT_10BIT_MASK 0x03ff -#define OD_RELAY_MODE BIT(0) +#define COLOR_BYPASS_ALL BIT(7) +#define COLOR_SEQ_SEL BIT(13) -#define UFO_BYPASS BIT(2) +#define OD_RELAYMODE BIT(0) -#define COLOR_BYPASS_ALL BIT(7) -#define COLOR_SEQ_SEL BIT(13) +#define UFO_BYPASS BIT(2) -#define AAL_EN BIT(0) +#define AAL_EN BIT(0) -#define GAMMA_EN BIT(0) -#define GAMMA_LUT_EN BIT(1) +#define GAMMA_EN BIT(0) +#define GAMMA_LUT_EN BIT(1) + +#define DISP_DITHERING BIT(2) +#define DITHER_LSB_ERR_SHIFT_R(x) (((x) & 0x7) << 28) +#define DITHER_OVFLW_BIT_R(x) (((x) & 0x7) << 24) +#define DITHER_ADD_LSHIFT_R(x) (((x) & 0x7) << 20) +#define DITHER_ADD_RSHIFT_R(x) (((x) & 0x7) << 16) +#define DITHER_NEW_BIT_MODE BIT(0) +#define DITHER_LSB_ERR_SHIFT_B(x) (((x) & 0x7) << 28) +#define DITHER_OVFLW_BIT_B(x) (((x) & 0x7) << 24) +#define DITHER_ADD_LSHIFT_B(x) (((x) & 0x7) << 20) +#define DITHER_ADD_RSHIFT_B(x) (((x) & 0x7) << 16) +#define DITHER_LSB_ERR_SHIFT_G(x) (((x) & 0x7) << 12) +#define DITHER_OVFLW_BIT_G(x) (((x) & 0x7) << 8) +#define DITHER_ADD_LSHIFT_G(x) (((x) & 0x7) << 4) +#define DITHER_ADD_RSHIFT_G(x) (((x) & 0x7) << 0) + +void mtk_dither_set(struct mtk_ddp_comp *comp, unsigned int bpc, + unsigned int CFG) +{ + /* If bpc equal to 0, the dithering function didn't be enabled */ + if (bpc == 0) + return; + + if (bpc >= MTK_MIN_BPC) { + writel(0, comp->regs + DISP_DITHER_5); + writel(0, comp->regs + DISP_DITHER_7); + writel(DITHER_LSB_ERR_SHIFT_R(MTK_MAX_BPC - bpc) | + DITHER_ADD_LSHIFT_R(MTK_MAX_BPC - bpc) | + DITHER_NEW_BIT_MODE, + comp->regs + DISP_DITHER_15); + writel(DITHER_LSB_ERR_SHIFT_B(MTK_MAX_BPC - bpc) | + DITHER_ADD_LSHIFT_B(MTK_MAX_BPC - bpc) | + DITHER_LSB_ERR_SHIFT_G(MTK_MAX_BPC - bpc) | + DITHER_ADD_LSHIFT_G(MTK_MAX_BPC - bpc), + comp->regs + DISP_DITHER_16); + writel(DISP_DITHERING, comp->regs + CFG); + } +} static void mtk_color_config(struct mtk_ddp_comp *comp, unsigned int w, - unsigned int h, unsigned int vrefresh) + unsigned int h, unsigned int vrefresh, + unsigned int bpc) { writel(w, comp->regs + DISP_COLOR_WIDTH); writel(h, comp->regs + DISP_COLOR_HEIGHT); @@ -76,14 +119,16 @@ static void mtk_color_start(struct mtk_ddp_comp *comp) } static void mtk_od_config(struct mtk_ddp_comp *comp, unsigned int w, - unsigned int h, unsigned int vrefresh) + unsigned int h, unsigned int vrefresh, + unsigned int bpc) { writel(w << 16 | h, comp->regs + DISP_OD_SIZE); + writel(OD_RELAYMODE, comp->regs + OD_RELAYMODE); + mtk_dither_set(comp, bpc, DISP_OD_CFG); } static void mtk_od_start(struct mtk_ddp_comp *comp) { - writel(OD_RELAY_MODE, comp->regs + DISP_OD_CFG); writel(1, comp->regs + DISP_OD_EN); } @@ -93,7 +138,8 @@ static void mtk_ufoe_start(struct mtk_ddp_comp *comp) } static void mtk_aal_config(struct mtk_ddp_comp *comp, unsigned int w, - unsigned int h, unsigned int vrefresh) + unsigned int h, unsigned int vrefresh, + unsigned int bpc) { writel(h << 16 | w, comp->regs + DISP_AAL_SIZE); } @@ -109,9 +155,11 @@ static void mtk_aal_stop(struct mtk_ddp_comp *comp) } static void mtk_gamma_config(struct mtk_ddp_comp *comp, unsigned int w, - unsigned int h, unsigned int vrefresh) + unsigned int h, unsigned int vrefresh, + unsigned int bpc) { writel(h << 16 | w, comp->regs + DISP_GAMMA_SIZE); + mtk_dither_set(comp, bpc, DISP_GAMMA_CFG); } static void mtk_gamma_start(struct mtk_ddp_comp *comp) diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h index f4b7e0a..22a33ee 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h @@ -65,7 +65,7 @@ struct mtk_ddp_comp; struct mtk_ddp_comp_funcs { void (*config)(struct mtk_ddp_comp *comp, unsigned int w, - unsigned int h, unsigned int vrefresh); + unsigned int h, unsigned int vrefresh, unsigned int bpc); void (*start)(struct mtk_ddp_comp *comp); void (*stop)(struct mtk_ddp_comp *comp); void (*enable_vblank)(struct mtk_ddp_comp *comp, struct drm_crtc *crtc); @@ -89,10 +89,10 @@ struct mtk_ddp_comp { static inline void mtk_ddp_comp_config(struct mtk_ddp_comp *comp, unsigned int w, unsigned int h, - unsigned int vrefresh) + unsigned int vrefresh, unsigned int bpc) { if (comp->funcs && comp->funcs->config) - comp->funcs->config(comp, w, h, vrefresh); + comp->funcs->config(comp, w, h, vrefresh, bpc); } static inline void mtk_ddp_comp_start(struct mtk_ddp_comp *comp) @@ -156,5 +156,7 @@ int mtk_ddp_comp_init(struct device *dev, struct device_node *comp_node, const struct mtk_ddp_comp_funcs *funcs); int mtk_ddp_comp_register(struct drm_device *drm, struct mtk_ddp_comp *comp); void mtk_ddp_comp_unregister(struct drm_device *drm, struct mtk_ddp_comp *comp); +void mtk_dither_set(struct mtk_ddp_comp *comp, unsigned int bpc, + unsigned int CFG); #endif /* MTK_DRM_DDP_COMP_H */ -- 1.7.9.5