From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ezequiel Garcia Subject: [PATCH 2/3] drm/rockchip: Add optional support for CRTC gamma LUT Date: Tue, 18 Jun 2019 18:34:05 -0300 Message-ID: <20190618213406.7667-3-ezequiel@collabora.com> References: <20190618213406.7667-1-ezequiel@collabora.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190618213406.7667-1-ezequiel@collabora.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Mark Rutland , devicetree@vger.kernel.org, Jacopo Mondi , linux-kernel@vger.kernel.org, Rob Herring , Douglas Anderson , linux-rockchip@lists.infradead.org, Boris Brezillon , Sean Paul , kernel@collabora.com, Ezequiel Garcia List-Id: linux-rockchip.vger.kernel.org QWRkIGFuIG9wdGlvbmFsIENSVEMgZ2FtbWEgTFVUIHN1cHBvcnQsIGFuZCBlbmFibGUgaXQgb24g UkszMjg4LgpUaGlzIGlzIGN1cnJlbnRseSBlbmFibGVkIHZpYSBhIHNlcGFyYXRlIGFkZHJlc3Mg cmVzb3VyY2UsCndoaWNoIG5lZWRzIHRvIGJlIHNwZWNpZmllZCBpbiB0aGUgZGV2aWNldHJlZS4K ClRoZSBhZGRyZXNzIHJlc291cmNlIGlzIHJlcXVpcmVkIGJlY2F1c2Ugb24gc29tZSBTb0NzLCBz dWNoIGFzClJLMzI4OCwgdGhlIExVVCBhZGRyZXNzIGlzIGFmdGVyIHRoZSBNTVUgYWRkcmVzcywg YW5kIHRoZSBsYXR0ZXIKaXMgc3VwcG9ydGVkIGJ5IGEgZGlmZmVyZW50IGRyaXZlci4gVGhpcyBw cmV2ZW50cyB0aGUgRFJNIGRyaXZlcgpmcm9tIHJlcXVlc3RpbmcgYW4gZW50aXJlIHJlZ2lzdGVy IHNwYWNlLgoKVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd29ya3MgZm9yIFJHQiAxMC1iaXQg dGFibGVzLCBhcyB0aGF0CmlzIHdoYXQgc2VlbXMgdG8gd29yayBvbiBSSzMyODguCgpTaWduZWQt b2ZmLWJ5OiBFemVxdWllbCBHYXJjaWEgPGV6ZXF1aWVsQGNvbGxhYm9yYS5jb20+Ci0tLQpDaGFu Z2VzIGZyb20gUkZDOgoqIFJlcXVlc3QgKGFuIG9wdGlvbmFsKSBhZGRyZXNzIHJlc291cmNlIGZv ciB0aGUgTFVULgoqIERyb3Agc3VwcG9ydCBmb3IgUkszMzk5LCB3aGljaCBkb2Vzbid0IHNlZW0g dG8gd29yawogIG91dCBvZiB0aGUgYm94IGFuZCBuZWVkcyBtb3JlIHJlc2VhcmNoLgoqIFN1cHBv cnQgcGFzcy10aHJ1IHNldHRpbmcgd2hlbiBHQU1NQV9MVVQgaXMgTlVMTC4KKiBBZGQgYSBjaGVj ayBmb3IgdGhlIGdhbW1hIHNpemUsIGFzIHN1Z2dlc3RlZCBieSBJbGlhLgoqIE1vdmUgZ2FtbWEg c2V0dGluZyB0byBhdG9taWNfY29tbWl0X3RhaWwsIGFzIHBvaW50ZWQKICBvdXQgYnkgSmFjb3Bv L0xhdXJlbnQsIGlzIHRoZSBjb3JyZWN0IHdheS4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vcm9ja2No aXAvcm9ja2NoaXBfZHJtX2ZiLmMgIHwgICAzICsKIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9y b2NrY2hpcF9kcm1fdm9wLmMgfCAxMDYgKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1 L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fdm9wLmggfCAgIDcgKysKIGRyaXZlcnMvZ3B1L2Ry bS9yb2NrY2hpcC9yb2NrY2hpcF92b3BfcmVnLmMgfCAgIDIgKwogNCBmaWxlcyBjaGFuZ2VkLCAx MTggaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9y b2NrY2hpcF9kcm1fZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1f ZmIuYwppbmRleCAxYzY5MDY2YjY4OTQuLmJmOWFkNjI0MDk3MSAxMDA2NDQKLS0tIGEvZHJpdmVy cy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZmIuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUg InJvY2tjaGlwX2RybV9mYi5oIgogI2luY2x1ZGUgInJvY2tjaGlwX2RybV9nZW0uaCIKICNpbmNs dWRlICJyb2NrY2hpcF9kcm1fcHNyLmgiCisjaW5jbHVkZSAicm9ja2NoaXBfZHJtX3ZvcC5oIgog CiBzdGF0aWMgaW50IHJvY2tjaGlwX2RybV9mYl9kaXJ0eShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVy ICpmYiwKIAkJCQkgc3RydWN0IGRybV9maWxlICpmaWxlLApAQCAtMTI4LDYgKzEyOSw4IEBAIHJv Y2tjaGlwX2F0b21pY19oZWxwZXJfY29tbWl0X3RhaWxfcnBtKHN0cnVjdCBkcm1fYXRvbWljX3N0 YXRlICpvbGRfc3RhdGUpCiAKIAlkcm1fYXRvbWljX2hlbHBlcl9jb21taXRfbW9kZXNldF9kaXNh YmxlcyhkZXYsIG9sZF9zdGF0ZSk7CiAKKwlyb2NrY2hpcF9kcm1fdm9wX2dhbW1hX3NldChvbGRf c3RhdGUpOworCiAJZHJtX2F0b21pY19oZWxwZXJfY29tbWl0X21vZGVzZXRfZW5hYmxlcyhkZXYs IG9sZF9zdGF0ZSk7CiAKIAlkcm1fYXRvbWljX2hlbHBlcl9jb21taXRfcGxhbmVzKGRldiwgb2xk X3N0YXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2Ry bV92b3AuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fdm9wLmMKaW5k ZXggMTJlZDUyNjVhOTBiLi41YjZlZGJlMjY3M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2Ry bS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fdm9wLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tj aGlwL3JvY2tjaGlwX2RybV92b3AuYwpAQCAtMTM3LDYgKzEzNyw3IEBAIHN0cnVjdCB2b3Agewog CiAJdWludDMyX3QgKnJlZ3NiYWs7CiAJdm9pZCBfX2lvbWVtICpyZWdzOworCXZvaWQgX19pb21l bSAqbHV0X3JlZ3M7CiAKIAkvKiBwaHlzaWNhbCBtYXAgbGVuZ3RoIG9mIHZvcCByZWdpc3RlciAq LwogCXVpbnQzMl90IGxlbjsKQEAgLTExNTMsNiArMTE1NCw5NCBAQCBzdGF0aWMgdm9pZCB2b3Bf d2FpdF9mb3JfaXJxX2hhbmRsZXIoc3RydWN0IHZvcCAqdm9wKQogCXN5bmNocm9uaXplX2lycSh2 b3AtPmlycSk7CiB9CiAKK3N0YXRpYyBib29sIHZvcF9kc3BfbHV0X2lzX2VuYWJsZShzdHJ1Y3Qg dm9wICp2b3ApCit7CisJcmV0dXJuIHZvcF9yZWFkX3JlZyh2b3AsIDAsICZ2b3AtPmRhdGEtPmNv bW1vbi0+ZHNwX2x1dF9lbik7Cit9CisKK3N0YXRpYyB2b2lkIHZvcF9jcnRjX3dyaXRlX2dhbW1h X2x1dChzdHJ1Y3Qgdm9wICp2b3AsIHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3Qg ZHJtX2NvbG9yX2x1dCAqbHV0ID0gY3J0Yy0+c3RhdGUtPmdhbW1hX2x1dC0+ZGF0YTsKKwlpbnQg aTsKKworCWZvciAoaSA9IDA7IGkgPCBjcnRjLT5nYW1tYV9zaXplOyBpKyspIHsKKwkJdTMyIHdv cmQ7CisKKwkJd29yZCA9IChkcm1fY29sb3JfbHV0X2V4dHJhY3QobHV0W2ldLnJlZCwgMTApIDw8 IDIwKSB8CisJCSAgICAgICAoZHJtX2NvbG9yX2x1dF9leHRyYWN0KGx1dFtpXS5ncmVlbiwgMTAp IDw8IDEwKSB8CisJCQlkcm1fY29sb3JfbHV0X2V4dHJhY3QobHV0W2ldLmJsdWUsIDEwKTsKKwkJ d3JpdGVsKHdvcmQsIHZvcC0+bHV0X3JlZ3MgKyBpICogNCk7CisJfQorfQorCitzdGF0aWMgdm9p ZCB2b3BfY3J0Y19nYW1tYV9zZXQoc3RydWN0IHZvcCAqdm9wLCBzdHJ1Y3QgZHJtX2NydGMgKmNy dGMsCisJCQkgICAgICAgc3RydWN0IGRybV9jcnRjX3N0YXRlICpvbGRfc3RhdGUpCit7CisJaW50 IGlkbGUsIHJldCwgaTsKKworCXNwaW5fbG9jaygmdm9wLT5yZWdfbG9jayk7CisJVk9QX1JFR19T RVQodm9wLCBjb21tb24sIGRzcF9sdXRfZW4sIDApOworCXZvcF9jZmdfZG9uZSh2b3ApOworCXNw aW5fdW5sb2NrKCZ2b3AtPnJlZ19sb2NrKTsKKworCXJldCA9IHJlYWR4X3BvbGxfdGltZW91dCh2 b3BfZHNwX2x1dF9pc19lbmFibGUsIHZvcCwKKwkJCSAgIGlkbGUsICFpZGxlLCA1LCAzMCAqIDEw MDApOworCWlmIChyZXQpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmdm9wLT5yZWdfbG9jayk7 CisKKwlpZiAoY3J0Yy0+c3RhdGUtPmdhbW1hX2x1dCkgeworCQlpZiAoIW9sZF9zdGF0ZS0+Z2Ft bWFfbHV0IHx8IChjcnRjLT5zdGF0ZS0+Z2FtbWFfbHV0LT5iYXNlLmlkICE9CisJCQkJCSAgICAg IG9sZF9zdGF0ZS0+Z2FtbWFfbHV0LT5iYXNlLmlkKSkKKwkJCXZvcF9jcnRjX3dyaXRlX2dhbW1h X2x1dCh2b3AsIGNydGMpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBjcnRjLT5nYW1t YV9zaXplOyBpKyspIHsKKwkJCXUzMiB3b3JkOworCisJCQl3b3JkID0gKGkgPDwgMjApIHwgKGkg PDwgMTApIHwgaTsKKwkJCXdyaXRlbCh3b3JkLCB2b3AtPmx1dF9yZWdzICsgaSAqIDQpOworCQl9 CisJfQorCisJVk9QX1JFR19TRVQodm9wLCBjb21tb24sIGRzcF9sdXRfZW4sIDEpOworCXZvcF9j ZmdfZG9uZSh2b3ApOworCXNwaW5fdW5sb2NrKCZ2b3AtPnJlZ19sb2NrKTsKK30KKworc3RhdGlj IGludCB2b3BfY3J0Y19hdG9taWNfY2hlY2soc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSAg IHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSkKK3sKKwlzdHJ1Y3Qgdm9wICp2b3Ag PSB0b192b3AoY3J0Yyk7CisKKwlpZiAodm9wLT5sdXRfcmVncyAmJiBjcnRjX3N0YXRlLT5jb2xv cl9tZ210X2NoYW5nZWQgJiYKKwkgICAgY3J0Y19zdGF0ZS0+Z2FtbWFfbHV0KSB7CisJCWludCBs ZW47CisKKwkJbGVuID0gZHJtX2NvbG9yX2x1dF9zaXplKGNydGNfc3RhdGUtPmdhbW1hX2x1dCk7 CisJCWlmIChsZW4gIT0gY3J0Yy0+Z2FtbWFfc2l6ZSkgeworCQkJRFJNX0RFQlVHX0tNUygiSW52 YWxpZCBMVVQgc2l6ZTsgZ290ICVkLCBleHBlY3RlZCAlZFxuIiwKKwkJCQkgICAgICBsZW4sIGNy dGMtPmdhbW1hX3NpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIDA7 Cit9CisKK3ZvaWQgcm9ja2NoaXBfZHJtX3ZvcF9nYW1tYV9zZXQoc3RydWN0IGRybV9hdG9taWNf c3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqb2xkX2NydGNfc3RhdGU7 CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCWludCBpOworCisJZm9yX2VhY2hfb2xkX2NydGNf aW5fc3RhdGUoc3RhdGUsIGNydGMsIG9sZF9jcnRjX3N0YXRlLCBpKSB7CisJCXN0cnVjdCB2b3Ag KnZvcCA9IHRvX3ZvcChjcnRjKTsKKworCQlpZiAodm9wLT5sdXRfcmVncyAmJiBjcnRjLT5zdGF0 ZS0+Y29sb3JfbWdtdF9jaGFuZ2VkKQorCQkJdm9wX2NydGNfZ2FtbWFfc2V0KHZvcCwgY3J0Yywg b2xkX2NydGNfc3RhdGUpOworCX0KK30KKwogc3RhdGljIHZvaWQgdm9wX2NydGNfYXRvbWljX2Zs dXNoKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJCQkgIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAq b2xkX2NydGNfc3RhdGUpCiB7CkBAIC0xMjA1LDYgKzEyOTQsNyBAQCBzdGF0aWMgdm9pZCB2b3Bf Y3J0Y19hdG9taWNfZmx1c2goc3RydWN0IGRybV9jcnRjICpjcnRjLAogCiBzdGF0aWMgY29uc3Qg c3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyB2b3BfY3J0Y19oZWxwZXJfZnVuY3MgPSB7CiAJ Lm1vZGVfZml4dXAgPSB2b3BfY3J0Y19tb2RlX2ZpeHVwLAorCS5hdG9taWNfY2hlY2sgPSB2b3Bf Y3J0Y19hdG9taWNfY2hlY2ssCiAJLmF0b21pY19mbHVzaCA9IHZvcF9jcnRjX2F0b21pY19mbHVz aCwKIAkuYXRvbWljX2VuYWJsZSA9IHZvcF9jcnRjX2F0b21pY19lbmFibGUsCiAJLmF0b21pY19k aXNhYmxlID0gdm9wX2NydGNfYXRvbWljX2Rpc2FibGUsCkBAIC0xMzIzLDYgKzE0MTMsNyBAQCBz dGF0aWMgY29uc3Qgc3RydWN0IGRybV9jcnRjX2Z1bmNzIHZvcF9jcnRjX2Z1bmNzID0gewogCS5k aXNhYmxlX3ZibGFuayA9IHZvcF9jcnRjX2Rpc2FibGVfdmJsYW5rLAogCS5zZXRfY3JjX3NvdXJj ZSA9IHZvcF9jcnRjX3NldF9jcmNfc291cmNlLAogCS52ZXJpZnlfY3JjX3NvdXJjZSA9IHZvcF9j cnRjX3ZlcmlmeV9jcmNfc291cmNlLAorCS5nYW1tYV9zZXQgPSBkcm1fYXRvbWljX2hlbHBlcl9s ZWdhY3lfZ2FtbWFfc2V0LAogfTsKIAogc3RhdGljIHZvaWQgdm9wX2ZiX3VucmVmX3dvcmtlcihz dHJ1Y3QgZHJtX2ZsaXBfd29yayAqd29yaywgdm9pZCAqdmFsKQpAQCAtMTQ4MCw2ICsxNTcxLDEw IEBAIHN0YXRpYyBpbnQgdm9wX2NyZWF0ZV9jcnRjKHN0cnVjdCB2b3AgKnZvcCkKIAkJZ290byBl cnJfY2xlYW51cF9wbGFuZXM7CiAKIAlkcm1fY3J0Y19oZWxwZXJfYWRkKGNydGMsICZ2b3BfY3J0 Y19oZWxwZXJfZnVuY3MpOworCWlmICh2b3BfZGF0YS0+bHV0X3NpemUpIHsKKwkJZHJtX21vZGVf Y3J0Y19zZXRfZ2FtbWFfc2l6ZShjcnRjLCB2b3BfZGF0YS0+bHV0X3NpemUpOworCQlkcm1fY3J0 Y19lbmFibGVfY29sb3JfbWdtdChjcnRjLCAwLCBmYWxzZSwgdm9wX2RhdGEtPmx1dF9zaXplKTsK Kwl9CiAKIAkvKgogCSAqIENyZWF0ZSBkcm1fcGxhbmVzIGZvciBvdmVybGF5IHdpbmRvd3Mgd2l0 aCBwb3NzaWJsZV9jcnRjcyByZXN0cmljdGVkCkBAIC0xNzc2LDYgKzE4NzEsMTcgQEAgc3RhdGlj IGludCB2b3BfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwg dm9pZCAqZGF0YSkKIAlpZiAoSVNfRVJSKHZvcC0+cmVncykpCiAJCXJldHVybiBQVFJfRVJSKHZv cC0+cmVncyk7CiAKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElP UkVTT1VSQ0VfTUVNLCAibHV0Iik7CisJaWYgKHJlcykgeworCQlpZiAoIXZvcF9kYXRhLT5sdXRf c2l6ZSkgeworCQkJRFJNX0RFVl9FUlJPUihkZXYsICJubyBnYW1tYSBMVVQgc2l6ZSBkZWZpbmVk XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXZvcC0+bHV0X3JlZ3MgPSBkZXZtX2lv cmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCQlpZiAoSVNfRVJSKHZvcC0+bHV0X3JlZ3MpKQor CQkJcmV0dXJuIFBUUl9FUlIodm9wLT5sdXRfcmVncyk7CisJfQorCiAJdm9wLT5yZWdzYmFrID0g ZGV2bV9remFsbG9jKGRldiwgdm9wLT5sZW4sIEdGUF9LRVJORUwpOwogCWlmICghdm9wLT5yZWdz YmFrKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2Nr Y2hpcC9yb2NrY2hpcF9kcm1fdm9wLmggYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2No aXBfZHJtX3ZvcC5oCmluZGV4IDIxNDlhODg5YzI5ZC4uYmQxYmNkNWExNGU5IDEwMDY0NAotLS0g YS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX3ZvcC5oCisrKyBiL2RyaXZl cnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fdm9wLmgKQEAgLTcsNiArNyw4IEBACiAj aWZuZGVmIF9ST0NLQ0hJUF9EUk1fVk9QX0gKICNkZWZpbmUgX1JPQ0tDSElQX0RSTV9WT1BfSAog CisjaW5jbHVkZSA8ZHJtL2RybV9hdG9taWMuaD4KKwogLyoKICAqIG1ham9yOiBJUCBtYWpvciB2 ZXJzaW9uLCB1c2VkIGZvciBJUCBzdHJ1Y3R1cmUKICAqIG1pbm9yOiBiaWcgZmVhdHVyZSBjaGFu Z2UgdW5kZXIgc2FtZSBzdHJ1Y3R1cmUKQEAgLTY3LDYgKzY5LDcgQEAgc3RydWN0IHZvcF9jb21t b24gewogCXN0cnVjdCB2b3BfcmVnIGRpdGhlcl9kb3duX21vZGU7CiAJc3RydWN0IHZvcF9yZWcg ZGl0aGVyX2Rvd25fZW47CiAJc3RydWN0IHZvcF9yZWcgZGl0aGVyX3VwOworCXN0cnVjdCB2b3Bf cmVnIGRzcF9sdXRfZW47CiAJc3RydWN0IHZvcF9yZWcgZ2F0ZV9lbjsKIAlzdHJ1Y3Qgdm9wX3Jl ZyBtbXVfZW47CiAJc3RydWN0IHZvcF9yZWcgb3V0X21vZGU7CkBAIC0xNzAsNiArMTczLDcgQEAg c3RydWN0IHZvcF9kYXRhIHsKIAljb25zdCBzdHJ1Y3Qgdm9wX3dpbl95dXYyeXV2X2RhdGEgKndp bl95dXYyeXV2OwogCWNvbnN0IHN0cnVjdCB2b3Bfd2luX2RhdGEgKndpbjsKIAl1bnNpZ25lZCBp bnQgd2luX3NpemU7CisJdW5zaWduZWQgaW50IGx1dF9zaXplOwogCiAjZGVmaW5lIFZPUF9GRUFU VVJFX09VVFBVVF9SR0IxMAlCSVQoMCkKICNkZWZpbmUgVk9QX0ZFQVRVUkVfSU5URVJOQUxfUkdC CUJJVCgxKQpAQCAtMzczLDQgKzM3Nyw3IEBAIHN0YXRpYyBpbmxpbmUgaW50IHNjbF92b3BfY2Fs X2xiX21vZGUoaW50IHdpZHRoLCBib29sIGlzX3l1dikKIH0KIAogZXh0ZXJuIGNvbnN0IHN0cnVj dCBjb21wb25lbnRfb3BzIHZvcF9jb21wb25lbnRfb3BzOworCit2b2lkIHJvY2tjaGlwX2RybV92 b3BfZ2FtbWFfc2V0KHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7CisKICNlbmRpZiAv KiBfUk9DS0NISVBfRFJNX1ZPUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9j a2NoaXAvcm9ja2NoaXBfdm9wX3JlZy5jIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tj aGlwX3ZvcF9yZWcuYwppbmRleCA3YjljNzQ3NTBmNmQuLjMwZDQ5ZWZmMzY3MCAxMDA2NDQKLS0t IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX3ZvcF9yZWcuYworKysgYi9kcml2 ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfdm9wX3JlZy5jCkBAIC01OTMsNiArNTkzLDcg QEAgc3RhdGljIGNvbnN0IHN0cnVjdCB2b3BfY29tbW9uIHJrMzI4OF9jb21tb24gPSB7CiAJLmRp dGhlcl9kb3duX2VuID0gVk9QX1JFRyhSSzMyODhfRFNQX0NUUkwxLCAweDEsIDIpLAogCS5wcmVf ZGl0aGVyX2Rvd24gPSBWT1BfUkVHKFJLMzI4OF9EU1BfQ1RSTDEsIDB4MSwgMSksCiAJLmRpdGhl cl91cCA9IFZPUF9SRUcoUkszMjg4X0RTUF9DVFJMMSwgMHgxLCA2KSwKKwkuZHNwX2x1dF9lbiA9 IFZPUF9SRUcoUkszMjg4X0RTUF9DVFJMMSwgMHgxLCAwKSwKIAkuZGF0YV9ibGFuayA9IFZPUF9S RUcoUkszMjg4X0RTUF9DVFJMMCwgMHgxLCAxOSksCiAJLmRzcF9ibGFuayA9IFZPUF9SRUcoUksz Mjg4X0RTUF9DVFJMMCwgMHgzLCAxOCksCiAJLm91dF9tb2RlID0gVk9QX1JFRyhSSzMyODhfRFNQ X0NUUkwwLCAweGYsIDApLApAQCAtNjQxLDYgKzY0Miw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qg dm9wX2RhdGEgcmszMjg4X3ZvcCA9IHsKIAkub3V0cHV0ID0gJnJrMzI4OF9vdXRwdXQsCiAJLndp biA9IHJrMzI4OF92b3Bfd2luX2RhdGEsCiAJLndpbl9zaXplID0gQVJSQVlfU0laRShyazMyODhf dm9wX3dpbl9kYXRhKSwKKwkubHV0X3NpemUgPSAxMDI0LAogfTsKIAogc3RhdGljIGNvbnN0IGlu dCByazMzNjhfdm9wX2ludHJzW10gPSB7Ci0tIAoyLjIwLjEKCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRl dmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbA== 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=-6.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, UNPARSEABLE_RELAY,UNWANTED_LANGUAGE_BODY,USER_AGENT_GIT 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 A59A4C31E5B for ; Tue, 18 Jun 2019 21:43:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 71BE021479 for ; Tue, 18 Jun 2019 21:43:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730755AbfFRVn0 (ORCPT ); Tue, 18 Jun 2019 17:43:26 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:35854 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729982AbfFRVnZ (ORCPT ); Tue, 18 Jun 2019 17:43:25 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: ezequiel) with ESMTPSA id ACA1C285288 From: Ezequiel Garcia To: dri-devel@lists.freedesktop.org Cc: linux-rockchip@lists.infradead.org, =?UTF-8?q?Heiko=20St=C3=BCbner?= , Sandy Huang , kernel@collabora.com, Sean Paul , Boris Brezillon , Douglas Anderson , Jacopo Mondi , Ilia Mirkin , Rob Herring , Mark Rutland , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Ezequiel Garcia Subject: [PATCH 2/3] drm/rockchip: Add optional support for CRTC gamma LUT Date: Tue, 18 Jun 2019 18:34:05 -0300 Message-Id: <20190618213406.7667-3-ezequiel@collabora.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190618213406.7667-1-ezequiel@collabora.com> References: <20190618213406.7667-1-ezequiel@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add an optional CRTC gamma LUT support, and enable it on RK3288. This is currently enabled via a separate address resource, which needs to be specified in the devicetree. The address resource is required because on some SoCs, such as RK3288, the LUT address is after the MMU address, and the latter is supported by a different driver. This prevents the DRM driver from requesting an entire register space. The current implementation works for RGB 10-bit tables, as that is what seems to work on RK3288. Signed-off-by: Ezequiel Garcia --- Changes from RFC: * Request (an optional) address resource for the LUT. * Drop support for RK3399, which doesn't seem to work out of the box and needs more research. * Support pass-thru setting when GAMMA_LUT is NULL. * Add a check for the gamma size, as suggested by Ilia. * Move gamma setting to atomic_commit_tail, as pointed out by Jacopo/Laurent, is the correct way. --- drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 3 + drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 106 ++++++++++++++++++++ drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 7 ++ drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 2 + 4 files changed, 118 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c index 1c69066b6894..bf9ad6240971 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c @@ -16,6 +16,7 @@ #include "rockchip_drm_fb.h" #include "rockchip_drm_gem.h" #include "rockchip_drm_psr.h" +#include "rockchip_drm_vop.h" static int rockchip_drm_fb_dirty(struct drm_framebuffer *fb, struct drm_file *file, @@ -128,6 +129,8 @@ rockchip_atomic_helper_commit_tail_rpm(struct drm_atomic_state *old_state) drm_atomic_helper_commit_modeset_disables(dev, old_state); + rockchip_drm_vop_gamma_set(old_state); + drm_atomic_helper_commit_modeset_enables(dev, old_state); drm_atomic_helper_commit_planes(dev, old_state, diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 12ed5265a90b..5b6edbe2673f 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -137,6 +137,7 @@ struct vop { uint32_t *regsbak; void __iomem *regs; + void __iomem *lut_regs; /* physical map length of vop register */ uint32_t len; @@ -1153,6 +1154,94 @@ static void vop_wait_for_irq_handler(struct vop *vop) synchronize_irq(vop->irq); } +static bool vop_dsp_lut_is_enable(struct vop *vop) +{ + return vop_read_reg(vop, 0, &vop->data->common->dsp_lut_en); +} + +static void vop_crtc_write_gamma_lut(struct vop *vop, struct drm_crtc *crtc) +{ + struct drm_color_lut *lut = crtc->state->gamma_lut->data; + int i; + + for (i = 0; i < crtc->gamma_size; i++) { + u32 word; + + word = (drm_color_lut_extract(lut[i].red, 10) << 20) | + (drm_color_lut_extract(lut[i].green, 10) << 10) | + drm_color_lut_extract(lut[i].blue, 10); + writel(word, vop->lut_regs + i * 4); + } +} + +static void vop_crtc_gamma_set(struct vop *vop, struct drm_crtc *crtc, + struct drm_crtc_state *old_state) +{ + int idle, ret, i; + + spin_lock(&vop->reg_lock); + VOP_REG_SET(vop, common, dsp_lut_en, 0); + vop_cfg_done(vop); + spin_unlock(&vop->reg_lock); + + ret = readx_poll_timeout(vop_dsp_lut_is_enable, vop, + idle, !idle, 5, 30 * 1000); + if (ret) + return; + + spin_lock(&vop->reg_lock); + + if (crtc->state->gamma_lut) { + if (!old_state->gamma_lut || (crtc->state->gamma_lut->base.id != + old_state->gamma_lut->base.id)) + vop_crtc_write_gamma_lut(vop, crtc); + } else { + for (i = 0; i < crtc->gamma_size; i++) { + u32 word; + + word = (i << 20) | (i << 10) | i; + writel(word, vop->lut_regs + i * 4); + } + } + + VOP_REG_SET(vop, common, dsp_lut_en, 1); + vop_cfg_done(vop); + spin_unlock(&vop->reg_lock); +} + +static int vop_crtc_atomic_check(struct drm_crtc *crtc, + struct drm_crtc_state *crtc_state) +{ + struct vop *vop = to_vop(crtc); + + if (vop->lut_regs && crtc_state->color_mgmt_changed && + crtc_state->gamma_lut) { + int len; + + len = drm_color_lut_size(crtc_state->gamma_lut); + if (len != crtc->gamma_size) { + DRM_DEBUG_KMS("Invalid LUT size; got %d, expected %d\n", + len, crtc->gamma_size); + return -EINVAL; + } + } + return 0; +} + +void rockchip_drm_vop_gamma_set(struct drm_atomic_state *state) +{ + struct drm_crtc_state *old_crtc_state; + struct drm_crtc *crtc; + int i; + + for_each_old_crtc_in_state(state, crtc, old_crtc_state, i) { + struct vop *vop = to_vop(crtc); + + if (vop->lut_regs && crtc->state->color_mgmt_changed) + vop_crtc_gamma_set(vop, crtc, old_crtc_state); + } +} + static void vop_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state *old_crtc_state) { @@ -1205,6 +1294,7 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc, static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = { .mode_fixup = vop_crtc_mode_fixup, + .atomic_check = vop_crtc_atomic_check, .atomic_flush = vop_crtc_atomic_flush, .atomic_enable = vop_crtc_atomic_enable, .atomic_disable = vop_crtc_atomic_disable, @@ -1323,6 +1413,7 @@ static const struct drm_crtc_funcs vop_crtc_funcs = { .disable_vblank = vop_crtc_disable_vblank, .set_crc_source = vop_crtc_set_crc_source, .verify_crc_source = vop_crtc_verify_crc_source, + .gamma_set = drm_atomic_helper_legacy_gamma_set, }; static void vop_fb_unref_worker(struct drm_flip_work *work, void *val) @@ -1480,6 +1571,10 @@ static int vop_create_crtc(struct vop *vop) goto err_cleanup_planes; drm_crtc_helper_add(crtc, &vop_crtc_helper_funcs); + if (vop_data->lut_size) { + drm_mode_crtc_set_gamma_size(crtc, vop_data->lut_size); + drm_crtc_enable_color_mgmt(crtc, 0, false, vop_data->lut_size); + } /* * Create drm_planes for overlay windows with possible_crtcs restricted @@ -1776,6 +1871,17 @@ static int vop_bind(struct device *dev, struct device *master, void *data) if (IS_ERR(vop->regs)) return PTR_ERR(vop->regs); + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lut"); + if (res) { + if (!vop_data->lut_size) { + DRM_DEV_ERROR(dev, "no gamma LUT size defined\n"); + return -EINVAL; + } + vop->lut_regs = devm_ioremap_resource(dev, res); + if (IS_ERR(vop->lut_regs)) + return PTR_ERR(vop->lut_regs); + } + vop->regsbak = devm_kzalloc(dev, vop->len, GFP_KERNEL); if (!vop->regsbak) return -ENOMEM; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index 2149a889c29d..bd1bcd5a14e9 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -7,6 +7,8 @@ #ifndef _ROCKCHIP_DRM_VOP_H #define _ROCKCHIP_DRM_VOP_H +#include + /* * major: IP major version, used for IP structure * minor: big feature change under same structure @@ -67,6 +69,7 @@ struct vop_common { struct vop_reg dither_down_mode; struct vop_reg dither_down_en; struct vop_reg dither_up; + struct vop_reg dsp_lut_en; struct vop_reg gate_en; struct vop_reg mmu_en; struct vop_reg out_mode; @@ -170,6 +173,7 @@ struct vop_data { const struct vop_win_yuv2yuv_data *win_yuv2yuv; const struct vop_win_data *win; unsigned int win_size; + unsigned int lut_size; #define VOP_FEATURE_OUTPUT_RGB10 BIT(0) #define VOP_FEATURE_INTERNAL_RGB BIT(1) @@ -373,4 +377,7 @@ static inline int scl_vop_cal_lb_mode(int width, bool is_yuv) } extern const struct component_ops vop_component_ops; + +void rockchip_drm_vop_gamma_set(struct drm_atomic_state *state); + #endif /* _ROCKCHIP_DRM_VOP_H */ diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c index 7b9c74750f6d..30d49eff3670 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c @@ -593,6 +593,7 @@ static const struct vop_common rk3288_common = { .dither_down_en = VOP_REG(RK3288_DSP_CTRL1, 0x1, 2), .pre_dither_down = VOP_REG(RK3288_DSP_CTRL1, 0x1, 1), .dither_up = VOP_REG(RK3288_DSP_CTRL1, 0x1, 6), + .dsp_lut_en = VOP_REG(RK3288_DSP_CTRL1, 0x1, 0), .data_blank = VOP_REG(RK3288_DSP_CTRL0, 0x1, 19), .dsp_blank = VOP_REG(RK3288_DSP_CTRL0, 0x3, 18), .out_mode = VOP_REG(RK3288_DSP_CTRL0, 0xf, 0), @@ -641,6 +642,7 @@ static const struct vop_data rk3288_vop = { .output = &rk3288_output, .win = rk3288_vop_win_data, .win_size = ARRAY_SIZE(rk3288_vop_win_data), + .lut_size = 1024, }; static const int rk3368_vop_intrs[] = { -- 2.20.1