Commit 346faacf authored by Neil Armstrong's avatar Neil Armstrong Committed by Rob Clark

drm/msm/dpu: move setup_force_clk_ctrl handling into plane and wb

Now SSPP and WB can have setup_force_clk_ctrl() ops, it's simpler to call
them from the plane and wb code and call into the mdp ops if not present.
Reviewed-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: default avatarNeil Armstrong <neil.armstrong@linaro.org>
Patchwork: https://patchwork.freedesktop.org/patch/562325/Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
parent 87e96867
...@@ -34,6 +34,23 @@ static bool dpu_encoder_phys_wb_is_master(struct dpu_encoder_phys *phys_enc) ...@@ -34,6 +34,23 @@ static bool dpu_encoder_phys_wb_is_master(struct dpu_encoder_phys *phys_enc)
return true; return true;
} }
static bool _dpu_encoder_phys_wb_clk_force_ctrl(struct dpu_hw_wb *wb,
struct dpu_hw_mdp *mdp,
bool enable, bool *forced_on)
{
if (wb->ops.setup_clk_force_ctrl) {
*forced_on = wb->ops.setup_clk_force_ctrl(wb, enable);
return true;
}
if (mdp->ops.setup_clk_force_ctrl) {
*forced_on = mdp->ops.setup_clk_force_ctrl(mdp, wb->caps->clk_ctrl, enable);
return true;
}
return false;
}
/** /**
* dpu_encoder_phys_wb_set_ot_limit - set OT limit for writeback interface * dpu_encoder_phys_wb_set_ot_limit - set OT limit for writeback interface
* @phys_enc: Pointer to physical encoder * @phys_enc: Pointer to physical encoder
...@@ -43,6 +60,7 @@ static void dpu_encoder_phys_wb_set_ot_limit( ...@@ -43,6 +60,7 @@ static void dpu_encoder_phys_wb_set_ot_limit(
{ {
struct dpu_hw_wb *hw_wb = phys_enc->hw_wb; struct dpu_hw_wb *hw_wb = phys_enc->hw_wb;
struct dpu_vbif_set_ot_params ot_params; struct dpu_vbif_set_ot_params ot_params;
bool forced_on = false;
memset(&ot_params, 0, sizeof(ot_params)); memset(&ot_params, 0, sizeof(ot_params));
ot_params.xin_id = hw_wb->caps->xin_id; ot_params.xin_id = hw_wb->caps->xin_id;
...@@ -52,10 +70,17 @@ static void dpu_encoder_phys_wb_set_ot_limit( ...@@ -52,10 +70,17 @@ static void dpu_encoder_phys_wb_set_ot_limit(
ot_params.is_wfd = true; ot_params.is_wfd = true;
ot_params.frame_rate = drm_mode_vrefresh(&phys_enc->cached_mode); ot_params.frame_rate = drm_mode_vrefresh(&phys_enc->cached_mode);
ot_params.vbif_idx = hw_wb->caps->vbif_idx; ot_params.vbif_idx = hw_wb->caps->vbif_idx;
ot_params.clk_ctrl = hw_wb->caps->clk_ctrl;
ot_params.rd = false; ot_params.rd = false;
if (!_dpu_encoder_phys_wb_clk_force_ctrl(hw_wb, phys_enc->dpu_kms->hw_mdp,
true, &forced_on))
return;
dpu_vbif_set_ot_limit(phys_enc->dpu_kms, &ot_params); dpu_vbif_set_ot_limit(phys_enc->dpu_kms, &ot_params);
if (forced_on)
_dpu_encoder_phys_wb_clk_force_ctrl(hw_wb, phys_enc->dpu_kms->hw_mdp,
false, &forced_on);
} }
/** /**
...@@ -67,6 +92,7 @@ static void dpu_encoder_phys_wb_set_qos_remap( ...@@ -67,6 +92,7 @@ static void dpu_encoder_phys_wb_set_qos_remap(
{ {
struct dpu_hw_wb *hw_wb; struct dpu_hw_wb *hw_wb;
struct dpu_vbif_set_qos_params qos_params; struct dpu_vbif_set_qos_params qos_params;
bool forced_on = false;
if (!phys_enc || !phys_enc->parent || !phys_enc->parent->crtc) { if (!phys_enc || !phys_enc->parent || !phys_enc->parent->crtc) {
DPU_ERROR("invalid arguments\n"); DPU_ERROR("invalid arguments\n");
...@@ -83,7 +109,6 @@ static void dpu_encoder_phys_wb_set_qos_remap( ...@@ -83,7 +109,6 @@ static void dpu_encoder_phys_wb_set_qos_remap(
memset(&qos_params, 0, sizeof(qos_params)); memset(&qos_params, 0, sizeof(qos_params));
qos_params.vbif_idx = hw_wb->caps->vbif_idx; qos_params.vbif_idx = hw_wb->caps->vbif_idx;
qos_params.xin_id = hw_wb->caps->xin_id; qos_params.xin_id = hw_wb->caps->xin_id;
qos_params.clk_ctrl = hw_wb->caps->clk_ctrl;
qos_params.num = hw_wb->idx - WB_0; qos_params.num = hw_wb->idx - WB_0;
qos_params.is_rt = false; qos_params.is_rt = false;
...@@ -92,7 +117,15 @@ static void dpu_encoder_phys_wb_set_qos_remap( ...@@ -92,7 +117,15 @@ static void dpu_encoder_phys_wb_set_qos_remap(
qos_params.vbif_idx, qos_params.vbif_idx,
qos_params.xin_id, qos_params.is_rt); qos_params.xin_id, qos_params.is_rt);
if (!_dpu_encoder_phys_wb_clk_force_ctrl(hw_wb, phys_enc->dpu_kms->hw_mdp,
true, &forced_on))
return;
dpu_vbif_set_qos_remap(phys_enc->dpu_kms, &qos_params); dpu_vbif_set_qos_remap(phys_enc->dpu_kms, &qos_params);
if (forced_on)
_dpu_encoder_phys_wb_clk_force_ctrl(hw_wb, phys_enc->dpu_kms->hw_mdp,
false, &forced_on);
} }
/** /**
......
...@@ -333,6 +333,23 @@ static void _dpu_plane_set_qos_ctrl(struct drm_plane *plane, ...@@ -333,6 +333,23 @@ static void _dpu_plane_set_qos_ctrl(struct drm_plane *plane,
enable); enable);
} }
static bool _dpu_plane_sspp_clk_force_ctrl(struct dpu_hw_sspp *sspp,
struct dpu_hw_mdp *mdp,
bool enable, bool *forced_on)
{
if (sspp->ops.setup_clk_force_ctrl) {
*forced_on = sspp->ops.setup_clk_force_ctrl(sspp, enable);
return true;
}
if (mdp->ops.setup_clk_force_ctrl) {
*forced_on = mdp->ops.setup_clk_force_ctrl(mdp, sspp->cap->clk_ctrl, enable);
return true;
}
return false;
}
/** /**
* _dpu_plane_set_ot_limit - set OT limit for the given plane * _dpu_plane_set_ot_limit - set OT limit for the given plane
* @plane: Pointer to drm plane * @plane: Pointer to drm plane
...@@ -348,6 +365,7 @@ static void _dpu_plane_set_ot_limit(struct drm_plane *plane, ...@@ -348,6 +365,7 @@ static void _dpu_plane_set_ot_limit(struct drm_plane *plane,
struct dpu_plane *pdpu = to_dpu_plane(plane); struct dpu_plane *pdpu = to_dpu_plane(plane);
struct dpu_vbif_set_ot_params ot_params; struct dpu_vbif_set_ot_params ot_params;
struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane); struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane);
bool forced_on = false;
memset(&ot_params, 0, sizeof(ot_params)); memset(&ot_params, 0, sizeof(ot_params));
ot_params.xin_id = pipe->sspp->cap->xin_id; ot_params.xin_id = pipe->sspp->cap->xin_id;
...@@ -357,10 +375,17 @@ static void _dpu_plane_set_ot_limit(struct drm_plane *plane, ...@@ -357,10 +375,17 @@ static void _dpu_plane_set_ot_limit(struct drm_plane *plane,
ot_params.is_wfd = !pdpu->is_rt_pipe; ot_params.is_wfd = !pdpu->is_rt_pipe;
ot_params.frame_rate = frame_rate; ot_params.frame_rate = frame_rate;
ot_params.vbif_idx = VBIF_RT; ot_params.vbif_idx = VBIF_RT;
ot_params.clk_ctrl = pipe->sspp->cap->clk_ctrl;
ot_params.rd = true; ot_params.rd = true;
if (!_dpu_plane_sspp_clk_force_ctrl(pipe->sspp, dpu_kms->hw_mdp,
true, &forced_on))
return;
dpu_vbif_set_ot_limit(dpu_kms, &ot_params); dpu_vbif_set_ot_limit(dpu_kms, &ot_params);
if (forced_on)
_dpu_plane_sspp_clk_force_ctrl(pipe->sspp, dpu_kms->hw_mdp,
false, &forced_on);
} }
/** /**
...@@ -374,21 +399,28 @@ static void _dpu_plane_set_qos_remap(struct drm_plane *plane, ...@@ -374,21 +399,28 @@ static void _dpu_plane_set_qos_remap(struct drm_plane *plane,
struct dpu_plane *pdpu = to_dpu_plane(plane); struct dpu_plane *pdpu = to_dpu_plane(plane);
struct dpu_vbif_set_qos_params qos_params; struct dpu_vbif_set_qos_params qos_params;
struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane); struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane);
bool forced_on = false;
memset(&qos_params, 0, sizeof(qos_params)); memset(&qos_params, 0, sizeof(qos_params));
qos_params.vbif_idx = VBIF_RT; qos_params.vbif_idx = VBIF_RT;
qos_params.clk_ctrl = pipe->sspp->cap->clk_ctrl;
qos_params.xin_id = pipe->sspp->cap->xin_id; qos_params.xin_id = pipe->sspp->cap->xin_id;
qos_params.num = pipe->sspp->idx - SSPP_VIG0; qos_params.num = pipe->sspp->idx - SSPP_VIG0;
qos_params.is_rt = pdpu->is_rt_pipe; qos_params.is_rt = pdpu->is_rt_pipe;
DPU_DEBUG_PLANE(pdpu, "pipe:%d vbif:%d xin:%d rt:%d, clk_ctrl:%d\n", DPU_DEBUG_PLANE(pdpu, "pipe:%d vbif:%d xin:%d rt:%d\n",
qos_params.num, qos_params.num,
qos_params.vbif_idx, qos_params.vbif_idx,
qos_params.xin_id, qos_params.is_rt, qos_params.xin_id, qos_params.is_rt);
qos_params.clk_ctrl);
if (!_dpu_plane_sspp_clk_force_ctrl(pipe->sspp, dpu_kms->hw_mdp,
true, &forced_on))
return;
dpu_vbif_set_qos_remap(dpu_kms, &qos_params); dpu_vbif_set_qos_remap(dpu_kms, &qos_params);
if (forced_on)
_dpu_plane_sspp_clk_force_ctrl(pipe->sspp, dpu_kms->hw_mdp,
false, &forced_on);
} }
static void _dpu_plane_setup_scaler3(struct dpu_hw_sspp *pipe_hw, static void _dpu_plane_setup_scaler3(struct dpu_hw_sspp *pipe_hw,
......
...@@ -169,23 +169,16 @@ void dpu_vbif_set_ot_limit(struct dpu_kms *dpu_kms, ...@@ -169,23 +169,16 @@ void dpu_vbif_set_ot_limit(struct dpu_kms *dpu_kms,
struct dpu_vbif_set_ot_params *params) struct dpu_vbif_set_ot_params *params)
{ {
struct dpu_hw_vbif *vbif; struct dpu_hw_vbif *vbif;
struct dpu_hw_mdp *mdp;
bool forced_on = false;
u32 ot_lim; u32 ot_lim;
int ret; int ret;
mdp = dpu_kms->hw_mdp;
vbif = dpu_get_vbif(dpu_kms, params->vbif_idx); vbif = dpu_get_vbif(dpu_kms, params->vbif_idx);
if (!vbif || !mdp) { if (!vbif) {
DRM_DEBUG_ATOMIC("invalid arguments vbif %d mdp %d\n", DRM_DEBUG_ATOMIC("invalid arguments vbif %d\n", vbif != NULL);
vbif != NULL, mdp != NULL);
return; return;
} }
if (!mdp->ops.setup_clk_force_ctrl || if (!vbif->ops.set_limit_conf || !vbif->ops.set_halt_ctrl)
!vbif->ops.set_limit_conf ||
!vbif->ops.set_halt_ctrl)
return; return;
/* set write_gather_en for all write clients */ /* set write_gather_en for all write clients */
...@@ -200,8 +193,6 @@ void dpu_vbif_set_ot_limit(struct dpu_kms *dpu_kms, ...@@ -200,8 +193,6 @@ void dpu_vbif_set_ot_limit(struct dpu_kms *dpu_kms,
trace_dpu_perf_set_ot(params->num, params->xin_id, ot_lim, trace_dpu_perf_set_ot(params->num, params->xin_id, ot_lim,
params->vbif_idx); params->vbif_idx);
forced_on = mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, true);
vbif->ops.set_limit_conf(vbif, params->xin_id, params->rd, ot_lim); vbif->ops.set_limit_conf(vbif, params->xin_id, params->rd, ot_lim);
vbif->ops.set_halt_ctrl(vbif, params->xin_id, true); vbif->ops.set_halt_ctrl(vbif, params->xin_id, true);
...@@ -211,25 +202,19 @@ void dpu_vbif_set_ot_limit(struct dpu_kms *dpu_kms, ...@@ -211,25 +202,19 @@ void dpu_vbif_set_ot_limit(struct dpu_kms *dpu_kms,
trace_dpu_vbif_wait_xin_halt_fail(vbif->idx, params->xin_id); trace_dpu_vbif_wait_xin_halt_fail(vbif->idx, params->xin_id);
vbif->ops.set_halt_ctrl(vbif, params->xin_id, false); vbif->ops.set_halt_ctrl(vbif, params->xin_id, false);
if (forced_on)
mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, false);
} }
void dpu_vbif_set_qos_remap(struct dpu_kms *dpu_kms, void dpu_vbif_set_qos_remap(struct dpu_kms *dpu_kms,
struct dpu_vbif_set_qos_params *params) struct dpu_vbif_set_qos_params *params)
{ {
struct dpu_hw_vbif *vbif; struct dpu_hw_vbif *vbif;
struct dpu_hw_mdp *mdp;
bool forced_on = false;
const struct dpu_vbif_qos_tbl *qos_tbl; const struct dpu_vbif_qos_tbl *qos_tbl;
int i; int i;
if (!params || !dpu_kms->hw_mdp) { if (!params) {
DPU_ERROR("invalid arguments\n"); DPU_ERROR("invalid arguments\n");
return; return;
} }
mdp = dpu_kms->hw_mdp;
vbif = dpu_get_vbif(dpu_kms, params->vbif_idx); vbif = dpu_get_vbif(dpu_kms, params->vbif_idx);
...@@ -238,7 +223,7 @@ void dpu_vbif_set_qos_remap(struct dpu_kms *dpu_kms, ...@@ -238,7 +223,7 @@ void dpu_vbif_set_qos_remap(struct dpu_kms *dpu_kms,
return; return;
} }
if (!vbif->ops.set_qos_remap || !mdp->ops.setup_clk_force_ctrl) { if (!vbif->ops.set_qos_remap) {
DRM_DEBUG_ATOMIC("qos remap not supported\n"); DRM_DEBUG_ATOMIC("qos remap not supported\n");
return; return;
} }
...@@ -251,8 +236,6 @@ void dpu_vbif_set_qos_remap(struct dpu_kms *dpu_kms, ...@@ -251,8 +236,6 @@ void dpu_vbif_set_qos_remap(struct dpu_kms *dpu_kms,
return; return;
} }
forced_on = mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, true);
for (i = 0; i < qos_tbl->npriority_lvl; i++) { for (i = 0; i < qos_tbl->npriority_lvl; i++) {
DRM_DEBUG_ATOMIC("%s xin:%d lvl:%d/%d\n", DRM_DEBUG_ATOMIC("%s xin:%d lvl:%d/%d\n",
dpu_vbif_name(params->vbif_idx), params->xin_id, i, dpu_vbif_name(params->vbif_idx), params->xin_id, i,
...@@ -260,9 +243,6 @@ void dpu_vbif_set_qos_remap(struct dpu_kms *dpu_kms, ...@@ -260,9 +243,6 @@ void dpu_vbif_set_qos_remap(struct dpu_kms *dpu_kms,
vbif->ops.set_qos_remap(vbif, params->xin_id, i, vbif->ops.set_qos_remap(vbif, params->xin_id, i,
qos_tbl->priority_lvl[i]); qos_tbl->priority_lvl[i]);
} }
if (forced_on)
mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, false);
} }
void dpu_vbif_clear_errors(struct dpu_kms *dpu_kms) void dpu_vbif_clear_errors(struct dpu_kms *dpu_kms)
......
...@@ -16,13 +16,11 @@ struct dpu_vbif_set_ot_params { ...@@ -16,13 +16,11 @@ struct dpu_vbif_set_ot_params {
bool rd; bool rd;
bool is_wfd; bool is_wfd;
u32 vbif_idx; u32 vbif_idx;
u32 clk_ctrl;
}; };
struct dpu_vbif_set_memtype_params { struct dpu_vbif_set_memtype_params {
u32 xin_id; u32 xin_id;
u32 vbif_idx; u32 vbif_idx;
u32 clk_ctrl;
bool is_cacheable; bool is_cacheable;
}; };
...@@ -30,14 +28,12 @@ struct dpu_vbif_set_memtype_params { ...@@ -30,14 +28,12 @@ struct dpu_vbif_set_memtype_params {
* struct dpu_vbif_set_qos_params - QoS remapper parameter * struct dpu_vbif_set_qos_params - QoS remapper parameter
* @vbif_idx: vbif identifier * @vbif_idx: vbif identifier
* @xin_id: client interface identifier * @xin_id: client interface identifier
* @clk_ctrl: clock control identifier of the xin
* @num: pipe identifier (debug only) * @num: pipe identifier (debug only)
* @is_rt: true if pipe is used in real-time use case * @is_rt: true if pipe is used in real-time use case
*/ */
struct dpu_vbif_set_qos_params { struct dpu_vbif_set_qos_params {
u32 vbif_idx; u32 vbif_idx;
u32 xin_id; u32 xin_id;
u32 clk_ctrl;
u32 num; u32 num;
bool is_rt; bool is_rt;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment