From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michal Januszewski Subject: [PATCH v2] fbdev: fix fillrect for 24bpp modes Date: Sat, 18 Apr 2009 20:52:34 +0200 Message-ID: <20090418185234.GA17853@tria> References: <20090413170954.GA8403@tria> <20090417183617.ed7553cd.krzysztof.h1@poczta.fm> <20090417115048.0c5ca35d.akpm@linux-foundation.org> Reply-To: spock@gentoo.org Mime-Version: 1.0 Content-Transfer-Encoding: base64 Return-path: Received: from sfi-mx-3.v28.ch3.sourceforge.com ([172.29.28.123] helo=mx.sourceforge.net) by 335xhf1.ch3.sourceforge.com with esmtp (Exim 4.69) (envelope-from ) id 1LvFfW-000795-7w for linux-fbdev-devel@lists.sourceforge.net; Sat, 18 Apr 2009 18:53:38 +0000 Received: from mail-ew0-f169.google.com ([209.85.219.169]) by 3b2kzd1.ch3.sourceforge.com with esmtp (Exim 4.69) id 1LvFfU-0005Jz-QW for linux-fbdev-devel@lists.sourceforge.net; Sat, 18 Apr 2009 18:53:38 +0000 Received: by ewy17 with SMTP id 17so1323831ewy.10 for ; Sat, 18 Apr 2009 11:53:35 -0700 (PDT) Content-Disposition: inline In-Reply-To: <20090417115048.0c5ca35d.akpm@linux-foundation.org> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linux-fbdev-devel-bounces@lists.sourceforge.net Content-Type: text/plain; charset="windows-1252" To: Andrew Morton Cc: linux-fbdev-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org VGhlIHNvZnR3YXJlIGZpbGxyZWN0IHJvdXRpbmVzIGRvIG5vdCB3b3JrIHByb3Blcmx5IHdoZW4g dGhlIG51bWJlciBvZgpwaXhlbHMgcGVyIG1hY2hpbmUgd29yZCBpcyBub3QgYW4gaW50ZWdlci4g IFRvIHNlZSB0aGF0LCBydW4gdGhlIGZvbGxvd2luZwpjb21tYW5kIG9uIGEgZmJkZXYgY29uc29s ZSB3aXRoIGEgMjRicHAgdmlkZW8gbW9kZSwgdXNpbmcgYSBub24tYWNjZWxlcmF0ZWQKZHJpdmVy IHN1Y2ggYXMgKHUpdmVzYWZiOgoKICByZXNldCA7IGVjaG8gLWUgJ1xlWzQxbXRlc3RcZVtLJwoK VGhlIGV4cGVjdGVkIHJlc3VsdCBpcyAndGVzdCcgZGlzcGxheWVkIG9uIGEgbGluZSB3aXRoIHJl ZCBiYWNrZ3JvdW5kLgpJbnN0ZWFkIG9mIHRoYXQsICd0ZXN0JyBoYXMgYSByZWQgYmFja2dyb3Vu ZCwgYnV0IHRoZSByZXN0IG9mIHRoZSBsaW5lCihyZW5kZXJlZCB1c2luZyBmaWxscmVjdCgpKSBj b250YWlucyBhIGRpc3RvcmVkIGNvbG9yZnVsIHBhdHRlcm4uCgpUaGlzIHBhdGNoIGZpeGVzIHRo ZSBwcm9ibGVtIGJ5IGNvcnJlY3RseSBjb21wdXRpbmcgcm90YXRpb24gc2hpZnRzLgpJdCBoYXMg YmVlbiB0ZXN0ZWQgaW4gYSAyNGJwcCBtb2RlIG9uIDMyLSBhbmQgNjQtYml0IGxpdHRsZS1lbmRp YW4KbWFjaGluZXMuCgpTaWduZWQtb2ZmLWJ5OiBNaWNoYcWCIEphbnVzemV3c2tpIDxzcG9ja0Bn ZW50b28ub3JnPgotLS0KVGhpcyB2ZXJzaW9uIG9mIHRoZSBwYXRjaCBzaG91bGQgd29yayBjb3Jy ZWN0bHkgd2l0aCBtb2RlcyB3aGVyZQpsaW5lX2xlbmd0aCo4ICUgYnBwICE9IDAuCgpJdCBhbHNv IHJlcGxhY2VzIHRoZSByaWdodCBzaGlmdCBieSAoZmZzKGJpdHMpIC0gMSkgd2l0aCBhIGRpdmlz aW9uCmJ5IGJpdHMsIGFzIGJvdGggb3BlcmF0aW9ucyBhcmUgb3B0aW1pemVkIGludG8gYSBzaGlm dCBieSBhIGNvbnN0YW50CmFuZCB0aGUgbGF0dGVyIG9uZSBpbmNyZWFzZXMgY29kZSByZWFkYWJp bGl0eS4KCkluIGNhc2UgdGhpcyBzdGlsbCBicmVha3MgaW4gc29tZSBtb2RlcywgSSB3b3VsZCBh cHByZWNpYXRlIGEgZnVsbApsaXN0IG9mIHBhcmFtZXRlcnMgZGVzY3JpYmluZyB0aGUgcHJvYmxl bSwgaS5lLiBicHAsIGxpbmVfbGVuZ3RoCmFuZCB0aGUgdG9wIGxlZnQgY29vcmRpbmF0ZSBvZiB0 aGUgcmVjdGFuZ2xlIHRoYXQgaXMgcGFpbnRlZAppbmNvcnJlY3RseS4KCmRpZmYgLS1naXQgYS9k cml2ZXJzL3ZpZGVvL2NmYmZpbGxyZWN0LmMgYi9kcml2ZXJzL3ZpZGVvL2NmYmZpbGxyZWN0LmMK aW5kZXggNjRiMzU3Ni4uZmFhMWEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jZmJmaWxs cmVjdC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2ZiZmlsbHJlY3QuYwpAQCAtOSwxMCArOSw2IEBA CiAgKgogICogTk9URVM6CiAgKgotICogIFRoZSBjb2RlIGZvciBkZXB0aHMgbGlrZSAyNCB0aGF0 IGRvbid0IGhhdmUgaW50ZWdlciBudW1iZXIgb2YgcGl4ZWxzIHBlcgotICogIGxvbmcgaXMgYnJv a2VuIGFuZCBuZWVkcyB0byBiZSBmaXhlZC4gRm9yIG5vdyBJIHR1cm5lZCB0aGVzZSB0eXBlcyBv ZgotICogIG1vZGUgb2ZmLgotICoKICAqICBBbHNvIG5lZWQgdG8gYWRkIGNvZGUgdG8gZGVhbCB3 aXRoIGNhcmRzIGVuZGlhbnMgdGhhdCBhcmUgZGlmZmVyZW50IHRoYW4KICAqICB0aGUgbmF0aXZl IGNwdSBlbmRpYW5zLiBJIGFsc28gbmVlZCB0byBkZWFsIHdpdGggTVNCIHBvc2l0aW9uIGluIHRo ZSB3b3JkLgogICoKQEAgLTEzOSw3ICsxMzUsNyBAQCBiaXRmaWxsX3VuYWxpZ25lZChzdHJ1Y3Qg ZmJfaW5mbyAqcCwgdW5zaWduZWQgbG9uZyBfX2lvbWVtICpkc3QsIGludCBkc3RfaWR4LAogCiAJ CS8vIFRyYWlsaW5nIGJpdHMKIAkJaWYgKGxhc3QpCi0JCQlGQl9XUklURUwoY29tcChwYXQsIEZC X1JFQURMKGRzdCksIGZpcnN0KSwgZHN0KTsKKwkJCUZCX1dSSVRFTChjb21wKHBhdCwgRkJfUkVB REwoZHN0KSwgbGFzdCksIGRzdCk7CiAJfQogfQogCkBAIC0yODEsNyArMjc3LDcgQEAgYml0Zmls bF91bmFsaWduZWRfcmV2KHN0cnVjdCBmYl9pbmZvICpwLCB1bnNpZ25lZCBsb25nIF9faW9tZW0g KmRzdCwKIAogdm9pZCBjZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKnAsIGNvbnN0IHN0cnVj dCBmYl9maWxscmVjdCAqcmVjdCkKIHsKLQl1bnNpZ25lZCBsb25nIHBhdCwgZmc7CisJdW5zaWdu ZWQgbG9uZyBwYXQsIHBhdDIsIGZnOwogCXVuc2lnbmVkIGxvbmcgd2lkdGggPSByZWN0LT53aWR0 aCwgaGVpZ2h0ID0gcmVjdC0+aGVpZ2h0OwogCWludCBiaXRzID0gQklUU19QRVJfTE9ORywgYnl0 ZXMgPSBiaXRzID4+IDM7CiAJdTMyIGJwcCA9IHAtPnZhci5iaXRzX3Blcl9waXhlbDsKQEAgLTI5 Nyw3ICsyOTMsNyBAQCB2b2lkIGNmYl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqcCwgY29uc3Qg c3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQogCWVsc2UKIAkJZmcgPSByZWN0LT5jb2xvcjsKIAot CXBhdCA9IHBpeGVsX3RvX3BhdCggYnBwLCBmZyk7CisJcGF0ID0gcGl4ZWxfdG9fcGF0KGJwcCwg ZmcpOwogCiAJZHN0ID0gKHVuc2lnbmVkIGxvbmcgX19pb21lbSAqKSgodW5zaWduZWQgbG9uZylw LT5zY3JlZW5fYmFzZSAmIH4oYnl0ZXMtMSkpOwogCWRzdF9pZHggPSAoKHVuc2lnbmVkIGxvbmcp cC0+c2NyZWVuX2Jhc2UgJiAoYnl0ZXMgLSAxKSkqODsKQEAgLTMzMywxNyArMzI5LDE2IEBAIHZv aWQgY2ZiX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICpwLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJl Y3QgKnJlY3QpCiAJCQlkc3RfaWR4ICs9IHAtPmZpeC5saW5lX2xlbmd0aCo4OwogCQl9CiAJfSBl bHNlIHsKLQkJaW50IHJpZ2h0OwotCQlpbnQgcjsKLQkJaW50IHJvdCA9IChsZWZ0LWRzdF9pZHgp ICUgYnBwOworCQlpbnQgcmlnaHQsIHI7CiAJCXZvaWQgKCpmaWxsX29wKShzdHJ1Y3QgZmJfaW5m byAqcCwgdW5zaWduZWQgbG9uZyBfX2lvbWVtICpkc3QsCiAJCQkJaW50IGRzdF9pZHgsIHVuc2ln bmVkIGxvbmcgcGF0LCBpbnQgbGVmdCwKIAkJCQlpbnQgcmlnaHQsIHVuc2lnbmVkIG4sIGludCBi aXRzKSA9IE5VTEw7Ci0KLQkJLyogcm90YXRlIHBhdHRlcm4gdG8gY29ycmVjdCBzdGFydCBwb3Np dGlvbiAqLwotCQlwYXQgPSBwYXQgPDwgcm90IHwgcGF0ID4+IChicHAtcm90KTsKLQotCQlyaWdo dCA9IGJwcC1sZWZ0OworI2lmZGVmIF9fTElUVExFX0VORElBTgorCQlyaWdodCA9IGxlZnQ7CisJ CWxlZnQgPSBicHAgLSByaWdodDsKKyNlbHNlCisJCXJpZ2h0ID0gYnBwIC0gbGVmdDsKKyNlbmRp ZgogCQlzd2l0Y2ggKHJlY3QtPnJvcCkgewogCQljYXNlIFJPUF9YT1I6CiAJCQlmaWxsX29wID0g Yml0ZmlsbF91bmFsaWduZWRfcmV2OwpAQCAtMzU3LDEyICszNTIsMTcgQEAgdm9pZCBjZmJfZmls bHJlY3Qoc3RydWN0IGZiX2luZm8gKnAsIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkK IAkJCWJyZWFrOwogCQl9CiAJCXdoaWxlIChoZWlnaHQtLSkgewotCQkJZHN0ICs9IGRzdF9pZHgg Pj4gKGZmcyhiaXRzKSAtIDEpOworCQkJZHN0ICs9IGRzdF9pZHggLyBiaXRzOwogCQkJZHN0X2lk eCAmPSAoYml0cyAtIDEpOwotCQkJZmlsbF9vcChwLCBkc3QsIGRzdF9pZHgsIHBhdCwgbGVmdCwg cmlnaHQsCisJCQlyID0gZHN0X2lkeCAlIGJwcDsKKwkJCS8qIHJvdGF0ZSBwYXR0ZXJuIHRvIHRo ZSBjb3JyZWN0IHN0YXJ0IHBvc2l0aW9uICovCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJCQlw YXQyID0gcGF0IDw8IHIgfCBwYXQgPj4gKGJwcC1yKTsKKyNlbHNlCisJCQlwYXQyID0gcGF0IDw8 IChicHAtcikgfCBwYXQgPj4gcjsKKyNlbmRpZgorCQkJZmlsbF9vcChwLCBkc3QsIGRzdF9pZHgs IHBhdDIsIGxlZnQsIHJpZ2h0LAogCQkJCXdpZHRoKmJwcCwgYml0cyk7Ci0JCQlyID0gKHAtPmZp eC5saW5lX2xlbmd0aCo4KSAlIGJwcDsKLQkJCXBhdCA9IHBhdCA8PCAoYnBwLXIpIHwgcGF0ID4+ IHI7CiAJCQlkc3RfaWR4ICs9IHAtPmZpeC5saW5lX2xlbmd0aCo4OwogCQl9CiAJfQpkaWZmIC0t Z2l0IGEvZHJpdmVycy92aWRlby9mYl9kcmF3LmggYi9kcml2ZXJzL3ZpZGVvL2ZiX2RyYXcuaApp bmRleCAxZGI2MjIxLi5mYTk2MjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZiX2RyYXcu aAorKysgYi9kcml2ZXJzL3ZpZGVvL2ZiX2RyYXcuaApAQCAtMzMsMTEgKzMzLDExIEBAIHBpeGVs X3RvX3BhdCggdTMyIGJwcCwgdTMyIHBpeGVsKQogCWNhc2UgODoKIAkJcmV0dXJuIDB4MDEwMTAx MDEwMTAxMDEwMXVsKnBpeGVsOwogCWNhc2UgMTI6Ci0JCXJldHVybiAweDAwMDEwMDEwMDEwMDEw MDF1bCpwaXhlbDsKKwkJcmV0dXJuIDB4MTAwMTAwMTAwMTAwMTAwMXVsKnBpeGVsOwogCWNhc2Ug MTY6CiAJCXJldHVybiAweDAwMDEwMDAxMDAwMTAwMDF1bCpwaXhlbDsKIAljYXNlIDI0OgotCQly ZXR1cm4gMHgwMDAwMDAwMDAxMDAwMDAxdWwqcGl4ZWw7CisJCXJldHVybiAweDAwMDEwMDAwMDEw MDAwMDF1bCpwaXhlbDsKIAljYXNlIDMyOgogCQlyZXR1cm4gMHgwMDAwMDAwMTAwMDAwMDAxdWwq cGl4ZWw7CiAJZGVmYXVsdDoKQEAgLTU4LDExICs1OCwxMSBAQCBwaXhlbF90b19wYXQoIHUzMiBi cHAsIHUzMiBwaXhlbCkKIAljYXNlIDg6CiAJCXJldHVybiAweDAxMDEwMTAxdWwqcGl4ZWw7CiAJ Y2FzZSAxMjoKLQkJcmV0dXJuIDB4MDAwMDEwMDF1bCpwaXhlbDsKKwkJcmV0dXJuIDB4MDEwMDEw MDF1bCpwaXhlbDsKIAljYXNlIDE2OgogCQlyZXR1cm4gMHgwMDAxMDAwMXVsKnBpeGVsOwogCWNh c2UgMjQ6Ci0JCXJldHVybiAweDAwMDAwMDAxdWwqcGl4ZWw7CisJCXJldHVybiAweDAxMDAwMDAx dWwqcGl4ZWw7CiAJY2FzZSAzMjoKIAkJcmV0dXJuIDB4MDAwMDAwMDF1bCpwaXhlbDsKIAlkZWZh dWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zeXNmaWxscmVjdC5jIGIvZHJpdmVycy92 aWRlby9zeXNmaWxscmVjdC5jCmluZGV4IGY5NGQ2YjYuLmZmMjU2YTQgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvdmlkZW8vc3lzZmlsbHJlY3QuYworKysgYi9kcml2ZXJzL3ZpZGVvL3N5c2ZpbGxyZWN0 LmMKQEAgLTEyNCw3ICsxMjQsNyBAQCBiaXRmaWxsX3VuYWxpZ25lZChzdHJ1Y3QgZmJfaW5mbyAq cCwgdW5zaWduZWQgbG9uZyAqZHN0LCBpbnQgZHN0X2lkeCwKIAogCQkvKiBUcmFpbGluZyBiaXRz ICovCiAJCWlmIChsYXN0KQotCQkJKmRzdCA9IGNvbXAocGF0LCAqZHN0LCBmaXJzdCk7CisJCQkq ZHN0ID0gY29tcChwYXQsICpkc3QsIGxhc3QpOwogCX0KIH0KIApAQCAtMjQyLDcgKzI0Miw3IEBA IGJpdGZpbGxfdW5hbGlnbmVkX3JldihzdHJ1Y3QgZmJfaW5mbyAqcCwgdW5zaWduZWQgbG9uZyAq ZHN0LCBpbnQgZHN0X2lkeCwKIAogdm9pZCBzeXNfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKnAs IGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkKIHsKLQl1bnNpZ25lZCBsb25nIHBhdCwg Zmc7CisJdW5zaWduZWQgbG9uZyBwYXQsIHBhdDIsIGZnOwogCXVuc2lnbmVkIGxvbmcgd2lkdGgg PSByZWN0LT53aWR0aCwgaGVpZ2h0ID0gcmVjdC0+aGVpZ2h0OwogCWludCBiaXRzID0gQklUU19Q RVJfTE9ORywgYnl0ZXMgPSBiaXRzID4+IDM7CiAJdTMyIGJwcCA9IHAtPnZhci5iaXRzX3Blcl9w aXhlbDsKQEAgLTI5MiwxNyArMjkyLDE2IEBAIHZvaWQgc3lzX2ZpbGxyZWN0KHN0cnVjdCBmYl9p bmZvICpwLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCiAJCQlkc3RfaWR4ICs9IHAt PmZpeC5saW5lX2xlbmd0aCo4OwogCQl9CiAJfSBlbHNlIHsKLQkJaW50IHJpZ2h0OwotCQlpbnQg cjsKLQkJaW50IHJvdCA9IChsZWZ0LWRzdF9pZHgpICUgYnBwOworCQlpbnQgcmlnaHQsIHI7CiAJ CXZvaWQgKCpmaWxsX29wKShzdHJ1Y3QgZmJfaW5mbyAqcCwgdW5zaWduZWQgbG9uZyAqZHN0LAog CQkJCWludCBkc3RfaWR4LCB1bnNpZ25lZCBsb25nIHBhdCwgaW50IGxlZnQsCiAJCQkJaW50IHJp Z2h0LCB1bnNpZ25lZCBuLCBpbnQgYml0cykgPSBOVUxMOwotCi0JCS8qIHJvdGF0ZSBwYXR0ZXJu IHRvIGNvcnJlY3Qgc3RhcnQgcG9zaXRpb24gKi8KLQkJcGF0ID0gcGF0IDw8IHJvdCB8IHBhdCA+ PiAoYnBwLXJvdCk7Ci0KLQkJcmlnaHQgPSBicHAtbGVmdDsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJ QU4KKwkJcmlnaHQgPSBsZWZ0OworCQlsZWZ0ID0gYnBwIC0gcmlnaHQ7CisjZWxzZQorCQlyaWdo dCA9IGJwcCAtIGxlZnQ7CisjZW5kaWYKIAkJc3dpdGNoIChyZWN0LT5yb3ApIHsKIAkJY2FzZSBS T1BfWE9SOgogCQkJZmlsbF9vcCA9IGJpdGZpbGxfdW5hbGlnbmVkX3JldjsKQEAgLTMxNywxMiAr MzE2LDE3IEBAIHZvaWQgc3lzX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICpwLCBjb25zdCBzdHJ1 Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCiAJCQlicmVhazsKIAkJfQogCQl3aGlsZSAoaGVpZ2h0LS0p IHsKLQkJCWRzdCArPSBkc3RfaWR4ID4+IChmZnMoYml0cykgLSAxKTsKKwkJCWRzdCArPSBkc3Rf aWR4IC8gYml0czsKIAkJCWRzdF9pZHggJj0gKGJpdHMgLSAxKTsKLQkJCWZpbGxfb3AocCwgZHN0 LCBkc3RfaWR4LCBwYXQsIGxlZnQsIHJpZ2h0LAorCQkJciA9IGRzdF9pZHggJSBicHA7CisJCQkv KiByb3RhdGUgcGF0dGVybiB0byB0aGUgY29ycmVjdCBzdGFydCBwb3NpdGlvbiAqLworI2lmZGVm IF9fTElUVExFX0VORElBTgorCQkJcGF0MiA9IHBhdCA8PCByIHwgcGF0ID4+IChicHAtcik7Cisj ZWxzZQorCQkJcGF0MiA9IHBhdCA8PCAoYnBwLXIpIHwgcGF0ID4+IHI7CisjZW5kaWYKKwkJCWZp bGxfb3AocCwgZHN0LCBkc3RfaWR4LCBwYXQyLCBsZWZ0LCByaWdodCwKIAkJCQl3aWR0aCpicHAs IGJpdHMpOwotCQkJciA9IChwLT5maXgubGluZV9sZW5ndGgqOCkgJSBicHA7Ci0JCQlwYXQgPSBw YXQgPDwgKGJwcC1yKSB8IHBhdCA+PiByOwogCQkJZHN0X2lkeCArPSBwLT5maXgubGluZV9sZW5n dGgqODsKIAkJfQogCX0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpTdGF5IG9uIHRvcCBvZiBldmVy eXRoaW5nIG5ldyBhbmQgZGlmZmVyZW50LCBib3RoIGluc2lkZSBhbmQgCmFyb3VuZCBKYXZhIChU TSkgdGVjaG5vbG9neSAtIHJlZ2lzdGVyIGJ5IEFwcmlsIDIyLCBhbmQgc2F2ZQokMjAwIG9uIHRo ZSBKYXZhT25lIChTTSkgY29uZmVyZW5jZSwgSnVuZSAyLTUsIDIwMDksIFNhbiBGcmFuY2lzY28u CjMwMCBwbHVzIHRlY2huaWNhbCBhbmQgaGFuZHMtb24gc2Vzc2lvbnMuIFJlZ2lzdGVyIHRvZGF5 LiAKVXNlIHByaW9yaXR5IGNvZGUgSjlKTVQzMi4gaHR0cDovL3Auc2YubmV0L3NmdS9wCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4LWZiZGV2LWRl dmVsIG1haWxpbmcgbGlzdApMaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQK aHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vbGludXgtZmJkZXYt ZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759915AbZDRS6g (ORCPT ); Sat, 18 Apr 2009 14:58:36 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1759600AbZDRSxi (ORCPT ); Sat, 18 Apr 2009 14:53:38 -0400 Received: from mail-ew0-f176.google.com ([209.85.219.176]:55746 "EHLO mail-ew0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759678AbZDRSxg convert rfc822-to-8bit (ORCPT ); Sat, 18 Apr 2009 14:53:36 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:date:from:to:cc:subject:message-id:reply-to:references :mime-version:content-type:content-disposition :content-transfer-encoding:in-reply-to:x-pgp-key:user-agent; b=marrwdWINl4scfLTOEpGfVRmy51C7wnep/WeOMX8QD/KMGC/9sFPwq0hhK8uYZ/plF Jndve0R4cMNZPggu7PvD+pT+VsZoVgy3QB7bOul5/sBfi8XlpFT54wuIni4MdaDqWUt1 rCUTWzd0alX3ZtRhi9hT0Wo/CM1lIsYJWqQ/8= Date: Sat, 18 Apr 2009 20:52:34 +0200 From: Michal Januszewski To: Andrew Morton Cc: Krzysztof Helt , linux-fbdev-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH v2] fbdev: fix fillrect for 24bpp modes Message-ID: <20090418185234.GA17853@tria> Reply-To: spock@gentoo.org References: <20090413170954.GA8403@tria> <20090417183617.ed7553cd.krzysztof.h1@poczta.fm> <20090417115048.0c5ca35d.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8BIT In-Reply-To: <20090417115048.0c5ca35d.akpm@linux-foundation.org> X-PGP-Key: http://dev.gentoo.org/~spock/spock.gpg User-Agent: Mutt/1.5.19 (2009-01-05) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The software fillrect routines do not work properly when the number of pixels per machine word is not an integer. To see that, run the following command on a fbdev console with a 24bpp video mode, using a non-accelerated driver such as (u)vesafb: reset ; echo -e '\e[41mtest\e[K' The expected result is 'test' displayed on a line with red background. Instead of that, 'test' has a red background, but the rest of the line (rendered using fillrect()) contains a distored colorful pattern. This patch fixes the problem by correctly computing rotation shifts. It has been tested in a 24bpp mode on 32- and 64-bit little-endian machines. Signed-off-by: MichaƂ Januszewski --- This version of the patch should work correctly with modes where line_length*8 % bpp != 0. It also replaces the right shift by (ffs(bits) - 1) with a division by bits, as both operations are optimized into a shift by a constant and the latter one increases code readability. In case this still breaks in some modes, I would appreciate a full list of parameters describing the problem, i.e. bpp, line_length and the top left coordinate of the rectangle that is painted incorrectly. diff --git a/drivers/video/cfbfillrect.c b/drivers/video/cfbfillrect.c index 64b3576..faa1a39 100644 --- a/drivers/video/cfbfillrect.c +++ b/drivers/video/cfbfillrect.c @@ -9,10 +9,6 @@ * * NOTES: * - * The code for depths like 24 that don't have integer number of pixels per - * long is broken and needs to be fixed. For now I turned these types of - * mode off. - * * Also need to add code to deal with cards endians that are different than * the native cpu endians. I also need to deal with MSB position in the word. * @@ -139,7 +135,7 @@ bitfill_unaligned(struct fb_info *p, unsigned long __iomem *dst, int dst_idx, // Trailing bits if (last) - FB_WRITEL(comp(pat, FB_READL(dst), first), dst); + FB_WRITEL(comp(pat, FB_READL(dst), last), dst); } } @@ -281,7 +277,7 @@ bitfill_unaligned_rev(struct fb_info *p, unsigned long __iomem *dst, void cfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect) { - unsigned long pat, fg; + unsigned long pat, pat2, fg; unsigned long width = rect->width, height = rect->height; int bits = BITS_PER_LONG, bytes = bits >> 3; u32 bpp = p->var.bits_per_pixel; @@ -297,7 +293,7 @@ void cfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect) else fg = rect->color; - pat = pixel_to_pat( bpp, fg); + pat = pixel_to_pat(bpp, fg); dst = (unsigned long __iomem *)((unsigned long)p->screen_base & ~(bytes-1)); dst_idx = ((unsigned long)p->screen_base & (bytes - 1))*8; @@ -333,17 +329,16 @@ void cfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect) dst_idx += p->fix.line_length*8; } } else { - int right; - int r; - int rot = (left-dst_idx) % bpp; + int right, r; void (*fill_op)(struct fb_info *p, unsigned long __iomem *dst, int dst_idx, unsigned long pat, int left, int right, unsigned n, int bits) = NULL; - - /* rotate pattern to correct start position */ - pat = pat << rot | pat >> (bpp-rot); - - right = bpp-left; +#ifdef __LITTLE_ENDIAN + right = left; + left = bpp - right; +#else + right = bpp - left; +#endif switch (rect->rop) { case ROP_XOR: fill_op = bitfill_unaligned_rev; @@ -357,12 +352,17 @@ void cfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect) break; } while (height--) { - dst += dst_idx >> (ffs(bits) - 1); + dst += dst_idx / bits; dst_idx &= (bits - 1); - fill_op(p, dst, dst_idx, pat, left, right, + r = dst_idx % bpp; + /* rotate pattern to the correct start position */ +#ifdef __LITTLE_ENDIAN + pat2 = pat << r | pat >> (bpp-r); +#else + pat2 = pat << (bpp-r) | pat >> r; +#endif + fill_op(p, dst, dst_idx, pat2, left, right, width*bpp, bits); - r = (p->fix.line_length*8) % bpp; - pat = pat << (bpp-r) | pat >> r; dst_idx += p->fix.line_length*8; } } diff --git a/drivers/video/fb_draw.h b/drivers/video/fb_draw.h index 1db6221..fa9626e 100644 --- a/drivers/video/fb_draw.h +++ b/drivers/video/fb_draw.h @@ -33,11 +33,11 @@ pixel_to_pat( u32 bpp, u32 pixel) case 8: return 0x0101010101010101ul*pixel; case 12: - return 0x0001001001001001ul*pixel; + return 0x1001001001001001ul*pixel; case 16: return 0x0001000100010001ul*pixel; case 24: - return 0x0000000001000001ul*pixel; + return 0x0001000001000001ul*pixel; case 32: return 0x0000000100000001ul*pixel; default: @@ -58,11 +58,11 @@ pixel_to_pat( u32 bpp, u32 pixel) case 8: return 0x01010101ul*pixel; case 12: - return 0x00001001ul*pixel; + return 0x01001001ul*pixel; case 16: return 0x00010001ul*pixel; case 24: - return 0x00000001ul*pixel; + return 0x01000001ul*pixel; case 32: return 0x00000001ul*pixel; default: diff --git a/drivers/video/sysfillrect.c b/drivers/video/sysfillrect.c index f94d6b6..ff256a4 100644 --- a/drivers/video/sysfillrect.c +++ b/drivers/video/sysfillrect.c @@ -124,7 +124,7 @@ bitfill_unaligned(struct fb_info *p, unsigned long *dst, int dst_idx, /* Trailing bits */ if (last) - *dst = comp(pat, *dst, first); + *dst = comp(pat, *dst, last); } } @@ -242,7 +242,7 @@ bitfill_unaligned_rev(struct fb_info *p, unsigned long *dst, int dst_idx, void sys_fillrect(struct fb_info *p, const struct fb_fillrect *rect) { - unsigned long pat, fg; + unsigned long pat, pat2, fg; unsigned long width = rect->width, height = rect->height; int bits = BITS_PER_LONG, bytes = bits >> 3; u32 bpp = p->var.bits_per_pixel; @@ -292,17 +292,16 @@ void sys_fillrect(struct fb_info *p, const struct fb_fillrect *rect) dst_idx += p->fix.line_length*8; } } else { - int right; - int r; - int rot = (left-dst_idx) % bpp; + int right, r; void (*fill_op)(struct fb_info *p, unsigned long *dst, int dst_idx, unsigned long pat, int left, int right, unsigned n, int bits) = NULL; - - /* rotate pattern to correct start position */ - pat = pat << rot | pat >> (bpp-rot); - - right = bpp-left; +#ifdef __LITTLE_ENDIAN + right = left; + left = bpp - right; +#else + right = bpp - left; +#endif switch (rect->rop) { case ROP_XOR: fill_op = bitfill_unaligned_rev; @@ -317,12 +316,17 @@ void sys_fillrect(struct fb_info *p, const struct fb_fillrect *rect) break; } while (height--) { - dst += dst_idx >> (ffs(bits) - 1); + dst += dst_idx / bits; dst_idx &= (bits - 1); - fill_op(p, dst, dst_idx, pat, left, right, + r = dst_idx % bpp; + /* rotate pattern to the correct start position */ +#ifdef __LITTLE_ENDIAN + pat2 = pat << r | pat >> (bpp-r); +#else + pat2 = pat << (bpp-r) | pat >> r; +#endif + fill_op(p, dst, dst_idx, pat2, left, right, width*bpp, bits); - r = (p->fix.line_length*8) % bpp; - pat = pat << (bpp-r) | pat >> r; dst_idx += p->fix.line_length*8; } }