Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 10bb3614 authored by Samantha Tran's avatar Samantha Tran
Browse files

drm/msm: return kms structure from helper function



Kms was being populated in a helper function, but it was
returning NULL. This change changes the helper function
to return the kms pointer. This also splits the init functin
into helper functions to address CCN threshold.

Change-Id: I8825d013d87b1803953404a65c14927e0951046f
Signed-off-by: default avatarSamantha Tran <samtran@codeaurora.org>
parent 155ccc15
Loading
Loading
Loading
Loading
+65 −54
Original line number Diff line number Diff line
/*
 * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -584,60 +584,12 @@ static int msm_power_enable_wrapper(void *handle, void *client, bool enable)
	return sde_power_resource_enable(handle, client, enable);
}

static int _msm_drm_init_helper(struct msm_drm_private *priv,
	struct sched_param param, struct drm_device *ddev,
	struct device *dev, struct platform_device *pdev,
	struct msm_kms *kms)
static int msm_drm_display_thread_create(struct sched_param param,
	struct msm_drm_private *priv, struct drm_device *ddev,
	struct device *dev)
{
	int i, ret = 0;

	switch (get_mdp_ver(pdev)) {
	case KMS_MDP4:
		kms = mdp4_kms_init(ddev);
		break;
	case KMS_MDP5:
		kms = mdp5_kms_init(ddev);
		break;
	case KMS_SDE:
		kms = sde_kms_init(ddev);
		break;
	default:
		kms = ERR_PTR(-ENODEV);
		break;
	}

	if (IS_ERR(kms)) {
		/*
		 * NOTE: once we have GPU support, having no kms should not
		 * be considered fatal.. ideally we would still support gpu
		 * and (for example) use dmabuf/prime to share buffers with
		 * imx drm driver on iMX5
		 */
		priv->kms = NULL;
		dev_err(dev, "failed to load kms\n");
		return PTR_ERR(kms);
		;
	}
	priv->kms = kms;
	pm_runtime_enable(dev);

	/**
	 * Since kms->funcs->hw_init(kms) might call
	 * drm_object_property_set_value to initialize some custom
	 * properties we need to make sure mode_config.funcs are populated
	 * beforehand to avoid dereferencing an unset value during the
	 * drm_drv_uses_atomic_modeset check.
	 */
	ddev->mode_config.funcs = &mode_config_funcs;

	if (kms) {
		ret = kms->funcs->hw_init(kms);
		if (ret) {
			dev_err(dev, "kms hw init failed: %d\n", ret);
			return ret;
		}
	}

	/**
	 * this priority was found during empiric testing to have appropriate
	 * realtime scheduling to process display updates and interact with
@@ -734,6 +686,59 @@ static int _msm_drm_init_helper(struct msm_drm_private *priv,
	}

	return 0;

}
static struct msm_kms *_msm_drm_init_helper(struct msm_drm_private *priv,
	struct drm_device *ddev, struct device *dev,
	struct platform_device *pdev)
{
	int ret;
	struct msm_kms *kms;

	switch (get_mdp_ver(pdev)) {
	case KMS_MDP4:
		kms = mdp4_kms_init(ddev);
		break;
	case KMS_MDP5:
		kms = mdp5_kms_init(ddev);
		break;
	case KMS_SDE:
		kms = sde_kms_init(ddev);
		break;
	default:
		kms = ERR_PTR(-ENODEV);
		break;
	}

	if (IS_ERR_OR_NULL(kms)) {
		/*
		 * NOTE: once we have GPU support, having no kms should not
		 * be considered fatal.. ideally we would still support gpu
		 * and (for example) use dmabuf/prime to share buffers with
		 * imx drm driver on iMX5
		 */
		dev_err(dev, "failed to load kms\n");
		return kms;
	}
	priv->kms = kms;
	pm_runtime_enable(dev);

	/**
	 * Since kms->funcs->hw_init(kms) might call
	 * drm_object_property_set_value to initialize some custom
	 * properties we need to make sure mode_config.funcs are populated
	 * beforehand to avoid dereferencing an unset value during the
	 * drm_drv_uses_atomic_modeset check.
	 */
	ddev->mode_config.funcs = &mode_config_funcs;

	ret = (kms)->funcs->hw_init(kms);
	if (ret) {
		dev_err(dev, "kms hw init failed: %d\n", ret);
		return ERR_PTR(ret);
	}

	return kms;
}

static int msm_drm_init(struct device *dev, struct drm_driver *drv)
@@ -811,12 +816,18 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv)
	ddev->mode_config.funcs = &mode_config_funcs;
	ddev->mode_config.helper_private = &mode_config_helper_funcs;

	ret = _msm_drm_init_helper(priv, param, ddev, dev, pdev, kms);
	if (ret) {
	kms = _msm_drm_init_helper(priv, ddev, dev, pdev);
	if (IS_ERR_OR_NULL(kms)) {
		dev_err(dev, "msm_drm_init_helper failed\n");
		goto fail;
	}

	ret = msm_drm_display_thread_create(param, priv, ddev, dev);
	if (ret) {
		dev_err(dev, "msm_drm_display_thread_create failed\n");
		goto fail;
	}

	ret = drm_vblank_init(ddev, priv->num_crtcs);
	if (ret < 0) {
		dev_err(dev, "failed to initialize vblank\n");