Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d8d5bc2b authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/sde: fix race condition in vblank control interrupts" into msm-4.9

parents 7b2945bf 3ea60b88
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -215,6 +215,7 @@ enum sde_enc_rc_states {
struct sde_encoder_virt {
	struct drm_encoder base;
	spinlock_t enc_spinlock;
	struct mutex vblank_ctl_lock;
	uint32_t bus_scaling_client;

	uint32_t display_num_of_h_tiles;
@@ -4388,6 +4389,7 @@ static int sde_encoder_setup_display(struct sde_encoder_virt *sde_enc,
	phys_params.parent = &sde_enc->base;
	phys_params.parent_ops = parent_ops;
	phys_params.enc_spinlock = &sde_enc->enc_spinlock;
	phys_params.vblank_ctl_lock = &sde_enc->vblank_ctl_lock;

	SDE_DEBUG("\n");

@@ -4530,6 +4532,7 @@ struct drm_encoder *sde_encoder_init(

	sde_enc->cur_master = NULL;
	spin_lock_init(&sde_enc->enc_spinlock);
	mutex_init(&sde_enc->vblank_ctl_lock);
	drm_enc = &sde_enc->base;
	drm_encoder_init(dev, drm_enc, &sde_encoder_funcs, drm_enc_mode, NULL);
	drm_encoder_helper_add(drm_enc, &sde_encoder_helper_funcs);
+2 −0
Original line number Diff line number Diff line
@@ -284,6 +284,7 @@ struct sde_encoder_phys {
	enum msm_display_compression_type comp_type;
	spinlock_t *enc_spinlock;
	enum sde_enc_enable_state enable_state;
	struct mutex *vblank_ctl_lock;
	atomic_t vblank_refcount;
	atomic_t vsync_cnt;
	atomic_t underrun_cnt;
@@ -434,6 +435,7 @@ struct sde_enc_phys_init_params {
	enum sde_wb wb_idx;
	enum msm_display_compression_type comp_type;
	spinlock_t *enc_spinlock;
	struct mutex *vblank_ctl_lock;
};

/**
+3 −0
Original line number Diff line number Diff line
@@ -680,6 +680,7 @@ static int sde_encoder_phys_cmd_control_vblank_irq(
		return -EINVAL;
	}

	mutex_lock(phys_enc->vblank_ctl_lock);
	refcount = atomic_read(&phys_enc->vblank_refcount);

	/* Slave encoders don't report vblank */
@@ -713,6 +714,7 @@ static int sde_encoder_phys_cmd_control_vblank_irq(
				enable, refcount, SDE_EVTLOG_ERROR);
	}

	mutex_unlock(phys_enc->vblank_ctl_lock);
	return ret;
}

@@ -1398,6 +1400,7 @@ struct sde_encoder_phys *sde_encoder_phys_cmd_init(
	phys_enc->split_role = p->split_role;
	phys_enc->intf_mode = INTF_MODE_CMD;
	phys_enc->enc_spinlock = p->enc_spinlock;
	phys_enc->vblank_ctl_lock = p->vblank_ctl_lock;
	cmd_enc->stream_sel = 0;
	phys_enc->enable_state = SDE_ENC_DISABLED;
	phys_enc->comp_type = p->comp_type;
+3 −0
Original line number Diff line number Diff line
@@ -625,6 +625,7 @@ static int sde_encoder_phys_vid_control_vblank_irq(
		return -EINVAL;
	}

	mutex_lock(phys_enc->vblank_ctl_lock);
	refcount = atomic_read(&phys_enc->vblank_refcount);
	vid_enc = to_sde_encoder_phys_vid(phys_enc);

@@ -666,6 +667,7 @@ static int sde_encoder_phys_vid_control_vblank_irq(
				vid_enc->hw_intf->idx - INTF_0,
				enable, refcount, SDE_EVTLOG_ERROR);
	}
	mutex_unlock(phys_enc->vblank_ctl_lock);
	return ret;
}

@@ -1239,6 +1241,7 @@ struct sde_encoder_phys *sde_encoder_phys_vid_init(
	phys_enc->split_role = p->split_role;
	phys_enc->intf_mode = INTF_MODE_VIDEO;
	phys_enc->enc_spinlock = p->enc_spinlock;
	phys_enc->vblank_ctl_lock = p->vblank_ctl_lock;
	phys_enc->comp_type = p->comp_type;
	for (i = 0; i < INTR_IDX_MAX; i++) {
		irq = &phys_enc->irq[i];
+2 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2015-2017 The Linux Foundation. All rights reserved.
 * Copyright (c) 2015-2018 The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -1410,6 +1410,7 @@ struct sde_encoder_phys *sde_encoder_phys_wb_init(
	phys_enc->intf_mode = INTF_MODE_WB_LINE;
	phys_enc->intf_idx = p->intf_idx;
	phys_enc->enc_spinlock = p->enc_spinlock;
	phys_enc->vblank_ctl_lock = p->vblank_ctl_lock;
	atomic_set(&phys_enc->pending_retire_fence_cnt, 0);
	INIT_LIST_HEAD(&wb_enc->irq_cb.list);