- case MLX5_APPLICATION:
- if (id > 4)
- return rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM,
- NULL, "invalid tag id");
- return id2reg[id];
+ case MLX5_METADATA_RX:
+ switch (config->dv_xmeta_en) {
+ case MLX5_XMETA_MODE_LEGACY:
+ return REG_B;
+ case MLX5_XMETA_MODE_META16:
+ return REG_C_0;
+ case MLX5_XMETA_MODE_META32:
+ return REG_C_1;
+ }
+ break;
+ case MLX5_METADATA_TX:
+ return REG_A;
+ case MLX5_METADATA_FDB:
+ return REG_C_0;
+ case MLX5_FLOW_MARK:
+ switch (config->dv_xmeta_en) {
+ case MLX5_XMETA_MODE_LEGACY:
+ return REG_NONE;
+ case MLX5_XMETA_MODE_META16:
+ return REG_C_1;
+ case MLX5_XMETA_MODE_META32:
+ return REG_C_0;
+ }
+ break;
+ case MLX5_COPY_MARK:
+ return REG_C_3;
+ case MLX5_APP_TAG:
+ /*
+ * Suppose engaging reg_c_2 .. reg_c_7 registers.
+ * reg_c_2 is reserved for coloring by meters.
+ * reg_c_3 is reserved for split flows TAG.
+ */
+ if (id > (REG_C_7 - REG_C_4))
+ return rte_flow_error_set
+ (error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+ NULL, "invalid tag id");
+ if (config->flow_mreg_c[id + REG_C_4 - REG_C_0] == REG_NONE)
+ return rte_flow_error_set
+ (error, ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+ NULL, "unsupported tag id");
+ return config->flow_mreg_c[id + REG_C_4 - REG_C_0];