[bug report] drm/vc4: Add CTM support

Dan Carpenter dan.carpenter at linaro.org
Sat Jul 20 00:08:47 UTC 2024


Hello Stefan Schake,

Commit 766cc6b1f7fc ("drm/vc4: Add CTM support") from Apr 20, 2018
(linux-next), leads to the following Smatch static checker warning:

	drivers/gpu/drm/vc4/vc4_kms.c:555 vc4_ctm_atomic_check()
	warn: reusing outside iterator: 'i'

drivers/gpu/drm/vc4/vc4_kms.c
    504 static int
    505 vc4_ctm_atomic_check(struct drm_device *dev, struct drm_atomic_state *state)
    506 {
    507         struct vc4_dev *vc4 = to_vc4_dev(dev);
    508         struct vc4_ctm_state *ctm_state = NULL;
    509         struct drm_crtc *crtc;
    510         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
    511         struct drm_color_ctm *ctm;
    512         int i;
    513 
    514         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
    515                 /* CTM is being disabled. */
    516                 if (!new_crtc_state->ctm && old_crtc_state->ctm) {
    517                         ctm_state = vc4_get_ctm_state(state, &vc4->ctm_manager);
    518                         if (IS_ERR(ctm_state))
    519                                 return PTR_ERR(ctm_state);
    520                         ctm_state->fifo = 0;
    521                 }
    522         }
    523 
    524         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
                                                                                           ^
This loops from zero to state->dev->mode_config.num_crtc - 1.

    525                 if (new_crtc_state->ctm == old_crtc_state->ctm)
    526                         continue;
    527 
    528                 if (!ctm_state) {
    529                         ctm_state = vc4_get_ctm_state(state, &vc4->ctm_manager);
    530                         if (IS_ERR(ctm_state))
    531                                 return PTR_ERR(ctm_state);
    532                 }
    533 
    534                 /* CTM is being enabled or the matrix changed. */
    535                 if (new_crtc_state->ctm) {
    536                         struct vc4_crtc_state *vc4_crtc_state =
    537                                 to_vc4_crtc_state(new_crtc_state);
    538 
    539                         /* fifo is 1-based since 0 disables CTM. */
    540                         int fifo = vc4_crtc_state->assigned_channel + 1;
    541 
    542                         /* Check userland isn't trying to turn on CTM for more
    543                          * than one CRTC at a time.
    544                          */
    545                         if (ctm_state->fifo && ctm_state->fifo != fifo) {
    546                                 DRM_DEBUG_DRIVER("Too many CTM configured\n");
    547                                 return -EINVAL;
    548                         }
    549 
    550                         /* Check we can approximate the specified CTM.
    551                          * We disallow scalars |c| > 1.0 since the HW has
    552                          * no integer bits.
    553                          */
    554                         ctm = new_crtc_state->ctm->data;
--> 555                         for (i = 0; i < ARRAY_SIZE(ctm->matrix); i++) {
                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This uses the same iterator and restarts the loop.

    556                                 u64 val = ctm->matrix[i];
    557 
    558                                 val &= ~BIT_ULL(63);
    559                                 if (val > BIT_ULL(32))
    560                                         return -EINVAL;
    561                         }
    562 
    563                         ctm_state->fifo = fifo;
    564                         ctm_state->ctm = ctm;
    565                 }
    566         }
    567 
    568         return 0;
    569 }

regards,
dan carpenter


More information about the dri-devel mailing list