diff --git a/msm/sde/sde_hw_top.c b/msm/sde/sde_hw_top.c index 9b07aac263..a1a610efad 100644 --- a/msm/sde/sde_hw_top.c +++ b/msm/sde/sde_hw_top.c @@ -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, diff --git a/msm/sde/sde_hw_top.h b/msm/sde/sde_hw_top.h index 21f1daf109..4de27e8263 100644 --- a/msm/sde/sde_hw_top.h +++ b/msm/sde/sde_hw_top.h @@ -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 diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 38b3f3f6b1..afd6961aca 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -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) diff --git a/msm/sde/sde_plane.c b/msm/sde/sde_plane.c index 2315af1e43..546461936f 100644 --- a/msm/sde/sde_plane.c +++ b/msm/sde/sde_plane.c @@ -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 diff --git a/msm/sde/sde_plane.h b/msm/sde/sde_plane.h index 66eeaa505a..baff282d6a 100644 --- a/msm/sde/sde_plane.h +++ b/msm/sde/sde_plane.h @@ -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