From 7245366343d1e5e4267553b5ac8660d0f88cf466 Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Thu, 6 Feb 2020 11:24:55 -0800 Subject: [PATCH] disp: msm: sde: parse MDSS HW from device tree Get the MDSS HW version from the device tree instead of reading directly from the hardware register. Change-Id: Icfb7a80c8f19312001b070a454741421fd67aae5 Signed-off-by: Veera Sundaram Sankaran --- msm/sde/sde_hw_catalog.c | 58 +++++++++++++++++++++++++++++++++++++--- msm/sde/sde_hw_catalog.h | 3 +-- msm/sde/sde_kms.c | 15 +++-------- msm/sde/sde_kms.h | 17 ++++++++++++ 4 files changed, 76 insertions(+), 17 deletions(-) diff --git a/msm/sde/sde_hw_catalog.c b/msm/sde/sde_hw_catalog.c index 0e7fd0dd6b0c..b689869093a8 100644 --- a/msm/sde/sde_hw_catalog.c +++ b/msm/sde/sde_hw_catalog.c @@ -161,6 +161,11 @@ /************************************************************* * DTSI PROPERTY INDEX *************************************************************/ +enum { + SDE_HW_VERSION, + SDE_HW_PROP_MAX, +}; + enum { HW_OFF, HW_LEN, @@ -524,6 +529,10 @@ struct sde_dt_props { /************************************************************* * dts property list *************************************************************/ +static struct sde_prop_type sde_hw_prop[] = { + {SDE_HW_VERSION, "qcom,sde-hw-version", false, PROP_TYPE_U32}, +}; + static struct sde_prop_type sde_prop[] = { {SDE_OFF, "qcom,sde-off", true, PROP_TYPE_U32}, {SDE_LEN, "qcom,sde-len", false, PROP_TYPE_U32}, @@ -4790,10 +4799,48 @@ void sde_hw_catalog_deinit(struct sde_mdss_cfg *sde_cfg) kfree(sde_cfg); } +static int sde_hw_ver_parse_dt(struct drm_device *dev, struct device_node *np, + struct sde_mdss_cfg *cfg) +{ + int rc, len, prop_count[SDE_HW_PROP_MAX]; + struct sde_prop_value *prop_value = NULL; + bool prop_exists[SDE_HW_PROP_MAX]; + + if (!cfg) { + SDE_ERROR("invalid argument\n"); + return -EINVAL; + } + + prop_value = kzalloc(SDE_HW_PROP_MAX * + sizeof(struct sde_prop_value), GFP_KERNEL); + if (!prop_value) + return -ENOMEM; + + rc = _validate_dt_entry(np, sde_hw_prop, ARRAY_SIZE(sde_hw_prop), + prop_count, &len); + if (rc) + goto end; + + rc = _read_dt_entry(np, sde_hw_prop, ARRAY_SIZE(sde_hw_prop), + prop_count, prop_exists, prop_value); + if (rc) + goto end; + + if (prop_exists[SDE_HW_VERSION]) + cfg->hwversion = PROP_VALUE_ACCESS(prop_value, + SDE_HW_VERSION, 0); + else + cfg->hwversion = sde_kms_get_hw_version(dev); + +end: + kfree(prop_value); + return rc; +} + /************************************************************* * hardware catalog init *************************************************************/ -struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev, u32 hw_rev) +struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev) { int rc; struct sde_mdss_cfg *sde_cfg; @@ -4806,10 +4853,13 @@ struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev, u32 hw_rev) if (!sde_cfg) return ERR_PTR(-ENOMEM); - sde_cfg->hwversion = hw_rev; INIT_LIST_HEAD(&sde_cfg->irq_offset_list); - rc = _sde_hardware_pre_caps(sde_cfg, hw_rev); + rc = sde_hw_ver_parse_dt(dev, np, sde_cfg); + if (rc) + goto end; + + rc = _sde_hardware_pre_caps(sde_cfg, sde_cfg->hwversion); if (rc) goto end; @@ -4905,7 +4955,7 @@ struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev, u32 hw_rev) if (rc) goto end; - rc = _sde_hardware_post_caps(sde_cfg, hw_rev); + rc = _sde_hardware_post_caps(sde_cfg, sde_cfg->hwversion); if (rc) goto end; diff --git a/msm/sde/sde_hw_catalog.h b/msm/sde/sde_hw_catalog.h index f3a7c330efaf..41f0ba6eb7cc 100644 --- a/msm/sde/sde_hw_catalog.h +++ b/msm/sde/sde_hw_catalog.h @@ -1602,11 +1602,10 @@ void sde_hw_mixer_set_preference(struct sde_mdss_cfg *sde_cfg, u32 num_lm, * sde_hw_catalog_init - sde hardware catalog init API parses dtsi property * and stores all parsed offset, hardware capabilities in config structure. * @dev: drm device node. - * @hw_rev: caller needs provide the hardware revision before parsing. * * Return: parsed sde config structure */ -struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev, u32 hw_rev); +struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev); /** * sde_hw_catalog_deinit - sde hardware catalog cleanup diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 52c99a23359f..38b3f3f6b11d 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -2839,12 +2839,6 @@ static const struct msm_kms_funcs kms_funcs = { .get_mixer_count = sde_kms_get_mixer_count, }; -/* the caller api needs to turn on clock before calling it */ -static inline void _sde_kms_core_hw_rev_init(struct sde_kms *sde_kms) -{ - sde_kms->core_rev = readl_relaxed(sde_kms->mmio + 0x0); -} - static int _sde_kms_mmu_destroy(struct sde_kms *sde_kms) { int i; @@ -3325,11 +3319,7 @@ static int _sde_kms_hw_init_blocks(struct sde_kms *sde_kms, struct sde_rm *rm = NULL; int i, rc = -EINVAL; - _sde_kms_core_hw_rev_init(sde_kms); - - pr_info("sde hardware revision:0x%x\n", sde_kms->core_rev); - - sde_kms->catalog = sde_hw_catalog_init(dev, sde_kms->core_rev); + sde_kms->catalog = sde_hw_catalog_init(dev); if (IS_ERR_OR_NULL(sde_kms->catalog)) { rc = PTR_ERR(sde_kms->catalog); if (!sde_kms->catalog) @@ -3338,6 +3328,9 @@ static int _sde_kms_hw_init_blocks(struct sde_kms *sde_kms, sde_kms->catalog = NULL; goto power_error; } + sde_kms->core_rev = sde_kms->catalog->hwversion; + + pr_info("sde hardware revision:0x%x\n", sde_kms->core_rev); /* initialize power domain if defined */ rc = _sde_kms_hw_init_power_helper(dev, sde_kms); diff --git a/msm/sde/sde_kms.h b/msm/sde/sde_kms.h index 0e096d2051f9..c4b2baefcc64 100644 --- a/msm/sde/sde_kms.h +++ b/msm/sde/sde_kms.h @@ -323,6 +323,23 @@ struct vsync_info { */ bool sde_is_custom_client(void); +/** + * sde_kms_get_hw_version - get the hw revision - client is expected to + * enable the power resources before making this call + * @dev: Pointer to drm device + */ +static inline u32 sde_kms_get_hw_version(struct drm_device *dev) +{ + struct sde_kms *sde_kms; + + if (!ddev_to_msm_kms(dev)) + return 0; + + sde_kms = to_sde_kms(ddev_to_msm_kms(dev)); + + return readl_relaxed(sde_kms->mmio + 0x0); +} + /** * sde_kms_power_resource_is_enabled - whether or not power resource is enabled * @dev: Pointer to drm device