Loading Documentation/devicetree/bindings/display/msm/sde.txt +2 −0 Original line number Diff line number Diff line Loading @@ -366,6 +366,7 @@ Optional properties: control register. Number of offsets defined should match the number of xin-ids defined in property: qcom,sde-inline-rot-xin - #power-domain-cells: Number of cells in a power-domain specifier and should contain 0. Bus Scaling Subnodes: - qcom,sde-reg-bus: Property to provide Bus scaling for register access for Loading Loading @@ -446,6 +447,7 @@ Example: interrupt-controller; #interrupt-cells = <1>; iommus = <&mdp_smmu 0>; #power-domain-cells = <0>; qcom,sde-off = <0x1000>; qcom,sde-ctl-off = <0x00002000 0x00002200 0x00002400 Loading Documentation/devicetree/bindings/media/video/msm-sde-rotator.txt +3 −0 Original line number Diff line number Diff line Loading @@ -123,6 +123,7 @@ Optional properties swizzle configuration value. - qcom,rot-reg-bus: Property to provide Bus scaling for register access for rotator blocks. - power-domains: A phandle to respective power domain node. Subnode properties: - compatible: Compatible name used in smmu v2. Loading Loading @@ -150,6 +151,8 @@ Example: interrupt-parent = <&mdss_mdp>; interrupts = <2 0>; power-domains = <&mdss_mdp>; qcom,mdss-mdp-reg-offset = <0x00001000>; rot-vdd-supply = <&gdsc_mdss>; Loading arch/arm64/boot/dts/qcom/sdm845-sde.dtsi +4 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,8 @@ #address-cells = <1>; #size-cells = <0>; #power-domain-cells = <0>; /* hw blocks */ qcom,sde-off = <0x1000>; qcom,sde-len = <0x45C>; Loading Loading @@ -365,6 +367,8 @@ interrupt-parent = <&mdss_mdp>; interrupts = <2 0>; power-domains = <&mdss_mdp>; /* Offline rotator QoS setting */ qcom,mdss-rot-vbif-qos-setting = <3 3 3 3 3 3 3 3>; qcom,mdss-rot-vbif-memtype = <3 3>; Loading drivers/gpu/drm/msm/sde/sde_kms.c +84 −0 Original line number Diff line number Diff line Loading @@ -1423,6 +1423,12 @@ static void _sde_kms_hw_destroy(struct sde_kms *sde_kms, if (!priv) return; if (sde_kms->genpd_init) { sde_kms->genpd_init = false; pm_genpd_remove(&sde_kms->genpd); of_genpd_del_provider(pdev->dev.of_node); } if (sde_kms->hw_intr) sde_hw_intr_destroy(sde_kms->hw_intr); sde_kms->hw_intr = NULL; Loading Loading @@ -2013,6 +2019,56 @@ static void sde_kms_handle_power_event(u32 event_type, void *usr) } } #define genpd_to_sde_kms(domain) container_of(domain, struct sde_kms, genpd) static int sde_kms_pd_enable(struct generic_pm_domain *genpd) { struct sde_kms *sde_kms = genpd_to_sde_kms(genpd); struct drm_device *dev; struct msm_drm_private *priv; int rc; SDE_DEBUG("\n"); dev = sde_kms->dev; if (!dev) return -EINVAL; priv = dev->dev_private; if (!priv) return -EINVAL; SDE_EVT32(genpd->device_count); rc = sde_power_resource_enable(&priv->phandle, priv->pclient, true); return rc; } static int sde_kms_pd_disable(struct generic_pm_domain *genpd) { struct sde_kms *sde_kms = genpd_to_sde_kms(genpd); struct drm_device *dev; struct msm_drm_private *priv; int rc; SDE_DEBUG("\n"); dev = sde_kms->dev; if (!dev) return -EINVAL; priv = dev->dev_private; if (!priv) return -EINVAL; SDE_EVT32(genpd->device_count); rc = sde_power_resource_enable(&priv->phandle, priv->pclient, false); return rc; } static int sde_kms_hw_init(struct msm_kms *kms) { struct sde_kms *sde_kms; Loading Loading @@ -2242,9 +2298,37 @@ static int sde_kms_hw_init(struct msm_kms *kms) SDE_POWER_EVENT_PRE_DISABLE, sde_kms_handle_power_event, sde_kms, "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); goto genpd_err; } sde_kms->genpd_init = true; SDE_DEBUG("added genpd provider %s\n", sde_kms->genpd.name); } sde_power_resource_enable(&priv->phandle, sde_kms->core_client, false); return 0; genpd_err: drm_obj_init_err: sde_core_perf_destroy(&sde_kms->perf); hw_intr_init_err: Loading drivers/gpu/drm/msm/sde/sde_kms.h +4 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #define __SDE_KMS_H__ #include <linux/msm_ion.h> #include <linux/pm_domain.h> #include "msm_drv.h" #include "msm_kms.h" Loading Loading @@ -176,6 +177,9 @@ struct sde_kms { int core_rev; struct sde_mdss_cfg *catalog; struct generic_pm_domain genpd; bool genpd_init; struct msm_gem_address_space *aspace[MSM_SMMU_DOMAIN_MAX]; struct sde_power_client *core_client; Loading Loading
Documentation/devicetree/bindings/display/msm/sde.txt +2 −0 Original line number Diff line number Diff line Loading @@ -366,6 +366,7 @@ Optional properties: control register. Number of offsets defined should match the number of xin-ids defined in property: qcom,sde-inline-rot-xin - #power-domain-cells: Number of cells in a power-domain specifier and should contain 0. Bus Scaling Subnodes: - qcom,sde-reg-bus: Property to provide Bus scaling for register access for Loading Loading @@ -446,6 +447,7 @@ Example: interrupt-controller; #interrupt-cells = <1>; iommus = <&mdp_smmu 0>; #power-domain-cells = <0>; qcom,sde-off = <0x1000>; qcom,sde-ctl-off = <0x00002000 0x00002200 0x00002400 Loading
Documentation/devicetree/bindings/media/video/msm-sde-rotator.txt +3 −0 Original line number Diff line number Diff line Loading @@ -123,6 +123,7 @@ Optional properties swizzle configuration value. - qcom,rot-reg-bus: Property to provide Bus scaling for register access for rotator blocks. - power-domains: A phandle to respective power domain node. Subnode properties: - compatible: Compatible name used in smmu v2. Loading Loading @@ -150,6 +151,8 @@ Example: interrupt-parent = <&mdss_mdp>; interrupts = <2 0>; power-domains = <&mdss_mdp>; qcom,mdss-mdp-reg-offset = <0x00001000>; rot-vdd-supply = <&gdsc_mdss>; Loading
arch/arm64/boot/dts/qcom/sdm845-sde.dtsi +4 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,8 @@ #address-cells = <1>; #size-cells = <0>; #power-domain-cells = <0>; /* hw blocks */ qcom,sde-off = <0x1000>; qcom,sde-len = <0x45C>; Loading Loading @@ -365,6 +367,8 @@ interrupt-parent = <&mdss_mdp>; interrupts = <2 0>; power-domains = <&mdss_mdp>; /* Offline rotator QoS setting */ qcom,mdss-rot-vbif-qos-setting = <3 3 3 3 3 3 3 3>; qcom,mdss-rot-vbif-memtype = <3 3>; Loading
drivers/gpu/drm/msm/sde/sde_kms.c +84 −0 Original line number Diff line number Diff line Loading @@ -1423,6 +1423,12 @@ static void _sde_kms_hw_destroy(struct sde_kms *sde_kms, if (!priv) return; if (sde_kms->genpd_init) { sde_kms->genpd_init = false; pm_genpd_remove(&sde_kms->genpd); of_genpd_del_provider(pdev->dev.of_node); } if (sde_kms->hw_intr) sde_hw_intr_destroy(sde_kms->hw_intr); sde_kms->hw_intr = NULL; Loading Loading @@ -2013,6 +2019,56 @@ static void sde_kms_handle_power_event(u32 event_type, void *usr) } } #define genpd_to_sde_kms(domain) container_of(domain, struct sde_kms, genpd) static int sde_kms_pd_enable(struct generic_pm_domain *genpd) { struct sde_kms *sde_kms = genpd_to_sde_kms(genpd); struct drm_device *dev; struct msm_drm_private *priv; int rc; SDE_DEBUG("\n"); dev = sde_kms->dev; if (!dev) return -EINVAL; priv = dev->dev_private; if (!priv) return -EINVAL; SDE_EVT32(genpd->device_count); rc = sde_power_resource_enable(&priv->phandle, priv->pclient, true); return rc; } static int sde_kms_pd_disable(struct generic_pm_domain *genpd) { struct sde_kms *sde_kms = genpd_to_sde_kms(genpd); struct drm_device *dev; struct msm_drm_private *priv; int rc; SDE_DEBUG("\n"); dev = sde_kms->dev; if (!dev) return -EINVAL; priv = dev->dev_private; if (!priv) return -EINVAL; SDE_EVT32(genpd->device_count); rc = sde_power_resource_enable(&priv->phandle, priv->pclient, false); return rc; } static int sde_kms_hw_init(struct msm_kms *kms) { struct sde_kms *sde_kms; Loading Loading @@ -2242,9 +2298,37 @@ static int sde_kms_hw_init(struct msm_kms *kms) SDE_POWER_EVENT_PRE_DISABLE, sde_kms_handle_power_event, sde_kms, "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); goto genpd_err; } sde_kms->genpd_init = true; SDE_DEBUG("added genpd provider %s\n", sde_kms->genpd.name); } sde_power_resource_enable(&priv->phandle, sde_kms->core_client, false); return 0; genpd_err: drm_obj_init_err: sde_core_perf_destroy(&sde_kms->perf); hw_intr_init_err: Loading
drivers/gpu/drm/msm/sde/sde_kms.h +4 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #define __SDE_KMS_H__ #include <linux/msm_ion.h> #include <linux/pm_domain.h> #include "msm_drv.h" #include "msm_kms.h" Loading Loading @@ -176,6 +177,9 @@ struct sde_kms { int core_rev; struct sde_mdss_cfg *catalog; struct generic_pm_domain genpd; bool genpd_init; struct msm_gem_address_space *aspace[MSM_SMMU_DOMAIN_MAX]; struct sde_power_client *core_client; Loading