@@ -52,7 +52,8 @@ struct mtk_drm_crtc {
52
52
bool pending_async_planes ;
53
53
54
54
#if IS_REACHABLE (CONFIG_MTK_CMDQ )
55
- struct cmdq_client * cmdq_client ;
55
+ struct mbox_client cmdq_cl ;
56
+ struct mbox_chan * cmdq_chan ;
56
57
u32 cmdq_event ;
57
58
#endif
58
59
@@ -224,11 +225,51 @@ struct mtk_ddp_comp *mtk_drm_ddp_comp_for_plane(struct drm_crtc *crtc,
224
225
}
225
226
226
227
#if IS_REACHABLE (CONFIG_MTK_CMDQ )
228
+ static struct cmdq_pkt * mtk_drm_cmdq_pkt_create (struct mbox_chan * chan , size_t size )
229
+ {
230
+ struct cmdq_pkt * pkt ;
231
+ struct device * dev ;
232
+ dma_addr_t dma_addr ;
233
+
234
+ pkt = kzalloc (sizeof (* pkt ), GFP_KERNEL );
235
+ if (!pkt )
236
+ return ERR_PTR (- ENOMEM );
237
+ pkt -> va_base = kzalloc (size , GFP_KERNEL );
238
+ if (!pkt -> va_base ) {
239
+ kfree (pkt );
240
+ return ERR_PTR (- ENOMEM );
241
+ }
242
+ pkt -> buf_size = size ;
243
+
244
+ dev = chan -> mbox -> dev ;
245
+ dma_addr = dma_map_single (dev , pkt -> va_base , pkt -> buf_size ,
246
+ DMA_TO_DEVICE );
247
+ if (dma_mapping_error (dev , dma_addr )) {
248
+ dev_err (dev , "dma map failed, size=%u\n" , (u32 )(u64 )size );
249
+ kfree (pkt -> va_base );
250
+ kfree (pkt );
251
+ return ERR_PTR (- ENOMEM );
252
+ }
253
+
254
+ pkt -> pa_base = dma_addr ;
255
+
256
+ return pkt ;
257
+ }
258
+
259
+ static void mtk_drm_cmdq_pkt_destroy (struct mbox_chan * chan , struct cmdq_pkt * pkt )
260
+ {
261
+ dma_unmap_single (chan -> mbox -> dev , pkt -> pa_base , pkt -> buf_size ,
262
+ DMA_TO_DEVICE );
263
+ kfree (pkt -> va_base );
264
+ kfree (pkt );
265
+ }
266
+
227
267
static void ddp_cmdq_cb (struct mbox_client * cl , void * mssg )
228
268
{
269
+ struct mtk_drm_crtc * mtk_crtc = container_of (cl , struct mtk_drm_crtc , cmdq_cl );
229
270
struct cmdq_cb_data * data = mssg ;
230
271
231
- cmdq_pkt_destroy ( data -> pkt );
272
+ mtk_drm_cmdq_pkt_destroy ( mtk_crtc -> cmdq_chan , data -> pkt );
232
273
}
233
274
#endif
234
275
@@ -472,19 +513,19 @@ static void mtk_drm_crtc_update_config(struct mtk_drm_crtc *mtk_crtc,
472
513
mtk_mutex_release (mtk_crtc -> mutex );
473
514
}
474
515
#if IS_REACHABLE (CONFIG_MTK_CMDQ )
475
- if (mtk_crtc -> cmdq_client ) {
476
- mbox_flush (mtk_crtc -> cmdq_client -> chan , 2000 );
477
- cmdq_handle = cmdq_pkt_create (mtk_crtc -> cmdq_client , PAGE_SIZE );
516
+ if (mtk_crtc -> cmdq_chan ) {
517
+ mbox_flush (mtk_crtc -> cmdq_chan , 2000 );
518
+ cmdq_handle = mtk_drm_cmdq_pkt_create (mtk_crtc -> cmdq_chan , PAGE_SIZE );
478
519
cmdq_pkt_clear_event (cmdq_handle , mtk_crtc -> cmdq_event );
479
520
cmdq_pkt_wfe (cmdq_handle , mtk_crtc -> cmdq_event , false);
480
521
mtk_crtc_ddp_config (crtc , cmdq_handle );
481
522
cmdq_pkt_finalize (cmdq_handle );
482
- dma_sync_single_for_device (mtk_crtc -> cmdq_client -> chan -> mbox -> dev ,
523
+ dma_sync_single_for_device (mtk_crtc -> cmdq_chan -> mbox -> dev ,
483
524
cmdq_handle -> pa_base ,
484
525
cmdq_handle -> cmd_buf_size ,
485
526
DMA_TO_DEVICE );
486
- mbox_send_message (mtk_crtc -> cmdq_client -> chan , cmdq_handle );
487
- mbox_client_txdone (mtk_crtc -> cmdq_client -> chan , 0 );
527
+ mbox_send_message (mtk_crtc -> cmdq_chan , cmdq_handle );
528
+ mbox_client_txdone (mtk_crtc -> cmdq_chan , 0 );
488
529
}
489
530
#endif
490
531
mtk_crtc -> config_updating = false;
@@ -498,7 +539,7 @@ static void mtk_crtc_ddp_irq(void *data)
498
539
struct mtk_drm_private * priv = crtc -> dev -> dev_private ;
499
540
500
541
#if IS_REACHABLE (CONFIG_MTK_CMDQ )
501
- if (!priv -> data -> shadow_register && !mtk_crtc -> cmdq_client )
542
+ if (!priv -> data -> shadow_register && !mtk_crtc -> cmdq_chan )
502
543
#else
503
544
if (!priv -> data -> shadow_register )
504
545
#endif
@@ -841,26 +882,29 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
841
882
mutex_init (& mtk_crtc -> hw_lock );
842
883
843
884
#if IS_REACHABLE (CONFIG_MTK_CMDQ )
844
- mtk_crtc -> cmdq_client =
845
- cmdq_mbox_create (mtk_crtc -> mmsys_dev ,
846
- drm_crtc_index (& mtk_crtc -> base ));
847
- if (IS_ERR (mtk_crtc -> cmdq_client )) {
885
+ mtk_crtc -> cmdq_cl .dev = mtk_crtc -> mmsys_dev ;
886
+ mtk_crtc -> cmdq_cl .tx_block = false;
887
+ mtk_crtc -> cmdq_cl .knows_txdone = true;
888
+ mtk_crtc -> cmdq_cl .rx_callback = ddp_cmdq_cb ;
889
+ mtk_crtc -> cmdq_chan =
890
+ mbox_request_channel (& mtk_crtc -> cmdq_cl ,
891
+ drm_crtc_index (& mtk_crtc -> base ));
892
+ if (IS_ERR (mtk_crtc -> cmdq_chan )) {
848
893
dev_dbg (dev , "mtk_crtc %d failed to create mailbox client, writing register by CPU now\n" ,
849
894
drm_crtc_index (& mtk_crtc -> base ));
850
- mtk_crtc -> cmdq_client = NULL ;
895
+ mtk_crtc -> cmdq_chan = NULL ;
851
896
}
852
897
853
- if (mtk_crtc -> cmdq_client ) {
854
- mtk_crtc -> cmdq_client -> client .rx_callback = ddp_cmdq_cb ;
898
+ if (mtk_crtc -> cmdq_chan ) {
855
899
ret = of_property_read_u32_index (priv -> mutex_node ,
856
900
"mediatek,gce-events" ,
857
901
drm_crtc_index (& mtk_crtc -> base ),
858
902
& mtk_crtc -> cmdq_event );
859
903
if (ret ) {
860
904
dev_dbg (dev , "mtk_crtc %d failed to get mediatek,gce-events property\n" ,
861
905
drm_crtc_index (& mtk_crtc -> base ));
862
- cmdq_mbox_destroy (mtk_crtc -> cmdq_client );
863
- mtk_crtc -> cmdq_client = NULL ;
906
+ mbox_free_channel (mtk_crtc -> cmdq_chan );
907
+ mtk_crtc -> cmdq_chan = NULL ;
864
908
}
865
909
}
866
910
#endif
0 commit comments