From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH v1] drm/rockchip: fix fbdev crash when not use DRM_FBDEV_EMULATION Date: Thu, 4 Aug 2016 10:08:54 +0200 Message-ID: <20160804080854.GQ6232@phenom.ffwll.local> References: <1470212025-30336-1-git-send-email-mark.yao@rock-chips.com> <1470277318-9204-1-git-send-email-mark.yao@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: <1470277318-9204-1-git-send-email-mark.yao@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 T24gVGh1LCBBdWcgMDQsIDIwMTYgYXQgMTA6MjE6NThBTSArMDgwMCwgTWFyayBZYW8gd3JvdGU6 Cj4gWyAgICAxLjE2MjU3MV0gVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgTlVMTCBwb2ludGVyIGRl cmVmZXJlbmNlIGF0IHZpcnR1YWwgYWRkcmVzcyAwMDAwMDIwMAo+IFsgICAgMS4xNjU2NTZdIE1v ZHVsZXMgbGlua2VkIGluOgo+IFsgICAgMS4xNjU5NDFdIENQVTogNSBQSUQ6IDE0MyBDb21tOiBr d29ya2VyLzU6MiBOb3QgdGFpbnRlZCA0LjQuMTUgIzIzNwo+IFsgICAgMS4xNjY1MDZdIEhhcmR3 YXJlIG5hbWU6IFJvY2tjaGlwIFJLMzM5OSBFdmFsdWF0aW9uIEJvYXJkIHYxIChBbmRyb2lkKSAo RFQpCj4gWyAgICAxLjE2NzE1M10gV29ya3F1ZXVlOiBldmVudHMgb3V0cHV0X3BvbGxfZXhlY3V0 ZQo+IFsgICAgMS4xNjgyMzFdIFBDIGlzIGF0IG11dGV4X2xvY2srMHgxNC8weDQ0Cj4gWyAgICAx LjE2ODU4Nl0gTFIgaXMgYXQgZHJtX2ZiX2hlbHBlcl9ob3RwbHVnX2V2ZW50KzB4MjgvMHhjYwo+ IFsgICAgMS4xNzIxOTJdIFs8ZmZmZmZmODAwODk4MjExMD5dIG11dGV4X2xvY2srMHgxNC8weDQ0 Cj4gWyAgICAxLjE3MjE5Nl0gWzxmZmZmZmY4MDA4NDAyNWE0Pl0gZHJtX2ZiX2hlbHBlcl9ob3Rw bHVnX2V2ZW50KzB4MjgvMHhjYwo+IFsgICAgMS4xNzIyMDFdIFs8ZmZmZmZmODAwODQyN2FlND5d IHJvY2tjaGlwX2RybV9vdXRwdXRfcG9sbF9jaGFuZ2VkKzB4MTQvMHgxYwo+IFsgICAgMS4xNzIy MDRdIFs8ZmZmZmZmODAwODNmN2M0Yz5dIGRybV9rbXNfaGVscGVyX2hvdHBsdWdfZXZlbnQrMHgy OC8weDM0Cj4gWyAgICAxLjE3MjIwN10gWzxmZmZmZmY4MDA4M2Y3ZGRjPl0gb3V0cHV0X3BvbGxf ZXhlY3V0ZSsweDE1MC8weDE5OAo+IFsgICAgMS4xNzIyMTJdIFs8ZmZmZmZmODAwODBiMGVhOD5d IHByb2Nlc3Nfb25lX3dvcmsrMHgyMTgvMHgzZGMKPiBbICAgIDEuMTcyMjE1XSBbPGZmZmZmZjgw MDgwYjE1Nzg+XSB3b3JrZXJfdGhyZWFkKzB4MjRjLzB4Mzc0Cj4gWyAgICAxLjE3MjIxN10gWzxm ZmZmZmY4MDA4MGI1YmNjPl0ga3RocmVhZCsweGRjLzB4ZTQKPiBbICAgIDEuMTcyMjIyXSBbPGZm ZmZmZjgwMDgwODRjZDA+XSByZXRfZnJvbV9mb3JrKzB4MTAvMHg0MAo+IAo+IFNpZ25lZC1vZmYt Ynk6IE1hcmsgWWFvIDxtYXJrLnlhb0Byb2NrLWNoaXBzLmNvbT4KPiAtLS0KPiBDaGFuZ2UgaW4g djE6Cj4gQWR2aXNlZCBieSBEYW5pZWwgVmV0dGVyCj4gICBvbmx5IGRvIHRoZSBzdHJ1Y3QtPnBv aW50ZXIgY29udmVyc2lvbiBhbG9uZQoKWWVhaCwgdGhhdCBsb29rcyBtdWNoIG1vcmUgaW4gbGlu ZSB3aXRoIGhvdyB0aGUgb3B0aW9uYWwgZmJkZXYgc3VwcG9ydCBpcwpzdXBwb3NlZCB0byBiZSB1 c2VkLgotRGFuaWVsCgo+IAo+ICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJt X2Rydi5jICAgfCAgNiArKystLS0KPiAgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlw X2RybV9kcnYuaCAgIHwgIDIgKy0KPiAgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlw X2RybV9mYi5jICAgIHwgIDIgKy0KPiAgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlw X2RybV9mYmRldi5jIHwgMTcgKysrKysrKysrKy0tLS0tLS0KPiAgNCBmaWxlcyBjaGFuZ2VkLCAx NSBpbnNlcnRpb25zKCspLCAxMiBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9y b2NrY2hpcC9yb2NrY2hpcF9kcm1fZHJ2LmMKPiBpbmRleCBhODIyZDQ5Li5mZTIyZjc2IDEwMDY0 NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZHJ2LmMKPiAr KysgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5jCj4gQEAgLTI2 MSw3ICsyNjEsNyBAQCBzdGF0aWMgdm9pZCByb2NrY2hpcF9kcm1fbGFzdGNsb3NlKHN0cnVjdCBk cm1fZGV2aWNlICpkZXYpCj4gIHsKPiAgCXN0cnVjdCByb2NrY2hpcF9kcm1fcHJpdmF0ZSAqcHJp diA9IGRldi0+ZGV2X3ByaXZhdGU7Cj4gIAo+IC0JZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2 X21vZGVfdW5sb2NrZWQoJnByaXYtPmZiZGV2X2hlbHBlcik7Cj4gKwlkcm1fZmJfaGVscGVyX3Jl c3RvcmVfZmJkZXZfbW9kZV91bmxvY2tlZChwcml2LT5mYmRldl9oZWxwZXIpOwo+ICB9Cj4gIAo+ ICBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByb2NrY2hpcF9kcm1fZHJpdmVy X2ZvcHMgPSB7Cj4gQEAgLTMxMSw3ICszMTEsNyBAQCB2b2lkIHJvY2tjaGlwX2RybV9mYl9zdXNw ZW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0pCj4gIAlzdHJ1Y3Qgcm9ja2NoaXBfZHJtX3ByaXZh dGUgKnByaXYgPSBkcm0tPmRldl9wcml2YXRlOwo+ICAKPiAgCWNvbnNvbGVfbG9jaygpOwo+IC0J ZHJtX2ZiX2hlbHBlcl9zZXRfc3VzcGVuZCgmcHJpdi0+ZmJkZXZfaGVscGVyLCAxKTsKPiArCWRy bV9mYl9oZWxwZXJfc2V0X3N1c3BlbmQocHJpdi0+ZmJkZXZfaGVscGVyLCAxKTsKPiAgCWNvbnNv bGVfdW5sb2NrKCk7Cj4gIH0KPiAgCj4gQEAgLTMyMCw3ICszMjAsNyBAQCB2b2lkIHJvY2tjaGlw X2RybV9mYl9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKmRybSkKPiAgCXN0cnVjdCByb2NrY2hp cF9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRybS0+ZGV2X3ByaXZhdGU7Cj4gIAo+ICAJY29uc29sZV9s b2NrKCk7Cj4gLQlkcm1fZmJfaGVscGVyX3NldF9zdXNwZW5kKCZwcml2LT5mYmRldl9oZWxwZXIs IDApOwo+ICsJZHJtX2ZiX2hlbHBlcl9zZXRfc3VzcGVuZChwcml2LT5mYmRldl9oZWxwZXIsIDAp Owo+ICAJY29uc29sZV91bmxvY2soKTsKPiAgfQo+ICAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9yb2Nr Y2hpcC9yb2NrY2hpcF9kcm1fZHJ2LmgKPiBpbmRleCBlYTM5MzI5Li5mMDA1ZjNmIDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZHJ2LmgKPiArKysg Yi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5oCj4gQEAgLTU3LDcg KzU3LDcgQEAgc3RydWN0IHJvY2tjaGlwX2NydGNfc3RhdGUgewo+ICAgKiBAbnVtX3BpcGU6IG51 bWJlciBvZiBwaXBlcyBmb3IgdGhpcyBkZXZpY2UuCj4gICAqLwo+ICBzdHJ1Y3Qgcm9ja2NoaXBf ZHJtX3ByaXZhdGUgewo+IC0Jc3RydWN0IGRybV9mYl9oZWxwZXIgZmJkZXZfaGVscGVyOwo+ICsJ c3RydWN0IGRybV9mYl9oZWxwZXIgKmZiZGV2X2hlbHBlcjsKPiAgCXN0cnVjdCBkcm1fZ2VtX29i amVjdCAqZmJkZXZfYm87Cj4gIAljb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfY3J0Y19mdW5jcyAqY3J0 Y19mdW5jc1tST0NLQ0hJUF9NQVhfQ1JUQ107Cj4gIAlzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAq c3RhdGU7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9k cm1fZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZmIuYwo+IGlu ZGV4IDU1YzUyNzMuLmRjMDM0ZWMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JvY2tj aGlwL3JvY2tjaGlwX2RybV9mYi5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3Jv Y2tjaGlwX2RybV9mYi5jCj4gQEAgLTE1Niw3ICsxNTYsNyBAQCBlcnJfZ2VtX29iamVjdF91bnJl ZmVyZW5jZToKPiAgc3RhdGljIHZvaWQgcm9ja2NoaXBfZHJtX291dHB1dF9wb2xsX2NoYW5nZWQo c3RydWN0IGRybV9kZXZpY2UgKmRldikKPiAgewo+ICAJc3RydWN0IHJvY2tjaGlwX2RybV9wcml2 YXRlICpwcml2YXRlID0gZGV2LT5kZXZfcHJpdmF0ZTsKPiAtCXN0cnVjdCBkcm1fZmJfaGVscGVy ICpmYl9oZWxwZXIgPSAmcHJpdmF0ZS0+ZmJkZXZfaGVscGVyOwo+ICsJc3RydWN0IGRybV9mYl9o ZWxwZXIgKmZiX2hlbHBlciA9IHByaXZhdGUtPmZiZGV2X2hlbHBlcjsKPiAgCj4gIAlpZiAoZmJf aGVscGVyKQo+ICAJCWRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudChmYl9oZWxwZXIpOwo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2ZiZGV2LmMg Yi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2ZiZGV2LmMKPiBpbmRleCAy MDdlMDFkLi42YjUwZGZhIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9y b2NrY2hpcF9kcm1fZmJkZXYuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2Nr Y2hpcF9kcm1fZmJkZXYuYwo+IEBAIC0yMiwxNCArMjIsMTIgQEAKPiAgI2luY2x1ZGUgInJvY2tj aGlwX2RybV9mYi5oIgo+ICAKPiAgI2RlZmluZSBQUkVGRVJSRURfQlBQCQkzMgo+IC0jZGVmaW5l IHRvX2RybV9wcml2YXRlKHgpIFwKPiAtCQljb250YWluZXJfb2YoeCwgc3RydWN0IHJvY2tjaGlw X2RybV9wcml2YXRlLCBmYmRldl9oZWxwZXIpCj4gIAo+ICBzdGF0aWMgaW50IHJvY2tjaGlwX2Zi ZGV2X21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sCj4gIAkJCSAgICAgICBzdHJ1Y3Qgdm1fYXJl YV9zdHJ1Y3QgKnZtYSkKPiAgewo+ICAJc3RydWN0IGRybV9mYl9oZWxwZXIgKmhlbHBlciA9IGlu Zm8tPnBhcjsKPiAtCXN0cnVjdCByb2NrY2hpcF9kcm1fcHJpdmF0ZSAqcHJpdmF0ZSA9IHRvX2Ry bV9wcml2YXRlKGhlbHBlcik7Cj4gKwlzdHJ1Y3Qgcm9ja2NoaXBfZHJtX3ByaXZhdGUgKnByaXZh dGUgPSBoZWxwZXItPmRldi0+ZGV2X3ByaXZhdGU7Cj4gIAo+ICAJcmV0dXJuIHJvY2tjaGlwX2dl bV9tbWFwX2J1Zihwcml2YXRlLT5mYmRldl9ibywgdm1hKTsKPiAgfQo+IEBAIC01MCw3ICs0OCw3 IEBAIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHJvY2tjaGlwX2RybV9mYmRldl9vcHMgPSB7Cj4gIHN0 YXRpYyBpbnQgcm9ja2NoaXBfZHJtX2ZiZGV2X2NyZWF0ZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAq aGVscGVyLAo+ICAJCQkJICAgICBzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9zdXJmYWNlX3NpemUgKnNp emVzKQo+ICB7Cj4gLQlzdHJ1Y3Qgcm9ja2NoaXBfZHJtX3ByaXZhdGUgKnByaXZhdGUgPSB0b19k cm1fcHJpdmF0ZShoZWxwZXIpOwo+ICsJc3RydWN0IHJvY2tjaGlwX2RybV9wcml2YXRlICpwcml2 YXRlID0gaGVscGVyLT5kZXYtPmRldl9wcml2YXRlOwo+ICAJc3RydWN0IGRybV9tb2RlX2ZiX2Nt ZDIgbW9kZV9jbWQgPSB7IDAgfTsKPiAgCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBoZWxwZXIt PmRldjsKPiAgCXN0cnVjdCByb2NrY2hpcF9nZW1fb2JqZWN0ICpya19vYmo7Cj4gQEAgLTEzOSw3 ICsxMzcsMTEgQEAgaW50IHJvY2tjaGlwX2RybV9mYmRldl9pbml0KHN0cnVjdCBkcm1fZGV2aWNl ICpkZXYpCj4gIAo+ICAJbnVtX2NydGMgPSBkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjOwo+ICAK PiAtCWhlbHBlciA9ICZwcml2YXRlLT5mYmRldl9oZWxwZXI7Cj4gKwloZWxwZXIgPSBkZXZtX2t6 YWxsb2MoZGV2LT5kZXYsIHNpemVvZigqaGVscGVyKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWhl bHBlcikKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlwcml2YXRlLT5mYmRldl9oZWxwZXIg PSBoZWxwZXI7Cj4gIAo+ICAJZHJtX2ZiX2hlbHBlcl9wcmVwYXJlKGRldiwgaGVscGVyLCAmcm9j a2NoaXBfZHJtX2ZiX2hlbHBlcl9mdW5jcyk7Cj4gIAo+IEBAIC0xNzMsOSArMTc1LDEwIEBAIGVy cl9kcm1fZmJfaGVscGVyX2Zpbmk6Cj4gIHZvaWQgcm9ja2NoaXBfZHJtX2ZiZGV2X2Zpbmkoc3Ry dWN0IGRybV9kZXZpY2UgKmRldikKPiAgewo+ICAJc3RydWN0IHJvY2tjaGlwX2RybV9wcml2YXRl ICpwcml2YXRlID0gZGV2LT5kZXZfcHJpdmF0ZTsKPiAtCXN0cnVjdCBkcm1fZmJfaGVscGVyICpo ZWxwZXI7Cj4gKwlzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyID0gcHJpdmF0ZS0+ZmJkZXZf aGVscGVyOwo+ICAKPiAtCWhlbHBlciA9ICZwcml2YXRlLT5mYmRldl9oZWxwZXI7Cj4gKwlpZiAo IWhlbHBlcikKPiArCQlyZXR1cm47Cj4gIAo+ICAJZHJtX2ZiX2hlbHBlcl91bnJlZ2lzdGVyX2Zi aShoZWxwZXIpOwo+ICAJZHJtX2ZiX2hlbHBlcl9yZWxlYXNlX2ZiaShoZWxwZXIpOwo+IC0tIAo+ IDEuOS4xCj4gCj4gCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KPiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4gZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNr dG9wLm9yZwo+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8v ZHJpLWRldmVsCgotLSAKRGFuaWVsIFZldHRlcgpTb2Z0d2FyZSBFbmdpbmVlciwgSW50ZWwgQ29y cG9yYXRpb24KaHR0cDovL2Jsb2cuZmZ3bGwuY2gKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlz dHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4v bGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: daniel@ffwll.ch (Daniel Vetter) Date: Thu, 4 Aug 2016 10:08:54 +0200 Subject: [PATCH v1] drm/rockchip: fix fbdev crash when not use DRM_FBDEV_EMULATION In-Reply-To: <1470277318-9204-1-git-send-email-mark.yao@rock-chips.com> References: <1470212025-30336-1-git-send-email-mark.yao@rock-chips.com> <1470277318-9204-1-git-send-email-mark.yao@rock-chips.com> Message-ID: <20160804080854.GQ6232@phenom.ffwll.local> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Thu, Aug 04, 2016 at 10:21:58AM +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 > --- > Change in v1: > Advised by Daniel Vetter > only do the struct->pointer conversion alone Yeah, that looks much more in line with how the optional fbdev support is supposed to be used. -Daniel > > drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 6 +++--- > drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 2 +- > drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 2 +- > drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c | 17 ++++++++++------- > 4 files changed, 15 insertions(+), 12 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > index a822d49..fe22f76 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > @@ -261,7 +261,7 @@ 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); > + drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev_helper); > } > > static const struct file_operations rockchip_drm_driver_fops = { > @@ -311,7 +311,7 @@ void rockchip_drm_fb_suspend(struct drm_device *drm) > struct rockchip_drm_private *priv = drm->dev_private; > > console_lock(); > - drm_fb_helper_set_suspend(&priv->fbdev_helper, 1); > + drm_fb_helper_set_suspend(priv->fbdev_helper, 1); > console_unlock(); > } > > @@ -320,7 +320,7 @@ void rockchip_drm_fb_resume(struct drm_device *drm) > struct rockchip_drm_private *priv = drm->dev_private; > > console_lock(); > - drm_fb_helper_set_suspend(&priv->fbdev_helper, 0); > + drm_fb_helper_set_suspend(priv->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..f005f3f 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > @@ -57,7 +57,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_fb_helper *fbdev_helper; > struct drm_gem_object *fbdev_bo; > 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..dc034ec 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > @@ -156,7 +156,7 @@ 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 drm_fb_helper *fb_helper = private->fbdev_helper; > > if (fb_helper) > drm_fb_helper_hotplug_event(fb_helper); > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c > index 207e01d..6b50dfa 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c > @@ -22,14 +22,12 @@ > #include "rockchip_drm_fb.h" > > #define PREFERRED_BPP 32 > -#define to_drm_private(x) \ > - container_of(x, struct rockchip_drm_private, 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_private *private = helper->dev->dev_private; > > return rockchip_gem_mmap_buf(private->fbdev_bo, vma); > } > @@ -50,7 +48,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_private *private = helper->dev->dev_private; > struct drm_mode_fb_cmd2 mode_cmd = { 0 }; > struct drm_device *dev = helper->dev; > struct rockchip_gem_object *rk_obj; > @@ -139,7 +137,11 @@ int rockchip_drm_fbdev_init(struct drm_device *dev) > > num_crtc = dev->mode_config.num_crtc; > > - helper = &private->fbdev_helper; > + helper = devm_kzalloc(dev->dev, sizeof(*helper), GFP_KERNEL); > + if (!helper) > + return -ENOMEM; > + > + private->fbdev_helper = helper; > > drm_fb_helper_prepare(dev, helper, &rockchip_drm_fb_helper_funcs); > > @@ -173,9 +175,10 @@ err_drm_fb_helper_fini: > void rockchip_drm_fbdev_fini(struct drm_device *dev) > { > struct rockchip_drm_private *private = dev->dev_private; > - struct drm_fb_helper *helper; > + struct drm_fb_helper *helper = private->fbdev_helper; > > - helper = &private->fbdev_helper; > + if (!helper) > + return; > > 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 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932342AbcHDIJq (ORCPT ); Thu, 4 Aug 2016 04:09:46 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:35920 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751549AbcHDII6 (ORCPT ); Thu, 4 Aug 2016 04:08:58 -0400 Date: Thu, 4 Aug 2016 10:08:54 +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 v1] drm/rockchip: fix fbdev crash when not use DRM_FBDEV_EMULATION Message-ID: <20160804080854.GQ6232@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> <1470277318-9204-1-git-send-email-mark.yao@rock-chips.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470277318-9204-1-git-send-email-mark.yao@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 Thu, Aug 04, 2016 at 10:21:58AM +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 > --- > Change in v1: > Advised by Daniel Vetter > only do the struct->pointer conversion alone Yeah, that looks much more in line with how the optional fbdev support is supposed to be used. -Daniel > > drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 6 +++--- > drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 2 +- > drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 2 +- > drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c | 17 ++++++++++------- > 4 files changed, 15 insertions(+), 12 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > index a822d49..fe22f76 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > @@ -261,7 +261,7 @@ 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); > + drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev_helper); > } > > static const struct file_operations rockchip_drm_driver_fops = { > @@ -311,7 +311,7 @@ void rockchip_drm_fb_suspend(struct drm_device *drm) > struct rockchip_drm_private *priv = drm->dev_private; > > console_lock(); > - drm_fb_helper_set_suspend(&priv->fbdev_helper, 1); > + drm_fb_helper_set_suspend(priv->fbdev_helper, 1); > console_unlock(); > } > > @@ -320,7 +320,7 @@ void rockchip_drm_fb_resume(struct drm_device *drm) > struct rockchip_drm_private *priv = drm->dev_private; > > console_lock(); > - drm_fb_helper_set_suspend(&priv->fbdev_helper, 0); > + drm_fb_helper_set_suspend(priv->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..f005f3f 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > @@ -57,7 +57,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_fb_helper *fbdev_helper; > struct drm_gem_object *fbdev_bo; > 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..dc034ec 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c > @@ -156,7 +156,7 @@ 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 drm_fb_helper *fb_helper = private->fbdev_helper; > > if (fb_helper) > drm_fb_helper_hotplug_event(fb_helper); > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c > index 207e01d..6b50dfa 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c > @@ -22,14 +22,12 @@ > #include "rockchip_drm_fb.h" > > #define PREFERRED_BPP 32 > -#define to_drm_private(x) \ > - container_of(x, struct rockchip_drm_private, 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_private *private = helper->dev->dev_private; > > return rockchip_gem_mmap_buf(private->fbdev_bo, vma); > } > @@ -50,7 +48,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_private *private = helper->dev->dev_private; > struct drm_mode_fb_cmd2 mode_cmd = { 0 }; > struct drm_device *dev = helper->dev; > struct rockchip_gem_object *rk_obj; > @@ -139,7 +137,11 @@ int rockchip_drm_fbdev_init(struct drm_device *dev) > > num_crtc = dev->mode_config.num_crtc; > > - helper = &private->fbdev_helper; > + helper = devm_kzalloc(dev->dev, sizeof(*helper), GFP_KERNEL); > + if (!helper) > + return -ENOMEM; > + > + private->fbdev_helper = helper; > > drm_fb_helper_prepare(dev, helper, &rockchip_drm_fb_helper_funcs); > > @@ -173,9 +175,10 @@ err_drm_fb_helper_fini: > void rockchip_drm_fbdev_fini(struct drm_device *dev) > { > struct rockchip_drm_private *private = dev->dev_private; > - struct drm_fb_helper *helper; > + struct drm_fb_helper *helper = private->fbdev_helper; > > - helper = &private->fbdev_helper; > + if (!helper) > + return; > > 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