Browse Source

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 <[email protected]>
Veera Sundaram Sankaran 5 years ago
parent
commit
7245366343
4 changed files with 76 additions and 17 deletions
  1. 54 4
      msm/sde/sde_hw_catalog.c
  2. 1 2
      msm/sde/sde_hw_catalog.h
  3. 4 11
      msm/sde/sde_kms.c
  4. 17 0
      msm/sde/sde_kms.h

+ 54 - 4
msm/sde/sde_hw_catalog.c

@@ -161,6 +161,11 @@
 /*************************************************************
 /*************************************************************
  *  DTSI PROPERTY INDEX
  *  DTSI PROPERTY INDEX
  *************************************************************/
  *************************************************************/
+enum {
+	SDE_HW_VERSION,
+	SDE_HW_PROP_MAX,
+};
+
 enum {
 enum {
 	HW_OFF,
 	HW_OFF,
 	HW_LEN,
 	HW_LEN,
@@ -524,6 +529,10 @@ struct sde_dt_props {
 /*************************************************************
 /*************************************************************
  * dts property list
  * 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[] = {
 static struct sde_prop_type sde_prop[] = {
 	{SDE_OFF, "qcom,sde-off", true, PROP_TYPE_U32},
 	{SDE_OFF, "qcom,sde-off", true, PROP_TYPE_U32},
 	{SDE_LEN, "qcom,sde-len", false, 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);
 	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
  * 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;
 	int rc;
 	struct sde_mdss_cfg *sde_cfg;
 	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)
 	if (!sde_cfg)
 		return ERR_PTR(-ENOMEM);
 		return ERR_PTR(-ENOMEM);
 
 
-	sde_cfg->hwversion = hw_rev;
 	INIT_LIST_HEAD(&sde_cfg->irq_offset_list);
 	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)
 	if (rc)
 		goto end;
 		goto end;
 
 
@@ -4905,7 +4955,7 @@ struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev, u32 hw_rev)
 	if (rc)
 	if (rc)
 		goto end;
 		goto end;
 
 
-	rc = _sde_hardware_post_caps(sde_cfg, hw_rev);
+	rc = _sde_hardware_post_caps(sde_cfg, sde_cfg->hwversion);
 	if (rc)
 	if (rc)
 		goto end;
 		goto end;
 
 

+ 1 - 2
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
  * sde_hw_catalog_init - sde hardware catalog init API parses dtsi property
  * and stores all parsed offset, hardware capabilities in config structure.
  * and stores all parsed offset, hardware capabilities in config structure.
  * @dev:          drm device node.
  * @dev:          drm device node.
- * @hw_rev:       caller needs provide the hardware revision before parsing.
  *
  *
  * Return: parsed sde config structure
  * 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
  * sde_hw_catalog_deinit - sde hardware catalog cleanup

+ 4 - 11
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,
 	.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)
 static int _sde_kms_mmu_destroy(struct sde_kms *sde_kms)
 {
 {
 	int i;
 	int i;
@@ -3325,11 +3319,7 @@ static int _sde_kms_hw_init_blocks(struct sde_kms *sde_kms,
 	struct sde_rm *rm = NULL;
 	struct sde_rm *rm = NULL;
 	int i, rc = -EINVAL;
 	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)) {
 	if (IS_ERR_OR_NULL(sde_kms->catalog)) {
 		rc = PTR_ERR(sde_kms->catalog);
 		rc = PTR_ERR(sde_kms->catalog);
 		if (!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;
 		sde_kms->catalog = NULL;
 		goto power_error;
 		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 */
 	/* initialize power domain if defined */
 	rc = _sde_kms_hw_init_power_helper(dev, sde_kms);
 	rc = _sde_kms_hw_init_power_helper(dev, sde_kms);

+ 17 - 0
msm/sde/sde_kms.h

@@ -323,6 +323,23 @@ struct vsync_info {
  */
  */
 bool sde_is_custom_client(void);
 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
  * sde_kms_power_resource_is_enabled - whether or not power resource is enabled
  * @dev: Pointer to drm device
  * @dev: Pointer to drm device