Merge v5.6-rc2 into drm-misc-next
Lyude needs some patches in 5.6-rc2 and we didn't bring drm-misc-next forward yet, so it looks like a good occasion. Signed-off-by: Maxime Ripard <maxime@cerno.tech>
This commit is contained in:
@@ -197,10 +197,6 @@ static void _dpu_crtc_blend_setup(struct drm_crtc *crtc)
|
||||
DPU_DEBUG("%s\n", dpu_crtc->name);
|
||||
|
||||
for (i = 0; i < cstate->num_mixers; i++) {
|
||||
if (!mixer[i].hw_lm || !mixer[i].lm_ctl) {
|
||||
DPU_ERROR("invalid lm or ctl assigned to mixer\n");
|
||||
return;
|
||||
}
|
||||
mixer[i].mixer_op_mode = 0;
|
||||
mixer[i].flush_mask = 0;
|
||||
if (mixer[i].lm_ctl->ops.clear_all_blendstages)
|
||||
@@ -1113,14 +1109,9 @@ static int _dpu_debugfs_status_show(struct seq_file *s, void *data)
|
||||
|
||||
for (i = 0; i < cstate->num_mixers; ++i) {
|
||||
m = &cstate->mixers[i];
|
||||
if (!m->hw_lm)
|
||||
seq_printf(s, "\tmixer[%d] has no lm\n", i);
|
||||
else if (!m->lm_ctl)
|
||||
seq_printf(s, "\tmixer[%d] has no ctl\n", i);
|
||||
else
|
||||
seq_printf(s, "\tmixer:%d ctl:%d width:%d height:%d\n",
|
||||
m->hw_lm->idx - LM_0, m->lm_ctl->idx - CTL_0,
|
||||
out_width, mode->vdisplay);
|
||||
seq_printf(s, "\tmixer:%d ctl:%d width:%d height:%d\n",
|
||||
m->hw_lm->idx - LM_0, m->lm_ctl->idx - CTL_0,
|
||||
out_width, mode->vdisplay);
|
||||
}
|
||||
|
||||
seq_puts(s, "\n");
|
||||
|
@@ -58,7 +58,7 @@
|
||||
|
||||
#define IDLE_SHORT_TIMEOUT 1
|
||||
|
||||
#define MAX_VDISPLAY_SPLIT 1080
|
||||
#define MAX_HDISPLAY_SPLIT 1080
|
||||
|
||||
/* timeout in frames waiting for frame done */
|
||||
#define DPU_ENCODER_FRAME_DONE_TIMEOUT_FRAMES 5
|
||||
@@ -233,7 +233,7 @@ int dpu_encoder_helper_wait_for_irq(struct dpu_encoder_phys *phys_enc,
|
||||
u32 irq_status;
|
||||
int ret;
|
||||
|
||||
if (!phys_enc || !wait_info || intr_idx >= INTR_IDX_MAX) {
|
||||
if (!wait_info || intr_idx >= INTR_IDX_MAX) {
|
||||
DPU_ERROR("invalid params\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -308,7 +308,7 @@ int dpu_encoder_helper_register_irq(struct dpu_encoder_phys *phys_enc,
|
||||
struct dpu_encoder_irq *irq;
|
||||
int ret = 0;
|
||||
|
||||
if (!phys_enc || intr_idx >= INTR_IDX_MAX) {
|
||||
if (intr_idx >= INTR_IDX_MAX) {
|
||||
DPU_ERROR("invalid params\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -363,10 +363,6 @@ int dpu_encoder_helper_unregister_irq(struct dpu_encoder_phys *phys_enc,
|
||||
struct dpu_encoder_irq *irq;
|
||||
int ret;
|
||||
|
||||
if (!phys_enc) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
irq = &phys_enc->irq[intr_idx];
|
||||
|
||||
/* silently skip irqs that weren't registered */
|
||||
@@ -415,7 +411,7 @@ void dpu_encoder_get_hw_resources(struct drm_encoder *drm_enc,
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (phys && phys->ops.get_hw_resources)
|
||||
if (phys->ops.get_hw_resources)
|
||||
phys->ops.get_hw_resources(phys, hw_res);
|
||||
}
|
||||
}
|
||||
@@ -438,7 +434,7 @@ static void dpu_encoder_destroy(struct drm_encoder *drm_enc)
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (phys && phys->ops.destroy) {
|
||||
if (phys->ops.destroy) {
|
||||
phys->ops.destroy(phys);
|
||||
--dpu_enc->num_phys_encs;
|
||||
dpu_enc->phys_encs[i] = NULL;
|
||||
@@ -464,7 +460,7 @@ void dpu_encoder_helper_split_config(
|
||||
struct dpu_hw_mdp *hw_mdptop;
|
||||
struct msm_display_info *disp_info;
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_mdptop || !phys_enc->parent) {
|
||||
if (!phys_enc->hw_mdptop || !phys_enc->parent) {
|
||||
DPU_ERROR("invalid arg(s), encoder %d\n", phys_enc != 0);
|
||||
return;
|
||||
}
|
||||
@@ -533,8 +529,23 @@ static struct msm_display_topology dpu_encoder_get_topology(
|
||||
if (dpu_enc->phys_encs[i])
|
||||
intf_count++;
|
||||
|
||||
/* User split topology for width > 1080 */
|
||||
topology.num_lm = (mode->vdisplay > MAX_VDISPLAY_SPLIT) ? 2 : 1;
|
||||
/* Datapath topology selection
|
||||
*
|
||||
* Dual display
|
||||
* 2 LM, 2 INTF ( Split display using 2 interfaces)
|
||||
*
|
||||
* Single display
|
||||
* 1 LM, 1 INTF
|
||||
* 2 LM, 1 INTF (stream merge to support high resolution interfaces)
|
||||
*
|
||||
*/
|
||||
if (intf_count == 2)
|
||||
topology.num_lm = 2;
|
||||
else if (!dpu_kms->catalog->caps->has_3d_merge)
|
||||
topology.num_lm = 1;
|
||||
else
|
||||
topology.num_lm = (mode->hdisplay > MAX_HDISPLAY_SPLIT) ? 2 : 1;
|
||||
|
||||
topology.num_enc = 0;
|
||||
topology.num_intf = intf_count;
|
||||
|
||||
@@ -582,10 +593,10 @@ static int dpu_encoder_virt_atomic_check(
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (phys && phys->ops.atomic_check)
|
||||
if (phys->ops.atomic_check)
|
||||
ret = phys->ops.atomic_check(phys, crtc_state,
|
||||
conn_state);
|
||||
else if (phys && phys->ops.mode_fixup)
|
||||
else if (phys->ops.mode_fixup)
|
||||
if (!phys->ops.mode_fixup(phys, mode, adj_mode))
|
||||
ret = -EINVAL;
|
||||
|
||||
@@ -681,7 +692,7 @@ static void _dpu_encoder_irq_control(struct drm_encoder *drm_enc, bool enable)
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (phys && phys->ops.irq_control)
|
||||
if (phys->ops.irq_control)
|
||||
phys->ops.irq_control(phys, enable);
|
||||
}
|
||||
|
||||
@@ -1031,46 +1042,43 @@ static void dpu_encoder_virt_mode_set(struct drm_encoder *drm_enc,
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (phys) {
|
||||
if (!dpu_enc->hw_pp[i]) {
|
||||
DPU_ERROR_ENC(dpu_enc, "no pp block assigned"
|
||||
"at idx: %d\n", i);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!hw_ctl[i]) {
|
||||
DPU_ERROR_ENC(dpu_enc, "no ctl block assigned"
|
||||
"at idx: %d\n", i);
|
||||
goto error;
|
||||
}
|
||||
|
||||
phys->hw_pp = dpu_enc->hw_pp[i];
|
||||
phys->hw_ctl = hw_ctl[i];
|
||||
|
||||
dpu_rm_init_hw_iter(&hw_iter, drm_enc->base.id,
|
||||
DPU_HW_BLK_INTF);
|
||||
for (j = 0; j < MAX_CHANNELS_PER_ENC; j++) {
|
||||
struct dpu_hw_intf *hw_intf;
|
||||
|
||||
if (!dpu_rm_get_hw(&dpu_kms->rm, &hw_iter))
|
||||
break;
|
||||
|
||||
hw_intf = (struct dpu_hw_intf *)hw_iter.hw;
|
||||
if (hw_intf->idx == phys->intf_idx)
|
||||
phys->hw_intf = hw_intf;
|
||||
}
|
||||
|
||||
if (!phys->hw_intf) {
|
||||
DPU_ERROR_ENC(dpu_enc,
|
||||
"no intf block assigned at idx: %d\n",
|
||||
i);
|
||||
goto error;
|
||||
}
|
||||
|
||||
phys->connector = conn->state->connector;
|
||||
if (phys->ops.mode_set)
|
||||
phys->ops.mode_set(phys, mode, adj_mode);
|
||||
if (!dpu_enc->hw_pp[i]) {
|
||||
DPU_ERROR_ENC(dpu_enc,
|
||||
"no pp block assigned at idx: %d\n", i);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!hw_ctl[i]) {
|
||||
DPU_ERROR_ENC(dpu_enc,
|
||||
"no ctl block assigned at idx: %d\n", i);
|
||||
goto error;
|
||||
}
|
||||
|
||||
phys->hw_pp = dpu_enc->hw_pp[i];
|
||||
phys->hw_ctl = hw_ctl[i];
|
||||
|
||||
dpu_rm_init_hw_iter(&hw_iter, drm_enc->base.id,
|
||||
DPU_HW_BLK_INTF);
|
||||
for (j = 0; j < MAX_CHANNELS_PER_ENC; j++) {
|
||||
struct dpu_hw_intf *hw_intf;
|
||||
|
||||
if (!dpu_rm_get_hw(&dpu_kms->rm, &hw_iter))
|
||||
break;
|
||||
|
||||
hw_intf = (struct dpu_hw_intf *)hw_iter.hw;
|
||||
if (hw_intf->idx == phys->intf_idx)
|
||||
phys->hw_intf = hw_intf;
|
||||
}
|
||||
|
||||
if (!phys->hw_intf) {
|
||||
DPU_ERROR_ENC(dpu_enc,
|
||||
"no intf block assigned at idx: %d\n", i);
|
||||
goto error;
|
||||
}
|
||||
|
||||
phys->connector = conn->state->connector;
|
||||
if (phys->ops.mode_set)
|
||||
phys->ops.mode_set(phys, mode, adj_mode);
|
||||
}
|
||||
|
||||
dpu_enc->mode_set_complete = true;
|
||||
@@ -1202,7 +1210,7 @@ static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc)
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (phys && phys->ops.disable)
|
||||
if (phys->ops.disable)
|
||||
phys->ops.disable(phys);
|
||||
}
|
||||
|
||||
@@ -1215,8 +1223,7 @@ static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc)
|
||||
dpu_encoder_resource_control(drm_enc, DPU_ENC_RC_EVENT_STOP);
|
||||
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
if (dpu_enc->phys_encs[i])
|
||||
dpu_enc->phys_encs[i]->connector = NULL;
|
||||
dpu_enc->phys_encs[i]->connector = NULL;
|
||||
}
|
||||
|
||||
DPU_DEBUG_ENC(dpu_enc, "encoder disabled\n");
|
||||
@@ -1306,7 +1313,7 @@ void dpu_encoder_toggle_vblank_for_crtc(struct drm_encoder *drm_enc,
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (phys && phys->ops.control_vblank_irq)
|
||||
if (phys->ops.control_vblank_irq)
|
||||
phys->ops.control_vblank_irq(phys, enable);
|
||||
}
|
||||
}
|
||||
@@ -1418,7 +1425,7 @@ static void _dpu_encoder_trigger_flush(struct drm_encoder *drm_enc,
|
||||
}
|
||||
|
||||
ctl = phys->hw_ctl;
|
||||
if (!ctl || !ctl->ops.trigger_flush) {
|
||||
if (!ctl->ops.trigger_flush) {
|
||||
DPU_ERROR("missing trigger cb\n");
|
||||
return;
|
||||
}
|
||||
@@ -1462,13 +1469,8 @@ void dpu_encoder_helper_trigger_start(struct dpu_encoder_phys *phys_enc)
|
||||
{
|
||||
struct dpu_hw_ctl *ctl;
|
||||
|
||||
if (!phys_enc) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ctl = phys_enc->hw_ctl;
|
||||
if (ctl && ctl->ops.trigger_start) {
|
||||
if (ctl->ops.trigger_start) {
|
||||
ctl->ops.trigger_start(ctl);
|
||||
trace_dpu_enc_trigger_start(DRMID(phys_enc->parent), ctl->idx);
|
||||
}
|
||||
@@ -1505,14 +1507,10 @@ static void dpu_encoder_helper_hw_reset(struct dpu_encoder_phys *phys_enc)
|
||||
struct dpu_hw_ctl *ctl;
|
||||
int rc;
|
||||
|
||||
if (!phys_enc) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
return;
|
||||
}
|
||||
dpu_enc = to_dpu_encoder_virt(phys_enc->parent);
|
||||
ctl = phys_enc->hw_ctl;
|
||||
|
||||
if (!ctl || !ctl->ops.reset)
|
||||
if (!ctl->ops.reset)
|
||||
return;
|
||||
|
||||
DRM_DEBUG_KMS("id:%u ctl %d reset\n", DRMID(phys_enc->parent),
|
||||
@@ -1549,12 +1547,10 @@ static void _dpu_encoder_kickoff_phys(struct dpu_encoder_virt *dpu_enc)
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (!phys || phys->enable_state == DPU_ENC_DISABLED)
|
||||
if (phys->enable_state == DPU_ENC_DISABLED)
|
||||
continue;
|
||||
|
||||
ctl = phys->hw_ctl;
|
||||
if (!ctl)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* This is cleared in frame_done worker, which isn't invoked
|
||||
@@ -1602,17 +1598,15 @@ void dpu_encoder_trigger_kickoff_pending(struct drm_encoder *drm_enc)
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (phys && phys->hw_ctl) {
|
||||
ctl = phys->hw_ctl;
|
||||
if (ctl->ops.clear_pending_flush)
|
||||
ctl->ops.clear_pending_flush(ctl);
|
||||
ctl = phys->hw_ctl;
|
||||
if (ctl->ops.clear_pending_flush)
|
||||
ctl->ops.clear_pending_flush(ctl);
|
||||
|
||||
/* update only for command mode primary ctl */
|
||||
if ((phys == dpu_enc->cur_master) &&
|
||||
(disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE)
|
||||
&& ctl->ops.trigger_pending)
|
||||
ctl->ops.trigger_pending(ctl);
|
||||
}
|
||||
/* update only for command mode primary ctl */
|
||||
if ((phys == dpu_enc->cur_master) &&
|
||||
(disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE)
|
||||
&& ctl->ops.trigger_pending)
|
||||
ctl->ops.trigger_pending(ctl);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1772,12 +1766,10 @@ void dpu_encoder_prepare_for_kickoff(struct drm_encoder *drm_enc)
|
||||
DPU_ATRACE_BEGIN("enc_prepare_for_kickoff");
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
phys = dpu_enc->phys_encs[i];
|
||||
if (phys) {
|
||||
if (phys->ops.prepare_for_kickoff)
|
||||
phys->ops.prepare_for_kickoff(phys);
|
||||
if (phys->enable_state == DPU_ENC_ERR_NEEDS_HW_RESET)
|
||||
needs_hw_reset = true;
|
||||
}
|
||||
if (phys->ops.prepare_for_kickoff)
|
||||
phys->ops.prepare_for_kickoff(phys);
|
||||
if (phys->enable_state == DPU_ENC_ERR_NEEDS_HW_RESET)
|
||||
needs_hw_reset = true;
|
||||
}
|
||||
DPU_ATRACE_END("enc_prepare_for_kickoff");
|
||||
|
||||
@@ -1818,7 +1810,7 @@ void dpu_encoder_kickoff(struct drm_encoder *drm_enc)
|
||||
/* allow phys encs to handle any post-kickoff business */
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
phys = dpu_enc->phys_encs[i];
|
||||
if (phys && phys->ops.handle_post_kickoff)
|
||||
if (phys->ops.handle_post_kickoff)
|
||||
phys->ops.handle_post_kickoff(phys);
|
||||
}
|
||||
|
||||
@@ -1847,7 +1839,7 @@ void dpu_encoder_prepare_commit(struct drm_encoder *drm_enc)
|
||||
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
phys = dpu_enc->phys_encs[i];
|
||||
if (phys && phys->ops.prepare_commit)
|
||||
if (phys->ops.prepare_commit)
|
||||
phys->ops.prepare_commit(phys);
|
||||
}
|
||||
}
|
||||
@@ -1862,9 +1854,6 @@ static int _dpu_encoder_status_show(struct seq_file *s, void *data)
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (!phys)
|
||||
continue;
|
||||
|
||||
seq_printf(s, "intf:%d vsync:%8d underrun:%8d ",
|
||||
phys->intf_idx - INTF_0,
|
||||
atomic_read(&phys->vsync_cnt),
|
||||
@@ -1923,8 +1912,7 @@ static int _dpu_encoder_init_debugfs(struct drm_encoder *drm_enc)
|
||||
dpu_enc->debugfs_root, dpu_enc, &debugfs_status_fops);
|
||||
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++)
|
||||
if (dpu_enc->phys_encs[i] &&
|
||||
dpu_enc->phys_encs[i]->ops.late_register)
|
||||
if (dpu_enc->phys_encs[i]->ops.late_register)
|
||||
dpu_enc->phys_encs[i]->ops.late_register(
|
||||
dpu_enc->phys_encs[i],
|
||||
dpu_enc->debugfs_root);
|
||||
@@ -2093,11 +2081,8 @@ static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
|
||||
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (phys) {
|
||||
atomic_set(&phys->vsync_cnt, 0);
|
||||
atomic_set(&phys->underrun_cnt, 0);
|
||||
}
|
||||
atomic_set(&phys->vsync_cnt, 0);
|
||||
atomic_set(&phys->underrun_cnt, 0);
|
||||
}
|
||||
mutex_unlock(&dpu_enc->enc_lock);
|
||||
|
||||
@@ -2239,8 +2224,6 @@ int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
|
||||
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
if (!phys)
|
||||
continue;
|
||||
|
||||
switch (event) {
|
||||
case MSM_ENC_COMMIT_DONE:
|
||||
@@ -2256,7 +2239,7 @@ int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
|
||||
DPU_ERROR_ENC(dpu_enc, "unknown wait event %d\n",
|
||||
event);
|
||||
return -EINVAL;
|
||||
};
|
||||
}
|
||||
|
||||
if (fn_wait) {
|
||||
DPU_ATRACE_BEGIN("wait_for_completion_event");
|
||||
@@ -2273,7 +2256,6 @@ int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
|
||||
enum dpu_intf_mode dpu_encoder_get_intf_mode(struct drm_encoder *encoder)
|
||||
{
|
||||
struct dpu_encoder_virt *dpu_enc = NULL;
|
||||
int i;
|
||||
|
||||
if (!encoder) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
@@ -2284,12 +2266,8 @@ enum dpu_intf_mode dpu_encoder_get_intf_mode(struct drm_encoder *encoder)
|
||||
if (dpu_enc->cur_master)
|
||||
return dpu_enc->cur_master->intf_mode;
|
||||
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (phys)
|
||||
return phys->intf_mode;
|
||||
}
|
||||
if (dpu_enc->num_phys_encs)
|
||||
return dpu_enc->phys_encs[0]->intf_mode;
|
||||
|
||||
return INTF_MODE_NONE;
|
||||
}
|
||||
|
@@ -45,8 +45,7 @@ static bool dpu_encoder_phys_cmd_mode_fixup(
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adj_mode)
|
||||
{
|
||||
if (phys_enc)
|
||||
DPU_DEBUG_CMDENC(to_dpu_encoder_phys_cmd(phys_enc), "\n");
|
||||
DPU_DEBUG_CMDENC(to_dpu_encoder_phys_cmd(phys_enc), "\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -58,11 +57,8 @@ static void _dpu_encoder_phys_cmd_update_intf_cfg(
|
||||
struct dpu_hw_ctl *ctl;
|
||||
struct dpu_hw_intf_cfg intf_cfg = { 0 };
|
||||
|
||||
if (!phys_enc)
|
||||
return;
|
||||
|
||||
ctl = phys_enc->hw_ctl;
|
||||
if (!ctl || !ctl->ops.setup_intf_cfg)
|
||||
if (!ctl->ops.setup_intf_cfg)
|
||||
return;
|
||||
|
||||
intf_cfg.intf = phys_enc->intf_idx;
|
||||
@@ -79,7 +75,7 @@ static void dpu_encoder_phys_cmd_pp_tx_done_irq(void *arg, int irq_idx)
|
||||
int new_cnt;
|
||||
u32 event = DPU_ENCODER_FRAME_EVENT_DONE;
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_pp)
|
||||
if (!phys_enc->hw_pp)
|
||||
return;
|
||||
|
||||
DPU_ATRACE_BEGIN("pp_done_irq");
|
||||
@@ -106,7 +102,7 @@ static void dpu_encoder_phys_cmd_pp_rd_ptr_irq(void *arg, int irq_idx)
|
||||
struct dpu_encoder_phys *phys_enc = arg;
|
||||
struct dpu_encoder_phys_cmd *cmd_enc;
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_pp)
|
||||
if (!phys_enc->hw_pp)
|
||||
return;
|
||||
|
||||
DPU_ATRACE_BEGIN("rd_ptr_irq");
|
||||
@@ -125,9 +121,6 @@ static void dpu_encoder_phys_cmd_ctl_start_irq(void *arg, int irq_idx)
|
||||
{
|
||||
struct dpu_encoder_phys *phys_enc = arg;
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_ctl)
|
||||
return;
|
||||
|
||||
DPU_ATRACE_BEGIN("ctl_start_irq");
|
||||
|
||||
atomic_add_unless(&phys_enc->pending_ctlstart_cnt, -1, 0);
|
||||
@@ -141,9 +134,6 @@ static void dpu_encoder_phys_cmd_underrun_irq(void *arg, int irq_idx)
|
||||
{
|
||||
struct dpu_encoder_phys *phys_enc = arg;
|
||||
|
||||
if (!phys_enc)
|
||||
return;
|
||||
|
||||
if (phys_enc->parent_ops->handle_underrun_virt)
|
||||
phys_enc->parent_ops->handle_underrun_virt(phys_enc->parent,
|
||||
phys_enc);
|
||||
@@ -179,7 +169,7 @@ static void dpu_encoder_phys_cmd_mode_set(
|
||||
struct dpu_encoder_phys_cmd *cmd_enc =
|
||||
to_dpu_encoder_phys_cmd(phys_enc);
|
||||
|
||||
if (!phys_enc || !mode || !adj_mode) {
|
||||
if (!mode || !adj_mode) {
|
||||
DPU_ERROR("invalid args\n");
|
||||
return;
|
||||
}
|
||||
@@ -198,7 +188,7 @@ static int _dpu_encoder_phys_cmd_handle_ppdone_timeout(
|
||||
u32 frame_event = DPU_ENCODER_FRAME_EVENT_ERROR;
|
||||
bool do_log = false;
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_pp || !phys_enc->hw_ctl)
|
||||
if (!phys_enc->hw_pp)
|
||||
return -EINVAL;
|
||||
|
||||
cmd_enc->pp_timeout_report_cnt++;
|
||||
@@ -247,11 +237,6 @@ static int _dpu_encoder_phys_cmd_wait_for_idle(
|
||||
struct dpu_encoder_wait_info wait_info;
|
||||
int ret;
|
||||
|
||||
if (!phys_enc) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
wait_info.wq = &phys_enc->pending_kickoff_wq;
|
||||
wait_info.atomic_cnt = &phys_enc->pending_kickoff_cnt;
|
||||
wait_info.timeout_ms = KICKOFF_TIMEOUT_MS;
|
||||
@@ -273,7 +258,7 @@ static int dpu_encoder_phys_cmd_control_vblank_irq(
|
||||
int ret = 0;
|
||||
int refcount;
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_pp) {
|
||||
if (!phys_enc->hw_pp) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -314,9 +299,6 @@ end:
|
||||
static void dpu_encoder_phys_cmd_irq_control(struct dpu_encoder_phys *phys_enc,
|
||||
bool enable)
|
||||
{
|
||||
if (!phys_enc)
|
||||
return;
|
||||
|
||||
trace_dpu_enc_phys_cmd_irq_ctrl(DRMID(phys_enc->parent),
|
||||
phys_enc->hw_pp->idx - PINGPONG_0,
|
||||
enable, atomic_read(&phys_enc->vblank_refcount));
|
||||
@@ -351,7 +333,7 @@ static void dpu_encoder_phys_cmd_tearcheck_config(
|
||||
u32 vsync_hz;
|
||||
struct dpu_kms *dpu_kms;
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_pp) {
|
||||
if (!phys_enc->hw_pp) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
return;
|
||||
}
|
||||
@@ -428,8 +410,7 @@ static void _dpu_encoder_phys_cmd_pingpong_config(
|
||||
struct dpu_encoder_phys_cmd *cmd_enc =
|
||||
to_dpu_encoder_phys_cmd(phys_enc);
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_ctl || !phys_enc->hw_pp
|
||||
|| !phys_enc->hw_ctl->ops.setup_intf_cfg) {
|
||||
if (!phys_enc->hw_pp || !phys_enc->hw_ctl->ops.setup_intf_cfg) {
|
||||
DPU_ERROR("invalid arg(s), enc %d\n", phys_enc != 0);
|
||||
return;
|
||||
}
|
||||
@@ -458,7 +439,7 @@ static void dpu_encoder_phys_cmd_enable_helper(
|
||||
struct dpu_hw_ctl *ctl;
|
||||
u32 flush_mask = 0;
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_ctl || !phys_enc->hw_pp) {
|
||||
if (!phys_enc->hw_pp) {
|
||||
DPU_ERROR("invalid arg(s), encoder %d\n", phys_enc != 0);
|
||||
return;
|
||||
}
|
||||
@@ -480,7 +461,7 @@ static void dpu_encoder_phys_cmd_enable(struct dpu_encoder_phys *phys_enc)
|
||||
struct dpu_encoder_phys_cmd *cmd_enc =
|
||||
to_dpu_encoder_phys_cmd(phys_enc);
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_pp) {
|
||||
if (!phys_enc->hw_pp) {
|
||||
DPU_ERROR("invalid phys encoder\n");
|
||||
return;
|
||||
}
|
||||
@@ -499,8 +480,7 @@ static void dpu_encoder_phys_cmd_enable(struct dpu_encoder_phys *phys_enc)
|
||||
static void _dpu_encoder_phys_cmd_connect_te(
|
||||
struct dpu_encoder_phys *phys_enc, bool enable)
|
||||
{
|
||||
if (!phys_enc || !phys_enc->hw_pp ||
|
||||
!phys_enc->hw_pp->ops.connect_external_te)
|
||||
if (!phys_enc->hw_pp || !phys_enc->hw_pp->ops.connect_external_te)
|
||||
return;
|
||||
|
||||
trace_dpu_enc_phys_cmd_connect_te(DRMID(phys_enc->parent), enable);
|
||||
@@ -518,7 +498,7 @@ static int dpu_encoder_phys_cmd_get_line_count(
|
||||
{
|
||||
struct dpu_hw_pingpong *hw_pp;
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_pp)
|
||||
if (!phys_enc->hw_pp)
|
||||
return -EINVAL;
|
||||
|
||||
if (!dpu_encoder_phys_cmd_is_master(phys_enc))
|
||||
@@ -536,7 +516,7 @@ static void dpu_encoder_phys_cmd_disable(struct dpu_encoder_phys *phys_enc)
|
||||
struct dpu_encoder_phys_cmd *cmd_enc =
|
||||
to_dpu_encoder_phys_cmd(phys_enc);
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_pp) {
|
||||
if (!phys_enc->hw_pp) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
return;
|
||||
}
|
||||
@@ -559,10 +539,6 @@ static void dpu_encoder_phys_cmd_destroy(struct dpu_encoder_phys *phys_enc)
|
||||
struct dpu_encoder_phys_cmd *cmd_enc =
|
||||
to_dpu_encoder_phys_cmd(phys_enc);
|
||||
|
||||
if (!phys_enc) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
return;
|
||||
}
|
||||
kfree(cmd_enc);
|
||||
}
|
||||
|
||||
@@ -580,7 +556,7 @@ static void dpu_encoder_phys_cmd_prepare_for_kickoff(
|
||||
to_dpu_encoder_phys_cmd(phys_enc);
|
||||
int ret;
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_pp) {
|
||||
if (!phys_enc->hw_pp) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
return;
|
||||
}
|
||||
@@ -614,11 +590,6 @@ static int _dpu_encoder_phys_cmd_wait_for_ctl_start(
|
||||
struct dpu_encoder_wait_info wait_info;
|
||||
int ret;
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_ctl) {
|
||||
DPU_ERROR("invalid argument(s)\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
wait_info.wq = &phys_enc->pending_kickoff_wq;
|
||||
wait_info.atomic_cnt = &phys_enc->pending_ctlstart_cnt;
|
||||
wait_info.timeout_ms = KICKOFF_TIMEOUT_MS;
|
||||
@@ -639,9 +610,6 @@ static int dpu_encoder_phys_cmd_wait_for_tx_complete(
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (!phys_enc)
|
||||
return -EINVAL;
|
||||
|
||||
rc = _dpu_encoder_phys_cmd_wait_for_idle(phys_enc);
|
||||
if (rc) {
|
||||
DRM_ERROR("failed wait_for_idle: id:%u ret:%d intf:%d\n",
|
||||
@@ -658,9 +626,6 @@ static int dpu_encoder_phys_cmd_wait_for_commit_done(
|
||||
int rc = 0;
|
||||
struct dpu_encoder_phys_cmd *cmd_enc;
|
||||
|
||||
if (!phys_enc)
|
||||
return -EINVAL;
|
||||
|
||||
cmd_enc = to_dpu_encoder_phys_cmd(phys_enc);
|
||||
|
||||
/* only required for master controller */
|
||||
@@ -681,9 +646,6 @@ static int dpu_encoder_phys_cmd_wait_for_vblank(
|
||||
struct dpu_encoder_phys_cmd *cmd_enc;
|
||||
struct dpu_encoder_wait_info wait_info;
|
||||
|
||||
if (!phys_enc)
|
||||
return -EINVAL;
|
||||
|
||||
cmd_enc = to_dpu_encoder_phys_cmd(phys_enc);
|
||||
|
||||
/* only required for master controller */
|
||||
@@ -715,9 +677,6 @@ static void dpu_encoder_phys_cmd_handle_post_kickoff(
|
||||
static void dpu_encoder_phys_cmd_trigger_start(
|
||||
struct dpu_encoder_phys *phys_enc)
|
||||
{
|
||||
if (!phys_enc)
|
||||
return;
|
||||
|
||||
dpu_encoder_helper_trigger_start(phys_enc);
|
||||
}
|
||||
|
||||
@@ -816,6 +775,4 @@ struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
|
||||
DPU_DEBUG_CMDENC(cmd_enc, "created\n");
|
||||
|
||||
return phys_enc;
|
||||
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
@@ -220,8 +220,7 @@ static bool dpu_encoder_phys_vid_mode_fixup(
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adj_mode)
|
||||
{
|
||||
if (phys_enc)
|
||||
DPU_DEBUG_VIDENC(phys_enc, "\n");
|
||||
DPU_DEBUG_VIDENC(phys_enc, "\n");
|
||||
|
||||
/*
|
||||
* Modifying mode has consequences when the mode comes back to us
|
||||
@@ -239,7 +238,7 @@ static void dpu_encoder_phys_vid_setup_timing_engine(
|
||||
unsigned long lock_flags;
|
||||
struct dpu_hw_intf_cfg intf_cfg = { 0 };
|
||||
|
||||
if (!phys_enc || !phys_enc->hw_ctl->ops.setup_intf_cfg) {
|
||||
if (!phys_enc->hw_ctl->ops.setup_intf_cfg) {
|
||||
DPU_ERROR("invalid encoder %d\n", phys_enc != 0);
|
||||
return;
|
||||
}
|
||||
@@ -280,6 +279,14 @@ static void dpu_encoder_phys_vid_setup_timing_engine(
|
||||
phys_enc->hw_intf->ops.setup_timing_gen(phys_enc->hw_intf,
|
||||
&timing_params, fmt);
|
||||
phys_enc->hw_ctl->ops.setup_intf_cfg(phys_enc->hw_ctl, &intf_cfg);
|
||||
|
||||
/* setup which pp blk will connect to this intf */
|
||||
if (phys_enc->hw_intf->ops.bind_pingpong_blk)
|
||||
phys_enc->hw_intf->ops.bind_pingpong_blk(
|
||||
phys_enc->hw_intf,
|
||||
true,
|
||||
phys_enc->hw_pp->idx);
|
||||
|
||||
spin_unlock_irqrestore(phys_enc->enc_spinlock, lock_flags);
|
||||
|
||||
programmable_fetch_config(phys_enc, &timing_params);
|
||||
@@ -293,12 +300,7 @@ static void dpu_encoder_phys_vid_vblank_irq(void *arg, int irq_idx)
|
||||
u32 flush_register = 0;
|
||||
int new_cnt = -1, old_cnt = -1;
|
||||
|
||||
if (!phys_enc)
|
||||
return;
|
||||
|
||||
hw_ctl = phys_enc->hw_ctl;
|
||||
if (!hw_ctl)
|
||||
return;
|
||||
|
||||
DPU_ATRACE_BEGIN("vblank_irq");
|
||||
|
||||
@@ -314,7 +316,7 @@ static void dpu_encoder_phys_vid_vblank_irq(void *arg, int irq_idx)
|
||||
* so we need to double-check with hw that it accepted the flush bits
|
||||
*/
|
||||
spin_lock_irqsave(phys_enc->enc_spinlock, lock_flags);
|
||||
if (hw_ctl && hw_ctl->ops.get_flush_register)
|
||||
if (hw_ctl->ops.get_flush_register)
|
||||
flush_register = hw_ctl->ops.get_flush_register(hw_ctl);
|
||||
|
||||
if (!(flush_register & hw_ctl->ops.get_pending_flush(hw_ctl)))
|
||||
@@ -335,9 +337,6 @@ static void dpu_encoder_phys_vid_underrun_irq(void *arg, int irq_idx)
|
||||
{
|
||||
struct dpu_encoder_phys *phys_enc = arg;
|
||||
|
||||
if (!phys_enc)
|
||||
return;
|
||||
|
||||
if (phys_enc->parent_ops->handle_underrun_virt)
|
||||
phys_enc->parent_ops->handle_underrun_virt(phys_enc->parent,
|
||||
phys_enc);
|
||||
@@ -374,11 +373,6 @@ static void dpu_encoder_phys_vid_mode_set(
|
||||
struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adj_mode)
|
||||
{
|
||||
if (!phys_enc) {
|
||||
DPU_ERROR("invalid encoder/kms\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (adj_mode) {
|
||||
phys_enc->cached_mode = *adj_mode;
|
||||
drm_mode_debug_printmodeline(adj_mode);
|
||||
@@ -395,11 +389,6 @@ static int dpu_encoder_phys_vid_control_vblank_irq(
|
||||
int ret = 0;
|
||||
int refcount;
|
||||
|
||||
if (!phys_enc) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
refcount = atomic_read(&phys_enc->vblank_refcount);
|
||||
|
||||
/* Slave encoders don't report vblank */
|
||||
@@ -435,6 +424,7 @@ static void dpu_encoder_phys_vid_enable(struct dpu_encoder_phys *phys_enc)
|
||||
{
|
||||
struct dpu_hw_ctl *ctl;
|
||||
u32 flush_mask = 0;
|
||||
u32 intf_flush_mask = 0;
|
||||
|
||||
ctl = phys_enc->hw_ctl;
|
||||
|
||||
@@ -459,10 +449,18 @@ static void dpu_encoder_phys_vid_enable(struct dpu_encoder_phys *phys_enc)
|
||||
ctl->ops.get_bitmask_intf(ctl, &flush_mask, phys_enc->hw_intf->idx);
|
||||
ctl->ops.update_pending_flush(ctl, flush_mask);
|
||||
|
||||
if (ctl->ops.get_bitmask_active_intf)
|
||||
ctl->ops.get_bitmask_active_intf(ctl, &intf_flush_mask,
|
||||
phys_enc->hw_intf->idx);
|
||||
|
||||
if (ctl->ops.update_pending_intf_flush)
|
||||
ctl->ops.update_pending_intf_flush(ctl, intf_flush_mask);
|
||||
|
||||
skip_flush:
|
||||
DPU_DEBUG_VIDENC(phys_enc,
|
||||
"update pending flush ctl %d flush_mask %x\n",
|
||||
ctl->idx - CTL_0, flush_mask);
|
||||
"update pending flush ctl %d flush_mask 0%x intf_mask 0x%x\n",
|
||||
ctl->idx - CTL_0, flush_mask, intf_flush_mask);
|
||||
|
||||
|
||||
/* ctl_flush & timing engine enable will be triggered by framework */
|
||||
if (phys_enc->enable_state == DPU_ENC_DISABLED)
|
||||
@@ -471,11 +469,6 @@ skip_flush:
|
||||
|
||||
static void dpu_encoder_phys_vid_destroy(struct dpu_encoder_phys *phys_enc)
|
||||
{
|
||||
if (!phys_enc) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
return;
|
||||
}
|
||||
|
||||
DPU_DEBUG_VIDENC(phys_enc, "\n");
|
||||
kfree(phys_enc);
|
||||
}
|
||||
@@ -493,11 +486,6 @@ static int dpu_encoder_phys_vid_wait_for_vblank(
|
||||
struct dpu_encoder_wait_info wait_info;
|
||||
int ret;
|
||||
|
||||
if (!phys_enc) {
|
||||
pr_err("invalid encoder\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
wait_info.wq = &phys_enc->pending_kickoff_wq;
|
||||
wait_info.atomic_cnt = &phys_enc->pending_kickoff_cnt;
|
||||
wait_info.timeout_ms = KICKOFF_TIMEOUT_MS;
|
||||
@@ -543,13 +531,8 @@ static void dpu_encoder_phys_vid_prepare_for_kickoff(
|
||||
struct dpu_hw_ctl *ctl;
|
||||
int rc;
|
||||
|
||||
if (!phys_enc) {
|
||||
DPU_ERROR("invalid encoder/parameters\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ctl = phys_enc->hw_ctl;
|
||||
if (!ctl || !ctl->ops.wait_reset_status)
|
||||
if (!ctl->ops.wait_reset_status)
|
||||
return;
|
||||
|
||||
/*
|
||||
@@ -569,12 +552,12 @@ static void dpu_encoder_phys_vid_disable(struct dpu_encoder_phys *phys_enc)
|
||||
unsigned long lock_flags;
|
||||
int ret;
|
||||
|
||||
if (!phys_enc || !phys_enc->parent || !phys_enc->parent->dev) {
|
||||
if (!phys_enc->parent || !phys_enc->parent->dev) {
|
||||
DPU_ERROR("invalid encoder/device\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!phys_enc->hw_intf || !phys_enc->hw_ctl) {
|
||||
if (!phys_enc->hw_intf) {
|
||||
DPU_ERROR("invalid hw_intf %d hw_ctl %d\n",
|
||||
phys_enc->hw_intf != 0, phys_enc->hw_ctl != 0);
|
||||
return;
|
||||
@@ -639,9 +622,6 @@ static void dpu_encoder_phys_vid_irq_control(struct dpu_encoder_phys *phys_enc,
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!phys_enc)
|
||||
return;
|
||||
|
||||
trace_dpu_enc_phys_vid_irq_ctrl(DRMID(phys_enc->parent),
|
||||
phys_enc->hw_intf->idx - INTF_0,
|
||||
enable,
|
||||
@@ -662,9 +642,6 @@ static void dpu_encoder_phys_vid_irq_control(struct dpu_encoder_phys *phys_enc,
|
||||
static int dpu_encoder_phys_vid_get_line_count(
|
||||
struct dpu_encoder_phys *phys_enc)
|
||||
{
|
||||
if (!phys_enc)
|
||||
return -EINVAL;
|
||||
|
||||
if (!dpu_encoder_phys_vid_is_master(phys_enc))
|
||||
return -EINVAL;
|
||||
|
||||
|
@@ -489,12 +489,28 @@ static const struct dpu_format dpu_format_map_ubwc[] = {
|
||||
true, 4, DPU_FORMAT_FLAG_COMPRESSED,
|
||||
DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
|
||||
|
||||
/* ARGB8888 and ABGR8888 purposely have the same color
|
||||
* ordering. The hardware only supports ABGR8888 UBWC
|
||||
* natively.
|
||||
*/
|
||||
INTERLEAVED_RGB_FMT_TILED(ARGB8888,
|
||||
COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
|
||||
C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
|
||||
true, 4, DPU_FORMAT_FLAG_COMPRESSED,
|
||||
DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
|
||||
|
||||
INTERLEAVED_RGB_FMT_TILED(XBGR8888,
|
||||
COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
|
||||
C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
|
||||
false, 4, DPU_FORMAT_FLAG_COMPRESSED,
|
||||
DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
|
||||
|
||||
INTERLEAVED_RGB_FMT_TILED(XRGB8888,
|
||||
COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
|
||||
C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
|
||||
false, 4, DPU_FORMAT_FLAG_COMPRESSED,
|
||||
DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
|
||||
|
||||
INTERLEAVED_RGB_FMT_TILED(ABGR2101010,
|
||||
COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
|
||||
C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
|
||||
@@ -550,7 +566,9 @@ static int _dpu_format_get_media_color_ubwc(const struct dpu_format *fmt)
|
||||
{
|
||||
static const struct dpu_media_color_map dpu_media_ubwc_map[] = {
|
||||
{DRM_FORMAT_ABGR8888, COLOR_FMT_RGBA8888_UBWC},
|
||||
{DRM_FORMAT_ARGB8888, COLOR_FMT_RGBA8888_UBWC},
|
||||
{DRM_FORMAT_XBGR8888, COLOR_FMT_RGBA8888_UBWC},
|
||||
{DRM_FORMAT_XRGB8888, COLOR_FMT_RGBA8888_UBWC},
|
||||
{DRM_FORMAT_ABGR2101010, COLOR_FMT_RGBA1010102_UBWC},
|
||||
{DRM_FORMAT_XBGR2101010, COLOR_FMT_RGBA1010102_UBWC},
|
||||
{DRM_FORMAT_BGR565, COLOR_FMT_RGB565_UBWC},
|
||||
|
@@ -11,11 +11,17 @@
|
||||
#include "dpu_hw_catalog_format.h"
|
||||
#include "dpu_kms.h"
|
||||
|
||||
#define VIG_SDM845_MASK \
|
||||
(BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_SCALER_QSEED3) | BIT(DPU_SSPP_QOS) |\
|
||||
#define VIG_MASK \
|
||||
(BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_QOS) |\
|
||||
BIT(DPU_SSPP_CSC_10BIT) | BIT(DPU_SSPP_CDP) | BIT(DPU_SSPP_QOS_8LVL) |\
|
||||
BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_EXCL_RECT))
|
||||
|
||||
#define VIG_SDM845_MASK \
|
||||
(VIG_MASK | BIT(DPU_SSPP_SCALER_QSEED3))
|
||||
|
||||
#define VIG_SC7180_MASK \
|
||||
(VIG_MASK | BIT(DPU_SSPP_SCALER_QSEED4))
|
||||
|
||||
#define DMA_SDM845_MASK \
|
||||
(BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_QOS_8LVL) |\
|
||||
BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_TS_PREFILL_REC1) |\
|
||||
@@ -27,6 +33,9 @@
|
||||
#define MIXER_SDM845_MASK \
|
||||
(BIT(DPU_MIXER_SOURCESPLIT) | BIT(DPU_DIM_LAYER))
|
||||
|
||||
#define MIXER_SC7180_MASK \
|
||||
(BIT(DPU_DIM_LAYER))
|
||||
|
||||
#define PINGPONG_SDM845_MASK BIT(DPU_PINGPONG_DITHER)
|
||||
|
||||
#define PINGPONG_SDM845_SPLIT_MASK \
|
||||
@@ -58,9 +67,20 @@ static const struct dpu_caps sdm845_dpu_caps = {
|
||||
.has_src_split = true,
|
||||
.has_dim_layer = true,
|
||||
.has_idle_pc = true,
|
||||
.has_3d_merge = true,
|
||||
};
|
||||
|
||||
static struct dpu_mdp_cfg sdm845_mdp[] = {
|
||||
static const struct dpu_caps sc7180_dpu_caps = {
|
||||
.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
|
||||
.max_mixer_blendstages = 0x9,
|
||||
.qseed_type = DPU_SSPP_SCALER_QSEED4,
|
||||
.smart_dma_rev = DPU_SSPP_SMART_DMA_V2,
|
||||
.ubwc_version = DPU_HW_UBWC_VER_20,
|
||||
.has_dim_layer = true,
|
||||
.has_idle_pc = true,
|
||||
};
|
||||
|
||||
static const struct dpu_mdp_cfg sdm845_mdp[] = {
|
||||
{
|
||||
.name = "top_0", .id = MDP_TOP,
|
||||
.base = 0x0, .len = 0x45C,
|
||||
@@ -85,10 +105,27 @@ static struct dpu_mdp_cfg sdm845_mdp[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct dpu_mdp_cfg sc7180_mdp[] = {
|
||||
{
|
||||
.name = "top_0", .id = MDP_TOP,
|
||||
.base = 0x0, .len = 0x494,
|
||||
.features = 0,
|
||||
.highest_bank_bit = 0x3,
|
||||
.clk_ctrls[DPU_CLK_CTRL_VIG0] = {
|
||||
.reg_off = 0x2AC, .bit_off = 0},
|
||||
.clk_ctrls[DPU_CLK_CTRL_DMA0] = {
|
||||
.reg_off = 0x2AC, .bit_off = 8},
|
||||
.clk_ctrls[DPU_CLK_CTRL_DMA1] = {
|
||||
.reg_off = 0x2B4, .bit_off = 8},
|
||||
.clk_ctrls[DPU_CLK_CTRL_CURSOR0] = {
|
||||
.reg_off = 0x2BC, .bit_off = 8},
|
||||
},
|
||||
};
|
||||
|
||||
/*************************************************************
|
||||
* CTL sub blocks config
|
||||
*************************************************************/
|
||||
static struct dpu_ctl_cfg sdm845_ctl[] = {
|
||||
static const struct dpu_ctl_cfg sdm845_ctl[] = {
|
||||
{
|
||||
.name = "ctl_0", .id = CTL_0,
|
||||
.base = 0x1000, .len = 0xE4,
|
||||
@@ -116,6 +153,24 @@ static struct dpu_ctl_cfg sdm845_ctl[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct dpu_ctl_cfg sc7180_ctl[] = {
|
||||
{
|
||||
.name = "ctl_0", .id = CTL_0,
|
||||
.base = 0x1000, .len = 0xE4,
|
||||
.features = BIT(DPU_CTL_ACTIVE_CFG)
|
||||
},
|
||||
{
|
||||
.name = "ctl_1", .id = CTL_1,
|
||||
.base = 0x1200, .len = 0xE4,
|
||||
.features = BIT(DPU_CTL_ACTIVE_CFG)
|
||||
},
|
||||
{
|
||||
.name = "ctl_2", .id = CTL_2,
|
||||
.base = 0x1400, .len = 0xE4,
|
||||
.features = BIT(DPU_CTL_ACTIVE_CFG)
|
||||
},
|
||||
};
|
||||
|
||||
/*************************************************************
|
||||
* SSPP sub blocks config
|
||||
*************************************************************/
|
||||
@@ -128,7 +183,7 @@ static const struct dpu_sspp_blks_common sdm845_sspp_common = {
|
||||
.maxvdeciexp = MAX_VERT_DECIMATION,
|
||||
};
|
||||
|
||||
#define _VIG_SBLK(num, sdma_pri) \
|
||||
#define _VIG_SBLK(num, sdma_pri, qseed_ver) \
|
||||
{ \
|
||||
.common = &sdm845_sspp_common, \
|
||||
.maxdwnscale = MAX_DOWNSCALE_RATIO, \
|
||||
@@ -137,7 +192,7 @@ static const struct dpu_sspp_blks_common sdm845_sspp_common = {
|
||||
.src_blk = {.name = STRCAT("sspp_src_", num), \
|
||||
.id = DPU_SSPP_SRC, .base = 0x00, .len = 0x150,}, \
|
||||
.scaler_blk = {.name = STRCAT("sspp_scaler", num), \
|
||||
.id = DPU_SSPP_SCALER_QSEED3, \
|
||||
.id = qseed_ver, \
|
||||
.base = 0xa00, .len = 0xa0,}, \
|
||||
.csc_blk = {.name = STRCAT("sspp_csc", num), \
|
||||
.id = DPU_SSPP_CSC_10BIT, \
|
||||
@@ -162,10 +217,14 @@ static const struct dpu_sspp_blks_common sdm845_sspp_common = {
|
||||
.virt_num_formats = ARRAY_SIZE(plane_formats), \
|
||||
}
|
||||
|
||||
static const struct dpu_sspp_sub_blks sdm845_vig_sblk_0 = _VIG_SBLK("0", 5);
|
||||
static const struct dpu_sspp_sub_blks sdm845_vig_sblk_1 = _VIG_SBLK("1", 6);
|
||||
static const struct dpu_sspp_sub_blks sdm845_vig_sblk_2 = _VIG_SBLK("2", 7);
|
||||
static const struct dpu_sspp_sub_blks sdm845_vig_sblk_3 = _VIG_SBLK("3", 8);
|
||||
static const struct dpu_sspp_sub_blks sdm845_vig_sblk_0 =
|
||||
_VIG_SBLK("0", 5, DPU_SSPP_SCALER_QSEED3);
|
||||
static const struct dpu_sspp_sub_blks sdm845_vig_sblk_1 =
|
||||
_VIG_SBLK("1", 6, DPU_SSPP_SCALER_QSEED3);
|
||||
static const struct dpu_sspp_sub_blks sdm845_vig_sblk_2 =
|
||||
_VIG_SBLK("2", 7, DPU_SSPP_SCALER_QSEED3);
|
||||
static const struct dpu_sspp_sub_blks sdm845_vig_sblk_3 =
|
||||
_VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED3);
|
||||
|
||||
static const struct dpu_sspp_sub_blks sdm845_dma_sblk_0 = _DMA_SBLK("8", 1);
|
||||
static const struct dpu_sspp_sub_blks sdm845_dma_sblk_1 = _DMA_SBLK("9", 2);
|
||||
@@ -184,7 +243,7 @@ static const struct dpu_sspp_sub_blks sdm845_dma_sblk_3 = _DMA_SBLK("11", 4);
|
||||
.clk_ctrl = _clkctrl \
|
||||
}
|
||||
|
||||
static struct dpu_sspp_cfg sdm845_sspp[] = {
|
||||
static const struct dpu_sspp_cfg sdm845_sspp[] = {
|
||||
SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SDM845_MASK,
|
||||
sdm845_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
|
||||
SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SDM845_MASK,
|
||||
@@ -203,9 +262,26 @@ static struct dpu_sspp_cfg sdm845_sspp[] = {
|
||||
sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1),
|
||||
};
|
||||
|
||||
static const struct dpu_sspp_sub_blks sc7180_vig_sblk_0 =
|
||||
_VIG_SBLK("0", 4, DPU_SSPP_SCALER_QSEED4);
|
||||
|
||||
static const struct dpu_sspp_cfg sc7180_sspp[] = {
|
||||
SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK,
|
||||
sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
|
||||
SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK,
|
||||
sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
|
||||
SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, DMA_SDM845_MASK,
|
||||
sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
|
||||
SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, DMA_CURSOR_SDM845_MASK,
|
||||
sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0),
|
||||
};
|
||||
|
||||
/*************************************************************
|
||||
* MIXER sub blocks config
|
||||
*************************************************************/
|
||||
|
||||
/* SDM845 */
|
||||
|
||||
static const struct dpu_lm_sub_blks sdm845_lm_sblk = {
|
||||
.maxwidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
|
||||
.maxblendstages = 11, /* excluding base layer */
|
||||
@@ -215,23 +291,46 @@ static const struct dpu_lm_sub_blks sdm845_lm_sblk = {
|
||||
},
|
||||
};
|
||||
|
||||
#define LM_BLK(_name, _id, _base, _pp, _lmpair) \
|
||||
#define LM_BLK(_name, _id, _base, _fmask, _sblk, _pp, _lmpair) \
|
||||
{ \
|
||||
.name = _name, .id = _id, \
|
||||
.base = _base, .len = 0x320, \
|
||||
.features = MIXER_SDM845_MASK, \
|
||||
.sblk = &sdm845_lm_sblk, \
|
||||
.features = _fmask, \
|
||||
.sblk = _sblk, \
|
||||
.pingpong = _pp, \
|
||||
.lm_pair_mask = (1 << _lmpair) \
|
||||
}
|
||||
|
||||
static struct dpu_lm_cfg sdm845_lm[] = {
|
||||
LM_BLK("lm_0", LM_0, 0x44000, PINGPONG_0, LM_1),
|
||||
LM_BLK("lm_1", LM_1, 0x45000, PINGPONG_1, LM_0),
|
||||
LM_BLK("lm_2", LM_2, 0x46000, PINGPONG_2, LM_5),
|
||||
LM_BLK("lm_3", LM_3, 0x0, PINGPONG_MAX, 0),
|
||||
LM_BLK("lm_4", LM_4, 0x0, PINGPONG_MAX, 0),
|
||||
LM_BLK("lm_5", LM_5, 0x49000, PINGPONG_3, LM_2),
|
||||
static const struct dpu_lm_cfg sdm845_lm[] = {
|
||||
LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK,
|
||||
&sdm845_lm_sblk, PINGPONG_0, LM_1),
|
||||
LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK,
|
||||
&sdm845_lm_sblk, PINGPONG_1, LM_0),
|
||||
LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK,
|
||||
&sdm845_lm_sblk, PINGPONG_2, LM_5),
|
||||
LM_BLK("lm_3", LM_3, 0x0, MIXER_SDM845_MASK,
|
||||
&sdm845_lm_sblk, PINGPONG_MAX, 0),
|
||||
LM_BLK("lm_4", LM_4, 0x0, MIXER_SDM845_MASK,
|
||||
&sdm845_lm_sblk, PINGPONG_MAX, 0),
|
||||
LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK,
|
||||
&sdm845_lm_sblk, PINGPONG_3, LM_2),
|
||||
};
|
||||
|
||||
/* SC7180 */
|
||||
|
||||
static const struct dpu_lm_sub_blks sc7180_lm_sblk = {
|
||||
.maxwidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
|
||||
.maxblendstages = 7, /* excluding base layer */
|
||||
.blendstage_base = { /* offsets relative to mixer base */
|
||||
0x20, 0x38, 0x50, 0x68, 0x80, 0x98, 0xb0
|
||||
},
|
||||
};
|
||||
|
||||
static const struct dpu_lm_cfg sc7180_lm[] = {
|
||||
LM_BLK("lm_0", LM_0, 0x44000, MIXER_SC7180_MASK,
|
||||
&sc7180_lm_sblk, PINGPONG_0, LM_1),
|
||||
LM_BLK("lm_1", LM_1, 0x45000, MIXER_SC7180_MASK,
|
||||
&sc7180_lm_sblk, PINGPONG_1, LM_0),
|
||||
};
|
||||
|
||||
/*************************************************************
|
||||
@@ -264,13 +363,18 @@ static const struct dpu_pingpong_sub_blks sdm845_pp_sblk = {
|
||||
.sblk = &sdm845_pp_sblk \
|
||||
}
|
||||
|
||||
static struct dpu_pingpong_cfg sdm845_pp[] = {
|
||||
static const struct dpu_pingpong_cfg sdm845_pp[] = {
|
||||
PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000),
|
||||
PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800),
|
||||
PP_BLK("pingpong_2", PINGPONG_2, 0x71000),
|
||||
PP_BLK("pingpong_3", PINGPONG_3, 0x71800),
|
||||
};
|
||||
|
||||
static struct dpu_pingpong_cfg sc7180_pp[] = {
|
||||
PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000),
|
||||
PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800),
|
||||
};
|
||||
|
||||
/*************************************************************
|
||||
* INTF sub blocks config
|
||||
*************************************************************/
|
||||
@@ -278,26 +382,32 @@ static struct dpu_pingpong_cfg sdm845_pp[] = {
|
||||
{\
|
||||
.name = _name, .id = _id, \
|
||||
.base = _base, .len = 0x280, \
|
||||
.features = BIT(DPU_CTL_ACTIVE_CFG), \
|
||||
.type = _type, \
|
||||
.controller_id = _ctrl_id, \
|
||||
.prog_fetch_lines_worst_case = 24 \
|
||||
}
|
||||
|
||||
static struct dpu_intf_cfg sdm845_intf[] = {
|
||||
static const struct dpu_intf_cfg sdm845_intf[] = {
|
||||
INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0),
|
||||
INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0),
|
||||
INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1),
|
||||
INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 1),
|
||||
};
|
||||
|
||||
static const struct dpu_intf_cfg sc7180_intf[] = {
|
||||
INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0),
|
||||
INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0),
|
||||
};
|
||||
|
||||
/*************************************************************
|
||||
* VBIF sub blocks config
|
||||
*************************************************************/
|
||||
/* VBIF QOS remap */
|
||||
static u32 sdm845_rt_pri_lvl[] = {3, 3, 4, 4, 5, 5, 6, 6};
|
||||
static u32 sdm845_nrt_pri_lvl[] = {3, 3, 3, 3, 3, 3, 3, 3};
|
||||
static const u32 sdm845_rt_pri_lvl[] = {3, 3, 4, 4, 5, 5, 6, 6};
|
||||
static const u32 sdm845_nrt_pri_lvl[] = {3, 3, 3, 3, 3, 3, 3, 3};
|
||||
|
||||
static struct dpu_vbif_cfg sdm845_vbif[] = {
|
||||
static const struct dpu_vbif_cfg sdm845_vbif[] = {
|
||||
{
|
||||
.name = "vbif_0", .id = VBIF_0,
|
||||
.base = 0, .len = 0x1040,
|
||||
@@ -316,7 +426,7 @@ static struct dpu_vbif_cfg sdm845_vbif[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct dpu_reg_dma_cfg sdm845_regdma = {
|
||||
static const struct dpu_reg_dma_cfg sdm845_regdma = {
|
||||
.base = 0x0, .version = 0x1, .trigger_sel_off = 0x119c
|
||||
};
|
||||
|
||||
@@ -325,7 +435,7 @@ static struct dpu_reg_dma_cfg sdm845_regdma = {
|
||||
*************************************************************/
|
||||
|
||||
/* SSPP QOS LUTs */
|
||||
static struct dpu_qos_lut_entry sdm845_qos_linear[] = {
|
||||
static const struct dpu_qos_lut_entry sdm845_qos_linear[] = {
|
||||
{.fl = 4, .lut = 0x357},
|
||||
{.fl = 5, .lut = 0x3357},
|
||||
{.fl = 6, .lut = 0x23357},
|
||||
@@ -340,7 +450,11 @@ static struct dpu_qos_lut_entry sdm845_qos_linear[] = {
|
||||
{.fl = 0, .lut = 0x11222222223357}
|
||||
};
|
||||
|
||||
static struct dpu_qos_lut_entry sdm845_qos_macrotile[] = {
|
||||
static const struct dpu_qos_lut_entry sc7180_qos_linear[] = {
|
||||
{.fl = 0, .lut = 0x0011222222335777},
|
||||
};
|
||||
|
||||
static const struct dpu_qos_lut_entry sdm845_qos_macrotile[] = {
|
||||
{.fl = 10, .lut = 0x344556677},
|
||||
{.fl = 11, .lut = 0x3344556677},
|
||||
{.fl = 12, .lut = 0x23344556677},
|
||||
@@ -349,11 +463,19 @@ static struct dpu_qos_lut_entry sdm845_qos_macrotile[] = {
|
||||
{.fl = 0, .lut = 0x112233344556677},
|
||||
};
|
||||
|
||||
static struct dpu_qos_lut_entry sdm845_qos_nrt[] = {
|
||||
static const struct dpu_qos_lut_entry sc7180_qos_macrotile[] = {
|
||||
{.fl = 0, .lut = 0x0011223344556677},
|
||||
};
|
||||
|
||||
static const struct dpu_qos_lut_entry sdm845_qos_nrt[] = {
|
||||
{.fl = 0, .lut = 0x0},
|
||||
};
|
||||
|
||||
static struct dpu_perf_cfg sdm845_perf_data = {
|
||||
static const struct dpu_qos_lut_entry sc7180_qos_nrt[] = {
|
||||
{.fl = 0, .lut = 0x0},
|
||||
};
|
||||
|
||||
static const struct dpu_perf_cfg sdm845_perf_data = {
|
||||
.max_bw_low = 6800000,
|
||||
.max_bw_high = 6800000,
|
||||
.min_core_ib = 2400000,
|
||||
@@ -392,6 +514,30 @@ static struct dpu_perf_cfg sdm845_perf_data = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct dpu_perf_cfg sc7180_perf_data = {
|
||||
.max_bw_low = 3900000,
|
||||
.max_bw_high = 5500000,
|
||||
.min_core_ib = 2400000,
|
||||
.min_llcc_ib = 800000,
|
||||
.min_dram_ib = 800000,
|
||||
.danger_lut_tbl = {0xff, 0xffff, 0x0},
|
||||
.qos_lut_tbl = {
|
||||
{.nentry = ARRAY_SIZE(sc7180_qos_linear),
|
||||
.entries = sc7180_qos_linear
|
||||
},
|
||||
{.nentry = ARRAY_SIZE(sc7180_qos_macrotile),
|
||||
.entries = sc7180_qos_macrotile
|
||||
},
|
||||
{.nentry = ARRAY_SIZE(sc7180_qos_nrt),
|
||||
.entries = sc7180_qos_nrt
|
||||
},
|
||||
},
|
||||
.cdp_cfg = {
|
||||
{.rd_enable = 1, .wr_enable = 1},
|
||||
{.rd_enable = 1, .wr_enable = 0}
|
||||
},
|
||||
};
|
||||
|
||||
/*************************************************************
|
||||
* Hardware catalog init
|
||||
*************************************************************/
|
||||
@@ -421,12 +567,43 @@ static void sdm845_cfg_init(struct dpu_mdss_cfg *dpu_cfg)
|
||||
.reg_dma_count = 1,
|
||||
.dma_cfg = sdm845_regdma,
|
||||
.perf = sdm845_perf_data,
|
||||
.mdss_irqs = 0x3ff,
|
||||
};
|
||||
}
|
||||
|
||||
static struct dpu_mdss_hw_cfg_handler cfg_handler[] = {
|
||||
/*
|
||||
* sc7180_cfg_init(): populate sc7180 dpu sub-blocks reg offsets
|
||||
* and instance counts.
|
||||
*/
|
||||
static void sc7180_cfg_init(struct dpu_mdss_cfg *dpu_cfg)
|
||||
{
|
||||
*dpu_cfg = (struct dpu_mdss_cfg){
|
||||
.caps = &sc7180_dpu_caps,
|
||||
.mdp_count = ARRAY_SIZE(sc7180_mdp),
|
||||
.mdp = sc7180_mdp,
|
||||
.ctl_count = ARRAY_SIZE(sc7180_ctl),
|
||||
.ctl = sc7180_ctl,
|
||||
.sspp_count = ARRAY_SIZE(sc7180_sspp),
|
||||
.sspp = sc7180_sspp,
|
||||
.mixer_count = ARRAY_SIZE(sc7180_lm),
|
||||
.mixer = sc7180_lm,
|
||||
.pingpong_count = ARRAY_SIZE(sc7180_pp),
|
||||
.pingpong = sc7180_pp,
|
||||
.intf_count = ARRAY_SIZE(sc7180_intf),
|
||||
.intf = sc7180_intf,
|
||||
.vbif_count = ARRAY_SIZE(sdm845_vbif),
|
||||
.vbif = sdm845_vbif,
|
||||
.reg_dma_count = 1,
|
||||
.dma_cfg = sdm845_regdma,
|
||||
.perf = sc7180_perf_data,
|
||||
.mdss_irqs = 0x3f,
|
||||
};
|
||||
}
|
||||
|
||||
static const struct dpu_mdss_hw_cfg_handler cfg_handler[] = {
|
||||
{ .hw_rev = DPU_HW_VER_400, .cfg_init = sdm845_cfg_init},
|
||||
{ .hw_rev = DPU_HW_VER_401, .cfg_init = sdm845_cfg_init},
|
||||
{ .hw_rev = DPU_HW_VER_620, .cfg_init = sc7180_cfg_init},
|
||||
};
|
||||
|
||||
void dpu_hw_catalog_deinit(struct dpu_mdss_cfg *dpu_cfg)
|
||||
|
@@ -38,6 +38,7 @@
|
||||
#define DPU_HW_VER_401 DPU_HW_VER(4, 0, 1) /* sdm845 v2.0 */
|
||||
#define DPU_HW_VER_410 DPU_HW_VER(4, 1, 0) /* sdm670 v1.0 */
|
||||
#define DPU_HW_VER_500 DPU_HW_VER(5, 0, 0) /* sdm855 v1.0 */
|
||||
#define DPU_HW_VER_620 DPU_HW_VER(6, 2, 0) /* sc7180 v1.0 */
|
||||
|
||||
|
||||
#define IS_MSM8996_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_170)
|
||||
@@ -45,6 +46,7 @@
|
||||
#define IS_SDM845_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_400)
|
||||
#define IS_SDM670_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_410)
|
||||
#define IS_SDM855_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_500)
|
||||
#define IS_SC7180_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_620)
|
||||
|
||||
|
||||
#define DPU_HW_BLK_NAME_LEN 16
|
||||
@@ -92,6 +94,7 @@ enum {
|
||||
* @DPU_SSPP_SRC Src and fetch part of the pipes,
|
||||
* @DPU_SSPP_SCALER_QSEED2, QSEED2 algorithm support
|
||||
* @DPU_SSPP_SCALER_QSEED3, QSEED3 alogorithm support
|
||||
* @DPU_SSPP_SCALER_QSEED4, QSEED4 algorithm support
|
||||
* @DPU_SSPP_SCALER_RGB, RGB Scaler, supported by RGB pipes
|
||||
* @DPU_SSPP_CSC, Support of Color space converion
|
||||
* @DPU_SSPP_CSC_10BIT, Support of 10-bit Color space conversion
|
||||
@@ -110,6 +113,7 @@ enum {
|
||||
DPU_SSPP_SRC = 0x1,
|
||||
DPU_SSPP_SCALER_QSEED2,
|
||||
DPU_SSPP_SCALER_QSEED3,
|
||||
DPU_SSPP_SCALER_QSEED4,
|
||||
DPU_SSPP_SCALER_RGB,
|
||||
DPU_SSPP_CSC,
|
||||
DPU_SSPP_CSC_10BIT,
|
||||
@@ -166,6 +170,7 @@ enum {
|
||||
*/
|
||||
enum {
|
||||
DPU_CTL_SPLIT_DISPLAY = 0x1,
|
||||
DPU_CTL_ACTIVE_CFG,
|
||||
DPU_CTL_MAX
|
||||
};
|
||||
|
||||
@@ -269,7 +274,7 @@ struct dpu_qos_lut_entry {
|
||||
*/
|
||||
struct dpu_qos_lut_tbl {
|
||||
u32 nentry;
|
||||
struct dpu_qos_lut_entry *entries;
|
||||
const struct dpu_qos_lut_entry *entries;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -283,6 +288,7 @@ struct dpu_qos_lut_tbl {
|
||||
* @has_src_split source split feature status
|
||||
* @has_dim_layer dim layer feature status
|
||||
* @has_idle_pc indicate if idle power collapse feature is supported
|
||||
* @has_3d_merge indicate if 3D merge is supported
|
||||
*/
|
||||
struct dpu_caps {
|
||||
u32 max_mixer_width;
|
||||
@@ -293,6 +299,7 @@ struct dpu_caps {
|
||||
bool has_src_split;
|
||||
bool has_dim_layer;
|
||||
bool has_idle_pc;
|
||||
bool has_3d_merge;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -320,6 +327,7 @@ struct dpu_sspp_blks_common {
|
||||
* @maxupscale: maxupscale ratio supported
|
||||
* @smart_dma_priority: hw priority of rect1 of multirect pipe
|
||||
* @max_per_pipe_bw: maximum allowable bandwidth of this pipe in kBps
|
||||
* @qseed_ver: qseed version
|
||||
* @src_blk:
|
||||
* @scaler_blk:
|
||||
* @csc_blk:
|
||||
@@ -340,6 +348,7 @@ struct dpu_sspp_sub_blks {
|
||||
u32 maxupscale;
|
||||
u32 smart_dma_priority;
|
||||
u32 max_per_pipe_bw;
|
||||
u32 qseed_ver;
|
||||
struct dpu_src_blk src_blk;
|
||||
struct dpu_scaler_blk scaler_blk;
|
||||
struct dpu_pp_blk csc_blk;
|
||||
@@ -511,7 +520,7 @@ struct dpu_vbif_dynamic_ot_cfg {
|
||||
*/
|
||||
struct dpu_vbif_dynamic_ot_tbl {
|
||||
u32 count;
|
||||
struct dpu_vbif_dynamic_ot_cfg *cfg;
|
||||
const struct dpu_vbif_dynamic_ot_cfg *cfg;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -521,7 +530,7 @@ struct dpu_vbif_dynamic_ot_tbl {
|
||||
*/
|
||||
struct dpu_vbif_qos_tbl {
|
||||
u32 npriority_lvl;
|
||||
u32 *priority_lvl;
|
||||
const u32 *priority_lvl;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -646,6 +655,7 @@ struct dpu_perf_cfg {
|
||||
* @dma_formats Supported formats for dma pipe
|
||||
* @cursor_formats Supported formats for cursor pipe
|
||||
* @vig_formats Supported formats for vig pipe
|
||||
* @mdss_irqs: Bitmap with the irqs supported by the target
|
||||
*/
|
||||
struct dpu_mdss_cfg {
|
||||
u32 hwversion;
|
||||
@@ -653,25 +663,25 @@ struct dpu_mdss_cfg {
|
||||
const struct dpu_caps *caps;
|
||||
|
||||
u32 mdp_count;
|
||||
struct dpu_mdp_cfg *mdp;
|
||||
const struct dpu_mdp_cfg *mdp;
|
||||
|
||||
u32 ctl_count;
|
||||
struct dpu_ctl_cfg *ctl;
|
||||
const struct dpu_ctl_cfg *ctl;
|
||||
|
||||
u32 sspp_count;
|
||||
struct dpu_sspp_cfg *sspp;
|
||||
const struct dpu_sspp_cfg *sspp;
|
||||
|
||||
u32 mixer_count;
|
||||
struct dpu_lm_cfg *mixer;
|
||||
const struct dpu_lm_cfg *mixer;
|
||||
|
||||
u32 pingpong_count;
|
||||
struct dpu_pingpong_cfg *pingpong;
|
||||
const struct dpu_pingpong_cfg *pingpong;
|
||||
|
||||
u32 intf_count;
|
||||
struct dpu_intf_cfg *intf;
|
||||
const struct dpu_intf_cfg *intf;
|
||||
|
||||
u32 vbif_count;
|
||||
struct dpu_vbif_cfg *vbif;
|
||||
const struct dpu_vbif_cfg *vbif;
|
||||
|
||||
u32 reg_dma_count;
|
||||
struct dpu_reg_dma_cfg dma_cfg;
|
||||
@@ -681,9 +691,11 @@ struct dpu_mdss_cfg {
|
||||
/* Add additional block data structures here */
|
||||
|
||||
struct dpu_perf_cfg perf;
|
||||
struct dpu_format_extended *dma_formats;
|
||||
struct dpu_format_extended *cursor_formats;
|
||||
struct dpu_format_extended *vig_formats;
|
||||
const struct dpu_format_extended *dma_formats;
|
||||
const struct dpu_format_extended *cursor_formats;
|
||||
const struct dpu_format_extended *vig_formats;
|
||||
|
||||
unsigned long mdss_irqs;
|
||||
};
|
||||
|
||||
struct dpu_mdss_hw_cfg_handler {
|
||||
|
@@ -6,8 +6,12 @@
|
||||
|
||||
static const uint32_t qcom_compressed_supported_formats[] = {
|
||||
DRM_FORMAT_ABGR8888,
|
||||
DRM_FORMAT_ARGB8888,
|
||||
DRM_FORMAT_XBGR8888,
|
||||
DRM_FORMAT_XRGB8888,
|
||||
DRM_FORMAT_BGR565,
|
||||
|
||||
DRM_FORMAT_NV12,
|
||||
};
|
||||
|
||||
static const uint32_t plane_formats[] = {
|
||||
|
@@ -22,14 +22,18 @@
|
||||
#define CTL_PREPARE 0x0d0
|
||||
#define CTL_SW_RESET 0x030
|
||||
#define CTL_LAYER_EXTN_OFFSET 0x40
|
||||
#define CTL_INTF_ACTIVE 0x0F4
|
||||
#define CTL_INTF_FLUSH 0x110
|
||||
#define CTL_INTF_MASTER 0x134
|
||||
|
||||
#define CTL_MIXER_BORDER_OUT BIT(24)
|
||||
#define CTL_FLUSH_MASK_CTL BIT(17)
|
||||
|
||||
#define DPU_REG_RESET_TIMEOUT_US 2000
|
||||
#define INTF_IDX 31
|
||||
|
||||
static struct dpu_ctl_cfg *_ctl_offset(enum dpu_ctl ctl,
|
||||
struct dpu_mdss_cfg *m,
|
||||
static const struct dpu_ctl_cfg *_ctl_offset(enum dpu_ctl ctl,
|
||||
const struct dpu_mdss_cfg *m,
|
||||
void __iomem *addr,
|
||||
struct dpu_hw_blk_reg_map *b)
|
||||
{
|
||||
@@ -100,11 +104,27 @@ static inline void dpu_hw_ctl_update_pending_flush(struct dpu_hw_ctl *ctx,
|
||||
ctx->pending_flush_mask |= flushbits;
|
||||
}
|
||||
|
||||
static inline void dpu_hw_ctl_update_pending_intf_flush(struct dpu_hw_ctl *ctx,
|
||||
u32 flushbits)
|
||||
{
|
||||
ctx->pending_intf_flush_mask |= flushbits;
|
||||
}
|
||||
|
||||
static u32 dpu_hw_ctl_get_pending_flush(struct dpu_hw_ctl *ctx)
|
||||
{
|
||||
return ctx->pending_flush_mask;
|
||||
}
|
||||
|
||||
static inline void dpu_hw_ctl_trigger_flush_v1(struct dpu_hw_ctl *ctx)
|
||||
{
|
||||
|
||||
if (ctx->pending_flush_mask & BIT(INTF_IDX))
|
||||
DPU_REG_WRITE(&ctx->hw, CTL_INTF_FLUSH,
|
||||
ctx->pending_intf_flush_mask);
|
||||
|
||||
DPU_REG_WRITE(&ctx->hw, CTL_FLUSH, ctx->pending_flush_mask);
|
||||
}
|
||||
|
||||
static inline void dpu_hw_ctl_trigger_flush(struct dpu_hw_ctl *ctx)
|
||||
{
|
||||
trace_dpu_hw_ctl_trigger_pending_flush(ctx->pending_flush_mask,
|
||||
@@ -222,6 +242,36 @@ static int dpu_hw_ctl_get_bitmask_intf(struct dpu_hw_ctl *ctx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dpu_hw_ctl_get_bitmask_intf_v1(struct dpu_hw_ctl *ctx,
|
||||
u32 *flushbits, enum dpu_intf intf)
|
||||
{
|
||||
switch (intf) {
|
||||
case INTF_0:
|
||||
case INTF_1:
|
||||
*flushbits |= BIT(31);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dpu_hw_ctl_active_get_bitmask_intf(struct dpu_hw_ctl *ctx,
|
||||
u32 *flushbits, enum dpu_intf intf)
|
||||
{
|
||||
switch (intf) {
|
||||
case INTF_0:
|
||||
*flushbits |= BIT(0);
|
||||
break;
|
||||
case INTF_1:
|
||||
*flushbits |= BIT(1);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32 dpu_hw_ctl_poll_reset_status(struct dpu_hw_ctl *ctx, u32 timeout_us)
|
||||
{
|
||||
struct dpu_hw_blk_reg_map *c = &ctx->hw;
|
||||
@@ -422,6 +472,24 @@ exit:
|
||||
DPU_REG_WRITE(c, CTL_LAYER_EXT3(lm), mixercfg_ext3);
|
||||
}
|
||||
|
||||
|
||||
static void dpu_hw_ctl_intf_cfg_v1(struct dpu_hw_ctl *ctx,
|
||||
struct dpu_hw_intf_cfg *cfg)
|
||||
{
|
||||
struct dpu_hw_blk_reg_map *c = &ctx->hw;
|
||||
u32 intf_active = 0;
|
||||
u32 mode_sel = 0;
|
||||
|
||||
if (cfg->intf_mode_sel == DPU_CTL_MODE_SEL_CMD)
|
||||
mode_sel |= BIT(17);
|
||||
|
||||
intf_active = DPU_REG_READ(c, CTL_INTF_ACTIVE);
|
||||
intf_active |= BIT(cfg->intf - INTF_0);
|
||||
|
||||
DPU_REG_WRITE(c, CTL_TOP, mode_sel);
|
||||
DPU_REG_WRITE(c, CTL_INTF_ACTIVE, intf_active);
|
||||
}
|
||||
|
||||
static void dpu_hw_ctl_intf_cfg(struct dpu_hw_ctl *ctx,
|
||||
struct dpu_hw_intf_cfg *cfg)
|
||||
{
|
||||
@@ -455,31 +523,41 @@ static void dpu_hw_ctl_intf_cfg(struct dpu_hw_ctl *ctx,
|
||||
static void _setup_ctl_ops(struct dpu_hw_ctl_ops *ops,
|
||||
unsigned long cap)
|
||||
{
|
||||
if (cap & BIT(DPU_CTL_ACTIVE_CFG)) {
|
||||
ops->trigger_flush = dpu_hw_ctl_trigger_flush_v1;
|
||||
ops->setup_intf_cfg = dpu_hw_ctl_intf_cfg_v1;
|
||||
ops->get_bitmask_intf = dpu_hw_ctl_get_bitmask_intf_v1;
|
||||
ops->get_bitmask_active_intf =
|
||||
dpu_hw_ctl_active_get_bitmask_intf;
|
||||
ops->update_pending_intf_flush =
|
||||
dpu_hw_ctl_update_pending_intf_flush;
|
||||
} else {
|
||||
ops->trigger_flush = dpu_hw_ctl_trigger_flush;
|
||||
ops->setup_intf_cfg = dpu_hw_ctl_intf_cfg;
|
||||
ops->get_bitmask_intf = dpu_hw_ctl_get_bitmask_intf;
|
||||
}
|
||||
ops->clear_pending_flush = dpu_hw_ctl_clear_pending_flush;
|
||||
ops->update_pending_flush = dpu_hw_ctl_update_pending_flush;
|
||||
ops->get_pending_flush = dpu_hw_ctl_get_pending_flush;
|
||||
ops->trigger_flush = dpu_hw_ctl_trigger_flush;
|
||||
ops->get_flush_register = dpu_hw_ctl_get_flush_register;
|
||||
ops->trigger_start = dpu_hw_ctl_trigger_start;
|
||||
ops->trigger_pending = dpu_hw_ctl_trigger_pending;
|
||||
ops->setup_intf_cfg = dpu_hw_ctl_intf_cfg;
|
||||
ops->reset = dpu_hw_ctl_reset_control;
|
||||
ops->wait_reset_status = dpu_hw_ctl_wait_reset_status;
|
||||
ops->clear_all_blendstages = dpu_hw_ctl_clear_all_blendstages;
|
||||
ops->setup_blendstage = dpu_hw_ctl_setup_blendstage;
|
||||
ops->get_bitmask_sspp = dpu_hw_ctl_get_bitmask_sspp;
|
||||
ops->get_bitmask_mixer = dpu_hw_ctl_get_bitmask_mixer;
|
||||
ops->get_bitmask_intf = dpu_hw_ctl_get_bitmask_intf;
|
||||
};
|
||||
|
||||
static struct dpu_hw_blk_ops dpu_hw_ops;
|
||||
|
||||
struct dpu_hw_ctl *dpu_hw_ctl_init(enum dpu_ctl idx,
|
||||
void __iomem *addr,
|
||||
struct dpu_mdss_cfg *m)
|
||||
const struct dpu_mdss_cfg *m)
|
||||
{
|
||||
struct dpu_hw_ctl *c;
|
||||
struct dpu_ctl_cfg *cfg;
|
||||
const struct dpu_ctl_cfg *cfg;
|
||||
|
||||
c = kzalloc(sizeof(*c), GFP_KERNEL);
|
||||
if (!c)
|
||||
|
@@ -90,6 +90,15 @@ struct dpu_hw_ctl_ops {
|
||||
void (*update_pending_flush)(struct dpu_hw_ctl *ctx,
|
||||
u32 flushbits);
|
||||
|
||||
/**
|
||||
* OR in the given flushbits to the cached pending_intf_flush_mask
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @flushbits : module flushmask
|
||||
*/
|
||||
void (*update_pending_intf_flush)(struct dpu_hw_ctl *ctx,
|
||||
u32 flushbits);
|
||||
|
||||
/**
|
||||
* Write the value of the pending_flush_mask to hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
@@ -130,10 +139,23 @@ struct dpu_hw_ctl_ops {
|
||||
uint32_t (*get_bitmask_mixer)(struct dpu_hw_ctl *ctx,
|
||||
enum dpu_lm blk);
|
||||
|
||||
/**
|
||||
* Query the value of the intf flush mask
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
*/
|
||||
int (*get_bitmask_intf)(struct dpu_hw_ctl *ctx,
|
||||
u32 *flushbits,
|
||||
enum dpu_intf blk);
|
||||
|
||||
/**
|
||||
* Query the value of the intf active flush mask
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
*/
|
||||
int (*get_bitmask_active_intf)(struct dpu_hw_ctl *ctx,
|
||||
u32 *flushbits, enum dpu_intf blk);
|
||||
|
||||
/**
|
||||
* Set all blend stages to disabled
|
||||
* @ctx : ctl path ctx pointer
|
||||
@@ -159,6 +181,7 @@ struct dpu_hw_ctl_ops {
|
||||
* @mixer_count: number of mixers
|
||||
* @mixer_hw_caps: mixer hardware capabilities
|
||||
* @pending_flush_mask: storage for pending ctl_flush managed via ops
|
||||
* @pending_intf_flush_mask: pending INTF flush
|
||||
* @ops: operation list
|
||||
*/
|
||||
struct dpu_hw_ctl {
|
||||
@@ -171,6 +194,7 @@ struct dpu_hw_ctl {
|
||||
int mixer_count;
|
||||
const struct dpu_lm_cfg *mixer_hw_caps;
|
||||
u32 pending_flush_mask;
|
||||
u32 pending_intf_flush_mask;
|
||||
|
||||
/* ops */
|
||||
struct dpu_hw_ctl_ops ops;
|
||||
@@ -195,7 +219,7 @@ static inline struct dpu_hw_ctl *to_dpu_hw_ctl(struct dpu_hw_blk *hw)
|
||||
*/
|
||||
struct dpu_hw_ctl *dpu_hw_ctl_init(enum dpu_ctl idx,
|
||||
void __iomem *addr,
|
||||
struct dpu_mdss_cfg *m);
|
||||
const struct dpu_mdss_cfg *m);
|
||||
|
||||
/**
|
||||
* dpu_hw_ctl_destroy(): Destroys ctl driver context
|
||||
|
@@ -800,8 +800,8 @@ static void dpu_hw_intr_dispatch_irq(struct dpu_hw_intr *intr,
|
||||
start_idx = reg_idx * 32;
|
||||
end_idx = start_idx + 32;
|
||||
|
||||
if (start_idx >= ARRAY_SIZE(dpu_irq_map) ||
|
||||
end_idx > ARRAY_SIZE(dpu_irq_map))
|
||||
if (!test_bit(reg_idx, &intr->irq_mask) ||
|
||||
start_idx >= ARRAY_SIZE(dpu_irq_map))
|
||||
continue;
|
||||
|
||||
/*
|
||||
@@ -955,8 +955,11 @@ static int dpu_hw_intr_clear_irqs(struct dpu_hw_intr *intr)
|
||||
if (!intr)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(dpu_intr_set); i++)
|
||||
DPU_REG_WRITE(&intr->hw, dpu_intr_set[i].clr_off, 0xffffffff);
|
||||
for (i = 0; i < ARRAY_SIZE(dpu_intr_set); i++) {
|
||||
if (test_bit(i, &intr->irq_mask))
|
||||
DPU_REG_WRITE(&intr->hw,
|
||||
dpu_intr_set[i].clr_off, 0xffffffff);
|
||||
}
|
||||
|
||||
/* ensure register writes go through */
|
||||
wmb();
|
||||
@@ -971,8 +974,11 @@ static int dpu_hw_intr_disable_irqs(struct dpu_hw_intr *intr)
|
||||
if (!intr)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(dpu_intr_set); i++)
|
||||
DPU_REG_WRITE(&intr->hw, dpu_intr_set[i].en_off, 0x00000000);
|
||||
for (i = 0; i < ARRAY_SIZE(dpu_intr_set); i++) {
|
||||
if (test_bit(i, &intr->irq_mask))
|
||||
DPU_REG_WRITE(&intr->hw,
|
||||
dpu_intr_set[i].en_off, 0x00000000);
|
||||
}
|
||||
|
||||
/* ensure register writes go through */
|
||||
wmb();
|
||||
@@ -991,6 +997,9 @@ static void dpu_hw_intr_get_interrupt_statuses(struct dpu_hw_intr *intr)
|
||||
|
||||
spin_lock_irqsave(&intr->irq_lock, irq_flags);
|
||||
for (i = 0; i < ARRAY_SIZE(dpu_intr_set); i++) {
|
||||
if (!test_bit(i, &intr->irq_mask))
|
||||
continue;
|
||||
|
||||
/* Read interrupt status */
|
||||
intr->save_irq_status[i] = DPU_REG_READ(&intr->hw,
|
||||
dpu_intr_set[i].status_off);
|
||||
@@ -1115,6 +1124,7 @@ struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
intr->irq_mask = m->mdss_irqs;
|
||||
spin_lock_init(&intr->irq_lock);
|
||||
|
||||
return intr;
|
||||
|
@@ -187,6 +187,7 @@ struct dpu_hw_intr {
|
||||
u32 *save_irq_status;
|
||||
u32 irq_idx_tbl_size;
|
||||
spinlock_t irq_lock;
|
||||
unsigned long irq_mask;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -56,8 +56,10 @@
|
||||
#define INTF_FRAME_COUNT 0x0AC
|
||||
#define INTF_LINE_COUNT 0x0B0
|
||||
|
||||
static struct dpu_intf_cfg *_intf_offset(enum dpu_intf intf,
|
||||
struct dpu_mdss_cfg *m,
|
||||
#define INTF_MUX 0x25C
|
||||
|
||||
static const struct dpu_intf_cfg *_intf_offset(enum dpu_intf intf,
|
||||
const struct dpu_mdss_cfg *m,
|
||||
void __iomem *addr,
|
||||
struct dpu_hw_blk_reg_map *b)
|
||||
{
|
||||
@@ -218,6 +220,30 @@ static void dpu_hw_intf_setup_prg_fetch(
|
||||
DPU_REG_WRITE(c, INTF_CONFIG, fetch_enable);
|
||||
}
|
||||
|
||||
static void dpu_hw_intf_bind_pingpong_blk(
|
||||
struct dpu_hw_intf *intf,
|
||||
bool enable,
|
||||
const enum dpu_pingpong pp)
|
||||
{
|
||||
struct dpu_hw_blk_reg_map *c;
|
||||
u32 mux_cfg;
|
||||
|
||||
if (!intf)
|
||||
return;
|
||||
|
||||
c = &intf->hw;
|
||||
|
||||
mux_cfg = DPU_REG_READ(c, INTF_MUX);
|
||||
mux_cfg &= ~0xf;
|
||||
|
||||
if (enable)
|
||||
mux_cfg |= (pp - PINGPONG_0) & 0x7;
|
||||
else
|
||||
mux_cfg |= 0xf;
|
||||
|
||||
DPU_REG_WRITE(c, INTF_MUX, mux_cfg);
|
||||
}
|
||||
|
||||
static void dpu_hw_intf_get_status(
|
||||
struct dpu_hw_intf *intf,
|
||||
struct intf_status *s)
|
||||
@@ -254,16 +280,18 @@ static void _setup_intf_ops(struct dpu_hw_intf_ops *ops,
|
||||
ops->get_status = dpu_hw_intf_get_status;
|
||||
ops->enable_timing = dpu_hw_intf_enable_timing_engine;
|
||||
ops->get_line_count = dpu_hw_intf_get_line_count;
|
||||
if (cap & BIT(DPU_CTL_ACTIVE_CFG))
|
||||
ops->bind_pingpong_blk = dpu_hw_intf_bind_pingpong_blk;
|
||||
}
|
||||
|
||||
static struct dpu_hw_blk_ops dpu_hw_ops;
|
||||
|
||||
struct dpu_hw_intf *dpu_hw_intf_init(enum dpu_intf idx,
|
||||
void __iomem *addr,
|
||||
struct dpu_mdss_cfg *m)
|
||||
const struct dpu_mdss_cfg *m)
|
||||
{
|
||||
struct dpu_hw_intf *c;
|
||||
struct dpu_intf_cfg *cfg;
|
||||
const struct dpu_intf_cfg *cfg;
|
||||
|
||||
c = kzalloc(sizeof(*c), GFP_KERNEL);
|
||||
if (!c)
|
||||
|
@@ -52,6 +52,8 @@ struct intf_status {
|
||||
* @ enable_timing: enable/disable timing engine
|
||||
* @ get_status: returns if timing engine is enabled or not
|
||||
* @ get_line_count: reads current vertical line counter
|
||||
* @bind_pingpong_blk: enable/disable the connection with pingpong which will
|
||||
* feed pixels to this interface
|
||||
*/
|
||||
struct dpu_hw_intf_ops {
|
||||
void (*setup_timing_gen)(struct dpu_hw_intf *intf,
|
||||
@@ -68,6 +70,10 @@ struct dpu_hw_intf_ops {
|
||||
struct intf_status *status);
|
||||
|
||||
u32 (*get_line_count)(struct dpu_hw_intf *intf);
|
||||
|
||||
void (*bind_pingpong_blk)(struct dpu_hw_intf *intf,
|
||||
bool enable,
|
||||
const enum dpu_pingpong pp);
|
||||
};
|
||||
|
||||
struct dpu_hw_intf {
|
||||
@@ -92,7 +98,7 @@ struct dpu_hw_intf {
|
||||
*/
|
||||
struct dpu_hw_intf *dpu_hw_intf_init(enum dpu_intf idx,
|
||||
void __iomem *addr,
|
||||
struct dpu_mdss_cfg *m);
|
||||
const struct dpu_mdss_cfg *m);
|
||||
|
||||
/**
|
||||
* dpu_hw_intf_destroy(): Destroys INTF driver context
|
||||
|
@@ -24,8 +24,8 @@
|
||||
#define LM_BLEND0_FG_ALPHA 0x04
|
||||
#define LM_BLEND0_BG_ALPHA 0x08
|
||||
|
||||
static struct dpu_lm_cfg *_lm_offset(enum dpu_lm mixer,
|
||||
struct dpu_mdss_cfg *m,
|
||||
static const struct dpu_lm_cfg *_lm_offset(enum dpu_lm mixer,
|
||||
const struct dpu_mdss_cfg *m,
|
||||
void __iomem *addr,
|
||||
struct dpu_hw_blk_reg_map *b)
|
||||
{
|
||||
@@ -147,12 +147,13 @@ static void dpu_hw_lm_setup_color3(struct dpu_hw_mixer *ctx,
|
||||
DPU_REG_WRITE(c, LM_OP_MODE, op_mode);
|
||||
}
|
||||
|
||||
static void _setup_mixer_ops(struct dpu_mdss_cfg *m,
|
||||
static void _setup_mixer_ops(const struct dpu_mdss_cfg *m,
|
||||
struct dpu_hw_lm_ops *ops,
|
||||
unsigned long features)
|
||||
{
|
||||
ops->setup_mixer_out = dpu_hw_lm_setup_out;
|
||||
if (IS_SDM845_TARGET(m->hwversion) || IS_SDM670_TARGET(m->hwversion))
|
||||
if (IS_SDM845_TARGET(m->hwversion) || IS_SDM670_TARGET(m->hwversion)
|
||||
|| IS_SC7180_TARGET(m->hwversion))
|
||||
ops->setup_blend_config = dpu_hw_lm_setup_blend_config_sdm845;
|
||||
else
|
||||
ops->setup_blend_config = dpu_hw_lm_setup_blend_config;
|
||||
@@ -164,10 +165,10 @@ static struct dpu_hw_blk_ops dpu_hw_ops;
|
||||
|
||||
struct dpu_hw_mixer *dpu_hw_lm_init(enum dpu_lm idx,
|
||||
void __iomem *addr,
|
||||
struct dpu_mdss_cfg *m)
|
||||
const struct dpu_mdss_cfg *m)
|
||||
{
|
||||
struct dpu_hw_mixer *c;
|
||||
struct dpu_lm_cfg *cfg;
|
||||
const struct dpu_lm_cfg *cfg;
|
||||
|
||||
c = kzalloc(sizeof(*c), GFP_KERNEL);
|
||||
if (!c)
|
||||
|
@@ -91,7 +91,7 @@ static inline struct dpu_hw_mixer *to_dpu_hw_mixer(struct dpu_hw_blk *hw)
|
||||
*/
|
||||
struct dpu_hw_mixer *dpu_hw_lm_init(enum dpu_lm idx,
|
||||
void __iomem *addr,
|
||||
struct dpu_mdss_cfg *m);
|
||||
const struct dpu_mdss_cfg *m);
|
||||
|
||||
/**
|
||||
* dpu_hw_lm_destroy(): Destroys layer mixer driver context
|
||||
|
@@ -28,8 +28,8 @@
|
||||
#define PP_FBC_BUDGET_CTL 0x038
|
||||
#define PP_FBC_LOSSY_MODE 0x03C
|
||||
|
||||
static struct dpu_pingpong_cfg *_pingpong_offset(enum dpu_pingpong pp,
|
||||
struct dpu_mdss_cfg *m,
|
||||
static const struct dpu_pingpong_cfg *_pingpong_offset(enum dpu_pingpong pp,
|
||||
const struct dpu_mdss_cfg *m,
|
||||
void __iomem *addr,
|
||||
struct dpu_hw_blk_reg_map *b)
|
||||
{
|
||||
@@ -195,10 +195,10 @@ static struct dpu_hw_blk_ops dpu_hw_ops;
|
||||
|
||||
struct dpu_hw_pingpong *dpu_hw_pingpong_init(enum dpu_pingpong idx,
|
||||
void __iomem *addr,
|
||||
struct dpu_mdss_cfg *m)
|
||||
const struct dpu_mdss_cfg *m)
|
||||
{
|
||||
struct dpu_hw_pingpong *c;
|
||||
struct dpu_pingpong_cfg *cfg;
|
||||
const struct dpu_pingpong_cfg *cfg;
|
||||
|
||||
c = kzalloc(sizeof(*c), GFP_KERNEL);
|
||||
if (!c)
|
||||
|
@@ -106,7 +106,7 @@ struct dpu_hw_pingpong {
|
||||
*/
|
||||
struct dpu_hw_pingpong *dpu_hw_pingpong_init(enum dpu_pingpong idx,
|
||||
void __iomem *addr,
|
||||
struct dpu_mdss_cfg *m);
|
||||
const struct dpu_mdss_cfg *m);
|
||||
|
||||
/**
|
||||
* dpu_hw_pingpong_destroy - destroys pingpong driver context
|
||||
|
@@ -132,6 +132,7 @@
|
||||
/* traffic shaper clock in Hz */
|
||||
#define TS_CLK 19200000
|
||||
|
||||
|
||||
static int _sspp_subblk_offset(struct dpu_hw_pipe *ctx,
|
||||
int s_id,
|
||||
u32 *idx)
|
||||
@@ -657,7 +658,8 @@ static void _setup_layer_ops(struct dpu_hw_pipe *c,
|
||||
test_bit(DPU_SSPP_SMART_DMA_V2, &c->cap->features))
|
||||
c->ops.setup_multirect = dpu_hw_sspp_setup_multirect;
|
||||
|
||||
if (test_bit(DPU_SSPP_SCALER_QSEED3, &features)) {
|
||||
if (test_bit(DPU_SSPP_SCALER_QSEED3, &features) ||
|
||||
test_bit(DPU_SSPP_SCALER_QSEED4, &features)) {
|
||||
c->ops.setup_scaler = _dpu_hw_sspp_setup_scaler3;
|
||||
c->ops.get_scaler_ver = _dpu_hw_sspp_get_scaler3_ver;
|
||||
}
|
||||
@@ -666,7 +668,7 @@ static void _setup_layer_ops(struct dpu_hw_pipe *c,
|
||||
c->ops.setup_cdp = dpu_hw_sspp_setup_cdp;
|
||||
}
|
||||
|
||||
static struct dpu_sspp_cfg *_sspp_offset(enum dpu_sspp sspp,
|
||||
static const struct dpu_sspp_cfg *_sspp_offset(enum dpu_sspp sspp,
|
||||
void __iomem *addr,
|
||||
struct dpu_mdss_cfg *catalog,
|
||||
struct dpu_hw_blk_reg_map *b)
|
||||
@@ -696,7 +698,7 @@ struct dpu_hw_pipe *dpu_hw_sspp_init(enum dpu_sspp idx,
|
||||
bool is_virtual_pipe)
|
||||
{
|
||||
struct dpu_hw_pipe *hw_pipe;
|
||||
struct dpu_sspp_cfg *cfg;
|
||||
const struct dpu_sspp_cfg *cfg;
|
||||
|
||||
if (!addr || !catalog)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
@@ -27,7 +27,8 @@ struct dpu_hw_pipe;
|
||||
*/
|
||||
#define DPU_SSPP_SCALER ((1UL << DPU_SSPP_SCALER_RGB) | \
|
||||
(1UL << DPU_SSPP_SCALER_QSEED2) | \
|
||||
(1UL << DPU_SSPP_SCALER_QSEED3))
|
||||
(1UL << DPU_SSPP_SCALER_QSEED3) | \
|
||||
(1UL << DPU_SSPP_SCALER_QSEED4))
|
||||
|
||||
/**
|
||||
* Component indices
|
||||
@@ -373,7 +374,7 @@ struct dpu_hw_pipe {
|
||||
struct dpu_hw_blk base;
|
||||
struct dpu_hw_blk_reg_map hw;
|
||||
struct dpu_mdss_cfg *catalog;
|
||||
struct dpu_mdp_cfg *mdp;
|
||||
const struct dpu_mdp_cfg *mdp;
|
||||
|
||||
/* Pipe */
|
||||
enum dpu_sspp idx;
|
||||
|
@@ -93,19 +93,12 @@ int msm_dss_enable_clk(struct dss_clk *clk_arry, int num_clk, int enable)
|
||||
DEV_DBG("%pS->%s: enable '%s'\n",
|
||||
__builtin_return_address(0), __func__,
|
||||
clk_arry[i].clk_name);
|
||||
if (clk_arry[i].clk) {
|
||||
rc = clk_prepare_enable(clk_arry[i].clk);
|
||||
if (rc)
|
||||
DEV_ERR("%pS->%s: %s en fail. rc=%d\n",
|
||||
__builtin_return_address(0),
|
||||
__func__,
|
||||
clk_arry[i].clk_name, rc);
|
||||
} else {
|
||||
DEV_ERR("%pS->%s: '%s' is not available\n",
|
||||
__builtin_return_address(0), __func__,
|
||||
clk_arry[i].clk_name);
|
||||
rc = -EPERM;
|
||||
}
|
||||
rc = clk_prepare_enable(clk_arry[i].clk);
|
||||
if (rc)
|
||||
DEV_ERR("%pS->%s: %s en fail. rc=%d\n",
|
||||
__builtin_return_address(0),
|
||||
__func__,
|
||||
clk_arry[i].clk_name, rc);
|
||||
|
||||
if (rc && i) {
|
||||
msm_dss_enable_clk(&clk_arry[i - 1],
|
||||
@@ -119,12 +112,7 @@ int msm_dss_enable_clk(struct dss_clk *clk_arry, int num_clk, int enable)
|
||||
__builtin_return_address(0), __func__,
|
||||
clk_arry[i].clk_name);
|
||||
|
||||
if (clk_arry[i].clk)
|
||||
clk_disable_unprepare(clk_arry[i].clk);
|
||||
else
|
||||
DEV_ERR("%pS->%s: '%s' is not available\n",
|
||||
__builtin_return_address(0), __func__,
|
||||
clk_arry[i].clk_name);
|
||||
clk_disable_unprepare(clk_arry[i].clk);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -187,6 +175,7 @@ int msm_dss_parse_clock(struct platform_device *pdev,
|
||||
continue;
|
||||
mp->clk_config[i].rate = rate;
|
||||
mp->clk_config[i].type = DSS_CLK_PCLK;
|
||||
mp->clk_config[i].max_rate = rate;
|
||||
}
|
||||
|
||||
mp->num_clk = num_clk;
|
||||
|
@@ -1059,6 +1059,7 @@ static const struct dev_pm_ops dpu_pm_ops = {
|
||||
|
||||
static const struct of_device_id dpu_dt_match[] = {
|
||||
{ .compatible = "qcom,sdm845-dpu", },
|
||||
{ .compatible = "qcom,sc7180-dpu", },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, dpu_dt_match);
|
||||
|
@@ -53,8 +53,13 @@ enum {
|
||||
R_MAX
|
||||
};
|
||||
|
||||
/*
|
||||
* Default Preload Values
|
||||
*/
|
||||
#define DPU_QSEED3_DEFAULT_PRELOAD_H 0x4
|
||||
#define DPU_QSEED3_DEFAULT_PRELOAD_V 0x3
|
||||
#define DPU_QSEED4_DEFAULT_PRELOAD_V 0x2
|
||||
#define DPU_QSEED4_DEFAULT_PRELOAD_H 0x4
|
||||
|
||||
#define DEFAULT_REFRESH_RATE 60
|
||||
|
||||
@@ -477,8 +482,16 @@ static void _dpu_plane_setup_scaler3(struct dpu_plane *pdpu,
|
||||
scale_cfg->src_width[i] /= chroma_subsmpl_h;
|
||||
scale_cfg->src_height[i] /= chroma_subsmpl_v;
|
||||
}
|
||||
scale_cfg->preload_x[i] = DPU_QSEED3_DEFAULT_PRELOAD_H;
|
||||
scale_cfg->preload_y[i] = DPU_QSEED3_DEFAULT_PRELOAD_V;
|
||||
|
||||
if (pdpu->pipe_hw->cap->features &
|
||||
BIT(DPU_SSPP_SCALER_QSEED4)) {
|
||||
scale_cfg->preload_x[i] = DPU_QSEED4_DEFAULT_PRELOAD_H;
|
||||
scale_cfg->preload_y[i] = DPU_QSEED4_DEFAULT_PRELOAD_V;
|
||||
} else {
|
||||
scale_cfg->preload_x[i] = DPU_QSEED3_DEFAULT_PRELOAD_H;
|
||||
scale_cfg->preload_y[i] = DPU_QSEED3_DEFAULT_PRELOAD_V;
|
||||
}
|
||||
|
||||
pstate->pixel_ext.num_ext_pxls_top[i] =
|
||||
scale_cfg->src_height[i];
|
||||
pstate->pixel_ext.num_ext_pxls_left[i] =
|
||||
@@ -738,7 +751,7 @@ done:
|
||||
} else {
|
||||
pstate[R0]->multirect_index = DPU_SSPP_RECT_0;
|
||||
pstate[R1]->multirect_index = DPU_SSPP_RECT_1;
|
||||
};
|
||||
}
|
||||
|
||||
DPU_DEBUG_PLANE(dpu_plane[R0], "R0: %d - %d\n",
|
||||
pstate[R0]->multirect_mode, pstate[R0]->multirect_index);
|
||||
@@ -858,7 +871,7 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
|
||||
pdpu->pipe_sblk->maxupscale << 16,
|
||||
true, true);
|
||||
if (ret) {
|
||||
DPU_ERROR_PLANE(pdpu, "Check plane state failed (%d)\n", ret);
|
||||
DPU_DEBUG_PLANE(pdpu, "Check plane state failed (%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
if (!state->visible)
|
||||
@@ -884,13 +897,13 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
|
||||
(!(pdpu->features & DPU_SSPP_SCALER) ||
|
||||
!(pdpu->features & (BIT(DPU_SSPP_CSC)
|
||||
| BIT(DPU_SSPP_CSC_10BIT))))) {
|
||||
DPU_ERROR_PLANE(pdpu,
|
||||
DPU_DEBUG_PLANE(pdpu,
|
||||
"plane doesn't have scaler/csc for yuv\n");
|
||||
return -EINVAL;
|
||||
|
||||
/* check src bounds */
|
||||
} else if (!dpu_plane_validate_src(&src, &fb_rect, min_src_size)) {
|
||||
DPU_ERROR_PLANE(pdpu, "invalid source " DRM_RECT_FMT "\n",
|
||||
DPU_DEBUG_PLANE(pdpu, "invalid source " DRM_RECT_FMT "\n",
|
||||
DRM_RECT_ARG(&src));
|
||||
return -E2BIG;
|
||||
|
||||
@@ -899,19 +912,19 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
|
||||
(src.x1 & 0x1 || src.y1 & 0x1 ||
|
||||
drm_rect_width(&src) & 0x1 ||
|
||||
drm_rect_height(&src) & 0x1)) {
|
||||
DPU_ERROR_PLANE(pdpu, "invalid yuv source " DRM_RECT_FMT "\n",
|
||||
DPU_DEBUG_PLANE(pdpu, "invalid yuv source " DRM_RECT_FMT "\n",
|
||||
DRM_RECT_ARG(&src));
|
||||
return -EINVAL;
|
||||
|
||||
/* min dst support */
|
||||
} else if (drm_rect_width(&dst) < 0x1 || drm_rect_height(&dst) < 0x1) {
|
||||
DPU_ERROR_PLANE(pdpu, "invalid dest rect " DRM_RECT_FMT "\n",
|
||||
DPU_DEBUG_PLANE(pdpu, "invalid dest rect " DRM_RECT_FMT "\n",
|
||||
DRM_RECT_ARG(&dst));
|
||||
return -EINVAL;
|
||||
|
||||
/* check decimated source width */
|
||||
} else if (drm_rect_width(&src) > max_linewidth) {
|
||||
DPU_ERROR_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u\n",
|
||||
DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u\n",
|
||||
DRM_RECT_ARG(&src), max_linewidth);
|
||||
return -E2BIG;
|
||||
}
|
||||
@@ -1337,7 +1350,8 @@ static int _dpu_plane_init_debugfs(struct drm_plane *plane)
|
||||
pdpu->debugfs_root, &pdpu->debugfs_src);
|
||||
|
||||
if (cfg->features & BIT(DPU_SSPP_SCALER_QSEED3) ||
|
||||
cfg->features & BIT(DPU_SSPP_SCALER_QSEED2)) {
|
||||
cfg->features & BIT(DPU_SSPP_SCALER_QSEED2) ||
|
||||
cfg->features & BIT(DPU_SSPP_SCALER_QSEED4)) {
|
||||
dpu_debugfs_setup_regset32(&pdpu->debugfs_scaler,
|
||||
sblk->scaler_blk.base + cfg->base,
|
||||
sblk->scaler_blk.len,
|
||||
|
@@ -141,11 +141,11 @@ int dpu_rm_destroy(struct dpu_rm *rm)
|
||||
|
||||
static int _dpu_rm_hw_blk_create(
|
||||
struct dpu_rm *rm,
|
||||
struct dpu_mdss_cfg *cat,
|
||||
const struct dpu_mdss_cfg *cat,
|
||||
void __iomem *mmio,
|
||||
enum dpu_hw_blk_type type,
|
||||
uint32_t id,
|
||||
void *hw_catalog_info)
|
||||
const void *hw_catalog_info)
|
||||
{
|
||||
struct dpu_rm_hw_blk *blk;
|
||||
void *hw;
|
||||
@@ -215,7 +215,7 @@ int dpu_rm_init(struct dpu_rm *rm,
|
||||
|
||||
/* Interrogate HW catalog and create tracking items for hw blocks */
|
||||
for (i = 0; i < cat->mixer_count; i++) {
|
||||
struct dpu_lm_cfg *lm = &cat->mixer[i];
|
||||
const struct dpu_lm_cfg *lm = &cat->mixer[i];
|
||||
|
||||
if (lm->pingpong == PINGPONG_MAX) {
|
||||
DPU_DEBUG("skip mixer %d without pingpong\n", lm->id);
|
||||
|
@@ -299,7 +299,7 @@ void dpu_debugfs_vbif_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root)
|
||||
entry = debugfs_create_dir("vbif", debugfs_root);
|
||||
|
||||
for (i = 0; i < dpu_kms->catalog->vbif_count; i++) {
|
||||
struct dpu_vbif_cfg *vbif = &dpu_kms->catalog->vbif[i];
|
||||
const struct dpu_vbif_cfg *vbif = &dpu_kms->catalog->vbif[i];
|
||||
|
||||
snprintf(vbif_name, sizeof(vbif_name), "%d", vbif->id);
|
||||
|
||||
@@ -318,7 +318,7 @@ void dpu_debugfs_vbif_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root)
|
||||
(u32 *)&vbif->default_ot_wr_limit);
|
||||
|
||||
for (j = 0; j < vbif->dynamic_ot_rd_tbl.count; j++) {
|
||||
struct dpu_vbif_dynamic_ot_cfg *cfg =
|
||||
const struct dpu_vbif_dynamic_ot_cfg *cfg =
|
||||
&vbif->dynamic_ot_rd_tbl.cfg[j];
|
||||
|
||||
snprintf(vbif_name, sizeof(vbif_name),
|
||||
@@ -332,7 +332,7 @@ void dpu_debugfs_vbif_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root)
|
||||
}
|
||||
|
||||
for (j = 0; j < vbif->dynamic_ot_wr_tbl.count; j++) {
|
||||
struct dpu_vbif_dynamic_ot_cfg *cfg =
|
||||
const struct dpu_vbif_dynamic_ot_cfg *cfg =
|
||||
&vbif->dynamic_ot_wr_tbl.cfg[j];
|
||||
|
||||
snprintf(vbif_name, sizeof(vbif_name),
|
||||
|
@@ -121,7 +121,7 @@ static void mdp4_dsi_encoder_enable(struct drm_encoder *encoder)
|
||||
if (mdp4_dsi_encoder->enabled)
|
||||
return;
|
||||
|
||||
mdp4_crtc_set_config(encoder->crtc,
|
||||
mdp4_crtc_set_config(encoder->crtc,
|
||||
MDP4_DMA_CONFIG_PACK_ALIGN_MSB |
|
||||
MDP4_DMA_CONFIG_DEFLKR_EN |
|
||||
MDP4_DMA_CONFIG_DITHER_EN |
|
||||
|
@@ -902,7 +902,7 @@ struct mdp5_cfg_handler *mdp5_cfg_init(struct mdp5_kms *mdp5_kms,
|
||||
major, minor);
|
||||
ret = -ENXIO;
|
||||
goto fail;
|
||||
};
|
||||
}
|
||||
|
||||
/* only after mdp5_cfg global pointer's init can we access the hw */
|
||||
for (i = 0; i < num_handlers; i++) {
|
||||
|
Fai riferimento in un nuovo problema
Block a user