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 13:50:12 +0200 Message-ID: <20160803115012.GN6232@phenom.ffwll.local> References: <1470212025-30336-1-git-send-email-mark.yao@rock-chips.com> <20160803084321.GJ6232@phenom.ffwll.local> <20160803084627.GK6232@phenom.ffwll.local> <57A1B1B4.7040501@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <57A1B1B4.7040501@rock-chips.com> 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 T24gV2VkLCBBdWcgMDMsIDIwMTYgYXQgMDQ6NTY6MjBQTSArMDgwMCwgTWFyayB5YW8gd3JvdGU6 Cj4gT24gMjAxNuW5tDA45pyIMDPml6UgMTY6NDYsIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4gPiBP biBXZWQsIEF1ZyAwMywgMjAxNiBhdCAxMDo0MzoyMUFNICswMjAwLCBEYW5pZWwgVmV0dGVyIHdy b3RlOgo+ID4gPiBPbiBXZWQsIEF1ZyAwMywgMjAxNiBhdCAwNDoxMzo0NVBNICswODAwLCBNYXJr IFlhbyB3cm90ZToKPiA+ID4gPiBbICAgIDEuMTYyNTcxXSBVbmFibGUgdG8gaGFuZGxlIGtlcm5l bCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UgYXQgdmlydHVhbCBhZGRyZXNzIDAwMDAwMjAwCj4g PiA+ID4gWyAgICAxLjE2NTY1Nl0gTW9kdWxlcyBsaW5rZWQgaW46Cj4gPiA+ID4gWyAgICAxLjE2 NTk0MV0gQ1BVOiA1IFBJRDogMTQzIENvbW06IGt3b3JrZXIvNToyIE5vdCB0YWludGVkIDQuNC4x NSAjMjM3Cj4gPiA+ID4gWyAgICAxLjE2NjUwNl0gSGFyZHdhcmUgbmFtZTogUm9ja2NoaXAgUksz Mzk5IEV2YWx1YXRpb24gQm9hcmQgdjEgKEFuZHJvaWQpIChEVCkKPiA+ID4gPiBbICAgIDEuMTY3 MTUzXSBXb3JrcXVldWU6IGV2ZW50cyBvdXRwdXRfcG9sbF9leGVjdXRlCj4gPiA+ID4gWyAgICAx LjE2ODIzMV0gUEMgaXMgYXQgbXV0ZXhfbG9jaysweDE0LzB4NDQKPiA+ID4gPiBbICAgIDEuMTY4 NTg2XSBMUiBpcyBhdCBkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQrMHgyOC8weGNjCj4gPiA+ ID4gWyAgICAxLjE3MjE5Ml0gWzxmZmZmZmY4MDA4OTgyMTEwPl0gbXV0ZXhfbG9jaysweDE0LzB4 NDQKPiA+ID4gPiBbICAgIDEuMTcyMTk2XSBbPGZmZmZmZjgwMDg0MDI1YTQ+XSBkcm1fZmJfaGVs cGVyX2hvdHBsdWdfZXZlbnQrMHgyOC8weGNjCj4gPiA+ID4gWyAgICAxLjE3MjIwMV0gWzxmZmZm ZmY4MDA4NDI3YWU0Pl0gcm9ja2NoaXBfZHJtX291dHB1dF9wb2xsX2NoYW5nZWQrMHgxNC8weDFj Cj4gPiA+ID4gWyAgICAxLjE3MjIwNF0gWzxmZmZmZmY4MDA4M2Y3YzRjPl0gZHJtX2ttc19oZWxw ZXJfaG90cGx1Z19ldmVudCsweDI4LzB4MzQKPiA+ID4gPiBbICAgIDEuMTcyMjA3XSBbPGZmZmZm ZjgwMDgzZjdkZGM+XSBvdXRwdXRfcG9sbF9leGVjdXRlKzB4MTUwLzB4MTk4Cj4gPiA+ID4gWyAg ICAxLjE3MjIxMl0gWzxmZmZmZmY4MDA4MGIwZWE4Pl0gcHJvY2Vzc19vbmVfd29yaysweDIxOC8w eDNkYwo+ID4gPiA+IFsgICAgMS4xNzIyMTVdIFs8ZmZmZmZmODAwODBiMTU3OD5dIHdvcmtlcl90 aHJlYWQrMHgyNGMvMHgzNzQKPiA+ID4gPiBbICAgIDEuMTcyMjE3XSBbPGZmZmZmZjgwMDgwYjVi Y2M+XSBrdGhyZWFkKzB4ZGMvMHhlNAo+ID4gPiA+IFsgICAgMS4xNzIyMjJdIFs8ZmZmZmZmODAw ODA4NGNkMD5dIHJldF9mcm9tX2ZvcmsrMHgxMC8weDQwCj4gPiA+ID4gCj4gPiA+ID4gU2lnbmVk LW9mZi1ieTogTWFyayBZYW8gPG1hcmsueWFvQHJvY2stY2hpcHMuY29tPgo+ID4gPiBFcmhtLCBo b3cgZXhhY3RseSBkaWQgeW91IG1hbmFnZSB0byBibG93IHVwIGluIHRoZXJlPyBXaXRob3V0IGZi ZGV2Cj4gPiA+IHN1cHBvcnQgZW5hYmxlIGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudCgpIGRv ZXMgbm90aGluZyBhdCBhbGwuCj4gPiA+IAo+ID4gPiBUaGUgZmJkZXYgaGVscGVyIGlzIGRlc2ln bmVkIHN1Y2ggdGhhdCB5b3UgX2Rvbid0XyBoYXZlIHRvIGNoZWNrIGZvciBOVUxMCj4gPiA+IGV2 ZXJ5d2hlcmUgaW4gdGhlIGRyaXZlciwgdGhhdCB3b3VsZCBiZSBwcmV0dHkgYmFkIGNvZGUuCj4g PiBBbmQgaW5kZWVkIHRoaXMgaXNzdWUgc2VlbXMgcHJlZXhpc3RpbmcsIGFuZCB3YXMgYWxyZWFk eSBhdHRlbXB0IHRvIGZpeCBpbgo+ID4gCj4gPiBjb21taXQgNzY1YzM1YmJkMjY3ZTkzZWFiZTE1 YTk0NTM0Njg4ZGRhYTBiOWRjNwo+ID4gQXV0aG9yOiBIZWlrbyBTdMO8Ym5lciA8aGVpa29Ac250 ZWNoLmRlPgo+ID4gRGF0ZTogICBUdWUgSnVuIDIgMTY6NDE6NDUgMjAxNSArMDIwMAo+ID4gCj4g PiAgICAgIGRybS9yb2NrY2hpcDogb25seSBjYWxsIGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVu dCBpZiBmYl9oZWxwZXIgcHJlc2VudAo+ID4gCj4gPiBleGNlcHQgdGhhdCBwYXRjaCBpcyBjb21w bGV0ZSBub25zZW5zZSAtIHRoZSBhZGRlZCBjaGVjayBpcyBhbHdheXMgdHJ1ZS4KPiA+IE9oIGFu ZCBpdCdzIG1pc3NpbmcgeW91ciBzLW8tYiwgd2hpY2ggaXMgbm90IGdvb2QgYXQgYWxsLgo+ID4g Cj4gPiBUaGUgcHJvcGVyIGZpeCBpcyB0byBtYWtlIGRlbGF5ZWQgZmJkZXYgbG9hZGluZyB3b3Jr IGNvcnJlY3RseSwgVGhpZXJyeQo+ID4gaGFzIHBhdGNoZXMgZm9yIHRoYXQgb24gdGhlIG1haWxp bmcgbGlzdC4gTm90IGFkZCBldmVuIG1vcmUgaGFja3MgbGlrZSB0aGUKPiA+IGFib3ZlIChhbmQg dGhlbiBzbGFwIGEgbWlzbGVhZGluZyBzdWJqZWN0IG9udG8geW91ciBwYXRjaCkuCj4gPiAtRGFu aWVsCj4gCj4gSG1tbSwgdGhlcmUgaXMgYSBtaXN0YWtlIG9uIEhlaWtvJ3MgcGF0Y2g6Cj4gCj4g ICAgICAgICBzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyID0gJnByaXZhdGUtPmZiZGV2 X2hlbHBlcjsKPiAKPiAgICAgICAgLSAgICAgICBkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQo ZmJfaGVscGVyKTsKPiAgICAgICArICAgICAgIGlmIChmYl9oZWxwZXIpCj4gICAgICAgKyAgICAg ICAgICAgICAgIGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudChmYl9oZWxwZXIpOwo+IAo+IEJ1 dCB0aGUgZmJfaGVscGVyIHdvdWxkIG5ldmVyIGJlIE5VTEwsIGJlY2F1c2UgdGhlIHByaXZhdGUt PmZiZGV2X2hlbHBlciBpcwo+IG5vdCBhIHBvaW50ZXIuCj4gCj4gU28gdGhlIGZpcnN0IHN0ZXAg aXMgbWFraW5nIHByaXZhdGUtPmZiZGV2X2hlbHBlciB0byBhIHBvaW50ZXIsIHRoYXQncyB3aGF0 Cj4gSSBkbyBvbiB0aGlzIHBhdGNoLgoKWW91J3ZlIGRvbmUgbW9yZSwgeW91IGFsc28gd3JhcHBl ZCB0aGF0IHBvaW50ZXIgaW50byBhbm90aGVyIHN0cnVjdHVyZSwKd2hpY2ggbWVhbnMgeW91IGhh dmUgdG8gc3BsYXR0ZXIgTlVMTCBjaGVja3MgYWxsIG92ZXIgdGhlIHBsYWNlLiBJZiB5b3UKcmVh bGx5IG9ubHkgZG8gdGhlIHN0cnVjdC0+cG9pbnRlciBjb252ZXJzaW9uIGFsb25lIHRoZSBwYXRj aCB3b3VsZCBiZSBhCmxvdCBjbGVhbmVyLgotRGFuaWVsCgo+IAo+IAo+ID4gPiAtRGFuaWVsCj4g PiA+IAo+ID4gPiA+IC0tLQo+ID4gPiA+ICAgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tj aGlwX2RybV9kcnYuYyAgIHwgMTMgKysrKysrKysrKy0tLQo+ID4gPiA+ICAgZHJpdmVycy9ncHUv ZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuaCAgIHwgIDggKysrKysrLS0KPiA+ID4gPiAg IGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZmIuYyAgICB8ICA2ICsrKy0t LQo+ID4gPiA+ICAgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9mYmRldi5j IHwgMjYgKysrKysrKysrKysrKysrKystLS0tLS0tLS0KPiA+ID4gPiAgIDQgZmlsZXMgY2hhbmdl ZCwgMzYgaW5zZXJ0aW9ucygrKSwgMTcgZGVsZXRpb25zKC0pCj4gPiA+ID4gCj4gPiA+ID4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZHJ2LmMgYi9k cml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5jCj4gPiA+ID4gaW5kZXgg YTgyMmQ0OS4uMWE0ZGFkNiAxMDA2NDQKPiA+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcm9j a2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5jCj4gPiA+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3Jv Y2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuYwo+ID4gPiA+IEBAIC0yNjEsNyArMjYxLDEwIEBAIHN0 YXRpYyB2b2lkIHJvY2tjaGlwX2RybV9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikK PiA+ID4gPiAgIHsKPiA+ID4gPiAgIAlzdHJ1Y3Qgcm9ja2NoaXBfZHJtX3ByaXZhdGUgKnByaXYg PSBkZXYtPmRldl9wcml2YXRlOwo+ID4gPiA+IC0JZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2 X21vZGVfdW5sb2NrZWQoJnByaXYtPmZiZGV2X2hlbHBlcik7Cj4gPiA+ID4gKwlpZiAoIXByaXYt PmZiZGV2KQo+ID4gPiA+ICsJCXJldHVybjsKPiA+ID4gPiArCj4gPiA+ID4gKwlkcm1fZmJfaGVs cGVyX3Jlc3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZCgmcHJpdi0+ZmJkZXYtPmZiZGV2X2hlbHBl cik7Cj4gPiA+ID4gICB9Cj4gPiA+ID4gICBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0 aW9ucyByb2NrY2hpcF9kcm1fZHJpdmVyX2ZvcHMgPSB7Cj4gPiA+ID4gQEAgLTMxMCw4ICszMTMs MTAgQEAgdm9pZCByb2NrY2hpcF9kcm1fZmJfc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqZHJt KQo+ID4gPiA+ICAgewo+ID4gPiA+ICAgCXN0cnVjdCByb2NrY2hpcF9kcm1fcHJpdmF0ZSAqcHJp diA9IGRybS0+ZGV2X3ByaXZhdGU7Cj4gPiA+ID4gKwlpZiAoIXByaXYtPmZiZGV2KQo+ID4gPiA+ ICsJCXJldHVybjsKPiA+ID4gPiAgIAljb25zb2xlX2xvY2soKTsKPiA+ID4gPiAtCWRybV9mYl9o ZWxwZXJfc2V0X3N1c3BlbmQoJnByaXYtPmZiZGV2X2hlbHBlciwgMSk7Cj4gPiA+ID4gKwlkcm1f ZmJfaGVscGVyX3NldF9zdXNwZW5kKCZwcml2LT5mYmRldi0+ZmJkZXZfaGVscGVyLCAxKTsKPiA+ ID4gPiAgIAljb25zb2xlX3VubG9jaygpOwo+ID4gPiA+ICAgfQo+ID4gPiA+IEBAIC0zMTksOCAr MzI0LDEwIEBAIHZvaWQgcm9ja2NoaXBfZHJtX2ZiX3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAq ZHJtKQo+ID4gPiA+ICAgewo+ID4gPiA+ICAgCXN0cnVjdCByb2NrY2hpcF9kcm1fcHJpdmF0ZSAq cHJpdiA9IGRybS0+ZGV2X3ByaXZhdGU7Cj4gPiA+ID4gKwlpZiAoIXByaXYtPmZiZGV2KQo+ID4g PiA+ICsJCXJldHVybjsKPiA+ID4gPiAgIAljb25zb2xlX2xvY2soKTsKPiA+ID4gPiAtCWRybV9m Yl9oZWxwZXJfc2V0X3N1c3BlbmQoJnByaXYtPmZiZGV2X2hlbHBlciwgMCk7Cj4gPiA+ID4gKwlk cm1fZmJfaGVscGVyX3NldF9zdXNwZW5kKCZwcml2LT5mYmRldi0+ZmJkZXZfaGVscGVyLCAwKTsK PiA+ID4gPiAgIAljb25zb2xlX3VubG9jaygpOwo+ID4gPiA+ICAgfQo+ID4gPiA+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5oIGIvZHJpdmVy cy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuaAo+ID4gPiA+IGluZGV4IGVhMzkz MjkuLmMwNTRmYzIgMTAwNjQ0Cj4gPiA+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlw L3JvY2tjaGlwX2RybV9kcnYuaAo+ID4gPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hp cC9yb2NrY2hpcF9kcm1fZHJ2LmgKPiA+ID4gPiBAQCAtNTAsNiArNTAsMTEgQEAgc3RydWN0IHJv Y2tjaGlwX2NydGNfc3RhdGUgewo+ID4gPiA+ICAgI2RlZmluZSB0b19yb2NrY2hpcF9jcnRjX3N0 YXRlKHMpIFwKPiA+ID4gPiAgIAkJY29udGFpbmVyX29mKHMsIHN0cnVjdCByb2NrY2hpcF9jcnRj X3N0YXRlLCBiYXNlKQo+ID4gPiA+ICtzdHJ1Y3Qgcm9ja2NoaXBfZHJtX2ZiZGV2IHsKPiA+ID4g PiArCXN0cnVjdCBkcm1fZmJfaGVscGVyIGZiZGV2X2hlbHBlcjsKPiA+ID4gPiArCXN0cnVjdCBk cm1fZ2VtX29iamVjdCAqZmJkZXZfYm87Cj4gPiA+ID4gK307Cj4gPiA+ID4gKwo+ID4gPiA+ICAg LyoKPiA+ID4gPiAgICAqIFJvY2tjaGlwIGRybSBwcml2YXRlIHN0cnVjdHVyZS4KPiA+ID4gPiAg ICAqCj4gPiA+ID4gQEAgLTU3LDggKzYyLDcgQEAgc3RydWN0IHJvY2tjaGlwX2NydGNfc3RhdGUg ewo+ID4gPiA+ICAgICogQG51bV9waXBlOiBudW1iZXIgb2YgcGlwZXMgZm9yIHRoaXMgZGV2aWNl Lgo+ID4gPiA+ICAgICovCj4gPiA+ID4gICBzdHJ1Y3Qgcm9ja2NoaXBfZHJtX3ByaXZhdGUgewo+ ID4gPiA+IC0Jc3RydWN0IGRybV9mYl9oZWxwZXIgZmJkZXZfaGVscGVyOwo+ID4gPiA+IC0Jc3Ry dWN0IGRybV9nZW1fb2JqZWN0ICpmYmRldl9ibzsKPiA+ID4gPiArCXN0cnVjdCByb2NrY2hpcF9k cm1fZmJkZXYgKmZiZGV2Owo+ID4gPiA+ICAgCWNvbnN0IHN0cnVjdCByb2NrY2hpcF9jcnRjX2Z1 bmNzICpjcnRjX2Z1bmNzW1JPQ0tDSElQX01BWF9DUlRDXTsKPiA+ID4gPiAgIAlzdHJ1Y3QgZHJt X2F0b21pY19zdGF0ZSAqc3RhdGU7Cj4gPiA+ID4gICB9Owo+ID4gPiA+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2ZiLmMgYi9kcml2ZXJzL2dwdS9k cm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2ZiLmMKPiA+ID4gPiBpbmRleCA1NWM1MjczLi5mZWY2 ZjhkIDEwMDY0NAo+ID4gPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hp cF9kcm1fZmIuYwo+ID4gPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hp cF9kcm1fZmIuYwo+ID4gPiA+IEBAIC0xNTYsMTAgKzE1NiwxMCBAQCBlcnJfZ2VtX29iamVjdF91 bnJlZmVyZW5jZToKPiA+ID4gPiAgIHN0YXRpYyB2b2lkIHJvY2tjaGlwX2RybV9vdXRwdXRfcG9s bF9jaGFuZ2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4gPiA+ID4gICB7Cj4gPiA+ID4gICAJ c3RydWN0IHJvY2tjaGlwX2RybV9wcml2YXRlICpwcml2YXRlID0gZGV2LT5kZXZfcHJpdmF0ZTsK PiA+ID4gPiAtCXN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIgPSAmcHJpdmF0ZS0+ZmJk ZXZfaGVscGVyOwo+ID4gPiA+ICsJc3RydWN0IHJvY2tjaGlwX2RybV9mYmRldiAqZmJkZXYgPSBw cml2YXRlLT5mYmRldjsKPiA+ID4gPiAtCWlmIChmYl9oZWxwZXIpCj4gPiA+ID4gLQkJZHJtX2Zi X2hlbHBlcl9ob3RwbHVnX2V2ZW50KGZiX2hlbHBlcik7Cj4gPiA+ID4gKwlpZiAoZmJkZXYpCj4g PiA+ID4gKwkJZHJtX2ZiX2hlbHBlcl9ob3RwbHVnX2V2ZW50KCZmYmRldi0+ZmJkZXZfaGVscGVy KTsKPiA+ID4gPiAgIH0KPiA+ID4gPiAgIHN0YXRpYyB2b2lkIHJvY2tjaGlwX2NydGNfd2FpdF9m b3JfdXBkYXRlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9mYmRldi5jIGIvZHJpdmVycy9ncHUv ZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9mYmRldi5jCj4gPiA+ID4gaW5kZXggMjA3ZTAxZC4u Y2M1NzgxYSAxMDA2NDQKPiA+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9j a2NoaXBfZHJtX2ZiZGV2LmMKPiA+ID4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAv cm9ja2NoaXBfZHJtX2ZiZGV2LmMKPiA+ID4gPiBAQCAtMjIsMTYgKzIyLDE2IEBACj4gPiA+ID4g ICAjaW5jbHVkZSAicm9ja2NoaXBfZHJtX2ZiLmgiCj4gPiA+ID4gICAjZGVmaW5lIFBSRUZFUlJF RF9CUFAJCTMyCj4gPiA+ID4gLSNkZWZpbmUgdG9fZHJtX3ByaXZhdGUoeCkgXAo+ID4gPiA+IC0J CWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3Qgcm9ja2NoaXBfZHJtX3ByaXZhdGUsIGZiZGV2X2hlbHBl cikKPiA+ID4gPiArI2RlZmluZSB0b19yb2NrY2hpcF9mYmRldih4KSBcCj4gPiA+ID4gKwkJY29u dGFpbmVyX29mKHgsIHN0cnVjdCByb2NrY2hpcF9kcm1fZmJkZXYsIGZiZGV2X2hlbHBlcikKPiA+ ID4gPiAgIHN0YXRpYyBpbnQgcm9ja2NoaXBfZmJkZXZfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5m bywKPiA+ID4gPiAgIAkJCSAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKPiA+ID4g PiAgIHsKPiA+ID4gPiAgIAlzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyID0gaW5mby0+cGFy Owo+ID4gPiA+IC0Jc3RydWN0IHJvY2tjaGlwX2RybV9wcml2YXRlICpwcml2YXRlID0gdG9fZHJt X3ByaXZhdGUoaGVscGVyKTsKPiA+ID4gPiArCXN0cnVjdCByb2NrY2hpcF9kcm1fZmJkZXYgKmZi ZGV2ID0gdG9fcm9ja2NoaXBfZmJkZXYoaGVscGVyKTsKPiA+ID4gPiAtCXJldHVybiByb2NrY2hp cF9nZW1fbW1hcF9idWYocHJpdmF0ZS0+ZmJkZXZfYm8sIHZtYSk7Cj4gPiA+ID4gKwlyZXR1cm4g cm9ja2NoaXBfZ2VtX21tYXBfYnVmKGZiZGV2LT5mYmRldl9ibywgdm1hKTsKPiA+ID4gPiAgIH0K PiA+ID4gPiAgIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHJvY2tjaGlwX2RybV9mYmRldl9vcHMgPSB7 Cj4gPiA+ID4gQEAgLTUwLDcgKzUwLDcgQEAgc3RhdGljIHN0cnVjdCBmYl9vcHMgcm9ja2NoaXBf ZHJtX2ZiZGV2X29wcyA9IHsKPiA+ID4gPiAgIHN0YXRpYyBpbnQgcm9ja2NoaXBfZHJtX2ZiZGV2 X2NyZWF0ZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyLAo+ID4gPiA+ICAgCQkJCSAgICAg c3RydWN0IGRybV9mYl9oZWxwZXJfc3VyZmFjZV9zaXplICpzaXplcykKPiA+ID4gPiAgIHsKPiA+ ID4gPiAtCXN0cnVjdCByb2NrY2hpcF9kcm1fcHJpdmF0ZSAqcHJpdmF0ZSA9IHRvX2RybV9wcml2 YXRlKGhlbHBlcik7Cj4gPiA+ID4gKwlzdHJ1Y3Qgcm9ja2NoaXBfZHJtX2ZiZGV2ICpmYmRldiA9 IHRvX3JvY2tjaGlwX2ZiZGV2KGhlbHBlcik7Cj4gPiA+ID4gICAJc3RydWN0IGRybV9tb2RlX2Zi X2NtZDIgbW9kZV9jbWQgPSB7IDAgfTsKPiA+ID4gPiAgIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 ID0gaGVscGVyLT5kZXY7Cj4gPiA+ID4gICAJc3RydWN0IHJvY2tjaGlwX2dlbV9vYmplY3QgKnJr X29iajsKPiA+ID4gPiBAQCAtNzUsNyArNzUsNyBAQCBzdGF0aWMgaW50IHJvY2tjaGlwX2RybV9m YmRldl9jcmVhdGUoc3RydWN0IGRybV9mYl9oZWxwZXIgKmhlbHBlciwKPiA+ID4gPiAgIAlpZiAo SVNfRVJSKHJrX29iaikpCj4gPiA+ID4gICAJCXJldHVybiAtRU5PTUVNOwo+ID4gPiA+IC0JcHJp dmF0ZS0+ZmJkZXZfYm8gPSAmcmtfb2JqLT5iYXNlOwo+ID4gPiA+ICsJZmJkZXYtPmZiZGV2X2Jv ID0gJnJrX29iai0+YmFzZTsKPiA+ID4gPiAgIAlmYmkgPSBkcm1fZmJfaGVscGVyX2FsbG9jX2Zi aShoZWxwZXIpOwo+ID4gPiA+ICAgCWlmIChJU19FUlIoZmJpKSkgewo+ID4gPiA+IEBAIC04NSw3 ICs4NSw3IEBAIHN0YXRpYyBpbnQgcm9ja2NoaXBfZHJtX2ZiZGV2X2NyZWF0ZShzdHJ1Y3QgZHJt X2ZiX2hlbHBlciAqaGVscGVyLAo+ID4gPiA+ICAgCX0KPiA+ID4gPiAgIAloZWxwZXItPmZiID0g cm9ja2NoaXBfZHJtX2ZyYW1lYnVmZmVyX2luaXQoZGV2LCAmbW9kZV9jbWQsCj4gPiA+ID4gLQkJ CQkJCSAgIHByaXZhdGUtPmZiZGV2X2JvKTsKPiA+ID4gPiArCQkJCQkJICAgZmJkZXYtPmZiZGV2 X2JvKTsKPiA+ID4gPiAgIAlpZiAoSVNfRVJSKGhlbHBlci0+ZmIpKSB7Cj4gPiA+ID4gICAJCWRl dl9lcnIoZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgRFJNIGZyYW1lYnVmZmVyLlxuIik7 Cj4gPiA+ID4gICAJCXJldCA9IFBUUl9FUlIoaGVscGVyLT5mYik7Cj4gPiA+ID4gQEAgLTEzMCw2 ICsxMzAsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9mYl9oZWxwZXJfZnVuY3Mgcm9ja2No aXBfZHJtX2ZiX2hlbHBlcl9mdW5jcyA9IHsKPiA+ID4gPiAgIGludCByb2NrY2hpcF9kcm1fZmJk ZXZfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+ID4gPiA+ICAgewo+ID4gPiA+ICAgCXN0 cnVjdCByb2NrY2hpcF9kcm1fcHJpdmF0ZSAqcHJpdmF0ZSA9IGRldi0+ZGV2X3ByaXZhdGU7Cj4g PiA+ID4gKwlzdHJ1Y3Qgcm9ja2NoaXBfZHJtX2ZiZGV2ICpmYmRldjsKPiA+ID4gPiAgIAlzdHJ1 Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyOwo+ID4gPiA+ICAgCXVuc2lnbmVkIGludCBudW1fY3J0 YzsKPiA+ID4gPiAgIAlpbnQgcmV0Owo+ID4gPiA+IEBAIC0xMzksNyArMTQwLDEyIEBAIGludCBy b2NrY2hpcF9kcm1fZmJkZXZfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+ID4gPiA+ICAg CW51bV9jcnRjID0gZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YzsKPiA+ID4gPiAtCWhlbHBlciA9 ICZwcml2YXRlLT5mYmRldl9oZWxwZXI7Cj4gPiA+ID4gKwlmYmRldiA9IGRldm1fa3phbGxvYyhk ZXYtPmRldiwgc2l6ZW9mKCpmYmRldiksIEdGUF9LRVJORUwpOwo+ID4gPiA+ICsJaWYgKCFmYmRl dikKPiA+ID4gPiArCQlyZXR1cm4gLUVOT01FTTsKPiA+ID4gPiArCj4gPiA+ID4gKwlwcml2YXRl LT5mYmRldiA9IGZiZGV2Owo+ID4gPiA+ICsJaGVscGVyID0gJmZiZGV2LT5mYmRldl9oZWxwZXI7 Cj4gPiA+ID4gICAJZHJtX2ZiX2hlbHBlcl9wcmVwYXJlKGRldiwgaGVscGVyLCAmcm9ja2NoaXBf ZHJtX2ZiX2hlbHBlcl9mdW5jcyk7Cj4gPiA+ID4gQEAgLTE3NSw3ICsxODEsOSBAQCB2b2lkIHJv Y2tjaGlwX2RybV9mYmRldl9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4gPiA+ID4gICAJ c3RydWN0IHJvY2tjaGlwX2RybV9wcml2YXRlICpwcml2YXRlID0gZGV2LT5kZXZfcHJpdmF0ZTsK PiA+ID4gPiAgIAlzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyOwo+ID4gPiA+IC0JaGVscGVy ID0gJnByaXZhdGUtPmZiZGV2X2hlbHBlcjsKPiA+ID4gPiArCWlmICghcHJpdmF0ZSB8fCBwcml2 YXRlLT5mYmRldikKPiA+ID4gPiArCQlyZXR1cm47Cj4gPiA+ID4gKwloZWxwZXIgPSAmcHJpdmF0 ZS0+ZmJkZXYtPmZiZGV2X2hlbHBlcjsKPiA+ID4gPiAgIAlkcm1fZmJfaGVscGVyX3VucmVnaXN0 ZXJfZmJpKGhlbHBlcik7Cj4gPiA+ID4gICAJZHJtX2ZiX2hlbHBlcl9yZWxlYXNlX2ZiaShoZWxw ZXIpOwo+ID4gPiA+IC0tIAo+ID4gPiA+IDEuOS4xCj4gPiA+ID4gCj4gPiA+ID4gCj4gPiA+ID4g X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiA+ID4gPiBk cmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4gPiA+ID4gZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9w Lm9yZwo+ID4gPiA+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vZHJpLWRldmVsCj4gPiA+IC0tIAo+ID4gPiBEYW5pZWwgVmV0dGVyCj4gPiA+IFNvZnR3YXJl IEVuZ2luZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbgo+ID4gPiBodHRwOi8vYmxvZy5mZndsbC5jaAo+ IAo+IAo+IC0tIAo+IO+8rWFyayBZYW8KPiAKPiAKPiBfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwo+IGRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKPiBkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcv bWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwKCi0tIApEYW5pZWwgVmV0dGVyClNvZnR3YXJlIEVu Z2luZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbgpodHRwOi8vYmxvZy5mZndsbC5jaApfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBs aXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: daniel@ffwll.ch (Daniel Vetter) Date: Wed, 3 Aug 2016 13:50:12 +0200 Subject: [PATCH] drm/rockchip: fix fbdev crash when not use DRM_FBDEV_EMULATION In-Reply-To: <57A1B1B4.7040501@rock-chips.com> References: <1470212025-30336-1-git-send-email-mark.yao@rock-chips.com> <20160803084321.GJ6232@phenom.ffwll.local> <20160803084627.GK6232@phenom.ffwll.local> <57A1B1B4.7040501@rock-chips.com> Message-ID: <20160803115012.GN6232@phenom.ffwll.local> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Wed, Aug 03, 2016 at 04:56:20PM +0800, Mark yao wrote: > On 2016?08?03? 16:46, Daniel Vetter wrote: > > 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 > > Hmmm, there is a mistake on Heiko's patch: > > struct drm_fb_helper *fb_helper = &private->fbdev_helper; > > - drm_fb_helper_hotplug_event(fb_helper); > + if (fb_helper) > + drm_fb_helper_hotplug_event(fb_helper); > > But the fb_helper would never be NULL, because the private->fbdev_helper is > not a pointer. > > So the first step is making private->fbdev_helper to a pointer, that's what > I do on this patch. You've done more, you also wrapped that pointer into another structure, which means you have to splatter NULL checks all over the place. If you really only do the struct->pointer conversion alone the patch would be a lot cleaner. -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 > > > -- > ?ark Yao > > > _______________________________________________ > 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 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757658AbcHCLvu (ORCPT ); Wed, 3 Aug 2016 07:51:50 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:34582 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756293AbcHCLvr (ORCPT ); Wed, 3 Aug 2016 07:51:47 -0400 Date: Wed, 3 Aug 2016 13:50:12 +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: <20160803115012.GN6232@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> <20160803084627.GK6232@phenom.ffwll.local> <57A1B1B4.7040501@rock-chips.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <57A1B1B4.7040501@rock-chips.com> 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 04:56:20PM +0800, Mark yao wrote: > On 2016年08月03日 16:46, Daniel Vetter wrote: > > 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 > > Hmmm, there is a mistake on Heiko's patch: > > struct drm_fb_helper *fb_helper = &private->fbdev_helper; > > - drm_fb_helper_hotplug_event(fb_helper); > + if (fb_helper) > + drm_fb_helper_hotplug_event(fb_helper); > > But the fb_helper would never be NULL, because the private->fbdev_helper is > not a pointer. > > So the first step is making private->fbdev_helper to a pointer, that's what > I do on this patch. You've done more, you also wrapped that pointer into another structure, which means you have to splatter NULL checks all over the place. If you really only do the struct->pointer conversion alone the patch would be a lot cleaner. -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 > > > -- > Mark Yao > > > _______________________________________________ > 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