disp: msm: sde: add SID setup function for pipes and lutdma

Add SID setup function to help programming
the SIDs for all the pipes and lutdma xin clients
based on the VM.

Change-Id: Iea598303b480b33de8750e0988129dd5cdfe7572
Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
This commit is contained in:
Veera Sundaram Sankaran
2020-02-27 12:24:21 -08:00
committed by Gerrit - the friendly Code Review server
parent 7245366343
commit bfec52ae7b
5 changed files with 93 additions and 9 deletions

View File

@@ -62,8 +62,19 @@
#define DCE_SEL 0x450
#define ROT_SID_RD 0x20
#define ROT_SID_WR 0x24
#define MDP_SID_VIG0 0x0
#define MDP_SID_VIG1 0x4
#define MDP_SID_VIG2 0x8
#define MDP_SID_VIG3 0xC
#define MDP_SID_DMA0 0x10
#define MDP_SID_DMA1 0x14
#define MDP_SID_DMA2 0x18
#define MDP_SID_DMA3 0x1C
#define MDP_SID_ROT_RD 0x20
#define MDP_SID_ROT_WR 0x24
#define MDP_SID_WB2 0x28
#define MDP_SID_XIN7 0x2C
#define ROT_SID_ID_VAL 0x1c
static void sde_hw_setup_split_pipe(struct sde_hw_mdp *mdp,
@@ -470,10 +481,38 @@ struct sde_hw_sid *sde_hw_sid_init(void __iomem *addr,
return c;
}
void sde_hw_sid_rotator_set(struct sde_hw_sid *sid)
void sde_hw_set_rotator_sid(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);
if (!sid)
return;
SDE_REG_WRITE(&sid->hw, MDP_SID_ROT_RD, ROT_SID_ID_VAL);
SDE_REG_WRITE(&sid->hw, MDP_SID_ROT_WR, ROT_SID_ID_VAL);
}
void sde_hw_set_sspp_sid(struct sde_hw_sid *sid, u32 pipe, u32 vm)
{
u32 offset = 0;
if (!sid)
return;
if ((pipe >= SSPP_VIG0) && (pipe <= SSPP_VIG3))
offset = MDP_SID_VIG0 + ((pipe - SSPP_VIG0) * 4);
else if ((pipe >= SSPP_DMA0) && (pipe <= SSPP_DMA3))
offset = MDP_SID_DMA0 + ((pipe - SSPP_DMA0) * 4);
else
return;
SDE_REG_WRITE(&sid->hw, offset, vm << 2);
}
void sde_hw_set_lutdma_sid(struct sde_hw_sid *sid, u32 vm)
{
if (!sid)
return;
SDE_REG_WRITE(&sid->hw, MDP_SID_XIN7, vm << 2);
}
static void sde_hw_program_cwb_ppb_ctrl(struct sde_hw_mdp *mdp,

View File

@@ -243,7 +243,7 @@ struct sde_hw_sid {
};
/**
* sde_hw_sid_rotator_set - initialize the sid blk reg map
* sde_hw_sid_init - initialize the sid blk reg map
* @addr: Mapped register io address
* @sid_len: Length of block
* @m: Pointer to mdss catalog data
@@ -252,10 +252,25 @@ 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
* sde_hw_set_rotator_sid - set sid values for rotator
* sid: sde_hw_sid passed from kms
*/
void sde_hw_sid_rotator_set(struct sde_hw_sid *sid);
void sde_hw_set_rotator_sid(struct sde_hw_sid *sid);
/**
* sde_hw_set_sspp_sid - set sid values for the pipes
* sid: sde_hw_sid passed from kms
* pipe: sspp id
* vm: vm id to set for SIDs
*/
void sde_hw_set_sspp_sid(struct sde_hw_sid *sid, u32 pipe, u32 vm);
/**
* sde_hw_set_lutdma_sid - set sid values for the pipes
* sid: sde_hw_sid passed from kms
* vm: vm id to set for SIDs
*/
void sde_hw_set_lutdma_sid(struct sde_hw_sid *sid, u32 vm);
/**
* to_sde_hw_mdp - convert base object sde_hw_base to container

View File

@@ -2928,7 +2928,7 @@ static void sde_kms_init_shared_hw(struct sde_kms *sde_kms)
sde_kms->catalog);
if (sde_kms->sid)
sde_hw_sid_rotator_set(sde_kms->hw_sid);
sde_hw_set_rotator_sid(sde_kms->hw_sid);
}
static void _sde_kms_set_lutdma_vbif_remap(struct sde_kms *sde_kms)

View File

@@ -233,6 +233,29 @@ void sde_plane_setup_src_split_order(struct drm_plane *plane,
rect_mode, enable);
}
void sde_plane_set_sid(struct drm_plane *plane, u32 vm)
{
struct sde_plane *psde;
struct sde_kms *sde_kms;
struct msm_drm_private *priv;
if (!plane || !plane->dev) {
SDE_ERROR("invalid plane %d\n");
return;
}
priv = plane->dev->dev_private;
if (!priv || !priv->kms) {
SDE_ERROR("invalid KMS reference\n");
return;
}
sde_kms = to_sde_kms(priv->kms);
psde = to_sde_plane(plane);
sde_hw_set_sspp_sid(sde_kms->hw_sid, psde->pipe, vm);
}
/**
* _sde_plane_set_qos_lut - set danger, safe and creq LUT of the given plane
* @plane: Pointer to drm plane

View File

@@ -327,6 +327,13 @@ void sde_plane_clear_ubwc_error(struct drm_plane *plane);
void sde_plane_setup_src_split_order(struct drm_plane *plane,
enum sde_sspp_multirect_index rect_mode, bool enable);
/*
* sde_plane_set_sid - set VM SID for the plane
* @plane: Pointer to DRM plane object
* @vm: VM id
*/
void sde_plane_set_sid(struct drm_plane *plane, u32 vm);
/* sde_plane_is_cache_required - indicates if the system cache is
* required for the plane.
* @plane: Pointer to DRM plane object