From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751659AbcGRIhP (ORCPT ); Mon, 18 Jul 2016 04:37:15 -0400 Received: from metis.ext.4.pengutronix.de ([92.198.50.35]:39350 "EHLO metis.ext.4.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750969AbcGRIhJ (ORCPT ); Mon, 18 Jul 2016 04:37:09 -0400 Message-ID: <1468830992.2994.6.camel@pengutronix.de> Subject: Re: [PATCH v4 3/8] drm/mediatek: add shadow register support From: Philipp Zabel To: CK Hu Cc: YT Shen , dri-devel@lists.freedesktop.org, Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Kumar Gala , Russell King , David Airlie , Matthias Brugger , Mao Huang , Bibby Hsieh , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, srv_heupstream@mediatek.com, Sascha Hauer , yingjoe.chen@mediatek.com, emil.l.velikov@gmail.com, thierry.reding@gmail.com Date: Mon, 18 Jul 2016 10:36:32 +0200 In-Reply-To: <1468823575.30644.33.camel@mtksdaap41> References: <1468577274-6178-1-git-send-email-yt.shen@mediatek.com> <1468577274-6178-4-git-send-email-yt.shen@mediatek.com> <1468823575.30644.33.camel@mtksdaap41> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.12.9-1+b1 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-SA-Exim-Connect-IP: 2001:67c:670:100:96de:80ff:fec2:9969 X-SA-Exim-Mail-From: p.zabel@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi CK, YT, Am Montag, den 18.07.2016, 14:32 +0800 schrieb CK Hu: > Hi, YT: > > One comment inline. > > > On Fri, 2016-07-15 at 18:07 +0800, YT Shen wrote: > > We need to acquire mutex before using the resources, > > and need to release it after finished. > > So we don't need to write registers in the blanking period. > > > > Signed-off-by: YT Shen > > --- > > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 75 +++++++++++++++++++------------ > > drivers/gpu/drm/mediatek/mtk_drm_ddp.c | 22 +++++++++ > > drivers/gpu/drm/mediatek/mtk_drm_ddp.h | 2 + > > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 1 + > > 4 files changed, 71 insertions(+), 29 deletions(-) > > > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > index 24aa3ba..80d9641 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > @@ -315,6 +315,42 @@ static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc) > > pm_runtime_put(drm->dev); > > } > > > > +static void mtk_crtc_ddp_config(struct drm_crtc *crtc) > > +{ > > + struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); > > + struct mtk_crtc_state *state = to_mtk_crtc_state(mtk_crtc->base.state); > > + struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0]; > > + unsigned int i; > > + > > + /* > > + * TODO: instead of updating the registers here, we should prepare > > + * working registers in atomic_commit and let the hardware command > > + * queue update module registers on vblank. > > + */ > > + if (state->pending_config) { > > + mtk_ddp_comp_config(ovl, state->pending_width, > > + state->pending_height, > > + state->pending_vrefresh); > > + > > + state->pending_config = false; > > + } > > + > > + if (mtk_crtc->pending_planes) { > > + for (i = 0; i < OVL_LAYER_NR; i++) { > > + struct drm_plane *plane = &mtk_crtc->planes[i].base; > > + struct mtk_plane_state *plane_state; > > + > > + plane_state = to_mtk_plane_state(plane->state); > > + > > + if (plane_state->pending.config) { > > + mtk_ddp_comp_layer_config(ovl, i, plane_state); > > + plane_state->pending.config = false; > > + } > > + } > > + mtk_crtc->pending_planes = false; > > + } > > +} > > + > > static void mtk_drm_crtc_enable(struct drm_crtc *crtc) > > { > > struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); > > @@ -391,6 +427,7 @@ static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc, > > struct drm_crtc_state *old_crtc_state) > > { > > struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); > > + struct mtk_drm_private *priv = crtc->dev->dev_private; > > unsigned int pending_planes = 0; > > int i; > > > > @@ -409,6 +446,12 @@ static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc, > > } > > if (pending_planes) > > mtk_crtc->pending_planes = true; > > + > > + if (priv->data->shadow_register) { > > + mtk_disp_mutex_acquire(mtk_crtc->mutex); > > + mtk_crtc_ddp_config(crtc); > > + mtk_disp_mutex_release(mtk_crtc->mutex); > > + } > > } > > > > static const struct drm_crtc_funcs mtk_crtc_funcs = { > > @@ -453,36 +496,10 @@ err_cleanup_crtc: > > void mtk_crtc_ddp_irq(struct drm_crtc *crtc, struct mtk_ddp_comp *ovl) > > { > > struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); > > - struct mtk_crtc_state *state = to_mtk_crtc_state(mtk_crtc->base.state); > > - unsigned int i; > > + struct mtk_drm_private *priv = crtc->dev->dev_private; > > > > - /* > > - * TODO: instead of updating the registers here, we should prepare > > - * working registers in atomic_commit and let the hardware command > > - * queue update module registers on vblank. > > - */ > > - if (state->pending_config) { > > - mtk_ddp_comp_config(ovl, state->pending_width, > > - state->pending_height, > > - state->pending_vrefresh); > > - > > - state->pending_config = false; > > - } > > - > > - if (mtk_crtc->pending_planes) { > > - for (i = 0; i < OVL_LAYER_NR; i++) { > > - struct drm_plane *plane = &mtk_crtc->planes[i].base; > > - struct mtk_plane_state *plane_state; > > - > > - plane_state = to_mtk_plane_state(plane->state); > > - > > - if (plane_state->pending.config) { > > - mtk_ddp_comp_layer_config(ovl, i, plane_state); > > - plane_state->pending.config = false; > > - } > > - } > > - mtk_crtc->pending_planes = false; > > - } > > + if (!priv->data->shadow_register) > > + mtk_crtc_ddp_config(crtc); > > > > mtk_drm_finish_page_flip(mtk_crtc); > > } > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > index 8030769..fa53806 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > @@ -12,6 +12,7 @@ > > */ > > > > #include > > +#include > > #include > > #include > > #include > > @@ -32,6 +33,7 @@ > > #define DISP_REG_CONFIG_MMSYS_CG_CON0 0x100 > > > > #define DISP_REG_MUTEX_EN(n) (0x20 + 0x20 * (n)) > > +#define DISP_REG_MUTEX(n) (0x24 + 0x20 * (n)) > > #define DISP_REG_MUTEX_RST(n) (0x28 + 0x20 * (n)) > > #define DISP_REG_MUTEX_MOD(n) (0x2c + 0x20 * (n)) > > #define DISP_REG_MUTEX_SOF(n) (0x30 + 0x20 * (n)) > > @@ -300,6 +302,26 @@ void mtk_disp_mutex_disable(struct mtk_disp_mutex *mutex) > > writel(0, ddp->regs + DISP_REG_MUTEX_EN(mutex->id)); > > } > > > > +void mtk_disp_mutex_acquire(struct mtk_disp_mutex *mutex) > > +{ > > + struct mtk_ddp *ddp = container_of(mutex, struct mtk_ddp, > > + mutex[mutex->id]); > > + u32 tmp; > > + > > + writel(1, ddp->regs + DISP_REG_MUTEX_EN(mutex->id)); > > + writel(1, ddp->regs + DISP_REG_MUTEX(mutex->id)); > > + readl_poll_timeout_atomic(ddp->regs + DISP_REG_MUTEX(mutex->id), tmp, > > + tmp & 0x2, 1, 10000); Please add a descriptive #define for the 0x2 bit of the DISP_REG_MUTEX registers. > Nothing to do with timeout? I think it should print error message here > or reset HW to recover it. I assume that if mtk_disp_mutex_acquire is called while the hardware has the mutex (during the shadow register update), this should wait until the update is complete, since it can't back out from trying to acquire the lock. Is that the case? regards Philipp From mboxrd@z Thu Jan 1 00:00:00 1970 From: Philipp Zabel Subject: Re: [PATCH v4 3/8] drm/mediatek: add shadow register support Date: Mon, 18 Jul 2016 10:36:32 +0200 Message-ID: <1468830992.2994.6.camel@pengutronix.de> References: <1468577274-6178-1-git-send-email-yt.shen@mediatek.com> <1468577274-6178-4-git-send-email-yt.shen@mediatek.com> <1468823575.30644.33.camel@mtksdaap41> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1468823575.30644.33.camel@mtksdaap41> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: CK Hu Cc: Mark Rutland , devicetree@vger.kernel.org, Russell King , srv_heupstream@mediatek.com, Pawel Moll , Ian Campbell , emil.l.velikov@gmail.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Mao Huang , Matthias Brugger , Rob Herring , linux-mediatek@lists.infradead.org, Kumar Gala , yingjoe.chen@mediatek.com, Sascha Hauer , linux-arm-kernel@lists.infradead.org List-Id: devicetree@vger.kernel.org SGkgQ0ssIFlULAoKQW0gTW9udGFnLCBkZW4gMTguMDcuMjAxNiwgMTQ6MzIgKzA4MDAgc2Nocmll YiBDSyBIdToKPiBIaSwgWVQ6Cj4gCj4gT25lIGNvbW1lbnQgaW5saW5lLgo+IAo+IAo+IE9uIEZy aSwgMjAxNi0wNy0xNSBhdCAxODowNyArMDgwMCwgWVQgU2hlbiB3cm90ZToKPiA+IFdlIG5lZWQg dG8gYWNxdWlyZSBtdXRleCBiZWZvcmUgdXNpbmcgdGhlIHJlc291cmNlcywKPiA+IGFuZCBuZWVk IHRvIHJlbGVhc2UgaXQgYWZ0ZXIgZmluaXNoZWQuCj4gPiBTbyB3ZSBkb24ndCBuZWVkIHRvIHdy aXRlIHJlZ2lzdGVycyBpbiB0aGUgYmxhbmtpbmcgcGVyaW9kLgo+ID4gCj4gPiBTaWduZWQtb2Zm LWJ5OiBZVCBTaGVuIDx5dC5zaGVuQG1lZGlhdGVrLmNvbT4KPiA+IC0tLQo+ID4gIGRyaXZlcnMv Z3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2NydGMuYyB8ICAgNzUgKysrKysrKysrKysrKysrKysr Ky0tLS0tLS0tLS0tLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2RkcC5j ICB8ICAgMjIgKysrKysrKysrCj4gPiAgZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1f ZGRwLmggIHwgICAgMiArCj4gPiAgZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZHJ2 LmggIHwgICAgMSArCj4gPiAgNCBmaWxlcyBjaGFuZ2VkLCA3MSBpbnNlcnRpb25zKCspLCAyOSBk ZWxldGlvbnMoLSkKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRl ay9tdGtfZHJtX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2NydGMu Ywo+ID4gaW5kZXggMjRhYTNiYS4uODBkOTY0MSAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9tZWRpYXRlay9tdGtfZHJtX2NydGMuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21l ZGlhdGVrL210a19kcm1fY3J0Yy5jCj4gPiBAQCAtMzE1LDYgKzMxNSw0MiBAQCBzdGF0aWMgdm9p ZCBtdGtfY3J0Y19kZHBfaHdfZmluaShzdHJ1Y3QgbXRrX2RybV9jcnRjICptdGtfY3J0YykKPiA+ ICAJcG1fcnVudGltZV9wdXQoZHJtLT5kZXYpOwo+ID4gIH0KPiA+ICAKPiA+ICtzdGF0aWMgdm9p ZCBtdGtfY3J0Y19kZHBfY29uZmlnKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKPiA+ICt7Cj4gPiAr CXN0cnVjdCBtdGtfZHJtX2NydGMgKm10a19jcnRjID0gdG9fbXRrX2NydGMoY3J0Yyk7Cj4gPiAr CXN0cnVjdCBtdGtfY3J0Y19zdGF0ZSAqc3RhdGUgPSB0b19tdGtfY3J0Y19zdGF0ZShtdGtfY3J0 Yy0+YmFzZS5zdGF0ZSk7Cj4gPiArCXN0cnVjdCBtdGtfZGRwX2NvbXAgKm92bCA9IG10a19jcnRj LT5kZHBfY29tcFswXTsKPiA+ICsJdW5zaWduZWQgaW50IGk7Cj4gPiArCj4gPiArCS8qCj4gPiAr CSAqIFRPRE86IGluc3RlYWQgb2YgdXBkYXRpbmcgdGhlIHJlZ2lzdGVycyBoZXJlLCB3ZSBzaG91 bGQgcHJlcGFyZQo+ID4gKwkgKiB3b3JraW5nIHJlZ2lzdGVycyBpbiBhdG9taWNfY29tbWl0IGFu ZCBsZXQgdGhlIGhhcmR3YXJlIGNvbW1hbmQKPiA+ICsJICogcXVldWUgdXBkYXRlIG1vZHVsZSBy ZWdpc3RlcnMgb24gdmJsYW5rLgo+ID4gKwkgKi8KPiA+ICsJaWYgKHN0YXRlLT5wZW5kaW5nX2Nv bmZpZykgewo+ID4gKwkJbXRrX2RkcF9jb21wX2NvbmZpZyhvdmwsIHN0YXRlLT5wZW5kaW5nX3dp ZHRoLAo+ID4gKwkJCQkgICAgc3RhdGUtPnBlbmRpbmdfaGVpZ2h0LAo+ID4gKwkJCQkgICAgc3Rh dGUtPnBlbmRpbmdfdnJlZnJlc2gpOwo+ID4gKwo+ID4gKwkJc3RhdGUtPnBlbmRpbmdfY29uZmln ID0gZmFsc2U7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWYgKG10a19jcnRjLT5wZW5kaW5nX3BsYW5l cykgewo+ID4gKwkJZm9yIChpID0gMDsgaSA8IE9WTF9MQVlFUl9OUjsgaSsrKSB7Cj4gPiArCQkJ c3RydWN0IGRybV9wbGFuZSAqcGxhbmUgPSAmbXRrX2NydGMtPnBsYW5lc1tpXS5iYXNlOwo+ID4g KwkJCXN0cnVjdCBtdGtfcGxhbmVfc3RhdGUgKnBsYW5lX3N0YXRlOwo+ID4gKwo+ID4gKwkJCXBs YW5lX3N0YXRlID0gdG9fbXRrX3BsYW5lX3N0YXRlKHBsYW5lLT5zdGF0ZSk7Cj4gPiArCj4gPiAr CQkJaWYgKHBsYW5lX3N0YXRlLT5wZW5kaW5nLmNvbmZpZykgewo+ID4gKwkJCQltdGtfZGRwX2Nv bXBfbGF5ZXJfY29uZmlnKG92bCwgaSwgcGxhbmVfc3RhdGUpOwo+ID4gKwkJCQlwbGFuZV9zdGF0 ZS0+cGVuZGluZy5jb25maWcgPSBmYWxzZTsKPiA+ICsJCQl9Cj4gPiArCQl9Cj4gPiArCQltdGtf Y3J0Yy0+cGVuZGluZ19wbGFuZXMgPSBmYWxzZTsKPiA+ICsJfQo+ID4gK30KPiA+ICsKPiA+ICBz dGF0aWMgdm9pZCBtdGtfZHJtX2NydGNfZW5hYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKPiA+ ICB7Cj4gPiAgCXN0cnVjdCBtdGtfZHJtX2NydGMgKm10a19jcnRjID0gdG9fbXRrX2NydGMoY3J0 Yyk7Cj4gPiBAQCAtMzkxLDYgKzQyNyw3IEBAIHN0YXRpYyB2b2lkIG10a19kcm1fY3J0Y19hdG9t aWNfZmx1c2goc3RydWN0IGRybV9jcnRjICpjcnRjLAo+ID4gIAkJCQkgICAgICBzdHJ1Y3QgZHJt X2NydGNfc3RhdGUgKm9sZF9jcnRjX3N0YXRlKQo+ID4gIHsKPiA+ICAJc3RydWN0IG10a19kcm1f Y3J0YyAqbXRrX2NydGMgPSB0b19tdGtfY3J0YyhjcnRjKTsKPiA+ICsJc3RydWN0IG10a19kcm1f cHJpdmF0ZSAqcHJpdiA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7Cj4gPiAgCXVuc2lnbmVkIGlu dCBwZW5kaW5nX3BsYW5lcyA9IDA7Cj4gPiAgCWludCBpOwo+ID4gIAo+ID4gQEAgLTQwOSw2ICs0 NDYsMTIgQEAgc3RhdGljIHZvaWQgbXRrX2RybV9jcnRjX2F0b21pY19mbHVzaChzdHJ1Y3QgZHJt X2NydGMgKmNydGMsCj4gPiAgCX0KPiA+ICAJaWYgKHBlbmRpbmdfcGxhbmVzKQo+ID4gIAkJbXRr X2NydGMtPnBlbmRpbmdfcGxhbmVzID0gdHJ1ZTsKPiA+ICsKPiA+ICsJaWYgKHByaXYtPmRhdGEt PnNoYWRvd19yZWdpc3Rlcikgewo+ID4gKwkJbXRrX2Rpc3BfbXV0ZXhfYWNxdWlyZShtdGtfY3J0 Yy0+bXV0ZXgpOwo+ID4gKwkJbXRrX2NydGNfZGRwX2NvbmZpZyhjcnRjKTsKPiA+ICsJCW10a19k aXNwX211dGV4X3JlbGVhc2UobXRrX2NydGMtPm11dGV4KTsKPiA+ICsJfQo+ID4gIH0KPiA+ICAK PiA+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jcnRjX2Z1bmNzIG10a19jcnRjX2Z1bmNzID0g ewo+ID4gQEAgLTQ1MywzNiArNDk2LDEwIEBAIGVycl9jbGVhbnVwX2NydGM6Cj4gPiAgdm9pZCBt dGtfY3J0Y19kZHBfaXJxKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IG10a19kZHBfY29t cCAqb3ZsKQo+ID4gIHsKPiA+ICAJc3RydWN0IG10a19kcm1fY3J0YyAqbXRrX2NydGMgPSB0b19t dGtfY3J0YyhjcnRjKTsKPiA+IC0Jc3RydWN0IG10a19jcnRjX3N0YXRlICpzdGF0ZSA9IHRvX210 a19jcnRjX3N0YXRlKG10a19jcnRjLT5iYXNlLnN0YXRlKTsKPiA+IC0JdW5zaWduZWQgaW50IGk7 Cj4gPiArCXN0cnVjdCBtdGtfZHJtX3ByaXZhdGUgKnByaXYgPSBjcnRjLT5kZXYtPmRldl9wcml2 YXRlOwo+ID4gIAo+ID4gLQkvKgo+ID4gLQkgKiBUT0RPOiBpbnN0ZWFkIG9mIHVwZGF0aW5nIHRo ZSByZWdpc3RlcnMgaGVyZSwgd2Ugc2hvdWxkIHByZXBhcmUKPiA+IC0JICogd29ya2luZyByZWdp c3RlcnMgaW4gYXRvbWljX2NvbW1pdCBhbmQgbGV0IHRoZSBoYXJkd2FyZSBjb21tYW5kCj4gPiAt CSAqIHF1ZXVlIHVwZGF0ZSBtb2R1bGUgcmVnaXN0ZXJzIG9uIHZibGFuay4KPiA+IC0JICovCj4g PiAtCWlmIChzdGF0ZS0+cGVuZGluZ19jb25maWcpIHsKPiA+IC0JCW10a19kZHBfY29tcF9jb25m aWcob3ZsLCBzdGF0ZS0+cGVuZGluZ193aWR0aCwKPiA+IC0JCQkJICAgIHN0YXRlLT5wZW5kaW5n X2hlaWdodCwKPiA+IC0JCQkJICAgIHN0YXRlLT5wZW5kaW5nX3ZyZWZyZXNoKTsKPiA+IC0KPiA+ IC0JCXN0YXRlLT5wZW5kaW5nX2NvbmZpZyA9IGZhbHNlOwo+ID4gLQl9Cj4gPiAtCj4gPiAtCWlm IChtdGtfY3J0Yy0+cGVuZGluZ19wbGFuZXMpIHsKPiA+IC0JCWZvciAoaSA9IDA7IGkgPCBPVkxf TEFZRVJfTlI7IGkrKykgewo+ID4gLQkJCXN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lID0gJm10a19j cnRjLT5wbGFuZXNbaV0uYmFzZTsKPiA+IC0JCQlzdHJ1Y3QgbXRrX3BsYW5lX3N0YXRlICpwbGFu ZV9zdGF0ZTsKPiA+IC0KPiA+IC0JCQlwbGFuZV9zdGF0ZSA9IHRvX210a19wbGFuZV9zdGF0ZShw bGFuZS0+c3RhdGUpOwo+ID4gLQo+ID4gLQkJCWlmIChwbGFuZV9zdGF0ZS0+cGVuZGluZy5jb25m aWcpIHsKPiA+IC0JCQkJbXRrX2RkcF9jb21wX2xheWVyX2NvbmZpZyhvdmwsIGksIHBsYW5lX3N0 YXRlKTsKPiA+IC0JCQkJcGxhbmVfc3RhdGUtPnBlbmRpbmcuY29uZmlnID0gZmFsc2U7Cj4gPiAt CQkJfQo+ID4gLQkJfQo+ID4gLQkJbXRrX2NydGMtPnBlbmRpbmdfcGxhbmVzID0gZmFsc2U7Cj4g PiAtCX0KPiA+ICsJaWYgKCFwcml2LT5kYXRhLT5zaGFkb3dfcmVnaXN0ZXIpCj4gPiArCQltdGtf Y3J0Y19kZHBfY29uZmlnKGNydGMpOwo+ID4gIAo+ID4gIAltdGtfZHJtX2ZpbmlzaF9wYWdlX2Zs aXAobXRrX2NydGMpOwo+ID4gIH0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVk aWF0ZWsvbXRrX2RybV9kZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2Rk cC5jCj4gPiBpbmRleCA4MDMwNzY5Li5mYTUzODA2IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9n cHUvZHJtL21lZGlhdGVrL210a19kcm1fZGRwLmMKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9t ZWRpYXRlay9tdGtfZHJtX2RkcC5jCj4gPiBAQCAtMTIsNiArMTIsNyBAQAo+ID4gICAqLwo+ID4g IAo+ID4gICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvaW9wb2xs Lmg+Cj4gPiAgI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ID4gICNpbmNsdWRlIDxsaW51eC9v Zl9kZXZpY2UuaD4KPiA+ICAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gPiBA QCAtMzIsNiArMzMsNyBAQAo+ID4gICNkZWZpbmUgRElTUF9SRUdfQ09ORklHX01NU1lTX0NHX0NP TjAJCTB4MTAwCj4gPiAgCj4gPiAgI2RlZmluZSBESVNQX1JFR19NVVRFWF9FTihuKQkoMHgyMCAr IDB4MjAgKiAobikpCj4gPiArI2RlZmluZSBESVNQX1JFR19NVVRFWChuKQkoMHgyNCArIDB4MjAg KiAobikpCj4gPiAgI2RlZmluZSBESVNQX1JFR19NVVRFWF9SU1QobikJKDB4MjggKyAweDIwICog KG4pKQo+ID4gICNkZWZpbmUgRElTUF9SRUdfTVVURVhfTU9EKG4pCSgweDJjICsgMHgyMCAqIChu KSkKPiA+ICAjZGVmaW5lIERJU1BfUkVHX01VVEVYX1NPRihuKQkoMHgzMCArIDB4MjAgKiAobikp Cj4gPiBAQCAtMzAwLDYgKzMwMiwyNiBAQCB2b2lkIG10a19kaXNwX211dGV4X2Rpc2FibGUoc3Ry dWN0IG10a19kaXNwX211dGV4ICptdXRleCkKPiA+ICAJd3JpdGVsKDAsIGRkcC0+cmVncyArIERJ U1BfUkVHX01VVEVYX0VOKG11dGV4LT5pZCkpOwo+ID4gIH0KPiA+ICAKPiA+ICt2b2lkIG10a19k aXNwX211dGV4X2FjcXVpcmUoc3RydWN0IG10a19kaXNwX211dGV4ICptdXRleCkKPiA+ICt7Cj4g PiArCXN0cnVjdCBtdGtfZGRwICpkZHAgPSBjb250YWluZXJfb2YobXV0ZXgsIHN0cnVjdCBtdGtf ZGRwLAo+ID4gKwkJCQkJICAgbXV0ZXhbbXV0ZXgtPmlkXSk7Cj4gPiArCXUzMiB0bXA7Cj4gPiAr Cj4gPiArCXdyaXRlbCgxLCBkZHAtPnJlZ3MgKyBESVNQX1JFR19NVVRFWF9FTihtdXRleC0+aWQp KTsKPiA+ICsJd3JpdGVsKDEsIGRkcC0+cmVncyArIERJU1BfUkVHX01VVEVYKG11dGV4LT5pZCkp Owo+ID4gKwlyZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljKGRkcC0+cmVncyArIERJU1BfUkVHX01V VEVYKG11dGV4LT5pZCksIHRtcCwKPiA+ICsJCQkJICB0bXAgJiAweDIsIDEsIDEwMDAwKTsKClBs ZWFzZSBhZGQgYSBkZXNjcmlwdGl2ZSAjZGVmaW5lIGZvciB0aGUgMHgyIGJpdCBvZiB0aGUgRElT UF9SRUdfTVVURVgKcmVnaXN0ZXJzLgoKPiBOb3RoaW5nIHRvIGRvIHdpdGggdGltZW91dD8gSSB0 aGluayBpdCBzaG91bGQgcHJpbnQgZXJyb3IgbWVzc2FnZSBoZXJlCj4gb3IgcmVzZXQgSFcgdG8g cmVjb3ZlciBpdC4KCkkgYXNzdW1lIHRoYXQgaWYgbXRrX2Rpc3BfbXV0ZXhfYWNxdWlyZSBpcyBj YWxsZWQgd2hpbGUgdGhlIGhhcmR3YXJlIGhhcwp0aGUgbXV0ZXggKGR1cmluZyB0aGUgc2hhZG93 IHJlZ2lzdGVyIHVwZGF0ZSksIHRoaXMgc2hvdWxkIHdhaXQgdW50aWwKdGhlIHVwZGF0ZSBpcyBj b21wbGV0ZSwgc2luY2UgaXQgY2FuJ3QgYmFjayBvdXQgZnJvbSB0cnlpbmcgdG8gYWNxdWlyZQp0 aGUgbG9jay4gSXMgdGhhdCB0aGUgY2FzZT8KCnJlZ2FyZHMKUGhpbGlwcAoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlz dApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0 b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: p.zabel@pengutronix.de (Philipp Zabel) Date: Mon, 18 Jul 2016 10:36:32 +0200 Subject: [PATCH v4 3/8] drm/mediatek: add shadow register support In-Reply-To: <1468823575.30644.33.camel@mtksdaap41> References: <1468577274-6178-1-git-send-email-yt.shen@mediatek.com> <1468577274-6178-4-git-send-email-yt.shen@mediatek.com> <1468823575.30644.33.camel@mtksdaap41> Message-ID: <1468830992.2994.6.camel@pengutronix.de> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi CK, YT, Am Montag, den 18.07.2016, 14:32 +0800 schrieb CK Hu: > Hi, YT: > > One comment inline. > > > On Fri, 2016-07-15 at 18:07 +0800, YT Shen wrote: > > We need to acquire mutex before using the resources, > > and need to release it after finished. > > So we don't need to write registers in the blanking period. > > > > Signed-off-by: YT Shen > > --- > > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 75 +++++++++++++++++++------------ > > drivers/gpu/drm/mediatek/mtk_drm_ddp.c | 22 +++++++++ > > drivers/gpu/drm/mediatek/mtk_drm_ddp.h | 2 + > > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 1 + > > 4 files changed, 71 insertions(+), 29 deletions(-) > > > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > index 24aa3ba..80d9641 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > > @@ -315,6 +315,42 @@ static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc) > > pm_runtime_put(drm->dev); > > } > > > > +static void mtk_crtc_ddp_config(struct drm_crtc *crtc) > > +{ > > + struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); > > + struct mtk_crtc_state *state = to_mtk_crtc_state(mtk_crtc->base.state); > > + struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0]; > > + unsigned int i; > > + > > + /* > > + * TODO: instead of updating the registers here, we should prepare > > + * working registers in atomic_commit and let the hardware command > > + * queue update module registers on vblank. > > + */ > > + if (state->pending_config) { > > + mtk_ddp_comp_config(ovl, state->pending_width, > > + state->pending_height, > > + state->pending_vrefresh); > > + > > + state->pending_config = false; > > + } > > + > > + if (mtk_crtc->pending_planes) { > > + for (i = 0; i < OVL_LAYER_NR; i++) { > > + struct drm_plane *plane = &mtk_crtc->planes[i].base; > > + struct mtk_plane_state *plane_state; > > + > > + plane_state = to_mtk_plane_state(plane->state); > > + > > + if (plane_state->pending.config) { > > + mtk_ddp_comp_layer_config(ovl, i, plane_state); > > + plane_state->pending.config = false; > > + } > > + } > > + mtk_crtc->pending_planes = false; > > + } > > +} > > + > > static void mtk_drm_crtc_enable(struct drm_crtc *crtc) > > { > > struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); > > @@ -391,6 +427,7 @@ static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc, > > struct drm_crtc_state *old_crtc_state) > > { > > struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); > > + struct mtk_drm_private *priv = crtc->dev->dev_private; > > unsigned int pending_planes = 0; > > int i; > > > > @@ -409,6 +446,12 @@ static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc, > > } > > if (pending_planes) > > mtk_crtc->pending_planes = true; > > + > > + if (priv->data->shadow_register) { > > + mtk_disp_mutex_acquire(mtk_crtc->mutex); > > + mtk_crtc_ddp_config(crtc); > > + mtk_disp_mutex_release(mtk_crtc->mutex); > > + } > > } > > > > static const struct drm_crtc_funcs mtk_crtc_funcs = { > > @@ -453,36 +496,10 @@ err_cleanup_crtc: > > void mtk_crtc_ddp_irq(struct drm_crtc *crtc, struct mtk_ddp_comp *ovl) > > { > > struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); > > - struct mtk_crtc_state *state = to_mtk_crtc_state(mtk_crtc->base.state); > > - unsigned int i; > > + struct mtk_drm_private *priv = crtc->dev->dev_private; > > > > - /* > > - * TODO: instead of updating the registers here, we should prepare > > - * working registers in atomic_commit and let the hardware command > > - * queue update module registers on vblank. > > - */ > > - if (state->pending_config) { > > - mtk_ddp_comp_config(ovl, state->pending_width, > > - state->pending_height, > > - state->pending_vrefresh); > > - > > - state->pending_config = false; > > - } > > - > > - if (mtk_crtc->pending_planes) { > > - for (i = 0; i < OVL_LAYER_NR; i++) { > > - struct drm_plane *plane = &mtk_crtc->planes[i].base; > > - struct mtk_plane_state *plane_state; > > - > > - plane_state = to_mtk_plane_state(plane->state); > > - > > - if (plane_state->pending.config) { > > - mtk_ddp_comp_layer_config(ovl, i, plane_state); > > - plane_state->pending.config = false; > > - } > > - } > > - mtk_crtc->pending_planes = false; > > - } > > + if (!priv->data->shadow_register) > > + mtk_crtc_ddp_config(crtc); > > > > mtk_drm_finish_page_flip(mtk_crtc); > > } > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > index 8030769..fa53806 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp.c > > @@ -12,6 +12,7 @@ > > */ > > > > #include > > +#include > > #include > > #include > > #include > > @@ -32,6 +33,7 @@ > > #define DISP_REG_CONFIG_MMSYS_CG_CON0 0x100 > > > > #define DISP_REG_MUTEX_EN(n) (0x20 + 0x20 * (n)) > > +#define DISP_REG_MUTEX(n) (0x24 + 0x20 * (n)) > > #define DISP_REG_MUTEX_RST(n) (0x28 + 0x20 * (n)) > > #define DISP_REG_MUTEX_MOD(n) (0x2c + 0x20 * (n)) > > #define DISP_REG_MUTEX_SOF(n) (0x30 + 0x20 * (n)) > > @@ -300,6 +302,26 @@ void mtk_disp_mutex_disable(struct mtk_disp_mutex *mutex) > > writel(0, ddp->regs + DISP_REG_MUTEX_EN(mutex->id)); > > } > > > > +void mtk_disp_mutex_acquire(struct mtk_disp_mutex *mutex) > > +{ > > + struct mtk_ddp *ddp = container_of(mutex, struct mtk_ddp, > > + mutex[mutex->id]); > > + u32 tmp; > > + > > + writel(1, ddp->regs + DISP_REG_MUTEX_EN(mutex->id)); > > + writel(1, ddp->regs + DISP_REG_MUTEX(mutex->id)); > > + readl_poll_timeout_atomic(ddp->regs + DISP_REG_MUTEX(mutex->id), tmp, > > + tmp & 0x2, 1, 10000); Please add a descriptive #define for the 0x2 bit of the DISP_REG_MUTEX registers. > Nothing to do with timeout? I think it should print error message here > or reset HW to recover it. I assume that if mtk_disp_mutex_acquire is called while the hardware has the mutex (during the shadow register update), this should wait until the update is complete, since it can't back out from trying to acquire the lock. Is that the case? regards Philipp