drm/i915/dsi: skip unknown elements for sequence block v3+
authorJani Nikula <jani.nikula@intel.com>
Tue, 5 Jan 2016 15:06:48 +0000 (17:06 +0200)
committerJani Nikula <jani.nikula@intel.com>
Mon, 11 Jan 2016 17:18:52 +0000 (19:18 +0200)
The sequence block has sizes of elements after the operation byte since
sequence block v3. Use it to skip elements we don't support yet.

v2: remove redundant exec_elem[operation_byte] check (Daniel)

Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1452006408-27688-1-git-send-email-jani.nikula@intel.com
drivers/gpu/drm/i915/intel_dsi_panel_vbt.c

index a7d22ebef3faf75b159784d5fc1872344619a9ef..92d5972ec71525263993b530a96d6279252d6106 100644 (file)
@@ -283,31 +283,35 @@ static void generic_exec_sequence(struct intel_dsi *intel_dsi, const u8 *data)
        if (dev_priv->vbt.dsi.seq_version >= 3)
                data += 4;
 
-       /* parse each byte till we reach end of sequence byte - 0x00 */
        while (1) {
                u8 operation_byte = *data++;
-               if (operation_byte >= ARRAY_SIZE(exec_elem) ||
-                   !exec_elem[operation_byte]) {
+               u8 operation_size = 0;
+
+               if (operation_byte == MIPI_SEQ_ELEM_END)
+                       break;
+
+               if (operation_byte < ARRAY_SIZE(exec_elem))
+                       mipi_elem_exec = exec_elem[operation_byte];
+               else
+                       mipi_elem_exec = NULL;
+
+               /* Size of Operation. */
+               if (dev_priv->vbt.dsi.seq_version >= 3)
+                       operation_size = *data++;
+
+               if (mipi_elem_exec) {
+                       data = mipi_elem_exec(intel_dsi, data);
+               } else if (operation_size) {
+                       /* We have size, skip. */
+                       DRM_DEBUG_KMS("Unsupported MIPI operation byte %u\n",
+                                     operation_byte);
+                       data += operation_size;
+               } else {
+                       /* No size, can't skip without parsing. */
                        DRM_ERROR("Unsupported MIPI operation byte %u\n",
                                  operation_byte);
                        return;
                }
-               mipi_elem_exec = exec_elem[operation_byte];
-
-               /* Skip Size of Operation. */
-               if (dev_priv->vbt.dsi.seq_version >= 3)
-                       data++;
-
-               /* execute the element specific rotines */
-               data = mipi_elem_exec(intel_dsi, data);
-
-               /*
-                * After processing the element, data should point to
-                * next element or end of sequence
-                * check if have we reached end of sequence
-                */
-               if (*data == 0x00)
-                       break;
        }
 }