Skip to content

Commit 544d8b9

Browse files
fltorobclark
authored andcommitted
drm/msm/dpu: update UBWC config for sm8150 and sm8250
Update the UBWC registers to the right values for sm8150 and sm8250. This removes broken dpu_hw_reset_ubwc, which doesn't work because the "force blk offset to zero to access beginning of register region" hack is copied from downstream, where mapped region starts 0x1000 below what is used in the upstream driver. Also simplifies the overly complicated change that was introduced in e4f9bbe to work around dpu_hw_reset_ubwc being broken. Signed-off-by: Jonathan Marek <[email protected]> Signed-off-by: Rob Clark <[email protected]>
1 parent de321dc commit 544d8b9

File tree

6 files changed

+42
-90
lines changed

6 files changed

+42
-90
lines changed

drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,7 +1088,6 @@ static void _dpu_encoder_virt_enable_helper(struct drm_encoder *drm_enc)
10881088
{
10891089
struct dpu_encoder_virt *dpu_enc = NULL;
10901090
struct msm_drm_private *priv;
1091-
struct dpu_kms *dpu_kms;
10921091
int i;
10931092

10941093
if (!drm_enc || !drm_enc->dev) {
@@ -1097,20 +1096,13 @@ static void _dpu_encoder_virt_enable_helper(struct drm_encoder *drm_enc)
10971096
}
10981097

10991098
priv = drm_enc->dev->dev_private;
1100-
dpu_kms = to_dpu_kms(priv->kms);
11011099

11021100
dpu_enc = to_dpu_encoder_virt(drm_enc);
11031101
if (!dpu_enc || !dpu_enc->cur_master) {
11041102
DPU_ERROR("invalid dpu encoder/master\n");
11051103
return;
11061104
}
11071105

1108-
if (dpu_enc->cur_master->hw_mdptop &&
1109-
dpu_enc->cur_master->hw_mdptop->ops.reset_ubwc)
1110-
dpu_enc->cur_master->hw_mdptop->ops.reset_ubwc(
1111-
dpu_enc->cur_master->hw_mdptop,
1112-
dpu_kms->catalog);
1113-
11141106
_dpu_encoder_update_vsync_source(dpu_enc, &dpu_enc->disp_info);
11151107

11161108
if (dpu_enc->disp_info.intf_type == DRM_MODE_ENCODER_DSI &&

drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@
3737
#define DPU_HW_VER_400 DPU_HW_VER(4, 0, 0) /* sdm845 v1.0 */
3838
#define DPU_HW_VER_401 DPU_HW_VER(4, 0, 1) /* sdm845 v2.0 */
3939
#define DPU_HW_VER_410 DPU_HW_VER(4, 1, 0) /* sdm670 v1.0 */
40-
#define DPU_HW_VER_500 DPU_HW_VER(5, 0, 0) /* sdm855 v1.0 */
40+
#define DPU_HW_VER_500 DPU_HW_VER(5, 0, 0) /* sm8150 v1.0 */
41+
#define DPU_HW_VER_501 DPU_HW_VER(5, 0, 1) /* sm8150 v2.0 */
42+
#define DPU_HW_VER_600 DPU_HW_VER(6, 0, 0) /* sm8250 */
4143
#define DPU_HW_VER_620 DPU_HW_VER(6, 2, 0) /* sc7180 v1.0 */
4244

4345

@@ -65,10 +67,9 @@ enum {
6567
DPU_HW_UBWC_VER_10 = 0x100,
6668
DPU_HW_UBWC_VER_20 = 0x200,
6769
DPU_HW_UBWC_VER_30 = 0x300,
70+
DPU_HW_UBWC_VER_40 = 0x400,
6871
};
6972

70-
#define IS_UBWC_20_SUPPORTED(rev) ((rev) >= DPU_HW_UBWC_VER_20)
71-
7273
/**
7374
* MDP TOP BLOCK features
7475
* @DPU_MDP_PANIC_PER_PIPE Panic configuration needs to be be done per pipe
@@ -447,7 +448,6 @@ struct dpu_clk_ctrl_reg {
447448
struct dpu_mdp_cfg {
448449
DPU_HW_BLK_INFO;
449450
u32 highest_bank_bit;
450-
u32 ubwc_static;
451451
u32 ubwc_swizzle;
452452
struct dpu_clk_ctrl_reg clk_ctrls[DPU_CLK_CTRL_MAX];
453453
};

drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,11 +303,25 @@ static void dpu_hw_sspp_setup_format(struct dpu_hw_pipe *ctx,
303303
DPU_REG_WRITE(c, SSPP_FETCH_CONFIG,
304304
DPU_FETCH_CONFIG_RESET_VALUE |
305305
ctx->mdp->highest_bank_bit << 18);
306-
if (IS_UBWC_20_SUPPORTED(ctx->catalog->caps->ubwc_version)) {
306+
switch (ctx->catalog->caps->ubwc_version) {
307+
case DPU_HW_UBWC_VER_10:
308+
/* TODO: UBWC v1 case */
309+
break;
310+
case DPU_HW_UBWC_VER_20:
307311
fast_clear = fmt->alpha_enable ? BIT(31) : 0;
308312
DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL,
309313
fast_clear | (ctx->mdp->ubwc_swizzle) |
310314
(ctx->mdp->highest_bank_bit << 4));
315+
break;
316+
case DPU_HW_UBWC_VER_30:
317+
DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL,
318+
BIT(30) | (ctx->mdp->ubwc_swizzle) |
319+
(ctx->mdp->highest_bank_bit << 4));
320+
break;
321+
case DPU_HW_UBWC_VER_40:
322+
DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL,
323+
DPU_FORMAT_IS_YUV(fmt) ? 0 : BIT(30));
324+
break;
311325
}
312326
}
313327

drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#include "dpu_kms.h"
99

1010
#define SSPP_SPARE 0x28
11-
#define UBWC_STATIC 0x144
1211

1312
#define FLD_SPLIT_DISPLAY_CMD BIT(1)
1413
#define FLD_SMART_PANEL_FREE_RUN BIT(2)
@@ -249,22 +248,6 @@ static void dpu_hw_get_safe_status(struct dpu_hw_mdp *mdp,
249248
status->sspp[SSPP_CURSOR1] = (value >> 26) & 0x1;
250249
}
251250

252-
static void dpu_hw_reset_ubwc(struct dpu_hw_mdp *mdp, struct dpu_mdss_cfg *m)
253-
{
254-
struct dpu_hw_blk_reg_map c;
255-
256-
if (!mdp || !m)
257-
return;
258-
259-
if (!IS_UBWC_20_SUPPORTED(m->caps->ubwc_version))
260-
return;
261-
262-
/* force blk offset to zero to access beginning of register region */
263-
c = mdp->hw;
264-
c.blk_off = 0x0;
265-
DPU_REG_WRITE(&c, UBWC_STATIC, m->mdp[0].ubwc_static);
266-
}
267-
268251
static void dpu_hw_intf_audio_select(struct dpu_hw_mdp *mdp)
269252
{
270253
struct dpu_hw_blk_reg_map *c;
@@ -285,7 +268,6 @@ static void _setup_mdp_ops(struct dpu_hw_mdp_ops *ops,
285268
ops->get_danger_status = dpu_hw_get_danger_status;
286269
ops->setup_vsync_source = dpu_hw_setup_vsync_source;
287270
ops->get_safe_status = dpu_hw_get_safe_status;
288-
ops->reset_ubwc = dpu_hw_reset_ubwc;
289271
ops->intf_audio_select = dpu_hw_intf_audio_select;
290272
}
291273

drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,6 @@ struct dpu_hw_mdp_ops {
126126
void (*get_safe_status)(struct dpu_hw_mdp *mdp,
127127
struct dpu_danger_safe_status *status);
128128

129-
/**
130-
* reset_ubwc - reset top level UBWC configuration
131-
* @mdp: mdp top context driver
132-
* @m: pointer to mdss catalog data
133-
*/
134-
void (*reset_ubwc)(struct dpu_hw_mdp *mdp, struct dpu_mdss_cfg *m);
135-
136129
/**
137130
* intf_audio_select - select the external interface for audio
138131
* @mdp: mdp top context driver

drivers/gpu/drm/msm/disp/dpu1/dpu_mdss.c

Lines changed: 23 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
#define HW_REV 0x0
1616
#define HW_INTR_STATUS 0x0010
1717

18+
#define UBWC_STATIC 0x144
19+
#define UBWC_CTRL_2 0x150
20+
#define UBWC_PREDICTION_MODE 0x154
21+
1822
/* Max BW defined in KBps */
1923
#define MAX_BW 6800000
2024

@@ -23,17 +27,6 @@ struct dpu_irq_controller {
2327
struct irq_domain *domain;
2428
};
2529

26-
struct dpu_hw_cfg {
27-
u32 val;
28-
u32 offset;
29-
};
30-
31-
struct dpu_mdss_hw_init_handler {
32-
u32 hw_rev;
33-
u32 hw_reg_count;
34-
struct dpu_hw_cfg* hw_cfg;
35-
};
36-
3730
struct dpu_mdss {
3831
struct msm_mdss base;
3932
void __iomem *mmio;
@@ -43,44 +36,6 @@ struct dpu_mdss {
4336
u32 num_paths;
4437
};
4538

46-
static struct dpu_hw_cfg hw_cfg[] = {
47-
{
48-
/* UBWC global settings */
49-
.val = 0x1E,
50-
.offset = 0x144,
51-
}
52-
};
53-
54-
static struct dpu_mdss_hw_init_handler cfg_handler[] = {
55-
{ .hw_rev = DPU_HW_VER_620,
56-
.hw_reg_count = ARRAY_SIZE(hw_cfg),
57-
.hw_cfg = hw_cfg
58-
},
59-
};
60-
61-
static void dpu_mdss_hw_init(struct dpu_mdss *dpu_mdss, u32 hw_rev)
62-
{
63-
int i;
64-
u32 count = 0;
65-
struct dpu_hw_cfg *hw_cfg = NULL;
66-
67-
for (i = 0; i < ARRAY_SIZE(cfg_handler); i++) {
68-
if (cfg_handler[i].hw_rev == hw_rev) {
69-
hw_cfg = cfg_handler[i].hw_cfg;
70-
count = cfg_handler[i].hw_reg_count;
71-
break;
72-
}
73-
}
74-
75-
for (i = 0; i < count; i++ ) {
76-
writel_relaxed(hw_cfg->val,
77-
dpu_mdss->mmio + hw_cfg->offset);
78-
hw_cfg++;
79-
}
80-
81-
return;
82-
}
83-
8439
static int dpu_mdss_parse_data_bus_icc_path(struct drm_device *dev,
8540
struct dpu_mdss *dpu_mdss)
8641
{
@@ -223,7 +178,6 @@ static int dpu_mdss_enable(struct msm_mdss *mdss)
223178
struct dpu_mdss *dpu_mdss = to_dpu_mdss(mdss);
224179
struct dss_module_power *mp = &dpu_mdss->mp;
225180
int ret;
226-
u32 mdss_rev;
227181

228182
dpu_mdss_icc_request_bw(mdss);
229183

@@ -233,8 +187,25 @@ static int dpu_mdss_enable(struct msm_mdss *mdss)
233187
return ret;
234188
}
235189

236-
mdss_rev = readl_relaxed(dpu_mdss->mmio + HW_REV);
237-
dpu_mdss_hw_init(dpu_mdss, mdss_rev);
190+
/*
191+
* ubwc config is part of the "mdss" region which is not accessible
192+
* from the rest of the driver. hardcode known configurations here
193+
*/
194+
switch (readl_relaxed(dpu_mdss->mmio + HW_REV)) {
195+
case DPU_HW_VER_500:
196+
case DPU_HW_VER_501:
197+
writel_relaxed(0x420, dpu_mdss->mmio + UBWC_STATIC);
198+
break;
199+
case DPU_HW_VER_600:
200+
/* TODO: 0x102e for LP_DDR4 */
201+
writel_relaxed(0x103e, dpu_mdss->mmio + UBWC_STATIC);
202+
writel_relaxed(2, dpu_mdss->mmio + UBWC_CTRL_2);
203+
writel_relaxed(1, dpu_mdss->mmio + UBWC_PREDICTION_MODE);
204+
break;
205+
case DPU_HW_VER_620:
206+
writel_relaxed(0x1e, dpu_mdss->mmio + UBWC_STATIC);
207+
break;
208+
}
238209

239210
return ret;
240211
}

0 commit comments

Comments
 (0)