diff --git a/msm/msm_drv.c b/msm/msm_drv.c index cf8a3d25..feaa3e2e 100644 --- a/msm/msm_drv.c +++ b/msm/msm_drv.c @@ -344,51 +344,6 @@ int msm_get_src_bpc(int chroma_format, return src_bpp; } -struct vblank_work { - struct kthread_work work; - int crtc_id; - bool enable; - struct msm_drm_private *priv; -}; - -static void vblank_ctrl_worker(struct kthread_work *work) -{ - struct vblank_work *cur_work = container_of(work, - struct vblank_work, work); - struct msm_drm_private *priv = cur_work->priv; - struct msm_kms *kms = priv->kms; - - if (cur_work->enable) - kms->funcs->enable_vblank(kms, priv->crtcs[cur_work->crtc_id]); - else - kms->funcs->disable_vblank(kms, priv->crtcs[cur_work->crtc_id]); - - kfree(cur_work); -} - -static int vblank_ctrl_queue_work(struct msm_drm_private *priv, - int crtc_id, bool enable) -{ - struct vblank_work *cur_work; - struct kthread_worker *worker; - - if (!priv || crtc_id >= priv->num_crtcs) - return -EINVAL; - - cur_work = kzalloc(sizeof(*cur_work), GFP_ATOMIC); - if (!cur_work) - return -ENOMEM; - - kthread_init_work(&cur_work->work, vblank_ctrl_worker); - cur_work->crtc_id = crtc_id; - cur_work->enable = enable; - cur_work->priv = priv; - worker = &priv->event_thread[crtc_id].worker; - - kthread_queue_work(worker, &cur_work->work); - return 0; -} - static int msm_drm_uninit(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); @@ -1116,26 +1071,6 @@ static void msm_irq_uninstall(struct drm_device *dev) kms->funcs->irq_uninstall(kms); } -static int msm_enable_vblank(struct drm_device *dev, unsigned int pipe) -{ - struct msm_drm_private *priv = dev->dev_private; - struct msm_kms *kms = priv->kms; - if (!kms) - return -ENXIO; - DBG("dev=%pK, crtc=%u", dev, pipe); - return vblank_ctrl_queue_work(priv, pipe, true); -} - -static void msm_disable_vblank(struct drm_device *dev, unsigned int pipe) -{ - struct msm_drm_private *priv = dev->dev_private; - struct msm_kms *kms = priv->kms; - if (!kms) - return; - DBG("dev=%pK, crtc=%u", dev, pipe); - vblank_ctrl_queue_work(priv, pipe, false); -} - /* * DRM ioctls: */ @@ -1727,8 +1662,6 @@ static struct drm_driver msm_driver = { .irq_preinstall = msm_irq_preinstall, .irq_postinstall = msm_irq_postinstall, .irq_uninstall = msm_irq_uninstall, - .enable_vblank = msm_enable_vblank, - .disable_vblank = msm_disable_vblank, .gem_free_object_unlocked = msm_gem_free_object, .gem_vm_ops = &vm_ops, .dumb_create = msm_gem_dumb_create, diff --git a/msm/msm_kms.h b/msm/msm_kms.h index 3e70dcf2..c9832fcf 100644 --- a/msm/msm_kms.h +++ b/msm/msm_kms.h @@ -57,8 +57,6 @@ struct msm_kms_funcs { int (*irq_postinstall)(struct msm_kms *kms); void (*irq_uninstall)(struct msm_kms *kms); irqreturn_t (*irq)(struct msm_kms *kms); - int (*enable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc); - void (*disable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc); /* modeset, bracketing atomic_commit(): */ void (*prepare_fence)(struct msm_kms *kms, struct drm_atomic_state *state); diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index 45a11b19..fc1a380c 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -50,6 +50,13 @@ struct sde_crtc_custom_events { struct sde_irq_callback *irq); }; +struct vblank_work { + struct kthread_work work; + int crtc_id; + bool enable; + struct msm_drm_private *priv; +}; + static int sde_crtc_power_interrupt_handler(struct drm_crtc *crtc_drm, bool en, struct sde_irq_callback *ad_irq); static int sde_crtc_idle_interrupt_handler(struct drm_crtc *crtc_drm, @@ -6274,6 +6281,72 @@ static void _sde_crtc_destroy_debugfs(struct drm_crtc *crtc) } #endif /* CONFIG_DEBUG_FS */ +static void vblank_ctrl_worker(struct kthread_work *work) +{ + struct vblank_work *cur_work = container_of(work, + struct vblank_work, work); + struct msm_drm_private *priv = cur_work->priv; + struct msm_kms *kms = priv->kms; + + sde_crtc_vblank(priv->crtcs[cur_work->crtc_id], cur_work->enable); + + kfree(cur_work); +} + +static int vblank_ctrl_queue_work(struct msm_drm_private *priv, + int crtc_id, bool enable) +{ + struct vblank_work *cur_work; + struct drm_crtc *crtc; + struct kthread_worker *worker; + + if (!priv || crtc_id >= priv->num_crtcs) + return -EINVAL; + + cur_work = kzalloc(sizeof(*cur_work), GFP_ATOMIC); + if (!cur_work) + return -ENOMEM; + + crtc = priv->crtcs[crtc_id]; + + kthread_init_work(&cur_work->work, vblank_ctrl_worker); + cur_work->crtc_id = crtc_id; + cur_work->enable = enable; + cur_work->priv = priv; + worker = &priv->event_thread[crtc_id].worker; + + kthread_queue_work(worker, &cur_work->work); + return 0; +} + +static int sde_crtc_enable_vblank(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + unsigned int pipe = crtc->index; + struct msm_drm_private *priv = dev->dev_private; + struct msm_kms *kms = priv->kms; + + if (!kms) + return -ENXIO; + + DBG("dev=%pK, crtc=%u", dev, pipe); + return vblank_ctrl_queue_work(priv, pipe, true); +} + +static void sde_crtc_disable_vblank(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + unsigned int pipe = crtc->index; + struct msm_drm_private *priv = dev->dev_private; + struct msm_kms *kms = priv->kms; + + if (!kms) + return; + DBG("dev=%pK, crtc=%u", dev, pipe); + + vblank_ctrl_queue_work(priv, pipe, false); +} + static int sde_crtc_late_register(struct drm_crtc *crtc) { return _sde_crtc_init_debugfs(crtc); @@ -6287,6 +6360,8 @@ static void sde_crtc_early_unregister(struct drm_crtc *crtc) static const struct drm_crtc_funcs sde_crtc_funcs = { .set_config = drm_atomic_helper_set_config, .destroy = sde_crtc_destroy, + .enable_vblank = sde_crtc_enable_vblank, + .disable_vblank = sde_crtc_disable_vblank, .page_flip = drm_atomic_helper_page_flip, .atomic_set_property = sde_crtc_atomic_set_property, .atomic_get_property = sde_crtc_atomic_get_property, diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index bd0f53fa..299a0b0d 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -205,30 +205,6 @@ static int _sde_kms_dump_clks_state(struct sde_kms *sde_kms) } #endif -static int sde_kms_enable_vblank(struct msm_kms *kms, struct drm_crtc *crtc) -{ - int ret; - - if (!kms || !crtc) - return -EINVAL; - - SDE_ATRACE_BEGIN("sde_kms_enable_vblank"); - ret = sde_crtc_vblank(crtc, true); - SDE_ATRACE_END("sde_kms_enable_vblank"); - - return ret; -} - -static void sde_kms_disable_vblank(struct msm_kms *kms, struct drm_crtc *crtc) -{ - if (!kms || !crtc) - return; - - SDE_ATRACE_BEGIN("sde_kms_disable_vblank"); - sde_crtc_vblank(crtc, false); - SDE_ATRACE_END("sde_kms_disable_vblank"); -} - static void sde_kms_wait_for_frame_transfer_complete(struct msm_kms *kms, struct drm_crtc *crtc) { @@ -3752,8 +3728,6 @@ static const struct msm_kms_funcs kms_funcs = { .complete_commit = sde_kms_complete_commit, .wait_for_crtc_commit_done = sde_kms_wait_for_commit_done, .wait_for_tx_complete = sde_kms_wait_for_frame_transfer_complete, - .enable_vblank = sde_kms_enable_vblank, - .disable_vblank = sde_kms_disable_vblank, .check_modified_format = sde_format_check_modified_format, .atomic_check = sde_kms_atomic_check, .get_format = sde_get_msm_format,