+ return (a1 >= (uint32_t)FILTER_DPDK_1);
+}
+
+int vnic_dev_flowman_cmd(struct vnic_dev *vdev, uint64_t *args, int nargs)
+{
+ int wait = 1000;
+
+ return vnic_dev_cmd_args(vdev, CMD_FLOW_MANAGER_OP, args, nargs, wait);
+}
+
+static int vnic_dev_flowman_enable(struct vnic_dev *vdev, uint32_t *mode,
+ uint8_t *filter_actions)
+{
+ char name[RTE_MEMZONE_NAMESIZE];
+ uint64_t args[3];
+ uint64_t ops;
+ static uint32_t instance;
+
+ /* flowman devcmd available? */
+ if (!vnic_dev_capable(vdev, CMD_FLOW_MANAGER_OP))
+ return 0;
+ /* Have the version we are using? */
+ args[0] = FM_API_VERSION_QUERY;
+ if (vnic_dev_flowman_cmd(vdev, args, 1))
+ return 0;
+ if ((args[0] & (1ULL << FM_VERSION)) == 0)
+ return 0;
+ /* Select the version */
+ args[0] = FM_API_VERSION_SELECT;
+ args[1] = FM_VERSION;
+ if (vnic_dev_flowman_cmd(vdev, args, 2))
+ return 0;
+ /* Can we get fm_info? */
+ if (!vdev->flowman_info) {
+ snprintf((char *)name, sizeof(name), "vnic_fm_info-%u",
+ instance++);
+ vdev->flowman_info = vdev->alloc_consistent(vdev->priv,
+ sizeof(struct fm_info),
+ &vdev->flowman_info_pa, (uint8_t *)name);
+ if (!vdev->flowman_info)
+ return 0;
+ }
+ args[0] = FM_INFO_QUERY;
+ args[1] = vdev->flowman_info_pa;
+ args[2] = sizeof(struct fm_info);
+ if (vnic_dev_flowman_cmd(vdev, args, 3))
+ return 0;
+ /* Have required operations? */
+ ops = (1ULL << FMOP_END) |
+ (1ULL << FMOP_DROP) |
+ (1ULL << FMOP_RQ_STEER) |
+ (1ULL << FMOP_EXACT_MATCH) |
+ (1ULL << FMOP_MARK) |
+ (1ULL << FMOP_TAG) |
+ (1ULL << FMOP_EG_HAIRPIN) |
+ (1ULL << FMOP_ENCAP) |
+ (1ULL << FMOP_DECAP_NOSTRIP);
+ if ((vdev->flowman_info->fm_op_mask & ops) != ops)
+ return 0;
+ /* Good to use flowman now */
+ *mode = FILTER_FLOWMAN;
+ *filter_actions = FILTER_ACTION_RQ_STEERING_FLAG |
+ FILTER_ACTION_FILTER_ID_FLAG |
+ FILTER_ACTION_COUNTER_FLAG |
+ FILTER_ACTION_DROP_FLAG;
+ return 1;