Hello Jose Abreu,

Commit 97f973d65260 ("drm: Use new mode_valid() helpers in connector
probe helper") from May 25, 2017 (linux-next), leads to the following
Smatch static checker warning:

        drivers/gpu/drm/drm_probe_helper.c:102 drm_mode_validate_pipeline()
        warn: set error code if '*status != 0'

drivers/gpu/drm/drm_probe_helper.c
    89 static int
    90 drm_mode_validate_pipeline(struct drm_display_mode *mode,
    91                            struct drm_connector *connector,
    92                            struct drm_modeset_acquire_ctx *ctx,
    93                            enum drm_mode_status *status)
    94 {
    95         struct drm_device *dev = connector->dev;
    96         struct drm_encoder *encoder;
    97         int ret;
    98 
    99         /* Step 1: Validate against connector */
    100         ret = drm_connector_mode_valid(connector, mode, ctx, status);
    101         if (ret || *status != MODE_OK)
--> 102                 return ret;

The caller expects ret to be set on error, so if only *status is set
to an error this will do something bad.

    103 
    104         /* Step 2: Validate against encoders and crtcs */
    105         drm_connector_for_each_possible_encoder(connector, encoder) {
    106                 struct drm_bridge *bridge;
    107                 struct drm_crtc *crtc;
    108 
    109                 *status = drm_encoder_mode_valid(encoder, mode);
    110                 if (*status != MODE_OK) {
    111                         /* No point in continuing for crtc check as 
this encoder
    112                          * will not accept the mode anyway. If all 
encoders
    113                          * reject the mode then, at exit, ret will not 
be
    114                          * MODE_OK. */
    115                         continue;
    116                 }
    117 
    118                 bridge = drm_bridge_chain_get_first_bridge(encoder);
    119                 *status = drm_bridge_chain_mode_valid(bridge,
    120                                                       
&connector->display_info,
    121                                                       mode);
    122                 drm_bridge_put(bridge);
    123                 if (*status != MODE_OK) {
    124                         /* There is also no point in continuing for 
crtc check
    125                          * here. */
    126                         continue;
    127                 }
    128 
    129                 drm_for_each_crtc(crtc, dev) {
    130                         if (!drm_encoder_crtc_ok(encoder, crtc))
    131                                 continue;
    132 
    133                         *status = drm_crtc_mode_valid(crtc, mode);
    134                         if (*status == MODE_OK) {
    135                                 /* If we get to this point there is at 
least
    136                                  * one combination of encoder+crtc that 
works
    137                                  * for this mode. Lets return now. */
    138                                 return 0;
    139                         }
    140                 }
    141         }
    142 
    143         return 0;
    144 }

regards,
dan carpenter

Reply via email to