return false; \
        }
 
+#define PIPE_CONF_QUIRK(quirk) \
+       ((current_config->quirks | pipe_config->quirks) & (quirk))
+
        PIPE_CONF_CHECK_I(cpu_transcoder);
 
        PIPE_CONF_CHECK_I(has_pch_encoder);
        PIPE_CONF_CHECK_FLAGS(adjusted_mode.flags,
                              DRM_MODE_FLAG_INTERLACE);
 
-       PIPE_CONF_CHECK_FLAGS(adjusted_mode.flags,
-                             DRM_MODE_FLAG_PHSYNC);
-       PIPE_CONF_CHECK_FLAGS(adjusted_mode.flags,
-                             DRM_MODE_FLAG_NHSYNC);
-       PIPE_CONF_CHECK_FLAGS(adjusted_mode.flags,
-                             DRM_MODE_FLAG_PVSYNC);
-       PIPE_CONF_CHECK_FLAGS(adjusted_mode.flags,
-                             DRM_MODE_FLAG_NVSYNC);
+       if (!PIPE_CONF_QUIRK(PIPE_CONFIG_QUIRK_MODE_SYNC_FLAGS)) {
+               PIPE_CONF_CHECK_FLAGS(adjusted_mode.flags,
+                                     DRM_MODE_FLAG_PHSYNC);
+               PIPE_CONF_CHECK_FLAGS(adjusted_mode.flags,
+                                     DRM_MODE_FLAG_NHSYNC);
+               PIPE_CONF_CHECK_FLAGS(adjusted_mode.flags,
+                                     DRM_MODE_FLAG_PVSYNC);
+               PIPE_CONF_CHECK_FLAGS(adjusted_mode.flags,
+                                     DRM_MODE_FLAG_NVSYNC);
+       }
 
        PIPE_CONF_CHECK_I(requested_mode.hdisplay);
        PIPE_CONF_CHECK_I(requested_mode.vdisplay);
 
 #undef PIPE_CONF_CHECK_I
 #undef PIPE_CONF_CHECK_FLAGS
+#undef PIPE_CONF_QUIRK
 
        return true;
 }
 
 } intel_clock_t;
 
 struct intel_crtc_config {
+       /**
+        * quirks - bitfield with hw state readout quirks
+        *
+        * For various reasons the hw state readout code might not be able to
+        * completely faithfully read out the current state. These cases are
+        * tracked with quirk flags so that fastboot and state checker can act
+        * accordingly.
+        */
+#define PIPE_CONFIG_QUIRK_MODE_SYNC_FLAGS (1<<0) /* unreliable sync mode.flags */
+       unsigned long quirks;
+
        struct drm_display_mode requested_mode;
        struct drm_display_mode adjusted_mode;
        /* This flag must be set by the encoder's compute_config callback if it
 
 
        ret = intel_sdvo_get_input_timing(intel_sdvo, &dtd);
        if (!ret) {
+               /* Some sdvo encoders are not spec compliant and don't
+                * implement the mandatory get_timings function. */
                DRM_DEBUG_DRIVER("failed to retrieve SDVO DTD\n");
-               return;
-       }
-
-       if (dtd.part2.dtd_flags & DTD_FLAG_HSYNC_POSITIVE)
-               flags |= DRM_MODE_FLAG_PHSYNC;
-       else
-               flags |= DRM_MODE_FLAG_NHSYNC;
+               pipe_config->quirks |= PIPE_CONFIG_QUIRK_MODE_SYNC_FLAGS;
+       } else {
+               if (dtd.part2.dtd_flags & DTD_FLAG_HSYNC_POSITIVE)
+                       flags |= DRM_MODE_FLAG_PHSYNC;
+               else
+                       flags |= DRM_MODE_FLAG_NHSYNC;
 
-       if (dtd.part2.dtd_flags & DTD_FLAG_VSYNC_POSITIVE)
-               flags |= DRM_MODE_FLAG_PVSYNC;
-       else
-               flags |= DRM_MODE_FLAG_NVSYNC;
+               if (dtd.part2.dtd_flags & DTD_FLAG_VSYNC_POSITIVE)
+                       flags |= DRM_MODE_FLAG_PVSYNC;
+               else
+                       flags |= DRM_MODE_FLAG_NVSYNC;
+       }
 
        pipe_config->adjusted_mode.flags |= flags;