Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/msm: stop storing the array of CRTCs in struct msm_drm_private

The array of CRTC in the struct msm_drm_private duplicates a list of
CRTCs in the drm_device. Drop it and use the existing list for CRTC
enumeration.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
Patchwork: https://patchwork.freedesktop.org/patch/538068/
Link: https://lore.kernel.org/r/20230519150734.3879916-1-dmitry.baryshkov@linaro.org

+24 -26
+1 -1
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
··· 794 794 ret = PTR_ERR(crtc); 795 795 return ret; 796 796 } 797 - priv->crtcs[priv->num_crtcs++] = crtc; 797 + priv->num_crtcs++; 798 798 } 799 799 800 800 /* All CRTCs are compatible with all encoders */
+1 -1
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
··· 332 332 goto fail; 333 333 } 334 334 335 - priv->crtcs[priv->num_crtcs++] = crtc; 335 + priv->num_crtcs++; 336 336 } 337 337 338 338 /*
+1 -1
drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
··· 497 497 DRM_DEV_ERROR(dev->dev, "failed to construct crtc %d (%d)\n", i, ret); 498 498 goto fail; 499 499 } 500 - priv->crtcs[priv->num_crtcs++] = crtc; 500 + priv->num_crtcs++; 501 501 } 502 502 503 503 /*
+21 -21
drivers/gpu/drm/msm/msm_drv.c
··· 155 155 156 156 struct msm_vblank_work { 157 157 struct work_struct work; 158 - int crtc_id; 158 + struct drm_crtc *crtc; 159 159 bool enable; 160 160 struct msm_drm_private *priv; 161 161 }; ··· 168 168 struct msm_kms *kms = priv->kms; 169 169 170 170 if (vbl_work->enable) 171 - kms->funcs->enable_vblank(kms, priv->crtcs[vbl_work->crtc_id]); 171 + kms->funcs->enable_vblank(kms, vbl_work->crtc); 172 172 else 173 - kms->funcs->disable_vblank(kms, priv->crtcs[vbl_work->crtc_id]); 173 + kms->funcs->disable_vblank(kms, vbl_work->crtc); 174 174 175 175 kfree(vbl_work); 176 176 } 177 177 178 178 static int vblank_ctrl_queue_work(struct msm_drm_private *priv, 179 - int crtc_id, bool enable) 179 + struct drm_crtc *crtc, bool enable) 180 180 { 181 181 struct msm_vblank_work *vbl_work; 182 182 ··· 186 186 187 187 INIT_WORK(&vbl_work->work, vblank_ctrl_worker); 188 188 189 - vbl_work->crtc_id = crtc_id; 189 + vbl_work->crtc = crtc; 190 190 vbl_work->enable = enable; 191 191 vbl_work->priv = priv; 192 192 ··· 407 407 struct msm_drm_private *priv = dev_get_drvdata(dev); 408 408 struct drm_device *ddev; 409 409 struct msm_kms *kms; 410 - int ret, i; 410 + struct drm_crtc *crtc; 411 + int ret; 411 412 412 413 if (drm_firmware_drivers_only()) 413 414 return -ENODEV; ··· 495 494 ddev->mode_config.funcs = &mode_config_funcs; 496 495 ddev->mode_config.helper_private = &mode_config_helper_funcs; 497 496 498 - for (i = 0; i < priv->num_crtcs; i++) { 497 + drm_for_each_crtc(crtc, ddev) { 498 + struct msm_drm_thread *ev_thread; 499 + 499 500 /* initialize event thread */ 500 - priv->event_thread[i].crtc_id = priv->crtcs[i]->base.id; 501 - priv->event_thread[i].dev = ddev; 502 - priv->event_thread[i].worker = kthread_create_worker(0, 503 - "crtc_event:%d", priv->event_thread[i].crtc_id); 504 - if (IS_ERR(priv->event_thread[i].worker)) { 505 - ret = PTR_ERR(priv->event_thread[i].worker); 501 + ev_thread = &priv->event_thread[drm_crtc_index(crtc)]; 502 + ev_thread->dev = ddev; 503 + ev_thread->worker = kthread_create_worker(0, "crtc_event:%d", crtc->base.id); 504 + if (IS_ERR(ev_thread->worker)) { 505 + ret = PTR_ERR(ev_thread->worker); 506 506 DRM_DEV_ERROR(dev, "failed to create crtc_event kthread\n"); 507 - priv->event_thread[i].worker = NULL; 507 + ev_thread->worker = NULL; 508 508 goto err_msm_uninit; 509 509 } 510 510 511 - sched_set_fifo(priv->event_thread[i].worker->task); 511 + sched_set_fifo(ev_thread->worker->task); 512 512 } 513 513 514 514 ret = drm_vblank_init(ddev, priv->num_crtcs); ··· 641 639 int msm_crtc_enable_vblank(struct drm_crtc *crtc) 642 640 { 643 641 struct drm_device *dev = crtc->dev; 644 - unsigned int pipe = crtc->index; 645 642 struct msm_drm_private *priv = dev->dev_private; 646 643 struct msm_kms *kms = priv->kms; 647 644 if (!kms) 648 645 return -ENXIO; 649 - drm_dbg_vbl(dev, "crtc=%u", pipe); 650 - return vblank_ctrl_queue_work(priv, pipe, true); 646 + drm_dbg_vbl(dev, "crtc=%u", crtc->base.id); 647 + return vblank_ctrl_queue_work(priv, crtc, true); 651 648 } 652 649 653 650 void msm_crtc_disable_vblank(struct drm_crtc *crtc) 654 651 { 655 652 struct drm_device *dev = crtc->dev; 656 - unsigned int pipe = crtc->index; 657 653 struct msm_drm_private *priv = dev->dev_private; 658 654 struct msm_kms *kms = priv->kms; 659 655 if (!kms) 660 656 return; 661 - drm_dbg_vbl(dev, "crtc=%u", pipe); 662 - vblank_ctrl_queue_work(priv, pipe, false); 657 + drm_dbg_vbl(dev, "crtc=%u", crtc->base.id); 658 + vblank_ctrl_queue_work(priv, crtc, false); 663 659 } 664 660 665 661 /*
-2
drivers/gpu/drm/msm/msm_drv.h
··· 97 97 /* Commit/Event thread specific structure */ 98 98 struct msm_drm_thread { 99 99 struct drm_device *dev; 100 - unsigned int crtc_id; 101 100 struct kthread_worker *worker; 102 101 }; 103 102 ··· 197 198 struct workqueue_struct *wq; 198 199 199 200 unsigned int num_crtcs; 200 - struct drm_crtc *crtcs[MAX_CRTCS]; 201 201 202 202 struct msm_drm_thread event_thread[MAX_CRTCS]; 203 203