From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark yao Subject: Re: [PATCH] drm/rockchip: get rid of rockchip_drm_crtc_mode_config Date: Wed, 20 Apr 2016 10:20:07 +0800 Message-ID: <5716E757.8070702@rock-chips.com> References: <1460948611-32259-1-git-send-email-mark.yao@rock-chips.com> <20160418102538.0ed730ca.john@metanate.com> <57159B37.9050806@rock-chips.com> <20160419100630.06518b63.john@metanate.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20160419100630.06518b63.john@metanate.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: John Keeping 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 T24gMjAxNuW5tDA05pyIMTnml6UgMTc6MDYsIEpvaG4gS2VlcGluZyB3cm90ZToKPiBPbiBUdWUs IDE5IEFwciAyMDE2IDEwOjQzOjAzICswODAwLCBNYXJrIHlhbyB3cm90ZToKPgo+PiBPbiAyMDE2 5bm0MDTmnIgxOOaXpSAxNzoyNSwgSm9obiBLZWVwaW5nIHdyb3RlOgo+Pj4gT24gTW9uLCAxOCBB cHIgMjAxNiAxMTowMzozMSArMDgwMCwgTWFyayBZYW8gd3JvdGU6Cj4+PiAgIAo+Pj4+PiBXZSBu ZWVkIHRvIHRha2UgY2FyZSBvZiB0aGUgdm9wIHN0YXR1cyB3aGVuIHVzZQo+Pj4+PiByb2NrY2hp cF9kcm1fY3J0Y19tb2RlX2NvbmZpZywgaWYgdm9wIGlzIGRpc2FibGVkLAo+Pj4+PiB0aGUgZnVu Y3Rpb24gd291bGQgZmFpbGVkLCB0aGF0IGlzIHRlcnJpYmxlLgo+Pj4+Pgo+Pj4+PiBTYXZlIGNv bm5lY3RvciB0eXBlIGFuZCBvdXRwdXQgbW9kZSBvbiBkcm1fZGlzcGxheV9tb2RlLT5wcml2YXRl X2ZsYWdzCj4+Pj4+IGF0IGVuY29kZXIgbW9kZV9maXh1cCwgdGhlbiB3ZSBjYW4gY29uZmlndXJl IHRoZSB0eXBlIGFuZCBtb2RlIHNhZmVseQo+Pj4+PiBvbiBjcnRjIG1vZGVfc2V0Lgo+Pj4gU2lu Y2UgUm9ja2NoaXAgaXMgYXRvbWljLCBzaG91bGRuJ3QgdGhpcyBiZSB1c2luZyBhdG9taWNfY2hl Y2sgaG9va3MgYW5kCj4+PiBhIHN1YmNsYXNzZWQgY3J0Y19zdGF0ZSBzdHJ1Y3R1cmU/Cj4+PiAg IAo+PiBJIHRyeSB0byB1c2UgYXRvbWljX2NoZWNrIHdpdGggY3J0Y19zdGF0ZSwgYnV0IGl0IHNl ZW1zIG5vdCBlYXN5LAo+PiB0aGVyZSBhcmUgdHdvIHZhbHVlIG5lZWQgdHJhbnNtaXQgZnJvbSBj b25uZWN0b3IgdG8gdm9wOiBjb25uZWN0b3IgdHlwZQo+PiBhbmQgb3V0X21vZGUKPj4KPj4gdGhl IGNvbm5lY3RvciB0eXBlIEkgdGhpbmsgd2UgY2FuIGxvb3AgdGhlIGF0b21pYyBzdGF0ZSB0byBm aW5kIHRoZQo+PiBjb25uZWN0b3IgdHlwZS4KPj4gYnV0IHRoZSBvdXRfbW9kZSBpcyBhIGN1c3Rv bSB2YWx1ZSwgSSBjYW4ndCBmaW5kIGEgZ2VuZXJpYyB3YXkgdG8KPj4gdHJhbnNtaXQgaXQgd2l0 aCBhdG9taWMgc3RhdGUuCj4+Cj4+IEJUVywgSSB0aGluayBvbiBhdG9taWMgc2lkZSwgdGhlIGRy bV9kaXNwbGF5X21vZGUgaXMgdW5kZXIgY29udHJvbCBieQo+PiBhdG9taWMgc3RhdGUsCj4+IGFu ZCB0aGUgbW9kZS0+cHJpdmF0ZV9mbGFncyBpcyBub3QgdXNlIGJ5IGRybSBmcmFtZXdvcmssIEkg Zm91bmQgaTkxNQo+PiBhbmQgZ21hNTAwIGFsc28gdXNlCj4+IG1vZGUtPnByaXZhdGVfZmxhZ3Mg dG8gdHJhbnNtaXQgY3VzdG9tIHZhbHVlLgo+Pgo+PiBTbyBJIHRoaW5rIGl0J3Mgbm8gcHJvYmxl bSB1c2luZyBtb2RlLT5wcml2YXRlX2ZsYWdzLgo+IFRoZSBkb2N1bWVudGF0aW9uIGZvciBkcm1f ZGlzcGxheV9tb2RlOjpwcml2YXRlIHNheXM6Cj4KPiAgICAgIEl0IHNob3VsZG4ndCBiZSB1c2Vk IGJ5IGF0b21pYyBkcml2ZXJzIHNpbmNlIHRoZXkgY2FuIHN0b3JlIGFueQo+ICAgICAgYWRkaXRp b25hbCBkYXRhIGJ5IHN1YmNsYXNzaW5nIHN0YXRlIHN0cnVjdHVyZXMuCj4KPiBUaGlzIGFwcGxp ZXMgdG8gcHJpdmF0ZV9mbGFncyBhcyB3ZWxsLgo+Cj4gSSB0aGluayB0aGlzIG1lYW5zIHRoYXQg d2Ugc2hvdWxkIGRvIHNvbWV0aGluZyBsaWtlIHRoZSBwYXRjaCBiZWxvdwo+ICh3aGljaCBpc24n dCBldmVuIGNvbXBpbGUgdGVzdGVkIGFuZCBkb2Vzbid0IGNvdmVyIGltcGxlbWVudGluZwo+IGRy bV9lbmNvZGVyX2hlbHBlcl9mdW5jczo6YXRvbWljX2NoZWNrIG9uIGFsbCBvZiB0aGUgZW5jb2Rl cnMpOgo+Cj4gLS0gPjggLS0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlw L3JvY2tjaGlwX2RybV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9k cm1fZHJ2LmgKPiBpbmRleCAwMGQxN2Q3MWFhNGMuLjlkNjVmYTkxODhmNCAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5oCj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuaAo+IEBAIC0zMSw2ICszMSwx NCBAQAo+ICAgc3RydWN0IGRybV9kZXZpY2U7Cj4gICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvcjsKPiAg IAo+ICtzdHJ1Y3Qgcm9ja2NoaXBfY3J0Y19zdGF0ZSB7Cj4gKwlzdHJ1Y3QgZHJtX2NydGNfc3Rh dGUgYmFzZTsKPiArCWludCBvdXRwdXRfdHlwZTsKPiArCWludCBvdXRwdXRfbW9kZTsKPiArfTsK PiArCj4gKyNkZWZpbmUgdG9fcm9ja2NoaXBfY3J0Y19zdGF0ZShzKSBjb250YWluZXJfb2YoeCwg c3RydWN0IHJvY2tjaGlwX2NydGNfc3RhdGUsIGJhc2UpCj4gKwo+ICAgLyoKPiAgICAqIFJvY2tj aGlwIGRybSBwcml2YXRlIGNydGMgZnVuY3MuCj4gICAgKiBAZW5hYmxlX3ZibGFuazogZW5hYmxl IGNydGMgdmJsYW5rIGlycS4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlw L3JvY2tjaGlwX2RybV92b3AuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9k cm1fdm9wLmMKPiBpbmRleCBhNjE5ZjEyMGY4MDEuLjVjZGYzMTIzZTFlYiAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX3ZvcC5jCj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV92b3AuYwo+IEBAIC0xMDQ0LDEzICsx MDQ0LDM0IEBAIHN0YXRpYyB2b2lkIHZvcF9jcnRjX2Rlc3Ryb3koc3RydWN0IGRybV9jcnRjICpj cnRjKQo+ICAgCWRybV9jcnRjX2NsZWFudXAoY3J0Yyk7Cj4gICB9Cj4gICAKPiArc3RhdGljIHN0 cnVjdCBkcm1fY3J0Y19zdGF0ZSAqdm9wX2NydGNfZHVwbGljYXRlX3N0YXRlKHN0cnVjdCBkcm1f Y3J0YyAqY3J0YykKPiArewo+ICsJc3RydWN0IHJvY2tjaGlwX2NydGNfc3RhdGUgKnJvY2tjaGlw X3N0YXRlOwo+ICsKPiArCXJvY2tjaGlwX3N0YXRlID0ga3phbGxvYyhzaXplb2YoKnJvY2tjaGlw X3N0YXRlKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIXJvY2tjaGlwX3N0YXRlKQo+ICsJCXJldHVy biBOVUxMOwo+ICsKPiArCV9fZHJtX2F0b21pY19oZWxwZXJfY3J0Y19kdXBsaWNhdGVfc3RhdGUo Y3J0YywgJnJvY2tjaGlwX3N0YXRlLT5iYXNlKTsKPiArCXJldHVybiAmcm9ja2NoaXBfc3RhdGUt PmJhc2U7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHZvcF9jcnRjX2Rlc3Ryb3lfc3RhdGUoc3Ry dWN0IGRybV9jcnRjICpjcnRjLAo+ICsJCQkJICAgc3RydWN0IGRybV9jcnRjX3N0YXRlICpzdGF0 ZSkKPiArewo+ICsJc3RydWN0IHJvY2tjaGlwX2NydGNfc3RhdGUgKnMgPSB0b19yb2NrY2hpcF9j cnRjX3N0YXRlKHN0YXRlKTsKPiArCj4gKwlfX2RybV9hdG9taWNfaGVscGVyX2NydGNfZGVzdHJv eV9zdGF0ZShjcnRjLCAmcy0+YmFzZSk7Cj4gKwlrZnJlZShzKTsKPiArfQo+ICsKPiAgIHN0YXRp YyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3Mgdm9wX2NydGNfZnVuY3MgPSB7Cj4gICAJLnNl dF9jb25maWcgPSBkcm1fYXRvbWljX2hlbHBlcl9zZXRfY29uZmlnLAo+ICAgCS5wYWdlX2ZsaXAg PSBkcm1fYXRvbWljX2hlbHBlcl9wYWdlX2ZsaXAsCj4gICAJLmRlc3Ryb3kgPSB2b3BfY3J0Y19k ZXN0cm95LAo+ICAgCS5yZXNldCA9IGRybV9hdG9taWNfaGVscGVyX2NydGNfcmVzZXQsCj4gLQku YXRvbWljX2R1cGxpY2F0ZV9zdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX2NydGNfZHVwbGljYXRl X3N0YXRlLAo+IC0JLmF0b21pY19kZXN0cm95X3N0YXRlID0gZHJtX2F0b21pY19oZWxwZXJfY3J0 Y19kZXN0cm95X3N0YXRlLAo+ICsJLmF0b21pY19kdXBsaWNhdGVfc3RhdGUgPSB2b3BfY3J0Y19k dXBsaWNhdGVfc3RhdGUsCj4gKwkuYXRvbWljX2Rlc3Ryb3lfc3RhdGUgPSB2b3BfY3J0Y19kZXN0 cm95X3N0YXRlLAo+ICAgfTsKPiAgIAo+ICAgc3RhdGljIGJvb2wgdm9wX3dpbl9wZW5kaW5nX2lz X2NvbXBsZXRlKHN0cnVjdCB2b3Bfd2luICp2b3Bfd2luKQo+Cj4KPgpIaSBKb2huCgpHb29kLCBJ IGhhZCBpbXBsZW1lbnQgaXQgYWNjb3JkaW5nIHRvICB5b3VyIGFkdmlzZS4KClRoYW5rcy4KCi0t IArvvK1hcmsgWWFvCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Au b3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRl dmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: mark.yao@rock-chips.com (Mark yao) Date: Wed, 20 Apr 2016 10:20:07 +0800 Subject: [PATCH] drm/rockchip: get rid of rockchip_drm_crtc_mode_config In-Reply-To: <20160419100630.06518b63.john@metanate.com> References: <1460948611-32259-1-git-send-email-mark.yao@rock-chips.com> <20160418102538.0ed730ca.john@metanate.com> <57159B37.9050806@rock-chips.com> <20160419100630.06518b63.john@metanate.com> Message-ID: <5716E757.8070702@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 2016?04?19? 17:06, John Keeping wrote: > On Tue, 19 Apr 2016 10:43:03 +0800, Mark yao wrote: > >> On 2016?04?18? 17:25, John Keeping wrote: >>> On Mon, 18 Apr 2016 11:03:31 +0800, Mark Yao wrote: >>> >>>>> We need to take care of the vop status when use >>>>> rockchip_drm_crtc_mode_config, if vop is disabled, >>>>> the function would failed, that is terrible. >>>>> >>>>> Save connector type and output mode on drm_display_mode->private_flags >>>>> at encoder mode_fixup, then we can configure the type and mode safely >>>>> on crtc mode_set. >>> Since Rockchip is atomic, shouldn't this be using atomic_check hooks and >>> a subclassed crtc_state structure? >>> >> I try to use atomic_check with crtc_state, but it seems not easy, >> there are two value need transmit from connector to vop: connector type >> and out_mode >> >> the connector type I think we can loop the atomic state to find the >> connector type. >> but the out_mode is a custom value, I can't find a generic way to >> transmit it with atomic state. >> >> BTW, I think on atomic side, the drm_display_mode is under control by >> atomic state, >> and the mode->private_flags is not use by drm framework, I found i915 >> and gma500 also use >> mode->private_flags to transmit custom value. >> >> So I think it's no problem using mode->private_flags. > The documentation for drm_display_mode::private says: > > It shouldn't be used by atomic drivers since they can store any > additional data by subclassing state structures. > > This applies to private_flags as well. > > I think this means that we should do something like the patch below > (which isn't even compile tested and doesn't cover implementing > drm_encoder_helper_funcs::atomic_check on all of the encoders): > > -- >8 -- > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > index 00d17d71aa4c..9d65fa9188f4 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > @@ -31,6 +31,14 @@ > struct drm_device; > struct drm_connector; > > +struct rockchip_crtc_state { > + struct drm_crtc_state base; > + int output_type; > + int output_mode; > +}; > + > +#define to_rockchip_crtc_state(s) container_of(x, struct rockchip_crtc_state, base) > + > /* > * Rockchip drm private crtc funcs. > * @enable_vblank: enable crtc vblank irq. > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > index a619f120f801..5cdf3123e1eb 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > @@ -1044,13 +1044,34 @@ static void vop_crtc_destroy(struct drm_crtc *crtc) > drm_crtc_cleanup(crtc); > } > > +static struct drm_crtc_state *vop_crtc_duplicate_state(struct drm_crtc *crtc) > +{ > + struct rockchip_crtc_state *rockchip_state; > + > + rockchip_state = kzalloc(sizeof(*rockchip_state), GFP_KERNEL); > + if (!rockchip_state) > + return NULL; > + > + __drm_atomic_helper_crtc_duplicate_state(crtc, &rockchip_state->base); > + return &rockchip_state->base; > +} > + > +static void vop_crtc_destroy_state(struct drm_crtc *crtc, > + struct drm_crtc_state *state) > +{ > + struct rockchip_crtc_state *s = to_rockchip_crtc_state(state); > + > + __drm_atomic_helper_crtc_destroy_state(crtc, &s->base); > + kfree(s); > +} > + > static const struct drm_crtc_funcs vop_crtc_funcs = { > .set_config = drm_atomic_helper_set_config, > .page_flip = drm_atomic_helper_page_flip, > .destroy = vop_crtc_destroy, > .reset = drm_atomic_helper_crtc_reset, > - .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state, > - .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, > + .atomic_duplicate_state = vop_crtc_duplicate_state, > + .atomic_destroy_state = vop_crtc_destroy_state, > }; > > static bool vop_win_pending_is_complete(struct vop_win *vop_win) > > > Hi John Good, I had implement it according to your advise. Thanks. -- ?ark Yao From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752409AbcDTCUW (ORCPT ); Tue, 19 Apr 2016 22:20:22 -0400 Received: from regular1.263xmail.com ([211.150.99.132]:50315 "EHLO regular1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750859AbcDTCUU (ORCPT ); Tue, 19 Apr 2016 22:20:20 -0400 X-263anti-spam: BIG:0;ABS:1;DNS:0;ATT:0;SPF:S;KSV:0; X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-ABS-CHECKED: 1 X-SKE-CHECKED: 1 X-ADDR-CHECKED: 0 X-KSVirus-check: 0 X-RL-SENDER: mark.yao@rock-chips.com X-FST-TO: linux-kernel@vger.kernel.org X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: mark.yao@rock-chips.com X-UNIQUE-TAG: <4728c67e7ee098d9cb8df37db574c7f1> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Message-ID: <5716E757.8070702@rock-chips.com> Date: Wed, 20 Apr 2016 10:20:07 +0800 From: Mark yao User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: John Keeping 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: get rid of rockchip_drm_crtc_mode_config References: <1460948611-32259-1-git-send-email-mark.yao@rock-chips.com> <20160418102538.0ed730ca.john@metanate.com> <57159B37.9050806@rock-chips.com> <20160419100630.06518b63.john@metanate.com> In-Reply-To: <20160419100630.06518b63.john@metanate.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2016年04月19日 17:06, John Keeping wrote: > On Tue, 19 Apr 2016 10:43:03 +0800, Mark yao wrote: > >> On 2016年04月18日 17:25, John Keeping wrote: >>> On Mon, 18 Apr 2016 11:03:31 +0800, Mark Yao wrote: >>> >>>>> We need to take care of the vop status when use >>>>> rockchip_drm_crtc_mode_config, if vop is disabled, >>>>> the function would failed, that is terrible. >>>>> >>>>> Save connector type and output mode on drm_display_mode->private_flags >>>>> at encoder mode_fixup, then we can configure the type and mode safely >>>>> on crtc mode_set. >>> Since Rockchip is atomic, shouldn't this be using atomic_check hooks and >>> a subclassed crtc_state structure? >>> >> I try to use atomic_check with crtc_state, but it seems not easy, >> there are two value need transmit from connector to vop: connector type >> and out_mode >> >> the connector type I think we can loop the atomic state to find the >> connector type. >> but the out_mode is a custom value, I can't find a generic way to >> transmit it with atomic state. >> >> BTW, I think on atomic side, the drm_display_mode is under control by >> atomic state, >> and the mode->private_flags is not use by drm framework, I found i915 >> and gma500 also use >> mode->private_flags to transmit custom value. >> >> So I think it's no problem using mode->private_flags. > The documentation for drm_display_mode::private says: > > It shouldn't be used by atomic drivers since they can store any > additional data by subclassing state structures. > > This applies to private_flags as well. > > I think this means that we should do something like the patch below > (which isn't even compile tested and doesn't cover implementing > drm_encoder_helper_funcs::atomic_check on all of the encoders): > > -- >8 -- > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > index 00d17d71aa4c..9d65fa9188f4 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > @@ -31,6 +31,14 @@ > struct drm_device; > struct drm_connector; > > +struct rockchip_crtc_state { > + struct drm_crtc_state base; > + int output_type; > + int output_mode; > +}; > + > +#define to_rockchip_crtc_state(s) container_of(x, struct rockchip_crtc_state, base) > + > /* > * Rockchip drm private crtc funcs. > * @enable_vblank: enable crtc vblank irq. > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > index a619f120f801..5cdf3123e1eb 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > @@ -1044,13 +1044,34 @@ static void vop_crtc_destroy(struct drm_crtc *crtc) > drm_crtc_cleanup(crtc); > } > > +static struct drm_crtc_state *vop_crtc_duplicate_state(struct drm_crtc *crtc) > +{ > + struct rockchip_crtc_state *rockchip_state; > + > + rockchip_state = kzalloc(sizeof(*rockchip_state), GFP_KERNEL); > + if (!rockchip_state) > + return NULL; > + > + __drm_atomic_helper_crtc_duplicate_state(crtc, &rockchip_state->base); > + return &rockchip_state->base; > +} > + > +static void vop_crtc_destroy_state(struct drm_crtc *crtc, > + struct drm_crtc_state *state) > +{ > + struct rockchip_crtc_state *s = to_rockchip_crtc_state(state); > + > + __drm_atomic_helper_crtc_destroy_state(crtc, &s->base); > + kfree(s); > +} > + > static const struct drm_crtc_funcs vop_crtc_funcs = { > .set_config = drm_atomic_helper_set_config, > .page_flip = drm_atomic_helper_page_flip, > .destroy = vop_crtc_destroy, > .reset = drm_atomic_helper_crtc_reset, > - .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state, > - .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, > + .atomic_duplicate_state = vop_crtc_duplicate_state, > + .atomic_destroy_state = vop_crtc_destroy_state, > }; > > static bool vop_win_pending_is_complete(struct vop_win *vop_win) > > > Hi John Good, I had implement it according to your advise. Thanks. -- Mark Yao