return err;
 }
 
+static void sparx5_tc_flower_set_port_mask(struct vcap_u72_action *ports,
+                                          struct net_device *ndev)
+{
+       struct sparx5_port *port = netdev_priv(ndev);
+       int byidx = port->portno / BITS_PER_BYTE;
+       int biidx = port->portno % BITS_PER_BYTE;
+
+       ports->value[byidx] |= BIT(biidx);
+}
+
+static int sparx5_tc_action_mirred(struct vcap_admin *admin,
+                                  struct vcap_rule *vrule,
+                                  struct flow_cls_offload *fco,
+                                  struct flow_action_entry *act)
+{
+       struct vcap_u72_action ports = {0};
+       int err;
+
+       if (admin->vtype != VCAP_TYPE_IS0 && admin->vtype != VCAP_TYPE_IS2) {
+               NL_SET_ERR_MSG_MOD(fco->common.extack,
+                                  "Mirror action not supported in this VCAP");
+               return -EOPNOTSUPP;
+       }
+
+       err = vcap_rule_add_action_u32(vrule, VCAP_AF_MASK_MODE,
+                                      SPX5_PMM_OR_DSTMASK);
+       if (err)
+               return err;
+
+       sparx5_tc_flower_set_port_mask(&ports, act->dev);
+
+       return vcap_rule_add_action_u72(vrule, VCAP_AF_PORT_MASK, &ports);
+}
+
 /* Remove rule keys that may prevent templates from matching a keyset */
 static void sparx5_tc_flower_simplify_rule(struct vcap_admin *admin,
                                           struct vcap_rule *vrule,
                        if (err)
                                goto out;
                        break;
+               case FLOW_ACTION_MIRRED:
+                       err = sparx5_tc_action_mirred(admin, vrule, fco, act);
+                       if (err)
+                               goto out;
+                       break;
                case FLOW_ACTION_ACCEPT:
                        err = sparx5_tc_set_actionset(admin, vrule);
                        if (err)
 
 }
 EXPORT_SYMBOL_GPL(vcap_rule_add_action_u32);
 
+/* Add a 72 bit action field with value to the rule */
+int vcap_rule_add_action_u72(struct vcap_rule *rule,
+                            enum vcap_action_field action,
+                            struct vcap_u72_action *fieldval)
+{
+       struct vcap_client_actionfield_data data;
+
+       memcpy(&data.u72, fieldval, sizeof(data.u72));
+       return vcap_rule_add_action(rule, action, VCAP_FIELD_U72, &data);
+}
+EXPORT_SYMBOL_GPL(vcap_rule_add_action_u72);
+
 static int vcap_read_counter(struct vcap_rule_internal *ri,
                             struct vcap_counter *ctr)
 {
 
                             enum vcap_action_field action, enum vcap_bit val);
 int vcap_rule_add_action_u32(struct vcap_rule *rule,
                             enum vcap_action_field action, u32 value);
+int vcap_rule_add_action_u72(struct vcap_rule *rule, enum vcap_action_field action,
+                            struct vcap_u72_action *fieldval);
 
 /* Get number of rules in a vcap instance lookup chain id range */
 int vcap_admin_rule_count(struct vcap_admin *admin, int cid);