mirror of https://github.com/torvalds/linux.git
drm/msm/dpu: split irq_control into irq_enable and _disable
The single helper for both enable and disable cases is too complicated, especially if we start adding more code to these helpers. Split it into irq_enable and irq_disable cases. Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Patchwork: https://patchwork.freedesktop.org/patch/577526/ Link: https://lore.kernel.org/r/20240208-fd_remove_phys_ops_atomic_mode_set-v4-1-caf5dcd125c0@linaro.org
This commit is contained in:
parent
06267d22f9
commit
c6f60037bf
|
|
@ -721,7 +721,7 @@ static void _dpu_encoder_update_vsync_source(struct dpu_encoder_virt *dpu_enc,
|
|||
}
|
||||
}
|
||||
|
||||
static void _dpu_encoder_irq_control(struct drm_encoder *drm_enc, bool enable)
|
||||
static void _dpu_encoder_irq_enable(struct drm_encoder *drm_enc)
|
||||
{
|
||||
struct dpu_encoder_virt *dpu_enc;
|
||||
int i;
|
||||
|
|
@ -733,14 +733,32 @@ static void _dpu_encoder_irq_control(struct drm_encoder *drm_enc, bool enable)
|
|||
|
||||
dpu_enc = to_dpu_encoder_virt(drm_enc);
|
||||
|
||||
DPU_DEBUG_ENC(dpu_enc, "enable:%d\n", enable);
|
||||
DPU_DEBUG_ENC(dpu_enc, "\n");
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
if (phys->ops.irq_control)
|
||||
phys->ops.irq_control(phys, enable);
|
||||
phys->ops.irq_enable(phys);
|
||||
}
|
||||
}
|
||||
|
||||
static void _dpu_encoder_irq_disable(struct drm_encoder *drm_enc)
|
||||
{
|
||||
struct dpu_encoder_virt *dpu_enc;
|
||||
int i;
|
||||
|
||||
if (!drm_enc) {
|
||||
DPU_ERROR("invalid encoder\n");
|
||||
return;
|
||||
}
|
||||
|
||||
dpu_enc = to_dpu_encoder_virt(drm_enc);
|
||||
|
||||
DPU_DEBUG_ENC(dpu_enc, "\n");
|
||||
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
|
||||
struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
|
||||
|
||||
phys->ops.irq_disable(phys);
|
||||
}
|
||||
}
|
||||
|
||||
static void _dpu_encoder_resource_control_helper(struct drm_encoder *drm_enc,
|
||||
|
|
@ -766,11 +784,11 @@ static void _dpu_encoder_resource_control_helper(struct drm_encoder *drm_enc,
|
|||
pm_runtime_get_sync(&dpu_kms->pdev->dev);
|
||||
|
||||
/* enable all the irq */
|
||||
_dpu_encoder_irq_control(drm_enc, true);
|
||||
_dpu_encoder_irq_enable(drm_enc);
|
||||
|
||||
} else {
|
||||
/* disable all the irq */
|
||||
_dpu_encoder_irq_control(drm_enc, false);
|
||||
_dpu_encoder_irq_disable(drm_enc);
|
||||
|
||||
/* disable DPU core clks */
|
||||
pm_runtime_put_sync(&dpu_kms->pdev->dev);
|
||||
|
|
@ -831,7 +849,7 @@ static int dpu_encoder_resource_control(struct drm_encoder *drm_enc,
|
|||
}
|
||||
|
||||
if (is_vid_mode && dpu_enc->rc_state == DPU_ENC_RC_STATE_IDLE)
|
||||
_dpu_encoder_irq_control(drm_enc, true);
|
||||
_dpu_encoder_irq_enable(drm_enc);
|
||||
else
|
||||
_dpu_encoder_resource_control_helper(drm_enc, true);
|
||||
|
||||
|
|
@ -886,7 +904,7 @@ static int dpu_encoder_resource_control(struct drm_encoder *drm_enc,
|
|||
|
||||
if (is_vid_mode &&
|
||||
dpu_enc->rc_state == DPU_ENC_RC_STATE_IDLE) {
|
||||
_dpu_encoder_irq_control(drm_enc, true);
|
||||
_dpu_encoder_irq_enable(drm_enc);
|
||||
}
|
||||
/* skip if is already OFF or IDLE, resources are off already */
|
||||
else if (dpu_enc->rc_state == DPU_ENC_RC_STATE_OFF ||
|
||||
|
|
@ -961,7 +979,7 @@ static int dpu_encoder_resource_control(struct drm_encoder *drm_enc,
|
|||
}
|
||||
|
||||
if (is_vid_mode)
|
||||
_dpu_encoder_irq_control(drm_enc, false);
|
||||
_dpu_encoder_irq_disable(drm_enc);
|
||||
else
|
||||
_dpu_encoder_resource_control_helper(drm_enc, false);
|
||||
|
||||
|
|
|
|||
|
|
@ -85,7 +85,8 @@ struct dpu_encoder_phys;
|
|||
* @handle_post_kickoff: Do any work necessary post-kickoff work
|
||||
* @trigger_start: Process start event on physical encoder
|
||||
* @needs_single_flush: Whether encoder slaves need to be flushed
|
||||
* @irq_control: Handler to enable/disable all the encoder IRQs
|
||||
* @irq_enable: Handler to enable all the encoder IRQs
|
||||
* @irq_disable: Handler to disable all the encoder IRQs
|
||||
* @prepare_idle_pc: phys encoder can update the vsync_enable status
|
||||
* on idle power collapse prepare
|
||||
* @restore: Restore all the encoder configs.
|
||||
|
|
@ -110,7 +111,8 @@ struct dpu_encoder_phys_ops {
|
|||
void (*handle_post_kickoff)(struct dpu_encoder_phys *phys_enc);
|
||||
void (*trigger_start)(struct dpu_encoder_phys *phys_enc);
|
||||
bool (*needs_single_flush)(struct dpu_encoder_phys *phys_enc);
|
||||
void (*irq_control)(struct dpu_encoder_phys *phys, bool enable);
|
||||
void (*irq_enable)(struct dpu_encoder_phys *phys);
|
||||
void (*irq_disable)(struct dpu_encoder_phys *phys);
|
||||
void (*prepare_idle_pc)(struct dpu_encoder_phys *phys_enc);
|
||||
void (*restore)(struct dpu_encoder_phys *phys);
|
||||
int (*get_line_count)(struct dpu_encoder_phys *phys);
|
||||
|
|
|
|||
|
|
@ -291,40 +291,42 @@ static int dpu_encoder_phys_cmd_control_vblank_irq(
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void dpu_encoder_phys_cmd_irq_control(struct dpu_encoder_phys *phys_enc,
|
||||
bool enable)
|
||||
static void dpu_encoder_phys_cmd_irq_enable(struct dpu_encoder_phys *phys_enc)
|
||||
{
|
||||
trace_dpu_enc_phys_cmd_irq_ctrl(DRMID(phys_enc->parent),
|
||||
phys_enc->hw_pp->idx - PINGPONG_0,
|
||||
enable, phys_enc->vblank_refcount);
|
||||
trace_dpu_enc_phys_cmd_irq_enable(DRMID(phys_enc->parent),
|
||||
phys_enc->hw_pp->idx - PINGPONG_0,
|
||||
phys_enc->vblank_refcount);
|
||||
|
||||
if (enable) {
|
||||
dpu_core_irq_register_callback(phys_enc->dpu_kms,
|
||||
phys_enc->irq[INTR_IDX_PINGPONG],
|
||||
dpu_encoder_phys_cmd_pp_tx_done_irq,
|
||||
phys_enc);
|
||||
dpu_core_irq_register_callback(phys_enc->dpu_kms,
|
||||
phys_enc->irq[INTR_IDX_UNDERRUN],
|
||||
dpu_encoder_phys_cmd_underrun_irq,
|
||||
phys_enc);
|
||||
dpu_encoder_phys_cmd_control_vblank_irq(phys_enc, true);
|
||||
|
||||
if (dpu_encoder_phys_cmd_is_master(phys_enc))
|
||||
dpu_core_irq_register_callback(phys_enc->dpu_kms,
|
||||
phys_enc->irq[INTR_IDX_PINGPONG],
|
||||
dpu_encoder_phys_cmd_pp_tx_done_irq,
|
||||
phys_enc);
|
||||
dpu_core_irq_register_callback(phys_enc->dpu_kms,
|
||||
phys_enc->irq[INTR_IDX_UNDERRUN],
|
||||
dpu_encoder_phys_cmd_underrun_irq,
|
||||
phys_enc);
|
||||
dpu_encoder_phys_cmd_control_vblank_irq(phys_enc, true);
|
||||
phys_enc->irq[INTR_IDX_CTL_START],
|
||||
dpu_encoder_phys_cmd_ctl_start_irq,
|
||||
phys_enc);
|
||||
}
|
||||
|
||||
if (dpu_encoder_phys_cmd_is_master(phys_enc))
|
||||
dpu_core_irq_register_callback(phys_enc->dpu_kms,
|
||||
phys_enc->irq[INTR_IDX_CTL_START],
|
||||
dpu_encoder_phys_cmd_ctl_start_irq,
|
||||
phys_enc);
|
||||
} else {
|
||||
if (dpu_encoder_phys_cmd_is_master(phys_enc))
|
||||
dpu_core_irq_unregister_callback(phys_enc->dpu_kms,
|
||||
phys_enc->irq[INTR_IDX_CTL_START]);
|
||||
static void dpu_encoder_phys_cmd_irq_disable(struct dpu_encoder_phys *phys_enc)
|
||||
{
|
||||
trace_dpu_enc_phys_cmd_irq_disable(DRMID(phys_enc->parent),
|
||||
phys_enc->hw_pp->idx - PINGPONG_0,
|
||||
phys_enc->vblank_refcount);
|
||||
|
||||
if (dpu_encoder_phys_cmd_is_master(phys_enc))
|
||||
dpu_core_irq_unregister_callback(phys_enc->dpu_kms,
|
||||
phys_enc->irq[INTR_IDX_UNDERRUN]);
|
||||
dpu_encoder_phys_cmd_control_vblank_irq(phys_enc, false);
|
||||
dpu_core_irq_unregister_callback(phys_enc->dpu_kms,
|
||||
phys_enc->irq[INTR_IDX_PINGPONG]);
|
||||
}
|
||||
phys_enc->irq[INTR_IDX_CTL_START]);
|
||||
|
||||
dpu_core_irq_unregister_callback(phys_enc->dpu_kms, phys_enc->irq[INTR_IDX_UNDERRUN]);
|
||||
dpu_encoder_phys_cmd_control_vblank_irq(phys_enc, false);
|
||||
dpu_core_irq_unregister_callback(phys_enc->dpu_kms, phys_enc->irq[INTR_IDX_PINGPONG]);
|
||||
}
|
||||
|
||||
static void dpu_encoder_phys_cmd_tearcheck_config(
|
||||
|
|
@ -713,7 +715,8 @@ static void dpu_encoder_phys_cmd_init_ops(
|
|||
ops->wait_for_tx_complete = dpu_encoder_phys_cmd_wait_for_tx_complete;
|
||||
ops->trigger_start = dpu_encoder_phys_cmd_trigger_start;
|
||||
ops->needs_single_flush = dpu_encoder_phys_cmd_needs_single_flush;
|
||||
ops->irq_control = dpu_encoder_phys_cmd_irq_control;
|
||||
ops->irq_enable = dpu_encoder_phys_cmd_irq_enable;
|
||||
ops->irq_disable = dpu_encoder_phys_cmd_irq_disable;
|
||||
ops->restore = dpu_encoder_phys_cmd_enable_helper;
|
||||
ops->prepare_idle_pc = dpu_encoder_phys_cmd_prepare_idle_pc;
|
||||
ops->handle_post_kickoff = dpu_encoder_phys_cmd_handle_post_kickoff;
|
||||
|
|
|
|||
|
|
@ -616,30 +616,33 @@ static void dpu_encoder_phys_vid_handle_post_kickoff(
|
|||
}
|
||||
}
|
||||
|
||||
static void dpu_encoder_phys_vid_irq_control(struct dpu_encoder_phys *phys_enc,
|
||||
bool enable)
|
||||
static void dpu_encoder_phys_vid_irq_enable(struct dpu_encoder_phys *phys_enc)
|
||||
{
|
||||
int ret;
|
||||
|
||||
trace_dpu_enc_phys_vid_irq_ctrl(DRMID(phys_enc->parent),
|
||||
phys_enc->hw_intf->idx - INTF_0,
|
||||
enable,
|
||||
phys_enc->vblank_refcount);
|
||||
trace_dpu_enc_phys_vid_irq_enable(DRMID(phys_enc->parent),
|
||||
phys_enc->hw_intf->idx - INTF_0,
|
||||
phys_enc->vblank_refcount);
|
||||
|
||||
if (enable) {
|
||||
ret = dpu_encoder_phys_vid_control_vblank_irq(phys_enc, true);
|
||||
if (WARN_ON(ret))
|
||||
return;
|
||||
ret = dpu_encoder_phys_vid_control_vblank_irq(phys_enc, true);
|
||||
if (WARN_ON(ret))
|
||||
return;
|
||||
|
||||
dpu_core_irq_register_callback(phys_enc->dpu_kms,
|
||||
phys_enc->irq[INTR_IDX_UNDERRUN],
|
||||
dpu_encoder_phys_vid_underrun_irq,
|
||||
phys_enc);
|
||||
} else {
|
||||
dpu_encoder_phys_vid_control_vblank_irq(phys_enc, false);
|
||||
dpu_core_irq_unregister_callback(phys_enc->dpu_kms,
|
||||
phys_enc->irq[INTR_IDX_UNDERRUN]);
|
||||
}
|
||||
dpu_core_irq_register_callback(phys_enc->dpu_kms,
|
||||
phys_enc->irq[INTR_IDX_UNDERRUN],
|
||||
dpu_encoder_phys_vid_underrun_irq,
|
||||
phys_enc);
|
||||
}
|
||||
|
||||
static void dpu_encoder_phys_vid_irq_disable(struct dpu_encoder_phys *phys_enc)
|
||||
{
|
||||
trace_dpu_enc_phys_vid_irq_disable(DRMID(phys_enc->parent),
|
||||
phys_enc->hw_intf->idx - INTF_0,
|
||||
phys_enc->vblank_refcount);
|
||||
|
||||
dpu_encoder_phys_vid_control_vblank_irq(phys_enc, false);
|
||||
dpu_core_irq_unregister_callback(phys_enc->dpu_kms,
|
||||
phys_enc->irq[INTR_IDX_UNDERRUN]);
|
||||
}
|
||||
|
||||
static int dpu_encoder_phys_vid_get_line_count(
|
||||
|
|
@ -690,7 +693,8 @@ static void dpu_encoder_phys_vid_init_ops(struct dpu_encoder_phys_ops *ops)
|
|||
ops->control_vblank_irq = dpu_encoder_phys_vid_control_vblank_irq;
|
||||
ops->wait_for_commit_done = dpu_encoder_phys_vid_wait_for_commit_done;
|
||||
ops->wait_for_tx_complete = dpu_encoder_phys_vid_wait_for_tx_complete;
|
||||
ops->irq_control = dpu_encoder_phys_vid_irq_control;
|
||||
ops->irq_enable = dpu_encoder_phys_vid_irq_enable;
|
||||
ops->irq_disable = dpu_encoder_phys_vid_irq_disable;
|
||||
ops->prepare_for_kickoff = dpu_encoder_phys_vid_prepare_for_kickoff;
|
||||
ops->handle_post_kickoff = dpu_encoder_phys_vid_handle_post_kickoff;
|
||||
ops->needs_single_flush = dpu_encoder_phys_vid_needs_single_flush;
|
||||
|
|
|
|||
|
|
@ -511,21 +511,31 @@ static void dpu_encoder_phys_wb_done_irq(void *arg)
|
|||
}
|
||||
|
||||
/**
|
||||
* dpu_encoder_phys_wb_irq_ctrl - irq control of WB
|
||||
* dpu_encoder_phys_wb_irq_enable - irq control of WB
|
||||
* @phys: Pointer to physical encoder
|
||||
* @enable: indicates enable or disable interrupts
|
||||
*/
|
||||
static void dpu_encoder_phys_wb_irq_ctrl(
|
||||
struct dpu_encoder_phys *phys, bool enable)
|
||||
static void dpu_encoder_phys_wb_irq_enable(struct dpu_encoder_phys *phys)
|
||||
{
|
||||
|
||||
struct dpu_encoder_phys_wb *wb_enc = to_dpu_encoder_phys_wb(phys);
|
||||
|
||||
if (enable && atomic_inc_return(&wb_enc->wbirq_refcount) == 1)
|
||||
if (atomic_inc_return(&wb_enc->wbirq_refcount) == 1)
|
||||
dpu_core_irq_register_callback(phys->dpu_kms,
|
||||
phys->irq[INTR_IDX_WB_DONE], dpu_encoder_phys_wb_done_irq, phys);
|
||||
else if (!enable &&
|
||||
atomic_dec_return(&wb_enc->wbirq_refcount) == 0)
|
||||
phys->irq[INTR_IDX_WB_DONE],
|
||||
dpu_encoder_phys_wb_done_irq,
|
||||
phys);
|
||||
}
|
||||
|
||||
/**
|
||||
* dpu_encoder_phys_wb_irq_disable - irq control of WB
|
||||
* @phys: Pointer to physical encoder
|
||||
*/
|
||||
static void dpu_encoder_phys_wb_irq_disable(struct dpu_encoder_phys *phys)
|
||||
{
|
||||
|
||||
struct dpu_encoder_phys_wb *wb_enc = to_dpu_encoder_phys_wb(phys);
|
||||
|
||||
if (atomic_dec_return(&wb_enc->wbirq_refcount) == 0)
|
||||
dpu_core_irq_unregister_callback(phys->dpu_kms, phys->irq[INTR_IDX_WB_DONE]);
|
||||
}
|
||||
|
||||
|
|
@ -785,7 +795,8 @@ static void dpu_encoder_phys_wb_init_ops(struct dpu_encoder_phys_ops *ops)
|
|||
ops->trigger_start = dpu_encoder_helper_trigger_start;
|
||||
ops->prepare_wb_job = dpu_encoder_phys_wb_prepare_wb_job;
|
||||
ops->cleanup_wb_job = dpu_encoder_phys_wb_cleanup_wb_job;
|
||||
ops->irq_control = dpu_encoder_phys_wb_irq_ctrl;
|
||||
ops->irq_enable = dpu_encoder_phys_wb_irq_enable;
|
||||
ops->irq_disable = dpu_encoder_phys_wb_irq_disable;
|
||||
ops->is_valid_for_commit = dpu_encoder_phys_wb_is_valid_for_commit;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -514,24 +514,41 @@ TRACE_EVENT(dpu_enc_wait_event_timeout,
|
|||
__entry->expected_time, __entry->atomic_cnt)
|
||||
);
|
||||
|
||||
TRACE_EVENT(dpu_enc_phys_cmd_irq_ctrl,
|
||||
TP_PROTO(uint32_t drm_id, enum dpu_pingpong pp, bool enable,
|
||||
TRACE_EVENT(dpu_enc_phys_cmd_irq_enable,
|
||||
TP_PROTO(uint32_t drm_id, enum dpu_pingpong pp,
|
||||
int refcnt),
|
||||
TP_ARGS(drm_id, pp, enable, refcnt),
|
||||
TP_ARGS(drm_id, pp, refcnt),
|
||||
TP_STRUCT__entry(
|
||||
__field( uint32_t, drm_id )
|
||||
__field( enum dpu_pingpong, pp )
|
||||
__field( bool, enable )
|
||||
__field( int, refcnt )
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->drm_id = drm_id;
|
||||
__entry->pp = pp;
|
||||
__entry->enable = enable;
|
||||
__entry->refcnt = refcnt;
|
||||
),
|
||||
TP_printk("id=%u, pp=%d, enable=%s, refcnt=%d", __entry->drm_id,
|
||||
__entry->pp, __entry->enable ? "true" : "false",
|
||||
TP_printk("id=%u, pp=%d, refcnt=%d", __entry->drm_id,
|
||||
__entry->pp,
|
||||
__entry->refcnt)
|
||||
);
|
||||
|
||||
TRACE_EVENT(dpu_enc_phys_cmd_irq_disable,
|
||||
TP_PROTO(uint32_t drm_id, enum dpu_pingpong pp,
|
||||
int refcnt),
|
||||
TP_ARGS(drm_id, pp, refcnt),
|
||||
TP_STRUCT__entry(
|
||||
__field( uint32_t, drm_id )
|
||||
__field( enum dpu_pingpong, pp )
|
||||
__field( int, refcnt )
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->drm_id = drm_id;
|
||||
__entry->pp = pp;
|
||||
__entry->refcnt = refcnt;
|
||||
),
|
||||
TP_printk("id=%u, pp=%d, refcnt=%d", __entry->drm_id,
|
||||
__entry->pp,
|
||||
__entry->refcnt)
|
||||
);
|
||||
|
||||
|
|
@ -592,24 +609,41 @@ TRACE_EVENT(dpu_enc_phys_vid_post_kickoff,
|
|||
TP_printk("id=%u, intf_idx=%d", __entry->drm_id, __entry->intf_idx)
|
||||
);
|
||||
|
||||
TRACE_EVENT(dpu_enc_phys_vid_irq_ctrl,
|
||||
TP_PROTO(uint32_t drm_id, enum dpu_intf intf_idx, bool enable,
|
||||
TRACE_EVENT(dpu_enc_phys_vid_irq_enable,
|
||||
TP_PROTO(uint32_t drm_id, enum dpu_intf intf_idx,
|
||||
int refcnt),
|
||||
TP_ARGS(drm_id, intf_idx, enable, refcnt),
|
||||
TP_ARGS(drm_id, intf_idx, refcnt),
|
||||
TP_STRUCT__entry(
|
||||
__field( uint32_t, drm_id )
|
||||
__field( enum dpu_intf, intf_idx )
|
||||
__field( bool, enable )
|
||||
__field( int, refcnt )
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->drm_id = drm_id;
|
||||
__entry->intf_idx = intf_idx;
|
||||
__entry->enable = enable;
|
||||
__entry->refcnt = refcnt;
|
||||
),
|
||||
TP_printk("id=%u, intf_idx=%d enable=%s refcnt=%d", __entry->drm_id,
|
||||
__entry->intf_idx, __entry->enable ? "true" : "false",
|
||||
TP_printk("id=%u, intf_idx=%d refcnt=%d", __entry->drm_id,
|
||||
__entry->intf_idx,
|
||||
__entry->drm_id)
|
||||
);
|
||||
|
||||
TRACE_EVENT(dpu_enc_phys_vid_irq_disable,
|
||||
TP_PROTO(uint32_t drm_id, enum dpu_intf intf_idx,
|
||||
int refcnt),
|
||||
TP_ARGS(drm_id, intf_idx, refcnt),
|
||||
TP_STRUCT__entry(
|
||||
__field( uint32_t, drm_id )
|
||||
__field( enum dpu_intf, intf_idx )
|
||||
__field( int, refcnt )
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->drm_id = drm_id;
|
||||
__entry->intf_idx = intf_idx;
|
||||
__entry->refcnt = refcnt;
|
||||
),
|
||||
TP_printk("id=%u, intf_idx=%d refcnt=%d", __entry->drm_id,
|
||||
__entry->intf_idx,
|
||||
__entry->drm_id)
|
||||
);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue