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

Commit 1fa7a093 authored by Samantha Tran's avatar Samantha Tran
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>
parent d25fbc3d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
 * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
 */

#ifndef _SDE_HW_MDSS_H
@@ -511,6 +511,7 @@ struct sde_mdss_color {
#define SDE_DBG_MASK_DS       (1 << 13)
#define SDE_DBG_MASK_REGDMA   (1 << 14)
#define SDE_DBG_MASK_UIDLE    (1 << 15)
#define SDE_DBG_MASK_SID      (1 << 15)

/**
 * struct sde_hw_cp_cfg: hardware dspp/lm feature payload.
+29 −1
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
 * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
 */

#include "sde_hwio.h"
@@ -56,6 +56,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)
{
@@ -424,6 +428,30 @@ static void sde_hw_intf_audio_select(struct sde_hw_mdp *mdp)
	SDE_REG_WRITE(c, HDMI_DP_CORE_SELECT, 0x1);
}

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;

	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)
{
+21 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
 * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
 */

#ifndef _SDE_HW_TOP_H
@@ -210,6 +210,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
+69 −23
Original line number Diff line number Diff line
@@ -1826,6 +1826,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;
@@ -2937,6 +2945,8 @@ 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);

	sde_hw_sid_rotator_set(sde_kms->hw_sid);
}

static void sde_kms_handle_power_event(u32 event_type, void *usr)
@@ -3165,10 +3175,57 @@ static int _sde_kms_hw_init_ioremap(struct sde_kms *sde_kms,
					rc);
	}

	sde_kms->sid = msm_ioremap(platformdev, "sid_phys",
							"sid_phys");
	if (IS_ERR(sde_kms->sid)) {
		rc = PTR_ERR(sde_kms->sid);
		SDE_ERROR("sid register memory map failed: %d\n", rc);
		sde_kms->sid = NULL;
		goto error;
	}

	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);

error:
	return rc;
}

static int _sde_kms_hw_init_power_helper(struct drm_device *dev,
			struct sde_kms *sde_kms)
{
	int rc = 0;

	if (of_find_property(dev->dev->of_node, "#power-domain-cells", NULL)) {
		sde_kms->genpd.name = dev->unique;
		sde_kms->genpd.power_off = sde_kms_pd_disable;
		sde_kms->genpd.power_on = sde_kms_pd_enable;

		rc = pm_genpd_init(&sde_kms->genpd, NULL, true);
		if (rc < 0) {
			SDE_ERROR("failed to init genpd provider %s: %d\n",
					sde_kms->genpd.name, rc);
			return rc;
		}

		rc = of_genpd_add_provider_simple(dev->dev->of_node,
				&sde_kms->genpd);
		if (rc < 0) {
			SDE_ERROR("failed to add genpd provider %s: %d\n",
					sde_kms->genpd.name, rc);
			pm_genpd_remove(&sde_kms->genpd);
			return rc;
		}

		sde_kms->genpd_init = true;
		SDE_DEBUG("added genpd provider %s\n", sde_kms->genpd.name);
	}

	return rc;
}

static int _sde_kms_hw_init_blocks(struct sde_kms *sde_kms,
	struct drm_device *dev,
	struct msm_drm_private *priv)
@@ -3198,31 +3255,12 @@ static int _sde_kms_hw_init_blocks(struct sde_kms *sde_kms,
	}

	/* initialize power domain if defined */
	if (of_find_property(dev->dev->of_node, "#power-domain-cells", NULL)) {
		sde_kms->genpd.name = dev->unique;
		sde_kms->genpd.power_off = sde_kms_pd_disable;
		sde_kms->genpd.power_on = sde_kms_pd_enable;

		rc = pm_genpd_init(&sde_kms->genpd, NULL, true);
		if (rc < 0) {
			SDE_ERROR("failed to init genpd provider %s: %d\n",
					sde_kms->genpd.name, rc);
			goto genpd_err;
		}

		rc = of_genpd_add_provider_simple(dev->dev->of_node,
				&sde_kms->genpd);
		if (rc < 0) {
			SDE_ERROR("failed to add genpd provider %s: %d\n",
					sde_kms->genpd.name, rc);
			pm_genpd_remove(&sde_kms->genpd);
	rc = _sde_kms_hw_init_power_helper(dev, sde_kms);
	if (rc) {
		SDE_ERROR("_sde_kms_hw_init_power_helper failed: %d\n", rc);
		goto genpd_err;
	}

		sde_kms->genpd_init = true;
		SDE_DEBUG("added genpd provider %s\n", sde_kms->genpd.name);
	}

	rc = _sde_kms_mmu_init(sde_kms);
	if (rc) {
		SDE_ERROR("sde_kms_mmu_init failed: %d\n", rc);
@@ -3313,6 +3351,14 @@ static int _sde_kms_hw_init_blocks(struct sde_kms *sde_kms,
		sde_kms->hw_uidle = NULL;
	}

	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) {
+4 −3
Original line number Diff line number Diff line
/*
 * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
 * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -249,8 +249,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;
@@ -275,6 +275,7 @@ struct sde_kms {
	struct sde_hw_vbif *hw_vbif[VBIF_MAX];
	struct sde_hw_mdp *hw_mdp;
	struct sde_hw_uidle *hw_uidle;
	struct sde_hw_sid *hw_sid;
	int dsi_display_count;
	void **dsi_displays;
	int wb_display_count;