From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH] drm/rockchip: fix fbdev crash when not use DRM_FBDEV_EMULATION Date: Wed, 3 Aug 2016 10:46:27 +0200 Message-ID: <20160803084627.GK6232@phenom.ffwll.local> References: <1470212025-30336-1-git-send-email-mark.yao@rock-chips.com> <20160803084321.GJ6232@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20160803084321.GJ6232@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Mark Yao Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org List-Id: linux-rockchip.vger.kernel.org T24gV2VkLCBBdWcgMDMsIDIwMTYgYXQgMTA6NDM6MjFBTSArMDIwMCwgRGFuaWVsIFZldHRlciB3 cm90ZToKPiBPbiBXZWQsIEF1ZyAwMywgMjAxNiBhdCAwNDoxMzo0NVBNICswODAwLCBNYXJrIFlh byB3cm90ZToKPiA+IFsgICAgMS4xNjI1NzFdIFVuYWJsZSB0byBoYW5kbGUga2VybmVsIE5VTEwg cG9pbnRlciBkZXJlZmVyZW5jZSBhdCB2aXJ0dWFsIGFkZHJlc3MgMDAwMDAyMDAKPiA+IFsgICAg MS4xNjU2NTZdIE1vZHVsZXMgbGlua2VkIGluOgo+ID4gWyAgICAxLjE2NTk0MV0gQ1BVOiA1IFBJ RDogMTQzIENvbW06IGt3b3JrZXIvNToyIE5vdCB0YWludGVkIDQuNC4xNSAjMjM3Cj4gPiBbICAg IDEuMTY2NTA2XSBIYXJkd2FyZSBuYW1lOiBSb2NrY2hpcCBSSzMzOTkgRXZhbHVhdGlvbiBCb2Fy ZCB2MSAoQW5kcm9pZCkgKERUKQo+ID4gWyAgICAxLjE2NzE1M10gV29ya3F1ZXVlOiBldmVudHMg b3V0cHV0X3BvbGxfZXhlY3V0ZQo+ID4gWyAgICAxLjE2ODIzMV0gUEMgaXMgYXQgbXV0ZXhfbG9j aysweDE0LzB4NDQKPiA+IFsgICAgMS4xNjg1ODZdIExSIGlzIGF0IGRybV9mYl9oZWxwZXJfaG90 cGx1Z19ldmVudCsweDI4LzB4Y2MKPiA+IFsgICAgMS4xNzIxOTJdIFs8ZmZmZmZmODAwODk4MjEx MD5dIG11dGV4X2xvY2srMHgxNC8weDQ0Cj4gPiBbICAgIDEuMTcyMTk2XSBbPGZmZmZmZjgwMDg0 MDI1YTQ+XSBkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQrMHgyOC8weGNjCj4gPiBbICAgIDEu MTcyMjAxXSBbPGZmZmZmZjgwMDg0MjdhZTQ+XSByb2NrY2hpcF9kcm1fb3V0cHV0X3BvbGxfY2hh bmdlZCsweDE0LzB4MWMKPiA+IFsgICAgMS4xNzIyMDRdIFs8ZmZmZmZmODAwODNmN2M0Yz5dIGRy bV9rbXNfaGVscGVyX2hvdHBsdWdfZXZlbnQrMHgyOC8weDM0Cj4gPiBbICAgIDEuMTcyMjA3XSBb PGZmZmZmZjgwMDgzZjdkZGM+XSBvdXRwdXRfcG9sbF9leGVjdXRlKzB4MTUwLzB4MTk4Cj4gPiBb ICAgIDEuMTcyMjEyXSBbPGZmZmZmZjgwMDgwYjBlYTg+XSBwcm9jZXNzX29uZV93b3JrKzB4MjE4 LzB4M2RjCj4gPiBbICAgIDEuMTcyMjE1XSBbPGZmZmZmZjgwMDgwYjE1Nzg+XSB3b3JrZXJfdGhy ZWFkKzB4MjRjLzB4Mzc0Cj4gPiBbICAgIDEuMTcyMjE3XSBbPGZmZmZmZjgwMDgwYjViY2M+XSBr dGhyZWFkKzB4ZGMvMHhlNAo+ID4gWyAgICAxLjE3MjIyMl0gWzxmZmZmZmY4MDA4MDg0Y2QwPl0g cmV0X2Zyb21fZm9yaysweDEwLzB4NDAKPiA+IAo+ID4gU2lnbmVkLW9mZi1ieTogTWFyayBZYW8g PG1hcmsueWFvQHJvY2stY2hpcHMuY29tPgo+IAo+IEVyaG0sIGhvdyBleGFjdGx5IGRpZCB5b3Ug bWFuYWdlIHRvIGJsb3cgdXAgaW4gdGhlcmU/IFdpdGhvdXQgZmJkZXYKPiBzdXBwb3J0IGVuYWJs ZSBkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQoKSBkb2VzIG5vdGhpbmcgYXQgYWxsLgo+IAo+ IFRoZSBmYmRldiBoZWxwZXIgaXMgZGVzaWduZWQgc3VjaCB0aGF0IHlvdSBfZG9uJ3RfIGhhdmUg dG8gY2hlY2sgZm9yIE5VTEwKPiBldmVyeXdoZXJlIGluIHRoZSBkcml2ZXIsIHRoYXQgd291bGQg YmUgcHJldHR5IGJhZCBjb2RlLgoKQW5kIGluZGVlZCB0aGlzIGlzc3VlIHNlZW1zIHByZWV4aXN0 aW5nLCBhbmQgd2FzIGFscmVhZHkgYXR0ZW1wdCB0byBmaXggaW4KCmNvbW1pdCA3NjVjMzViYmQy NjdlOTNlYWJlMTVhOTQ1MzQ2ODhkZGFhMGI5ZGM3CkF1dGhvcjogSGVpa28gU3TDvGJuZXIgPGhl aWtvQHNudGVjaC5kZT4KRGF0ZTogICBUdWUgSnVuIDIgMTY6NDE6NDUgMjAxNSArMDIwMAoKICAg IGRybS9yb2NrY2hpcDogb25seSBjYWxsIGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudCBpZiBm Yl9oZWxwZXIgcHJlc2VudAoKZXhjZXB0IHRoYXQgcGF0Y2ggaXMgY29tcGxldGUgbm9uc2Vuc2Ug LSB0aGUgYWRkZWQgY2hlY2sgaXMgYWx3YXlzIHRydWUuCk9oIGFuZCBpdCdzIG1pc3NpbmcgeW91 ciBzLW8tYiwgd2hpY2ggaXMgbm90IGdvb2QgYXQgYWxsLgoKVGhlIHByb3BlciBmaXggaXMgdG8g bWFrZSBkZWxheWVkIGZiZGV2IGxvYWRpbmcgd29yayBjb3JyZWN0bHksIFRoaWVycnkKaGFzIHBh dGNoZXMgZm9yIHRoYXQgb24gdGhlIG1haWxpbmcgbGlzdC4gTm90IGFkZCBldmVuIG1vcmUgaGFj a3MgbGlrZSB0aGUKYWJvdmUgKGFuZCB0aGVuIHNsYXAgYSBtaXNsZWFkaW5nIHN1YmplY3Qgb250 byB5b3VyIHBhdGNoKS4KLURhbmllbAoKPiAtRGFuaWVsCj4gCj4gPiAtLS0KPiA+ICBkcml2ZXJz L2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5jICAgfCAxMyArKysrKysrKysrLS0t Cj4gPiAgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuaCAgIHwgIDgg KysrKysrLS0KPiA+ICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2ZiLmMg ICAgfCAgNiArKystLS0KPiA+ICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJt X2ZiZGV2LmMgfCAyNiArKysrKysrKysrKysrKysrKy0tLS0tLS0tLQo+ID4gIDQgZmlsZXMgY2hh bmdlZCwgMzYgaW5zZXJ0aW9ucygrKSwgMTcgZGVsZXRpb25zKC0pCj4gPiAKPiA+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5jIGIvZHJpdmVy cy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuYwo+ID4gaW5kZXggYTgyMmQ0OS4u MWE0ZGFkNiAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hp cF9kcm1fZHJ2LmMKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9k cm1fZHJ2LmMKPiA+IEBAIC0yNjEsNyArMjYxLDEwIEBAIHN0YXRpYyB2b2lkIHJvY2tjaGlwX2Ry bV9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKPiA+ICB7Cj4gPiAgCXN0cnVjdCBy b2NrY2hpcF9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cj4gPiAgCj4gPiAt CWRybV9mYl9oZWxwZXJfcmVzdG9yZV9mYmRldl9tb2RlX3VubG9ja2VkKCZwcml2LT5mYmRldl9o ZWxwZXIpOwo+ID4gKwlpZiAoIXByaXYtPmZiZGV2KQo+ID4gKwkJcmV0dXJuOwo+ID4gKwo+ID4g Kwlkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZCgmcHJpdi0+ZmJkZXYt PmZiZGV2X2hlbHBlcik7Cj4gPiAgfQo+ID4gIAo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmls ZV9vcGVyYXRpb25zIHJvY2tjaGlwX2RybV9kcml2ZXJfZm9wcyA9IHsKPiA+IEBAIC0zMTAsOCAr MzEzLDEwIEBAIHZvaWQgcm9ja2NoaXBfZHJtX2ZiX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2Ug KmRybSkKPiA+ICB7Cj4gPiAgCXN0cnVjdCByb2NrY2hpcF9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRy bS0+ZGV2X3ByaXZhdGU7Cj4gPiAgCj4gPiArCWlmICghcHJpdi0+ZmJkZXYpCj4gPiArCQlyZXR1 cm47Cj4gPiAgCWNvbnNvbGVfbG9jaygpOwo+ID4gLQlkcm1fZmJfaGVscGVyX3NldF9zdXNwZW5k KCZwcml2LT5mYmRldl9oZWxwZXIsIDEpOwo+ID4gKwlkcm1fZmJfaGVscGVyX3NldF9zdXNwZW5k KCZwcml2LT5mYmRldi0+ZmJkZXZfaGVscGVyLCAxKTsKPiA+ICAJY29uc29sZV91bmxvY2soKTsK PiA+ICB9Cj4gPiAgCj4gPiBAQCAtMzE5LDggKzMyNCwxMCBAQCB2b2lkIHJvY2tjaGlwX2RybV9m Yl9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKmRybSkKPiA+ICB7Cj4gPiAgCXN0cnVjdCByb2Nr Y2hpcF9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRybS0+ZGV2X3ByaXZhdGU7Cj4gPiAgCj4gPiArCWlm ICghcHJpdi0+ZmJkZXYpCj4gPiArCQlyZXR1cm47Cj4gPiAgCWNvbnNvbGVfbG9jaygpOwo+ID4g LQlkcm1fZmJfaGVscGVyX3NldF9zdXNwZW5kKCZwcml2LT5mYmRldl9oZWxwZXIsIDApOwo+ID4g Kwlkcm1fZmJfaGVscGVyX3NldF9zdXNwZW5kKCZwcml2LT5mYmRldi0+ZmJkZXZfaGVscGVyLCAw KTsKPiA+ICAJY29uc29sZV91bmxvY2soKTsKPiA+ICB9Cj4gPiAgCj4gPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuaCBiL2RyaXZlcnMvZ3B1 L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZHJ2LmgKPiA+IGluZGV4IGVhMzkzMjkuLmMwNTRm YzIgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJt X2Rydi5oCj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Ry di5oCj4gPiBAQCAtNTAsNiArNTAsMTEgQEAgc3RydWN0IHJvY2tjaGlwX2NydGNfc3RhdGUgewo+ ID4gICNkZWZpbmUgdG9fcm9ja2NoaXBfY3J0Y19zdGF0ZShzKSBcCj4gPiAgCQljb250YWluZXJf b2Yocywgc3RydWN0IHJvY2tjaGlwX2NydGNfc3RhdGUsIGJhc2UpCj4gPiAgCj4gPiArc3RydWN0 IHJvY2tjaGlwX2RybV9mYmRldiB7Cj4gPiArCXN0cnVjdCBkcm1fZmJfaGVscGVyIGZiZGV2X2hl bHBlcjsKPiA+ICsJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpmYmRldl9ibzsKPiA+ICt9Owo+ID4g Kwo+ID4gIC8qCj4gPiAgICogUm9ja2NoaXAgZHJtIHByaXZhdGUgc3RydWN0dXJlLgo+ID4gICAq Cj4gPiBAQCAtNTcsOCArNjIsNyBAQCBzdHJ1Y3Qgcm9ja2NoaXBfY3J0Y19zdGF0ZSB7Cj4gPiAg ICogQG51bV9waXBlOiBudW1iZXIgb2YgcGlwZXMgZm9yIHRoaXMgZGV2aWNlLgo+ID4gICAqLwo+ ID4gIHN0cnVjdCByb2NrY2hpcF9kcm1fcHJpdmF0ZSB7Cj4gPiAtCXN0cnVjdCBkcm1fZmJfaGVs cGVyIGZiZGV2X2hlbHBlcjsKPiA+IC0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpmYmRldl9ibzsK PiA+ICsJc3RydWN0IHJvY2tjaGlwX2RybV9mYmRldiAqZmJkZXY7Cj4gPiAgCWNvbnN0IHN0cnVj dCByb2NrY2hpcF9jcnRjX2Z1bmNzICpjcnRjX2Z1bmNzW1JPQ0tDSElQX01BWF9DUlRDXTsKPiA+ ICAJc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlOwo+ID4gIH07Cj4gPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9mYi5jIGIvZHJpdmVycy9n cHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9mYi5jCj4gPiBpbmRleCA1NWM1MjczLi5mZWY2 ZjhkIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2Ry bV9mYi5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Zi LmMKPiA+IEBAIC0xNTYsMTAgKzE1NiwxMCBAQCBlcnJfZ2VtX29iamVjdF91bnJlZmVyZW5jZToK PiA+ICBzdGF0aWMgdm9pZCByb2NrY2hpcF9kcm1fb3V0cHV0X3BvbGxfY2hhbmdlZChzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2KQo+ID4gIHsKPiA+ICAJc3RydWN0IHJvY2tjaGlwX2RybV9wcml2YXRl ICpwcml2YXRlID0gZGV2LT5kZXZfcHJpdmF0ZTsKPiA+IC0Jc3RydWN0IGRybV9mYl9oZWxwZXIg KmZiX2hlbHBlciA9ICZwcml2YXRlLT5mYmRldl9oZWxwZXI7Cj4gPiArCXN0cnVjdCByb2NrY2hp cF9kcm1fZmJkZXYgKmZiZGV2ID0gcHJpdmF0ZS0+ZmJkZXY7Cj4gPiAgCj4gPiAtCWlmIChmYl9o ZWxwZXIpCj4gPiAtCQlkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQoZmJfaGVscGVyKTsKPiA+ ICsJaWYgKGZiZGV2KQo+ID4gKwkJZHJtX2ZiX2hlbHBlcl9ob3RwbHVnX2V2ZW50KCZmYmRldi0+ ZmJkZXZfaGVscGVyKTsKPiA+ICB9Cj4gPiAgCj4gPiAgc3RhdGljIHZvaWQgcm9ja2NoaXBfY3J0 Y193YWl0X2Zvcl91cGRhdGUoc3RydWN0IGRybV9jcnRjICpjcnRjKQo+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZmJkZXYuYyBiL2RyaXZlcnMv Z3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZmJkZXYuYwo+ID4gaW5kZXggMjA3ZTAxZC4u Y2M1NzgxYSAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hp cF9kcm1fZmJkZXYuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlw X2RybV9mYmRldi5jCj4gPiBAQCAtMjIsMTYgKzIyLDE2IEBACj4gPiAgI2luY2x1ZGUgInJvY2tj aGlwX2RybV9mYi5oIgo+ID4gIAo+ID4gICNkZWZpbmUgUFJFRkVSUkVEX0JQUAkJMzIKPiA+IC0j ZGVmaW5lIHRvX2RybV9wcml2YXRlKHgpIFwKPiA+IC0JCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3Qg cm9ja2NoaXBfZHJtX3ByaXZhdGUsIGZiZGV2X2hlbHBlcikKPiA+ICsjZGVmaW5lIHRvX3JvY2tj aGlwX2ZiZGV2KHgpIFwKPiA+ICsJCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3Qgcm9ja2NoaXBfZHJt X2ZiZGV2LCBmYmRldl9oZWxwZXIpCj4gPiAgCj4gPiAgc3RhdGljIGludCByb2NrY2hpcF9mYmRl dl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLAo+ID4gIAkJCSAgICAgICBzdHJ1Y3Qgdm1fYXJl YV9zdHJ1Y3QgKnZtYSkKPiA+ICB7Cj4gPiAgCXN0cnVjdCBkcm1fZmJfaGVscGVyICpoZWxwZXIg PSBpbmZvLT5wYXI7Cj4gPiAtCXN0cnVjdCByb2NrY2hpcF9kcm1fcHJpdmF0ZSAqcHJpdmF0ZSA9 IHRvX2RybV9wcml2YXRlKGhlbHBlcik7Cj4gPiArCXN0cnVjdCByb2NrY2hpcF9kcm1fZmJkZXYg KmZiZGV2ID0gdG9fcm9ja2NoaXBfZmJkZXYoaGVscGVyKTsKPiA+ICAKPiA+IC0JcmV0dXJuIHJv Y2tjaGlwX2dlbV9tbWFwX2J1Zihwcml2YXRlLT5mYmRldl9ibywgdm1hKTsKPiA+ICsJcmV0dXJu IHJvY2tjaGlwX2dlbV9tbWFwX2J1ZihmYmRldi0+ZmJkZXZfYm8sIHZtYSk7Cj4gPiAgfQo+ID4g IAo+ID4gIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHJvY2tjaGlwX2RybV9mYmRldl9vcHMgPSB7Cj4g PiBAQCAtNTAsNyArNTAsNyBAQCBzdGF0aWMgc3RydWN0IGZiX29wcyByb2NrY2hpcF9kcm1fZmJk ZXZfb3BzID0gewo+ID4gIHN0YXRpYyBpbnQgcm9ja2NoaXBfZHJtX2ZiZGV2X2NyZWF0ZShzdHJ1 Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyLAo+ID4gIAkJCQkgICAgIHN0cnVjdCBkcm1fZmJfaGVs cGVyX3N1cmZhY2Vfc2l6ZSAqc2l6ZXMpCj4gPiAgewo+ID4gLQlzdHJ1Y3Qgcm9ja2NoaXBfZHJt X3ByaXZhdGUgKnByaXZhdGUgPSB0b19kcm1fcHJpdmF0ZShoZWxwZXIpOwo+ID4gKwlzdHJ1Y3Qg cm9ja2NoaXBfZHJtX2ZiZGV2ICpmYmRldiA9IHRvX3JvY2tjaGlwX2ZiZGV2KGhlbHBlcik7Cj4g PiAgCXN0cnVjdCBkcm1fbW9kZV9mYl9jbWQyIG1vZGVfY21kID0geyAwIH07Cj4gPiAgCXN0cnVj dCBkcm1fZGV2aWNlICpkZXYgPSBoZWxwZXItPmRldjsKPiA+ICAJc3RydWN0IHJvY2tjaGlwX2dl bV9vYmplY3QgKnJrX29iajsKPiA+IEBAIC03NSw3ICs3NSw3IEBAIHN0YXRpYyBpbnQgcm9ja2No aXBfZHJtX2ZiZGV2X2NyZWF0ZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyLAo+ID4gIAlp ZiAoSVNfRVJSKHJrX29iaikpCj4gPiAgCQlyZXR1cm4gLUVOT01FTTsKPiA+ICAKPiA+IC0JcHJp dmF0ZS0+ZmJkZXZfYm8gPSAmcmtfb2JqLT5iYXNlOwo+ID4gKwlmYmRldi0+ZmJkZXZfYm8gPSAm cmtfb2JqLT5iYXNlOwo+ID4gIAo+ID4gIAlmYmkgPSBkcm1fZmJfaGVscGVyX2FsbG9jX2ZiaSho ZWxwZXIpOwo+ID4gIAlpZiAoSVNfRVJSKGZiaSkpIHsKPiA+IEBAIC04NSw3ICs4NSw3IEBAIHN0 YXRpYyBpbnQgcm9ja2NoaXBfZHJtX2ZiZGV2X2NyZWF0ZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAq aGVscGVyLAo+ID4gIAl9Cj4gPiAgCj4gPiAgCWhlbHBlci0+ZmIgPSByb2NrY2hpcF9kcm1fZnJh bWVidWZmZXJfaW5pdChkZXYsICZtb2RlX2NtZCwKPiA+IC0JCQkJCQkgICBwcml2YXRlLT5mYmRl dl9ibyk7Cj4gPiArCQkJCQkJICAgZmJkZXYtPmZiZGV2X2JvKTsKPiA+ICAJaWYgKElTX0VSUiho ZWxwZXItPmZiKSkgewo+ID4gIAkJZGV2X2VycihkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0 ZSBEUk0gZnJhbWVidWZmZXIuXG4iKTsKPiA+ICAJCXJldCA9IFBUUl9FUlIoaGVscGVyLT5mYik7 Cj4gPiBAQCAtMTMwLDYgKzEzMCw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2ZiX2hlbHBl cl9mdW5jcyByb2NrY2hpcF9kcm1fZmJfaGVscGVyX2Z1bmNzID0gewo+ID4gIGludCByb2NrY2hp cF9kcm1fZmJkZXZfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+ID4gIHsKPiA+ICAJc3Ry dWN0IHJvY2tjaGlwX2RybV9wcml2YXRlICpwcml2YXRlID0gZGV2LT5kZXZfcHJpdmF0ZTsKPiA+ ICsJc3RydWN0IHJvY2tjaGlwX2RybV9mYmRldiAqZmJkZXY7Cj4gPiAgCXN0cnVjdCBkcm1fZmJf aGVscGVyICpoZWxwZXI7Cj4gPiAgCXVuc2lnbmVkIGludCBudW1fY3J0YzsKPiA+ICAJaW50IHJl dDsKPiA+IEBAIC0xMzksNyArMTQwLDEyIEBAIGludCByb2NrY2hpcF9kcm1fZmJkZXZfaW5pdChz dHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+ID4gIAo+ID4gIAludW1fY3J0YyA9IGRldi0+bW9kZV9j b25maWcubnVtX2NydGM7Cj4gPiAgCj4gPiAtCWhlbHBlciA9ICZwcml2YXRlLT5mYmRldl9oZWxw ZXI7Cj4gPiArCWZiZGV2ID0gZGV2bV9remFsbG9jKGRldi0+ZGV2LCBzaXplb2YoKmZiZGV2KSwg R0ZQX0tFUk5FTCk7Cj4gPiArCWlmICghZmJkZXYpCj4gPiArCQlyZXR1cm4gLUVOT01FTTsKPiA+ ICsKPiA+ICsJcHJpdmF0ZS0+ZmJkZXYgPSBmYmRldjsKPiA+ICsJaGVscGVyID0gJmZiZGV2LT5m YmRldl9oZWxwZXI7Cj4gPiAgCj4gPiAgCWRybV9mYl9oZWxwZXJfcHJlcGFyZShkZXYsIGhlbHBl ciwgJnJvY2tjaGlwX2RybV9mYl9oZWxwZXJfZnVuY3MpOwo+ID4gIAo+ID4gQEAgLTE3NSw3ICsx ODEsOSBAQCB2b2lkIHJvY2tjaGlwX2RybV9mYmRldl9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpk ZXYpCj4gPiAgCXN0cnVjdCByb2NrY2hpcF9kcm1fcHJpdmF0ZSAqcHJpdmF0ZSA9IGRldi0+ZGV2 X3ByaXZhdGU7Cj4gPiAgCXN0cnVjdCBkcm1fZmJfaGVscGVyICpoZWxwZXI7Cj4gPiAgCj4gPiAt CWhlbHBlciA9ICZwcml2YXRlLT5mYmRldl9oZWxwZXI7Cj4gPiArCWlmICghcHJpdmF0ZSB8fCBw cml2YXRlLT5mYmRldikKPiA+ICsJCXJldHVybjsKPiA+ICsJaGVscGVyID0gJnByaXZhdGUtPmZi ZGV2LT5mYmRldl9oZWxwZXI7Cj4gPiAgCj4gPiAgCWRybV9mYl9oZWxwZXJfdW5yZWdpc3Rlcl9m YmkoaGVscGVyKTsKPiA+ICAJZHJtX2ZiX2hlbHBlcl9yZWxlYXNlX2ZiaShoZWxwZXIpOwo+ID4g LS0gCj4gPiAxLjkuMQo+ID4gCj4gPiAKPiA+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCj4gPiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4gPiBkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gPiBodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo+IAo+IC0tIAo+IERhbmllbCBWZXR0ZXIKPiBT b2Z0d2FyZSBFbmdpbmVlciwgSW50ZWwgQ29ycG9yYXRpb24KPiBodHRwOi8vYmxvZy5mZndsbC5j aAoKLS0gCkRhbmllbCBWZXR0ZXIKU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENvcnBvcmF0aW9u Cmh0dHA6Ly9ibG9nLmZmd2xsLmNoCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVk ZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: daniel@ffwll.ch (Daniel Vetter) Date: Wed, 3 Aug 2016 10:46:27 +0200 Subject: [PATCH] drm/rockchip: fix fbdev crash when not use DRM_FBDEV_EMULATION In-Reply-To: <20160803084321.GJ6232@phenom.ffwll.local> References: <1470212025-30336-1-git-send-email-mark.yao@rock-chips.com> <20160803084321.GJ6232@phenom.ffwll.local> Message-ID: <20160803084627.GK6232@phenom.ffwll.local> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Wed, Aug 03, 2016 at 10:43:21AM +0200, Daniel Vetter wrote: > On Wed, Aug 03, 2016 at 04:13:45PM +0800, Mark Yao wrote: > > [ 1.162571] Unable to handle kernel NULL pointer dereference at virtual address 00000200 > > [ 1.165656] Modules linked in: > > [ 1.165941] CPU: 5 PID: 143 Comm: kworker/5:2 Not tainted 4.4.15 #237 > > [ 1.166506] Hardware name: Rockchip RK3399 Evaluation Board v1 (Android) (DT) > > [ 1.167153] Workqueue: events output_poll_execute > > [ 1.168231] PC is at mutex_lock+0x14/0x44 > > [ 1.168586] LR is at drm_fb_helper_hotplug_event+0x28/0xcc > > [ 1.172192] [] mutex_lock+0x14/0x44 > > [ 1.172196] [] drm_fb_helper_hotplug_event+0x28/0xcc > > [ 1.172201] [] rockchip_drm_output_poll_changed+0x14/0x1c > > [ 1.172204] [] drm_kms_helper_hotplug_event+0x28/0x34 > > [ 1.172207] [] output_poll_execute+0x150/0x198 > > [ 1.172212] [] process_one_work+0x218/0x3dc > > [ 1.172215] [] worker_thread+0x24c/0x374 > > [ 1.172217] [] kthread+0xdc/0xe4 > > [ 1.172222] [] ret_from_fork+0x10/0x40 > > > > Signed-off-by: Mark Yao > > Erhm, how exactly did you manage to blow up in there? Without fbdev > support enable drm_fb_helper_hotplug_event() does nothing at all. > > The fbdev helper is designed such that you _don't_ have to check for NULL > everywhere in the driver, that would be pretty bad code. And indeed this issue seems preexisting, and was already attempt to fix in commit 765c35bbd267e93eabe15a94534688ddaa0b9dc7 Author: Heiko St?bner Date: Tue Jun 2 16:41:45 2015 +0200 drm/rockchip: only call drm_fb_helper_hotplug_event if fb_helper present except that patch is complete nonsense - the added check is always true. Oh and it's missing your s-o-b, which is not good at all. The proper fix is to make delayed fbdev loading work correctly, Thierry has patches for that on the mailing list. Not add even more hacks like the above (and then slap a misleading subject onto your patch). -Daniel > -Daniel > > > --- > > drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 13 ++++++++++--- > > drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 8 ++++++-- > > drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 6 +++--- > > drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c | 26 +++++++++++++++++--------- > > 4 files changed, 36 insertions(+), 17 deletions(-) > > > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > > index a822d49..1a4dad6 100644 > > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > > @@ -261,7 +261,10 @@ static void rockchip_drm_lastclose(struct drm_device *dev) > > { > > struct rockchip_drm_private *priv = dev->dev_private; > > > > - drm_fb_helper_restore_fbdev_mode_unlocked(&priv->fbdev_helper); > > + if (!priv->fbdev) > > + return; > > + > > + drm_fb_helper_restore_fbdev_mode_unlocked(&priv->fbdev->fbdev_helper); > > } > > > > static const struct file_operations rockchip_drm_driver_fops = { > > @@ -310,8 +313,10 @@ void rockchip_drm_fb_suspend(struct drm_device *drm) > > { > > struct rockchip_drm_private *priv = drm->dev_private; > > > > + if (!priv->fbdev) > > + return; > > console_lock(); > > - drm_fb_helper_set_suspend(&priv->fbdev_helper, 1); > > + drm_fb_helper_set_suspend(&priv->fbdev->fbdev_helper, 1); > > console_unlock(); > > } > > > > @@ -319,8 +324,10 @@ void rockchip_drm_fb_resume(struct drm_device *drm) > > { > > struct rockchip_drm_private *priv = drm->dev_private; > > > > + if (!priv->fbdev) > > + return; > > console_lock(); > > - drm_fb_helper_set_suspend(&priv->fbdev_helper, 0); > > + drm_fb_helper_set_suspend(&priv->fbdev->fbdev_helper, 0); > > console_unlock(); > > } > > > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > > index ea39329..c054fc2 100644 > > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > > @@ -50,6 +50,11 @@ struct rockchip_crtc_state { > > #define to_rockchip_crtc_state(s) \ > > container_of(s, struct rockchip_crtc_state, base) > > > > +struct rockchip_drm_fbdev { > > + struct drm_fb_helper fbdev_helper; > > + struct drm_gem_object *fbdev_bo; > > +}; > > + > > /* > > * Rockchip drm private structure. > > * > > @@ -57,8 +62,7 @@ struct rockchip_crtc_state { > > * @num_pipe: number of pipes for this device. > > */ > > struct rockchip_drm_private { > > - struct drm_fb_helper fbdev_helper; > > - struct drm_gem_object *fbdev_bo; > > + struct rockchip_drm_fbdev *fbdev; > > const struct rockchip_crtc_funcs *crtc_funcs[ROCKCHIP_MAX_CRTC]; > > struct drm_atomic_state *state; > > }; > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > > index 55c5273..fef6f8d 100644 > > --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > > @@ -156,10 +156,10 @@ err_gem_object_unreference: > > static void rockchip_drm_output_poll_changed(struct drm_device *dev) > > { > > struct rockchip_drm_private *private = dev->dev_private; > > - struct drm_fb_helper *fb_helper = &private->fbdev_helper; > > + struct rockchip_drm_fbdev *fbdev = private->fbdev; > > > > - if (fb_helper) > > - drm_fb_helper_hotplug_event(fb_helper); > > + if (fbdev) > > + drm_fb_helper_hotplug_event(&fbdev->fbdev_helper); > > } > > > > static void rockchip_crtc_wait_for_update(struct drm_crtc *crtc) > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c > > index 207e01d..cc5781a 100644 > > --- a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c > > @@ -22,16 +22,16 @@ > > #include "rockchip_drm_fb.h" > > > > #define PREFERRED_BPP 32 > > -#define to_drm_private(x) \ > > - container_of(x, struct rockchip_drm_private, fbdev_helper) > > +#define to_rockchip_fbdev(x) \ > > + container_of(x, struct rockchip_drm_fbdev, fbdev_helper) > > > > static int rockchip_fbdev_mmap(struct fb_info *info, > > struct vm_area_struct *vma) > > { > > struct drm_fb_helper *helper = info->par; > > - struct rockchip_drm_private *private = to_drm_private(helper); > > + struct rockchip_drm_fbdev *fbdev = to_rockchip_fbdev(helper); > > > > - return rockchip_gem_mmap_buf(private->fbdev_bo, vma); > > + return rockchip_gem_mmap_buf(fbdev->fbdev_bo, vma); > > } > > > > static struct fb_ops rockchip_drm_fbdev_ops = { > > @@ -50,7 +50,7 @@ static struct fb_ops rockchip_drm_fbdev_ops = { > > static int rockchip_drm_fbdev_create(struct drm_fb_helper *helper, > > struct drm_fb_helper_surface_size *sizes) > > { > > - struct rockchip_drm_private *private = to_drm_private(helper); > > + struct rockchip_drm_fbdev *fbdev = to_rockchip_fbdev(helper); > > struct drm_mode_fb_cmd2 mode_cmd = { 0 }; > > struct drm_device *dev = helper->dev; > > struct rockchip_gem_object *rk_obj; > > @@ -75,7 +75,7 @@ static int rockchip_drm_fbdev_create(struct drm_fb_helper *helper, > > if (IS_ERR(rk_obj)) > > return -ENOMEM; > > > > - private->fbdev_bo = &rk_obj->base; > > + fbdev->fbdev_bo = &rk_obj->base; > > > > fbi = drm_fb_helper_alloc_fbi(helper); > > if (IS_ERR(fbi)) { > > @@ -85,7 +85,7 @@ static int rockchip_drm_fbdev_create(struct drm_fb_helper *helper, > > } > > > > helper->fb = rockchip_drm_framebuffer_init(dev, &mode_cmd, > > - private->fbdev_bo); > > + fbdev->fbdev_bo); > > if (IS_ERR(helper->fb)) { > > dev_err(dev->dev, "Failed to allocate DRM framebuffer.\n"); > > ret = PTR_ERR(helper->fb); > > @@ -130,6 +130,7 @@ static const struct drm_fb_helper_funcs rockchip_drm_fb_helper_funcs = { > > int rockchip_drm_fbdev_init(struct drm_device *dev) > > { > > struct rockchip_drm_private *private = dev->dev_private; > > + struct rockchip_drm_fbdev *fbdev; > > struct drm_fb_helper *helper; > > unsigned int num_crtc; > > int ret; > > @@ -139,7 +140,12 @@ int rockchip_drm_fbdev_init(struct drm_device *dev) > > > > num_crtc = dev->mode_config.num_crtc; > > > > - helper = &private->fbdev_helper; > > + fbdev = devm_kzalloc(dev->dev, sizeof(*fbdev), GFP_KERNEL); > > + if (!fbdev) > > + return -ENOMEM; > > + > > + private->fbdev = fbdev; > > + helper = &fbdev->fbdev_helper; > > > > drm_fb_helper_prepare(dev, helper, &rockchip_drm_fb_helper_funcs); > > > > @@ -175,7 +181,9 @@ void rockchip_drm_fbdev_fini(struct drm_device *dev) > > struct rockchip_drm_private *private = dev->dev_private; > > struct drm_fb_helper *helper; > > > > - helper = &private->fbdev_helper; > > + if (!private || private->fbdev) > > + return; > > + helper = &private->fbdev->fbdev_helper; > > > > drm_fb_helper_unregister_fbi(helper); > > drm_fb_helper_release_fbi(helper); > > -- > > 1.9.1 > > > > > > _______________________________________________ > > dri-devel mailing list > > dri-devel at lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/dri-devel > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757241AbcHCJvm (ORCPT ); Wed, 3 Aug 2016 05:51:42 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:33911 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752270AbcHCJvf (ORCPT ); Wed, 3 Aug 2016 05:51:35 -0400 Date: Wed, 3 Aug 2016 10:46:27 +0200 From: Daniel Vetter To: Mark Yao Cc: David Airlie , Heiko Stuebner , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] drm/rockchip: fix fbdev crash when not use DRM_FBDEV_EMULATION Message-ID: <20160803084627.GK6232@phenom.ffwll.local> Mail-Followup-To: Mark Yao , David Airlie , Heiko Stuebner , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org References: <1470212025-30336-1-git-send-email-mark.yao@rock-chips.com> <20160803084321.GJ6232@phenom.ffwll.local> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20160803084321.GJ6232@phenom.ffwll.local> X-Operating-System: Linux phenom 4.6.0-1-amd64 User-Agent: Mutt/1.6.0 (2016-04-01) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Aug 03, 2016 at 10:43:21AM +0200, Daniel Vetter wrote: > On Wed, Aug 03, 2016 at 04:13:45PM +0800, Mark Yao wrote: > > [ 1.162571] Unable to handle kernel NULL pointer dereference at virtual address 00000200 > > [ 1.165656] Modules linked in: > > [ 1.165941] CPU: 5 PID: 143 Comm: kworker/5:2 Not tainted 4.4.15 #237 > > [ 1.166506] Hardware name: Rockchip RK3399 Evaluation Board v1 (Android) (DT) > > [ 1.167153] Workqueue: events output_poll_execute > > [ 1.168231] PC is at mutex_lock+0x14/0x44 > > [ 1.168586] LR is at drm_fb_helper_hotplug_event+0x28/0xcc > > [ 1.172192] [] mutex_lock+0x14/0x44 > > [ 1.172196] [] drm_fb_helper_hotplug_event+0x28/0xcc > > [ 1.172201] [] rockchip_drm_output_poll_changed+0x14/0x1c > > [ 1.172204] [] drm_kms_helper_hotplug_event+0x28/0x34 > > [ 1.172207] [] output_poll_execute+0x150/0x198 > > [ 1.172212] [] process_one_work+0x218/0x3dc > > [ 1.172215] [] worker_thread+0x24c/0x374 > > [ 1.172217] [] kthread+0xdc/0xe4 > > [ 1.172222] [] ret_from_fork+0x10/0x40 > > > > Signed-off-by: Mark Yao > > Erhm, how exactly did you manage to blow up in there? Without fbdev > support enable drm_fb_helper_hotplug_event() does nothing at all. > > The fbdev helper is designed such that you _don't_ have to check for NULL > everywhere in the driver, that would be pretty bad code. And indeed this issue seems preexisting, and was already attempt to fix in commit 765c35bbd267e93eabe15a94534688ddaa0b9dc7 Author: Heiko Stübner Date: Tue Jun 2 16:41:45 2015 +0200 drm/rockchip: only call drm_fb_helper_hotplug_event if fb_helper present except that patch is complete nonsense - the added check is always true. Oh and it's missing your s-o-b, which is not good at all. The proper fix is to make delayed fbdev loading work correctly, Thierry has patches for that on the mailing list. Not add even more hacks like the above (and then slap a misleading subject onto your patch). -Daniel > -Daniel > > > --- > > drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 13 ++++++++++--- > > drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 8 ++++++-- > > drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 6 +++--- > > drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c | 26 +++++++++++++++++--------- > > 4 files changed, 36 insertions(+), 17 deletions(-) > > > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > > index a822d49..1a4dad6 100644 > > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > > @@ -261,7 +261,10 @@ static void rockchip_drm_lastclose(struct drm_device *dev) > > { > > struct rockchip_drm_private *priv = dev->dev_private; > > > > - drm_fb_helper_restore_fbdev_mode_unlocked(&priv->fbdev_helper); > > + if (!priv->fbdev) > > + return; > > + > > + drm_fb_helper_restore_fbdev_mode_unlocked(&priv->fbdev->fbdev_helper); > > } > > > > static const struct file_operations rockchip_drm_driver_fops = { > > @@ -310,8 +313,10 @@ void rockchip_drm_fb_suspend(struct drm_device *drm) > > { > > struct rockchip_drm_private *priv = drm->dev_private; > > > > + if (!priv->fbdev) > > + return; > > console_lock(); > > - drm_fb_helper_set_suspend(&priv->fbdev_helper, 1); > > + drm_fb_helper_set_suspend(&priv->fbdev->fbdev_helper, 1); > > console_unlock(); > > } > > > > @@ -319,8 +324,10 @@ void rockchip_drm_fb_resume(struct drm_device *drm) > > { > > struct rockchip_drm_private *priv = drm->dev_private; > > > > + if (!priv->fbdev) > > + return; > > console_lock(); > > - drm_fb_helper_set_suspend(&priv->fbdev_helper, 0); > > + drm_fb_helper_set_suspend(&priv->fbdev->fbdev_helper, 0); > > console_unlock(); > > } > > > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > > index ea39329..c054fc2 100644 > > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > > @@ -50,6 +50,11 @@ struct rockchip_crtc_state { > > #define to_rockchip_crtc_state(s) \ > > container_of(s, struct rockchip_crtc_state, base) > > > > +struct rockchip_drm_fbdev { > > + struct drm_fb_helper fbdev_helper; > > + struct drm_gem_object *fbdev_bo; > > +}; > > + > > /* > > * Rockchip drm private structure. > > * > > @@ -57,8 +62,7 @@ struct rockchip_crtc_state { > > * @num_pipe: number of pipes for this device. > > */ > > struct rockchip_drm_private { > > - struct drm_fb_helper fbdev_helper; > > - struct drm_gem_object *fbdev_bo; > > + struct rockchip_drm_fbdev *fbdev; > > const struct rockchip_crtc_funcs *crtc_funcs[ROCKCHIP_MAX_CRTC]; > > struct drm_atomic_state *state; > > }; > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > > index 55c5273..fef6f8d 100644 > > --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > > @@ -156,10 +156,10 @@ err_gem_object_unreference: > > static void rockchip_drm_output_poll_changed(struct drm_device *dev) > > { > > struct rockchip_drm_private *private = dev->dev_private; > > - struct drm_fb_helper *fb_helper = &private->fbdev_helper; > > + struct rockchip_drm_fbdev *fbdev = private->fbdev; > > > > - if (fb_helper) > > - drm_fb_helper_hotplug_event(fb_helper); > > + if (fbdev) > > + drm_fb_helper_hotplug_event(&fbdev->fbdev_helper); > > } > > > > static void rockchip_crtc_wait_for_update(struct drm_crtc *crtc) > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c > > index 207e01d..cc5781a 100644 > > --- a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c > > @@ -22,16 +22,16 @@ > > #include "rockchip_drm_fb.h" > > > > #define PREFERRED_BPP 32 > > -#define to_drm_private(x) \ > > - container_of(x, struct rockchip_drm_private, fbdev_helper) > > +#define to_rockchip_fbdev(x) \ > > + container_of(x, struct rockchip_drm_fbdev, fbdev_helper) > > > > static int rockchip_fbdev_mmap(struct fb_info *info, > > struct vm_area_struct *vma) > > { > > struct drm_fb_helper *helper = info->par; > > - struct rockchip_drm_private *private = to_drm_private(helper); > > + struct rockchip_drm_fbdev *fbdev = to_rockchip_fbdev(helper); > > > > - return rockchip_gem_mmap_buf(private->fbdev_bo, vma); > > + return rockchip_gem_mmap_buf(fbdev->fbdev_bo, vma); > > } > > > > static struct fb_ops rockchip_drm_fbdev_ops = { > > @@ -50,7 +50,7 @@ static struct fb_ops rockchip_drm_fbdev_ops = { > > static int rockchip_drm_fbdev_create(struct drm_fb_helper *helper, > > struct drm_fb_helper_surface_size *sizes) > > { > > - struct rockchip_drm_private *private = to_drm_private(helper); > > + struct rockchip_drm_fbdev *fbdev = to_rockchip_fbdev(helper); > > struct drm_mode_fb_cmd2 mode_cmd = { 0 }; > > struct drm_device *dev = helper->dev; > > struct rockchip_gem_object *rk_obj; > > @@ -75,7 +75,7 @@ static int rockchip_drm_fbdev_create(struct drm_fb_helper *helper, > > if (IS_ERR(rk_obj)) > > return -ENOMEM; > > > > - private->fbdev_bo = &rk_obj->base; > > + fbdev->fbdev_bo = &rk_obj->base; > > > > fbi = drm_fb_helper_alloc_fbi(helper); > > if (IS_ERR(fbi)) { > > @@ -85,7 +85,7 @@ static int rockchip_drm_fbdev_create(struct drm_fb_helper *helper, > > } > > > > helper->fb = rockchip_drm_framebuffer_init(dev, &mode_cmd, > > - private->fbdev_bo); > > + fbdev->fbdev_bo); > > if (IS_ERR(helper->fb)) { > > dev_err(dev->dev, "Failed to allocate DRM framebuffer.\n"); > > ret = PTR_ERR(helper->fb); > > @@ -130,6 +130,7 @@ static const struct drm_fb_helper_funcs rockchip_drm_fb_helper_funcs = { > > int rockchip_drm_fbdev_init(struct drm_device *dev) > > { > > struct rockchip_drm_private *private = dev->dev_private; > > + struct rockchip_drm_fbdev *fbdev; > > struct drm_fb_helper *helper; > > unsigned int num_crtc; > > int ret; > > @@ -139,7 +140,12 @@ int rockchip_drm_fbdev_init(struct drm_device *dev) > > > > num_crtc = dev->mode_config.num_crtc; > > > > - helper = &private->fbdev_helper; > > + fbdev = devm_kzalloc(dev->dev, sizeof(*fbdev), GFP_KERNEL); > > + if (!fbdev) > > + return -ENOMEM; > > + > > + private->fbdev = fbdev; > > + helper = &fbdev->fbdev_helper; > > > > drm_fb_helper_prepare(dev, helper, &rockchip_drm_fb_helper_funcs); > > > > @@ -175,7 +181,9 @@ void rockchip_drm_fbdev_fini(struct drm_device *dev) > > struct rockchip_drm_private *private = dev->dev_private; > > struct drm_fb_helper *helper; > > > > - helper = &private->fbdev_helper; > > + if (!private || private->fbdev) > > + return; > > + helper = &private->fbdev->fbdev_helper; > > > > drm_fb_helper_unregister_fbi(helper); > > drm_fb_helper_release_fbi(helper); > > -- > > 1.9.1 > > > > > > _______________________________________________ > > dri-devel mailing list > > dri-devel@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/dri-devel > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch