drm/i915/gvt: Utility for valid command length check
authorGao, Fred <fred.gao@intel.com>
Thu, 18 Jul 2019 01:39:01 +0000 (09:39 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Tue, 13 Aug 2019 09:55:06 +0000 (17:55 +0800)
Add utility for valid command length check.

v2: Add F_VAL_CONST flag to identify the value is const
    although LEN maybe variable. (Zhenyu)
v3: unused code removal, flag rename/conflict. (Zhenyu)
v4: redefine F_IP_ADVANCE_CUSTOM and move the check function to
    next patch. (Zhenyu)

Reviewed-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Signed-off-by: Gao, Fred <fred.gao@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
drivers/gpu/drm/i915/gvt/cmd_parser.c

index 6ea88270c818ff62680e56f95cfef8a3c3c1f1f3..5f00e5d049296016f27ecbc558d3a4ad98ca0663 100644 (file)
@@ -378,17 +378,17 @@ struct cmd_info {
        const char *name;
        u32 opcode;
 
-#define F_LEN_MASK     (1U<<0)
+#define F_LEN_MASK     3U
 #define F_LEN_CONST  1U
 #define F_LEN_VAR    0U
+/* value is const although LEN maybe variable */
+#define F_LEN_VAR_FIXED    (1<<1)
 
 /*
  * command has its own ip advance logic
  * e.g. MI_BATCH_START, MI_BATCH_END
  */
-#define F_IP_ADVANCE_CUSTOM (1<<1)
-
-#define F_POST_HANDLE  (1<<2)
+#define F_IP_ADVANCE_CUSTOM (1<<2)
        u32 flag;
 
 #define R_RCS  BIT(RCS0)
@@ -418,9 +418,12 @@ struct cmd_info {
         * flag == F_LEN_VAR : length bias bits
         * Note: length is in DWord
         */
-       u8 len;
+       u32 len;
 
        parser_cmd_handler handler;
+
+       /* valid length in DWord */
+       u32 valid_len;
 };
 
 struct cmd_entry {
@@ -1912,7 +1915,7 @@ static const struct cmd_info cmd_info[] = {
        {"MI_RS_CONTEXT", OP_MI_RS_CONTEXT, F_LEN_CONST, R_RCS, D_ALL, 0, 1,
                NULL},
 
-       {"MI_DISPLAY_FLIP", OP_MI_DISPLAY_FLIP, F_LEN_VAR | F_POST_HANDLE,
+       {"MI_DISPLAY_FLIP", OP_MI_DISPLAY_FLIP, F_LEN_VAR,
                R_RCS | R_BCS, D_ALL, 0, 8, cmd_handler_mi_display_flip},
 
        {"MI_SEMAPHORE_MBOX", OP_MI_SEMAPHORE_MBOX, F_LEN_VAR, R_ALL, D_ALL,