diff options
Diffstat (limited to 'drivers/gpu/drm/msm/msm_drv.c')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_drv.c | 126 | 
1 files changed, 59 insertions, 67 deletions
| diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index f6ce40bf3699..7d641c7e3514 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -120,8 +120,8 @@ struct clk *msm_clk_get(struct platform_device *pdev, const char *name)  	return clk;  } -void __iomem *msm_ioremap(struct platform_device *pdev, const char *name, -		const char *dbgname) +void __iomem *_msm_ioremap(struct platform_device *pdev, const char *name, +			   const char *dbgname, bool quiet)  {  	struct resource *res;  	unsigned long size; @@ -133,7 +133,8 @@ void __iomem *msm_ioremap(struct platform_device *pdev, const char *name,  		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	if (!res) { -		DRM_DEV_ERROR(&pdev->dev, "failed to get memory resource: %s\n", name); +		if (!quiet) +			DRM_DEV_ERROR(&pdev->dev, "failed to get memory resource: %s\n", name);  		return ERR_PTR(-EINVAL);  	} @@ -141,7 +142,8 @@ void __iomem *msm_ioremap(struct platform_device *pdev, const char *name,  	ptr = devm_ioremap(&pdev->dev, res->start, size);  	if (!ptr) { -		DRM_DEV_ERROR(&pdev->dev, "failed to ioremap: %s\n", name); +		if (!quiet) +			DRM_DEV_ERROR(&pdev->dev, "failed to ioremap: %s\n", name);  		return ERR_PTR(-ENOMEM);  	} @@ -151,6 +153,18 @@ void __iomem *msm_ioremap(struct platform_device *pdev, const char *name,  	return ptr;  } +void __iomem *msm_ioremap(struct platform_device *pdev, const char *name, +			  const char *dbgname) +{ +	return _msm_ioremap(pdev, name, dbgname, false); +} + +void __iomem *msm_ioremap_quiet(struct platform_device *pdev, const char *name, +				const char *dbgname) +{ +	return _msm_ioremap(pdev, name, dbgname, true); +} +  void msm_writel(u32 data, void __iomem *addr)  {  	if (reglog) @@ -238,10 +252,8 @@ static int msm_drm_uninit(struct device *dev)  	/* clean up event worker threads */  	for (i = 0; i < priv->num_crtcs; i++) { -		if (priv->event_thread[i].thread) { -			kthread_destroy_worker(&priv->event_thread[i].worker); -			priv->event_thread[i].thread = NULL; -		} +		if (priv->event_thread[i].worker) +			kthread_destroy_worker(priv->event_thread[i].worker);  	}  	msm_gem_shrinker_cleanup(ddev); @@ -389,7 +401,6 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv)  	struct msm_kms *kms;  	struct msm_mdss *mdss;  	int ret, i; -	struct sched_param param;  	ddev = drm_dev_alloc(drv, dev);  	if (IS_ERR(ddev)) { @@ -495,32 +506,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; -	/** -	 * this priority was found during empiric testing to have appropriate -	 * realtime scheduling to process display updates and interact with -	 * other real time and normal priority task -	 */ -	param.sched_priority = 16;  	for (i = 0; i < priv->num_crtcs; i++) {  		/* initialize event thread */  		priv->event_thread[i].crtc_id = priv->crtcs[i]->base.id; -		kthread_init_worker(&priv->event_thread[i].worker);  		priv->event_thread[i].dev = ddev; -		priv->event_thread[i].thread = -			kthread_run(kthread_worker_fn, -				&priv->event_thread[i].worker, -				"crtc_event:%d", priv->event_thread[i].crtc_id); -		if (IS_ERR(priv->event_thread[i].thread)) { +		priv->event_thread[i].worker = kthread_create_worker(0, +			"crtc_event:%d", priv->event_thread[i].crtc_id); +		if (IS_ERR(priv->event_thread[i].worker)) {  			DRM_DEV_ERROR(dev, "failed to create crtc_event kthread\n"); -			priv->event_thread[i].thread = NULL;  			goto err_msm_uninit;  		} -		ret = sched_setscheduler(priv->event_thread[i].thread, -					 SCHED_FIFO, ¶m); -		if (ret) -			dev_warn(dev, "event_thread set priority failed:%d\n", -				 ret); +		sched_set_fifo(priv->event_thread[i].worker->task);  	}  	ret = drm_vblank_init(ddev, priv->num_crtcs); @@ -758,7 +755,7 @@ static int msm_ioctl_gem_cpu_prep(struct drm_device *dev, void *data,  	ret = msm_gem_cpu_prep(obj, args->op, &timeout); -	drm_gem_object_put_unlocked(obj); +	drm_gem_object_put(obj);  	return ret;  } @@ -776,7 +773,7 @@ static int msm_ioctl_gem_cpu_fini(struct drm_device *dev, void *data,  	ret = msm_gem_cpu_fini(obj); -	drm_gem_object_put_unlocked(obj); +	drm_gem_object_put(obj);  	return ret;  } @@ -868,7 +865,7 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data,  		break;  	} -	drm_gem_object_put_unlocked(obj); +	drm_gem_object_put(obj);  	return ret;  } @@ -933,7 +930,7 @@ static int msm_ioctl_gem_madvise(struct drm_device *dev, void *data,  		ret = 0;  	} -	drm_gem_object_put(obj); +	drm_gem_object_put_locked(obj);  unlock:  	mutex_unlock(&dev->struct_mutex); @@ -1039,75 +1036,70 @@ static struct drm_driver msm_driver = {  	.patchlevel         = MSM_VERSION_PATCHLEVEL,  }; -#ifdef CONFIG_PM_SLEEP -static int msm_pm_suspend(struct device *dev) +static int __maybe_unused msm_runtime_suspend(struct device *dev)  {  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct msm_drm_private *priv = ddev->dev_private; +	struct msm_mdss *mdss = priv->mdss; -	if (WARN_ON(priv->pm_state)) -		drm_atomic_state_put(priv->pm_state); +	DBG(""); -	priv->pm_state = drm_atomic_helper_suspend(ddev); -	if (IS_ERR(priv->pm_state)) { -		int ret = PTR_ERR(priv->pm_state); -		DRM_ERROR("Failed to suspend dpu, %d\n", ret); -		return ret; -	} +	if (mdss && mdss->funcs) +		return mdss->funcs->disable(mdss);  	return 0;  } -static int msm_pm_resume(struct device *dev) +static int __maybe_unused msm_runtime_resume(struct device *dev)  {  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct msm_drm_private *priv = ddev->dev_private; -	int ret; +	struct msm_mdss *mdss = priv->mdss; -	if (WARN_ON(!priv->pm_state)) -		return -ENOENT; +	DBG(""); -	ret = drm_atomic_helper_resume(ddev, priv->pm_state); -	if (!ret) -		priv->pm_state = NULL; +	if (mdss && mdss->funcs) +		return mdss->funcs->enable(mdss); -	return ret; +	return 0;  } -#endif -#ifdef CONFIG_PM -static int msm_runtime_suspend(struct device *dev) +static int __maybe_unused msm_pm_suspend(struct device *dev)  { -	struct drm_device *ddev = dev_get_drvdata(dev); -	struct msm_drm_private *priv = ddev->dev_private; -	struct msm_mdss *mdss = priv->mdss; -	DBG(""); +	if (pm_runtime_suspended(dev)) +		return 0; -	if (mdss && mdss->funcs) -		return mdss->funcs->disable(mdss); +	return msm_runtime_suspend(dev); +} -	return 0; +static int __maybe_unused msm_pm_resume(struct device *dev) +{ +	if (pm_runtime_suspended(dev)) +		return 0; + +	return msm_runtime_resume(dev);  } -static int msm_runtime_resume(struct device *dev) +static int __maybe_unused msm_pm_prepare(struct device *dev)  {  	struct drm_device *ddev = dev_get_drvdata(dev); -	struct msm_drm_private *priv = ddev->dev_private; -	struct msm_mdss *mdss = priv->mdss; -	DBG(""); +	return drm_mode_config_helper_suspend(ddev); +} -	if (mdss && mdss->funcs) -		return mdss->funcs->enable(mdss); +static void __maybe_unused msm_pm_complete(struct device *dev) +{ +	struct drm_device *ddev = dev_get_drvdata(dev); -	return 0; +	drm_mode_config_helper_resume(ddev);  } -#endif  static const struct dev_pm_ops msm_pm_ops = {  	SET_SYSTEM_SLEEP_PM_OPS(msm_pm_suspend, msm_pm_resume)  	SET_RUNTIME_PM_OPS(msm_runtime_suspend, msm_runtime_resume, NULL) +	.prepare = msm_pm_prepare, +	.complete = msm_pm_complete,  };  /* | 
