Merge "drm/msm: move display and event threads to realtime priority"

This commit is contained in:
Linux Build Service Account 2018-03-16 01:55:49 -07:00 committed by Gerrit - the friendly Code Review server
commit 8353ae1eaf
3 changed files with 45 additions and 3 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
* Copyright (C) 2014 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@ -562,6 +562,11 @@ int msm_atomic_commit(struct drm_device *dev,
struct msm_commit *commit;
int i, ret;
if (!priv || priv->shutdown_in_progress) {
DRM_ERROR("priv is null or shutdwon is in-progress\n");
return -EINVAL;
}
SDE_ATRACE_BEGIN("atomic_commit");
ret = drm_atomic_helper_prepare_planes(dev, state);
if (ret) {

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
* Copyright (C) 2013 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@ -439,6 +439,7 @@ static int msm_load(struct drm_device *dev, unsigned long flags)
struct msm_kms *kms;
struct sde_dbg_power_ctrl dbg_power_ctrl = { NULL };
int ret, i;
struct sched_param param;
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv) {
@ -532,7 +533,12 @@ static int msm_load(struct drm_device *dev, unsigned long flags)
goto fail;
}
}
/**
* 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;
/* initialize commit thread structure */
for (i = 0; i < priv->num_crtcs; i++) {
priv->disp_thread[i].crtc_id = priv->crtcs[i]->base.id;
@ -543,6 +549,11 @@ static int msm_load(struct drm_device *dev, unsigned long flags)
&priv->disp_thread[i].worker,
"crtc_commit:%d",
priv->disp_thread[i].crtc_id);
ret = sched_setscheduler(priv->disp_thread[i].thread,
SCHED_FIFO, &param);
if (ret)
pr_warn("display thread priority update failed: %d\n",
ret);
if (IS_ERR(priv->disp_thread[i].thread)) {
dev_err(dev->dev, "failed to create kthread\n");
@ -2199,6 +2210,28 @@ static const struct platform_device_id msm_id[] = {
{ }
};
static void msm_pdev_shutdown(struct platform_device *pdev)
{
struct drm_device *ddev = platform_get_drvdata(pdev);
struct msm_drm_private *priv = NULL;
if (!ddev) {
DRM_ERROR("invalid drm device node\n");
return;
}
priv = ddev->dev_private;
if (!priv) {
DRM_ERROR("invalid msm drm private node\n");
return;
}
msm_lastclose(ddev);
/* set this after lastclose to allow kickoff from lastclose */
priv->shutdown_in_progress = true;
}
static const struct of_device_id dt_match[] = {
{ .compatible = "qcom,mdp" }, /* mdp4 */
{ .compatible = "qcom,sde-kms" }, /* sde */
@ -2209,6 +2242,7 @@ MODULE_DEVICE_TABLE(of, dt_match);
static struct platform_driver msm_platform_driver = {
.probe = msm_pdev_probe,
.remove = msm_pdev_remove,
.shutdown = msm_pdev_shutdown,
.driver = {
.name = "msm_drm",
.of_match_table = dt_match,

View file

@ -375,6 +375,9 @@ struct msm_drm_private {
/* list of clients waiting for events */
struct list_head client_event_list;
/* update the flag when msm driver receives shutdown notification */
bool shutdown_in_progress;
};
struct msm_format {