Skip to content

Commit a55c8ff

Browse files
committed
drm/msm/mdss: Handle the reg bus ICC path
Apart from the already handled data bus (MAS_MDP_Pn<->DDR), there's another path that needs to be handled to ensure MDSS functions properly, namely the "reg bus", a.k.a the CPU-MDSS interconnect. Gating that path may have a variety of effects, from none to otherwise inexplicable DSI timeouts. Provide a way for MDSS driver to vote on this bus. A note regarding vote values. Newer platforms have corresponding bandwidth values in the vendor DT files. For the older platforms there was a static vote in the mdss_mdp and rotator drivers. I choose to be conservative here and choose this value as a default. Co-developed-by: Konrad Dybcio <[email protected]> Signed-off-by: Konrad Dybcio <[email protected]> Signed-off-by: Dmitry Baryshkov <[email protected]> Reviewed-by: Abhinav Kumar <[email protected]> Patchwork: https://patchwork.freedesktop.org/patch/570164/ Link: https://lore.kernel.org/r/[email protected]
1 parent 7323694 commit a55c8ff

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-4
lines changed

drivers/gpu/drm/msm/msm_mdss.c

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828

2929
#define MIN_IB_BW 400000000UL /* Min ib vote 400MB */
3030

31+
#define DEFAULT_REG_BW 153600 /* Used in mdss fbdev driver */
32+
3133
struct msm_mdss {
3234
struct device *dev;
3335

@@ -42,13 +44,15 @@ struct msm_mdss {
4244
const struct msm_mdss_data *mdss_data;
4345
struct icc_path *mdp_path[2];
4446
u32 num_mdp_paths;
47+
struct icc_path *reg_bus_path;
4548
};
4649

4750
static int msm_mdss_parse_data_bus_icc_path(struct device *dev,
4851
struct msm_mdss *msm_mdss)
4952
{
5053
struct icc_path *path0;
5154
struct icc_path *path1;
55+
struct icc_path *reg_bus_path;
5256

5357
path0 = devm_of_icc_get(dev, "mdp0-mem");
5458
if (IS_ERR_OR_NULL(path0))
@@ -63,6 +67,10 @@ static int msm_mdss_parse_data_bus_icc_path(struct device *dev,
6367
msm_mdss->num_mdp_paths++;
6468
}
6569

70+
reg_bus_path = of_icc_get(dev, "cpu-cfg");
71+
if (!IS_ERR_OR_NULL(reg_bus_path))
72+
msm_mdss->reg_bus_path = reg_bus_path;
73+
6674
return 0;
6775
}
6876

@@ -229,6 +237,13 @@ static int msm_mdss_enable(struct msm_mdss *msm_mdss)
229237
for (i = 0; i < msm_mdss->num_mdp_paths; i++)
230238
icc_set_bw(msm_mdss->mdp_path[i], 0, Bps_to_icc(MIN_IB_BW));
231239

240+
if (msm_mdss->mdss_data && msm_mdss->mdss_data->reg_bus_bw)
241+
icc_set_bw(msm_mdss->reg_bus_path, 0,
242+
msm_mdss->mdss_data->reg_bus_bw);
243+
else
244+
icc_set_bw(msm_mdss->reg_bus_path, 0,
245+
DEFAULT_REG_BW);
246+
232247
ret = clk_bulk_prepare_enable(msm_mdss->num_clocks, msm_mdss->clocks);
233248
if (ret) {
234249
dev_err(msm_mdss->dev, "clock enable failed, ret:%d\n", ret);
@@ -286,6 +301,9 @@ static int msm_mdss_disable(struct msm_mdss *msm_mdss)
286301
for (i = 0; i < msm_mdss->num_mdp_paths; i++)
287302
icc_set_bw(msm_mdss->mdp_path[i], 0, 0);
288303

304+
if (msm_mdss->reg_bus_path)
305+
icc_set_bw(msm_mdss->reg_bus_path, 0, 0);
306+
289307
return 0;
290308
}
291309

@@ -372,6 +390,8 @@ static struct msm_mdss *msm_mdss_init(struct platform_device *pdev, bool is_mdp5
372390
if (!msm_mdss)
373391
return ERR_PTR(-ENOMEM);
374392

393+
msm_mdss->mdss_data = of_device_get_match_data(&pdev->dev);
394+
375395
msm_mdss->mmio = devm_platform_ioremap_resource_byname(pdev, is_mdp5 ? "mdss_phys" : "mdss");
376396
if (IS_ERR(msm_mdss->mmio))
377397
return ERR_CAST(msm_mdss->mmio);
@@ -462,8 +482,6 @@ static int mdss_probe(struct platform_device *pdev)
462482
if (IS_ERR(mdss))
463483
return PTR_ERR(mdss);
464484

465-
mdss->mdss_data = of_device_get_match_data(&pdev->dev);
466-
467485
platform_set_drvdata(pdev, mdss);
468486

469487
/*
@@ -495,18 +513,21 @@ static const struct msm_mdss_data msm8998_data = {
495513
.ubwc_enc_version = UBWC_1_0,
496514
.ubwc_dec_version = UBWC_1_0,
497515
.highest_bank_bit = 2,
516+
.reg_bus_bw = 76800,
498517
};
499518

500519
static const struct msm_mdss_data qcm2290_data = {
501520
/* no UBWC */
502521
.highest_bank_bit = 0x2,
522+
.reg_bus_bw = 76800,
503523
};
504524

505525
static const struct msm_mdss_data sc7180_data = {
506526
.ubwc_enc_version = UBWC_2_0,
507527
.ubwc_dec_version = UBWC_2_0,
508528
.ubwc_static = 0x1e,
509529
.highest_bank_bit = 0x3,
530+
.reg_bus_bw = 76800,
510531
};
511532

512533
static const struct msm_mdss_data sc7280_data = {
@@ -516,13 +537,15 @@ static const struct msm_mdss_data sc7280_data = {
516537
.ubwc_static = 1,
517538
.highest_bank_bit = 1,
518539
.macrotile_mode = 1,
540+
.reg_bus_bw = 74000,
519541
};
520542

521543
static const struct msm_mdss_data sc8180x_data = {
522544
.ubwc_enc_version = UBWC_3_0,
523545
.ubwc_dec_version = UBWC_3_0,
524546
.highest_bank_bit = 3,
525547
.macrotile_mode = 1,
548+
.reg_bus_bw = 76800,
526549
};
527550

528551
static const struct msm_mdss_data sc8280xp_data = {
@@ -532,6 +555,7 @@ static const struct msm_mdss_data sc8280xp_data = {
532555
.ubwc_static = 1,
533556
.highest_bank_bit = 3,
534557
.macrotile_mode = 1,
558+
.reg_bus_bw = 76800,
535559
};
536560

537561
static const struct msm_mdss_data sdm670_data = {
@@ -544,6 +568,7 @@ static const struct msm_mdss_data sdm845_data = {
544568
.ubwc_enc_version = UBWC_2_0,
545569
.ubwc_dec_version = UBWC_2_0,
546570
.highest_bank_bit = 2,
571+
.reg_bus_bw = 76800,
547572
};
548573

549574
static const struct msm_mdss_data sm6350_data = {
@@ -552,12 +577,14 @@ static const struct msm_mdss_data sm6350_data = {
552577
.ubwc_swizzle = 6,
553578
.ubwc_static = 0x1e,
554579
.highest_bank_bit = 1,
580+
.reg_bus_bw = 76800,
555581
};
556582

557583
static const struct msm_mdss_data sm8150_data = {
558584
.ubwc_enc_version = UBWC_3_0,
559585
.ubwc_dec_version = UBWC_3_0,
560586
.highest_bank_bit = 2,
587+
.reg_bus_bw = 76800,
561588
};
562589

563590
static const struct msm_mdss_data sm6115_data = {
@@ -566,6 +593,7 @@ static const struct msm_mdss_data sm6115_data = {
566593
.ubwc_swizzle = 7,
567594
.ubwc_static = 0x11f,
568595
.highest_bank_bit = 0x1,
596+
.reg_bus_bw = 76800,
569597
};
570598

571599
static const struct msm_mdss_data sm6125_data = {
@@ -583,6 +611,18 @@ static const struct msm_mdss_data sm8250_data = {
583611
/* TODO: highest_bank_bit = 2 for LP_DDR4 */
584612
.highest_bank_bit = 3,
585613
.macrotile_mode = 1,
614+
.reg_bus_bw = 76800,
615+
};
616+
617+
static const struct msm_mdss_data sm8350_data = {
618+
.ubwc_enc_version = UBWC_4_0,
619+
.ubwc_dec_version = UBWC_4_0,
620+
.ubwc_swizzle = 6,
621+
.ubwc_static = 1,
622+
/* TODO: highest_bank_bit = 2 for LP_DDR4 */
623+
.highest_bank_bit = 3,
624+
.macrotile_mode = 1,
625+
.reg_bus_bw = 74000,
586626
};
587627

588628
static const struct msm_mdss_data sm8550_data = {
@@ -593,6 +633,7 @@ static const struct msm_mdss_data sm8550_data = {
593633
/* TODO: highest_bank_bit = 2 for LP_DDR4 */
594634
.highest_bank_bit = 3,
595635
.macrotile_mode = 1,
636+
.reg_bus_bw = 57000,
596637
};
597638
static const struct of_device_id mdss_dt_match[] = {
598639
{ .compatible = "qcom,mdss" },
@@ -610,8 +651,8 @@ static const struct of_device_id mdss_dt_match[] = {
610651
{ .compatible = "qcom,sm6375-mdss", .data = &sm6350_data },
611652
{ .compatible = "qcom,sm8150-mdss", .data = &sm8150_data },
612653
{ .compatible = "qcom,sm8250-mdss", .data = &sm8250_data },
613-
{ .compatible = "qcom,sm8350-mdss", .data = &sm8250_data },
614-
{ .compatible = "qcom,sm8450-mdss", .data = &sm8250_data },
654+
{ .compatible = "qcom,sm8350-mdss", .data = &sm8350_data },
655+
{ .compatible = "qcom,sm8450-mdss", .data = &sm8350_data },
615656
{ .compatible = "qcom,sm8550-mdss", .data = &sm8550_data },
616657
{ .compatible = "qcom,sm8650-mdss", .data = &sm8550_data},
617658
{}

drivers/gpu/drm/msm/msm_mdss.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ struct msm_mdss_data {
1414
u32 ubwc_static;
1515
u32 highest_bank_bit;
1616
u32 macrotile_mode;
17+
u32 reg_bus_bw;
1718
};
1819

1920
#define UBWC_1_0 0x10000000

0 commit comments

Comments
 (0)