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

Commit 7a3ab0dc authored by Krishna Manikandan's avatar Krishna Manikandan Committed by Gerrit - the friendly Code Review server
Browse files

msm/sde: add SID register support for offline rotator



This change updates the SID register for offline rotator
transaction traffic.

Change-Id: I08c852a09e7c946e28f0ddc63cf8a02c86e8c093
Signed-off-by: default avatarSamantha Tran <samtran@codeaurora.org>
Signed-off-by: default avatarKrishna Manikandan <mkrishn@codeaurora.org>
parent 1c8e301b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -523,6 +523,7 @@ struct sde_mdss_color {
#define SDE_DBG_MASK_DS       (1 << 13)
#define SDE_DBG_MASK_REGDMA   (1 << 14)
#define SDE_DBG_MASK_QDSS     (1 << 15)
#define SDE_DBG_MASK_SID      (1 << 15)

/**
 * struct sde_hw_cp_cfg: hardware dspp/lm feature payload.
+33 −0
Original line number Diff line number Diff line
@@ -61,6 +61,10 @@

#define DCE_SEL                           0x450

#define ROT_SID_RD			  0x20
#define ROT_SID_WR			  0x24
#define ROT_SID_ID_VAL			  0x1c

static void sde_hw_setup_split_pipe(struct sde_hw_mdp *mdp,
		struct split_pipe_cfg *cfg)
{
@@ -412,6 +416,35 @@ static void sde_hw_mdp_events(struct sde_hw_mdp *mdp, bool enable)
	SDE_REG_WRITE(c, HW_EVENTS_CTL, enable);
}

struct sde_hw_sid *sde_hw_sid_init(void __iomem *addr,
	u32 sid_len, const struct sde_mdss_cfg *m)
{
	struct sde_hw_sid *c;

	if (!addr) {
		SDE_DEBUG("Invalid addr\n");
		return NULL;
	}

	c = kzalloc(sizeof(*c), GFP_KERNEL);
	if (!c)
		return ERR_PTR(-ENOMEM);

	c->hw.base_off = addr;
	c->hw.blk_off = 0;
	c->hw.length = sid_len;
	c->hw.hwversion = m->hwversion;
	c->hw.log_mask = SDE_DBG_MASK_SID;

	return c;
}

void sde_hw_sid_rotator_set(struct sde_hw_sid *sid)
{
	SDE_REG_WRITE(&sid->hw, ROT_SID_RD, ROT_SID_ID_VAL);
	SDE_REG_WRITE(&sid->hw, ROT_SID_WR, ROT_SID_ID_VAL);
}

static void sde_hw_program_cwb_ppb_ctrl(struct sde_hw_mdp *mdp,
		bool dual, bool dspp_out)
{
+20 −0
Original line number Diff line number Diff line
@@ -220,6 +220,26 @@ struct sde_hw_mdp {
	struct sde_hw_mdp_ops ops;
};

struct sde_hw_sid {
	/* rotator base */
	struct sde_hw_blk_reg_map hw;
};

/**
 * sde_hw_sid_rotator_set - initialize the sid blk reg map
 * @addr: Mapped register io address
 * @sid_len: Length of block
 * @m: Pointer to mdss catalog data
 */
struct sde_hw_sid *sde_hw_sid_init(void __iomem *addr,
		u32 sid_len, const struct sde_mdss_cfg *m);

/**
 * sde_hw_sid_rotator_set - set sid values for rotator
 * sid: sde_hw_sid passed from kms
 */
void sde_hw_sid_rotator_set(struct sde_hw_sid *sid);

/**
 * to_sde_hw_mdp - convert base object sde_hw_base to container
 * @hw: Pointer to base hardware block
+32 −0
Original line number Diff line number Diff line
@@ -1871,6 +1871,14 @@ static void _sde_kms_hw_destroy(struct sde_kms *sde_kms,
		sde_power_client_destroy(&priv->phandle, sde_kms->core_client);
	sde_kms->core_client = NULL;

	if (sde_kms->sid)
		msm_iounmap(pdev, sde_kms->sid);
	sde_kms->sid = NULL;

	if (sde_kms->reg_dma)
		msm_iounmap(pdev, sde_kms->reg_dma);
	sde_kms->reg_dma = NULL;

	if (sde_kms->vbif[VBIF_NRT])
		msm_iounmap(pdev, sde_kms->vbif[VBIF_NRT]);
	sde_kms->vbif[VBIF_NRT] = NULL;
@@ -3049,6 +3057,9 @@ static void sde_kms_init_shared_hw(struct sde_kms *sde_kms)
	if (sde_kms->hw_mdp->ops.reset_ubwc)
		sde_kms->hw_mdp->ops.reset_ubwc(sde_kms->hw_mdp,
						sde_kms->catalog);

	if (sde_kms->hw_sid)
		sde_hw_sid_rotator_set(sde_kms->hw_sid);
}

static void sde_kms_handle_power_event(u32 event_type, void *usr)
@@ -3300,6 +3311,19 @@ static int sde_kms_hw_init(struct msm_kms *kms)
					rc);
	}

	sde_kms->sid = msm_ioremap(platformdev, "sid_phys",
							"sid_phys");
	if (IS_ERR(sde_kms->sid)) {
		sde_kms->sid = NULL;
		SDE_DEBUG("SID_PHYS is not defined\n");
	} else {
		sde_kms->sid_len = msm_iomap_size(platformdev, "sid_phys");
		rc =  sde_dbg_reg_register_base("sid", sde_kms->sid,
				sde_kms->sid_len);
		if (rc)
			SDE_ERROR("dbg base register sid failed: %d\n", rc);
	}

	sde_kms->core_client = sde_power_client_create(&priv->phandle, "core");
	if (IS_ERR_OR_NULL(sde_kms->core_client)) {
		rc = PTR_ERR(sde_kms->core_client);
@@ -3449,6 +3473,14 @@ static int sde_kms_hw_init(struct msm_kms *kms)
		}
	}

	sde_kms->hw_sid = sde_hw_sid_init(sde_kms->sid,
				sde_kms->sid_len, sde_kms->catalog);
	if (IS_ERR(sde_kms->hw_sid)) {
		SDE_ERROR("failed to init sid %d\n", PTR_ERR(sde_kms->hw_sid));
		sde_kms->hw_sid = NULL;
		goto power_error;
	}

	rc = sde_core_perf_init(&sde_kms->perf, dev, sde_kms->catalog,
			&priv->phandle, priv->pclient, "core_clk");
	if (rc) {
+3 −2
Original line number Diff line number Diff line
@@ -232,8 +232,8 @@ struct sde_kms {
	struct dentry *debugfs_vbif;

	/* io/register spaces: */
	void __iomem *mmio, *vbif[VBIF_MAX], *reg_dma;
	unsigned long mmio_len, vbif_len[VBIF_MAX], reg_dma_len;
	void __iomem *mmio, *vbif[VBIF_MAX], *reg_dma, *sid;
	unsigned long mmio_len, vbif_len[VBIF_MAX], reg_dma_len, sid_len;

	struct regulator *vdd;
	struct regulator *mmagic;
@@ -257,6 +257,7 @@ struct sde_kms {
	struct sde_splash_data splash_data;
	struct sde_hw_vbif *hw_vbif[VBIF_MAX];
	struct sde_hw_mdp *hw_mdp;
	struct sde_hw_sid *hw_sid;
	int dsi_display_count;
	void **dsi_displays;
	int wb_display_count;