@@ -54,6 +54,7 @@ struct mtk_drm_crtc {
54
54
#if IS_REACHABLE (CONFIG_MTK_CMDQ )
55
55
struct mbox_client cmdq_cl ;
56
56
struct mbox_chan * cmdq_chan ;
57
+ struct cmdq_pkt cmdq_handle ;
57
58
u32 cmdq_event ;
58
59
u32 cmdq_vblank_cnt ;
59
60
#endif
@@ -226,19 +227,16 @@ struct mtk_ddp_comp *mtk_drm_ddp_comp_for_plane(struct drm_crtc *crtc,
226
227
}
227
228
228
229
#if IS_REACHABLE (CONFIG_MTK_CMDQ )
229
- static struct cmdq_pkt * mtk_drm_cmdq_pkt_create (struct mbox_chan * chan , size_t size )
230
+ static int mtk_drm_cmdq_pkt_create (struct mbox_chan * chan , struct cmdq_pkt * pkt ,
231
+ size_t size )
230
232
{
231
- struct cmdq_pkt * pkt ;
232
233
struct device * dev ;
233
234
dma_addr_t dma_addr ;
234
235
235
- pkt = kzalloc (sizeof (* pkt ), GFP_KERNEL );
236
- if (!pkt )
237
- return ERR_PTR (- ENOMEM );
238
236
pkt -> va_base = kzalloc (size , GFP_KERNEL );
239
237
if (!pkt -> va_base ) {
240
238
kfree (pkt );
241
- return ERR_PTR ( - ENOMEM ) ;
239
+ return - ENOMEM ;
242
240
}
243
241
pkt -> buf_size = size ;
244
242
@@ -249,12 +247,12 @@ static struct cmdq_pkt *mtk_drm_cmdq_pkt_create(struct mbox_chan *chan, size_t s
249
247
dev_err (dev , "dma map failed, size=%u\n" , (u32 )(u64 )size );
250
248
kfree (pkt -> va_base );
251
249
kfree (pkt );
252
- return ERR_PTR ( - ENOMEM ) ;
250
+ return - ENOMEM ;
253
251
}
254
252
255
253
pkt -> pa_base = dma_addr ;
256
254
257
- return pkt ;
255
+ return 0 ;
258
256
}
259
257
260
258
static void mtk_drm_cmdq_pkt_destroy (struct mbox_chan * chan , struct cmdq_pkt * pkt )
@@ -477,7 +475,7 @@ static void mtk_drm_crtc_update_config(struct mtk_drm_crtc *mtk_crtc,
477
475
bool needs_vblank )
478
476
{
479
477
#if IS_REACHABLE (CONFIG_MTK_CMDQ )
480
- struct cmdq_pkt * cmdq_handle ;
478
+ struct cmdq_pkt * cmdq_handle = & mtk_crtc -> cmdq_handle ;
481
479
#endif
482
480
struct drm_crtc * crtc = & mtk_crtc -> base ;
483
481
struct mtk_drm_private * priv = crtc -> dev -> dev_private ;
@@ -517,7 +515,7 @@ static void mtk_drm_crtc_update_config(struct mtk_drm_crtc *mtk_crtc,
517
515
#if IS_REACHABLE (CONFIG_MTK_CMDQ )
518
516
if (mtk_crtc -> cmdq_chan ) {
519
517
mbox_flush (mtk_crtc -> cmdq_chan , 2000 );
520
- cmdq_handle = mtk_drm_cmdq_pkt_create ( mtk_crtc -> cmdq_chan , PAGE_SIZE ) ;
518
+ cmdq_handle -> cmd_buf_size = 0 ;
521
519
cmdq_pkt_clear_event (cmdq_handle , mtk_crtc -> cmdq_event );
522
520
cmdq_pkt_wfe (cmdq_handle , mtk_crtc -> cmdq_event , false);
523
521
mtk_crtc_ddp_config (crtc , cmdq_handle );
@@ -915,6 +913,16 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
915
913
drm_crtc_index (& mtk_crtc -> base ));
916
914
mbox_free_channel (mtk_crtc -> cmdq_chan );
917
915
mtk_crtc -> cmdq_chan = NULL ;
916
+ } else {
917
+ ret = mtk_drm_cmdq_pkt_create (mtk_crtc -> cmdq_chan ,
918
+ & mtk_crtc -> cmdq_handle ,
919
+ PAGE_SIZE );
920
+ if (ret ) {
921
+ dev_dbg (dev , "mtk_crtc %d failed to create cmdq packet\n" ,
922
+ drm_crtc_index (& mtk_crtc -> base ));
923
+ mbox_free_channel (mtk_crtc -> cmdq_chan );
924
+ mtk_crtc -> cmdq_chan = NULL ;
925
+ }
918
926
}
919
927
}
920
928
#endif
0 commit comments