Skip to content

Commit 7266e90

Browse files
jason-jh.linChun-Kuang Hu
authored andcommitted
drm/mediatek: Add mediatek-drm of vdosys0 support for mt8195
1. Add driver data of mt8195 vdosys0 to mediatek-drm and the sub driver. 2. Add get driver data function to identify which vdosys by io_start. Link: https://patchwork.kernel.org/project/linux-mediatek/patch/[email protected]/ Signed-off-by: jason-jh.lin <[email protected]> Reviewed-by: AngeloGioacchino Del Regno <[email protected]> Reviewed-by: Rex-BC Chen <[email protected]> Signed-off-by: Chun-Kuang Hu <[email protected]>
1 parent bd448b8 commit 7266e90

File tree

3 files changed

+153
-9
lines changed

3 files changed

+153
-9
lines changed

drivers/gpu/drm/mediatek/mtk_disp_rdma.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,10 @@ static const struct mtk_disp_rdma_data mt8192_rdma_driver_data = {
372372
.fifo_size = 5 * SZ_1K,
373373
};
374374

375+
static const struct mtk_disp_rdma_data mt8195_rdma_driver_data = {
376+
.fifo_size = 1920,
377+
};
378+
375379
static const struct of_device_id mtk_disp_rdma_driver_dt_match[] = {
376380
{ .compatible = "mediatek,mt2701-disp-rdma",
377381
.data = &mt2701_rdma_driver_data},
@@ -381,6 +385,8 @@ static const struct of_device_id mtk_disp_rdma_driver_dt_match[] = {
381385
.data = &mt8183_rdma_driver_data},
382386
{ .compatible = "mediatek,mt8192-disp-rdma",
383387
.data = &mt8192_rdma_driver_data},
388+
{ .compatible = "mediatek,mt8195-disp-rdma",
389+
.data = &mt8195_rdma_driver_data},
384390
{},
385391
};
386392
MODULE_DEVICE_TABLE(of, mtk_disp_rdma_driver_dt_match);

drivers/gpu/drm/mediatek/mtk_drm_drv.c

Lines changed: 141 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* Author: YT SHEN <[email protected]>
55
*/
66

7+
#include <linux/clk.h>
8+
#include <linux/clk-provider.h>
79
#include <linux/component.h>
810
#include <linux/iommu.h>
911
#include <linux/module.h>
@@ -195,6 +197,19 @@ static const enum mtk_ddp_comp_id mt8192_mtk_ddp_ext[] = {
195197
DDP_COMPONENT_DPI0,
196198
};
197199

200+
static const enum mtk_ddp_comp_id mt8195_mtk_ddp_main[] = {
201+
DDP_COMPONENT_OVL0,
202+
DDP_COMPONENT_RDMA0,
203+
DDP_COMPONENT_COLOR0,
204+
DDP_COMPONENT_CCORR,
205+
DDP_COMPONENT_AAL0,
206+
DDP_COMPONENT_GAMMA,
207+
DDP_COMPONENT_DITHER,
208+
DDP_COMPONENT_DSC0,
209+
DDP_COMPONENT_MERGE0,
210+
DDP_COMPONENT_DP_INTF0,
211+
};
212+
198213
static const struct mtk_mmsys_driver_data mt2701_mmsys_driver_data = {
199214
.main_path = mt2701_mtk_ddp_main,
200215
.main_len = ARRAY_SIZE(mt2701_mtk_ddp_main),
@@ -203,6 +218,13 @@ static const struct mtk_mmsys_driver_data mt2701_mmsys_driver_data = {
203218
.shadow_register = true,
204219
};
205220

221+
static const struct mtk_mmsys_match_data mt2701_mmsys_match_data = {
222+
.num_drv_data = 1,
223+
.drv_data = {
224+
&mt2701_mmsys_driver_data,
225+
},
226+
};
227+
206228
static const struct mtk_mmsys_driver_data mt7623_mmsys_driver_data = {
207229
.main_path = mt7623_mtk_ddp_main,
208230
.main_len = ARRAY_SIZE(mt7623_mtk_ddp_main),
@@ -211,6 +233,13 @@ static const struct mtk_mmsys_driver_data mt7623_mmsys_driver_data = {
211233
.shadow_register = true,
212234
};
213235

236+
static const struct mtk_mmsys_match_data mt7623_mmsys_match_data = {
237+
.num_drv_data = 1,
238+
.drv_data = {
239+
&mt7623_mmsys_driver_data,
240+
},
241+
};
242+
214243
static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = {
215244
.main_path = mt2712_mtk_ddp_main,
216245
.main_len = ARRAY_SIZE(mt2712_mtk_ddp_main),
@@ -220,39 +249,99 @@ static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = {
220249
.third_len = ARRAY_SIZE(mt2712_mtk_ddp_third),
221250
};
222251

252+
static const struct mtk_mmsys_match_data mt2712_mmsys_match_data = {
253+
.num_drv_data = 1,
254+
.drv_data = {
255+
&mt2712_mmsys_driver_data,
256+
},
257+
};
258+
223259
static const struct mtk_mmsys_driver_data mt8167_mmsys_driver_data = {
224260
.main_path = mt8167_mtk_ddp_main,
225261
.main_len = ARRAY_SIZE(mt8167_mtk_ddp_main),
226262
};
227263

264+
static const struct mtk_mmsys_match_data mt8167_mmsys_match_data = {
265+
.num_drv_data = 1,
266+
.drv_data = {
267+
&mt8167_mmsys_driver_data,
268+
},
269+
};
270+
228271
static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = {
229272
.main_path = mt8173_mtk_ddp_main,
230273
.main_len = ARRAY_SIZE(mt8173_mtk_ddp_main),
231274
.ext_path = mt8173_mtk_ddp_ext,
232275
.ext_len = ARRAY_SIZE(mt8173_mtk_ddp_ext),
233276
};
234277

278+
static const struct mtk_mmsys_match_data mt8173_mmsys_match_data = {
279+
.num_drv_data = 1,
280+
.drv_data = {
281+
&mt8173_mmsys_driver_data,
282+
},
283+
};
284+
235285
static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = {
236286
.main_path = mt8183_mtk_ddp_main,
237287
.main_len = ARRAY_SIZE(mt8183_mtk_ddp_main),
238288
.ext_path = mt8183_mtk_ddp_ext,
239289
.ext_len = ARRAY_SIZE(mt8183_mtk_ddp_ext),
240290
};
241291

292+
static const struct mtk_mmsys_match_data mt8183_mmsys_match_data = {
293+
.num_drv_data = 1,
294+
.drv_data = {
295+
&mt8183_mmsys_driver_data,
296+
},
297+
};
298+
242299
static const struct mtk_mmsys_driver_data mt8186_mmsys_driver_data = {
243300
.main_path = mt8186_mtk_ddp_main,
244301
.main_len = ARRAY_SIZE(mt8186_mtk_ddp_main),
245302
.ext_path = mt8186_mtk_ddp_ext,
246303
.ext_len = ARRAY_SIZE(mt8186_mtk_ddp_ext),
247304
};
248305

306+
static const struct mtk_mmsys_match_data mt8186_mmsys_match_data = {
307+
.num_drv_data = 1,
308+
.drv_data = {
309+
&mt8186_mmsys_driver_data,
310+
},
311+
};
312+
249313
static const struct mtk_mmsys_driver_data mt8192_mmsys_driver_data = {
250314
.main_path = mt8192_mtk_ddp_main,
251315
.main_len = ARRAY_SIZE(mt8192_mtk_ddp_main),
252316
.ext_path = mt8192_mtk_ddp_ext,
253317
.ext_len = ARRAY_SIZE(mt8192_mtk_ddp_ext),
254318
};
255319

320+
static const struct mtk_mmsys_match_data mt8192_mmsys_match_data = {
321+
.num_drv_data = 1,
322+
.drv_data = {
323+
&mt8192_mmsys_driver_data,
324+
},
325+
};
326+
327+
static const struct mtk_mmsys_driver_data mt8195_vdosys0_driver_data = {
328+
.io_start = 0x1c01a000,
329+
.main_path = mt8195_mtk_ddp_main,
330+
.main_len = ARRAY_SIZE(mt8195_mtk_ddp_main),
331+
};
332+
333+
static const struct mtk_mmsys_driver_data mt8195_vdosys1_driver_data = {
334+
.io_start = 0x1c100000,
335+
};
336+
337+
static const struct mtk_mmsys_match_data mt8195_mmsys_match_data = {
338+
.num_drv_data = 1,
339+
.drv_data = {
340+
&mt8195_vdosys0_driver_data,
341+
&mt8195_vdosys1_driver_data,
342+
},
343+
};
344+
256345
static int mtk_drm_kms_init(struct drm_device *drm)
257346
{
258347
struct mtk_drm_private *private = drm->dev_private;
@@ -470,12 +559,16 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
470559
.data = (void *)MTK_DISP_DITHER },
471560
{ .compatible = "mediatek,mt8183-disp-dither",
472561
.data = (void *)MTK_DISP_DITHER },
562+
{ .compatible = "mediatek,mt8195-disp-dsc",
563+
.data = (void *)MTK_DISP_DSC },
473564
{ .compatible = "mediatek,mt8167-disp-gamma",
474565
.data = (void *)MTK_DISP_GAMMA, },
475566
{ .compatible = "mediatek,mt8173-disp-gamma",
476567
.data = (void *)MTK_DISP_GAMMA, },
477568
{ .compatible = "mediatek,mt8183-disp-gamma",
478569
.data = (void *)MTK_DISP_GAMMA, },
570+
{ .compatible = "mediatek,mt8195-disp-merge",
571+
.data = (void *)MTK_DISP_MERGE },
479572
{ .compatible = "mediatek,mt2701-disp-mutex",
480573
.data = (void *)MTK_DISP_MUTEX },
481574
{ .compatible = "mediatek,mt2712-disp-mutex",
@@ -490,6 +583,8 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
490583
.data = (void *)MTK_DISP_MUTEX },
491584
{ .compatible = "mediatek,mt8192-disp-mutex",
492585
.data = (void *)MTK_DISP_MUTEX },
586+
{ .compatible = "mediatek,mt8195-disp-mutex",
587+
.data = (void *)MTK_DISP_MUTEX },
493588
{ .compatible = "mediatek,mt8173-disp-od",
494589
.data = (void *)MTK_DISP_OD },
495590
{ .compatible = "mediatek,mt2701-disp-ovl",
@@ -524,6 +619,8 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
524619
.data = (void *)MTK_DISP_RDMA },
525620
{ .compatible = "mediatek,mt8192-disp-rdma",
526621
.data = (void *)MTK_DISP_RDMA },
622+
{ .compatible = "mediatek,mt8195-disp-rdma",
623+
.data = (void *)MTK_DISP_RDMA },
527624
{ .compatible = "mediatek,mt8173-disp-ufoe",
528625
.data = (void *)MTK_DISP_UFOE },
529626
{ .compatible = "mediatek,mt8173-disp-wdma",
@@ -549,30 +646,53 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
549646

550647
static const struct of_device_id mtk_drm_of_ids[] = {
551648
{ .compatible = "mediatek,mt2701-mmsys",
552-
.data = &mt2701_mmsys_driver_data},
649+
.data = &mt2701_mmsys_match_data},
553650
{ .compatible = "mediatek,mt7623-mmsys",
554-
.data = &mt7623_mmsys_driver_data},
651+
.data = &mt7623_mmsys_match_data},
555652
{ .compatible = "mediatek,mt2712-mmsys",
556-
.data = &mt2712_mmsys_driver_data},
653+
.data = &mt2712_mmsys_match_data},
557654
{ .compatible = "mediatek,mt8167-mmsys",
558-
.data = &mt8167_mmsys_driver_data},
655+
.data = &mt8167_mmsys_match_data},
559656
{ .compatible = "mediatek,mt8173-mmsys",
560-
.data = &mt8173_mmsys_driver_data},
657+
.data = &mt8173_mmsys_match_data},
561658
{ .compatible = "mediatek,mt8183-mmsys",
562-
.data = &mt8183_mmsys_driver_data},
659+
.data = &mt8183_mmsys_match_data},
563660
{ .compatible = "mediatek,mt8186-mmsys",
564-
.data = &mt8186_mmsys_driver_data},
661+
.data = &mt8186_mmsys_match_data},
565662
{ .compatible = "mediatek,mt8192-mmsys",
566-
.data = &mt8192_mmsys_driver_data},
663+
.data = &mt8192_mmsys_match_data},
664+
{ .compatible = "mediatek,mt8195-mmsys",
665+
.data = &mt8195_mmsys_match_data},
567666
{ }
568667
};
569668
MODULE_DEVICE_TABLE(of, mtk_drm_of_ids);
570669

670+
static int mtk_drm_find_match_data(struct device *dev,
671+
const struct mtk_mmsys_match_data *match_data)
672+
{
673+
int i;
674+
struct platform_device *pdev = of_find_device_by_node(dev->parent->of_node);
675+
struct resource *res;
676+
677+
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
678+
if (!res) {
679+
dev_err(dev, "failed to get parent resource\n");
680+
return -EINVAL;
681+
}
682+
683+
for (i = 0; i < match_data->num_drv_data; i++)
684+
if (match_data->drv_data[i]->io_start == res->start)
685+
return i;
686+
687+
return -EINVAL;
688+
}
689+
571690
static int mtk_drm_probe(struct platform_device *pdev)
572691
{
573692
struct device *dev = &pdev->dev;
574693
struct device_node *phandle = dev->parent->of_node;
575694
const struct of_device_id *of_id;
695+
const struct mtk_mmsys_match_data *match_data;
576696
struct mtk_drm_private *private;
577697
struct device_node *node;
578698
struct component_match *match = NULL;
@@ -593,7 +713,19 @@ static int mtk_drm_probe(struct platform_device *pdev)
593713
if (!of_id)
594714
return -ENODEV;
595715

596-
private->data = of_id->data;
716+
match_data = of_id->data;
717+
if (match_data->num_drv_data > 1) {
718+
/* This SoC has multiple mmsys channels */
719+
ret = mtk_drm_find_match_data(dev, match_data);
720+
if (ret < 0) {
721+
dev_err(dev, "Couldn't get match driver data\n");
722+
return ret;
723+
}
724+
private->data = match_data->drv_data[ret];
725+
} else {
726+
dev_dbg(dev, "Using single mmsys channel\n");
727+
private->data = match_data->drv_data[0];
728+
}
597729

598730
/* Iterate over sibling DISP function blocks */
599731
for_each_child_of_node(phandle->parent, node) {

drivers/gpu/drm/mediatek/mtk_drm_drv.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ struct drm_property;
2121
struct regmap;
2222

2323
struct mtk_mmsys_driver_data {
24+
const resource_size_t io_start;
2425
const enum mtk_ddp_comp_id *main_path;
2526
unsigned int main_len;
2627
const enum mtk_ddp_comp_id *ext_path;
@@ -31,6 +32,11 @@ struct mtk_mmsys_driver_data {
3132
bool shadow_register;
3233
};
3334

35+
struct mtk_mmsys_match_data {
36+
unsigned short num_drv_data;
37+
const struct mtk_mmsys_driver_data *drv_data[];
38+
};
39+
3440
struct mtk_drm_private {
3541
struct drm_device *drm;
3642
struct device *dma_dev;

0 commit comments

Comments
 (0)