Loading drivers/gpu/drm/msm/sde/sde_hw_mdss.h +1 −0 Original line number Diff line number Diff line Loading @@ -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. Loading drivers/gpu/drm/msm/sde/sde_hw_top.c +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" Loading Loading @@ -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) { Loading Loading @@ -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) { Loading drivers/gpu/drm/msm/sde/sde_hw_top.h +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 Loading Loading @@ -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 Loading drivers/gpu/drm/msm/sde/sde_kms.c +69 −23 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) Loading Loading @@ -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) Loading Loading @@ -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); Loading Loading @@ -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) { Loading drivers/gpu/drm/msm/sde/sde_kms.h +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> * Loading Loading @@ -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; Loading @@ -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; Loading Loading
drivers/gpu/drm/msm/sde/sde_hw_mdss.h +1 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
drivers/gpu/drm/msm/sde/sde_hw_top.c +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" Loading Loading @@ -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) { Loading Loading @@ -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) { Loading
drivers/gpu/drm/msm/sde/sde_hw_top.h +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 Loading Loading @@ -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 Loading
drivers/gpu/drm/msm/sde/sde_kms.c +69 −23 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) Loading Loading @@ -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) Loading Loading @@ -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); Loading Loading @@ -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) { Loading
drivers/gpu/drm/msm/sde/sde_kms.h +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> * Loading Loading @@ -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; Loading @@ -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; Loading