emit_alu(nfp_prog, imm_a(nfp_prog),
                         imm_a(nfp_prog), ALU_OP_ADD, reg_imm(size));
                emit_alu(nfp_prog, reg_none(),
-                        NFP_BPF_ABI_LEN, ALU_OP_SUB, imm_a(nfp_prog));
+                        plen_reg(nfp_prog), ALU_OP_SUB, imm_a(nfp_prog));
                wrp_br_special(nfp_prog, BR_BLO, OP_BR_GO_ABORT);
                /* Load data */
                emit_cmd(nfp_prog, CMD_TGT_READ8, CMD_MODE_32b, 0,
-                        pkt_reg(nfp_prog), imm_b(nfp_prog), sz - 1, true);
+                        pptr_reg(nfp_prog), imm_b(nfp_prog), sz - 1, true);
        } else {
                /* Check packet length */
                tmp_reg = ur_load_imm_any(nfp_prog, offset + size,
                                          imm_a(nfp_prog));
                emit_alu(nfp_prog, reg_none(),
-                        NFP_BPF_ABI_LEN, ALU_OP_SUB, tmp_reg);
+                        plen_reg(nfp_prog), ALU_OP_SUB, tmp_reg);
                wrp_br_special(nfp_prog, BR_BLO, OP_BR_GO_ABORT);
                /* Load data */
                tmp_reg = re_load_imm_any(nfp_prog, offset, imm_b(nfp_prog));
                emit_cmd(nfp_prog, CMD_TGT_READ8, CMD_MODE_32b, 0,
-                        pkt_reg(nfp_prog), tmp_reg, sz - 1, true);
+                        pptr_reg(nfp_prog), tmp_reg, sz - 1, true);
        }
 
        i = 0;
 {
        if (meta->insn.off == offsetof(struct sk_buff, len))
                emit_alu(nfp_prog, reg_both(meta->insn.dst_reg * 2),
-                        reg_none(), ALU_OP_NONE, NFP_BPF_ABI_LEN);
+                        reg_none(), ALU_OP_NONE, plen_reg(nfp_prog));
        else
                return -EOPNOTSUPP;
 
            meta->insn.off != offsetof(struct xdp_md, data_end))
                return -EOPNOTSUPP;
 
-       emit_alu(nfp_prog, dst, reg_none(), ALU_OP_NONE, NFP_BPF_ABI_PKT);
+       emit_alu(nfp_prog, dst, reg_none(), ALU_OP_NONE, pptr_reg(nfp_prog));
 
        if (meta->insn.off == offsetof(struct xdp_md, data))
                return 0;
 
-       emit_alu(nfp_prog, dst, dst, ALU_OP_ADD, NFP_BPF_ABI_LEN);
+       emit_alu(nfp_prog, dst, dst, ALU_OP_ADD, plen_reg(nfp_prog));
 
        return 0;
 }
 
 static void nfp_intro(struct nfp_prog *nfp_prog)
 {
-       emit_alu(nfp_prog, pkt_reg(nfp_prog),
-                reg_none(), ALU_OP_NONE, NFP_BPF_ABI_PKT);
+       wrp_immed(nfp_prog, plen_reg(nfp_prog), GENMASK(13, 0));
+       emit_alu(nfp_prog, plen_reg(nfp_prog),
+                plen_reg(nfp_prog), ALU_OP_AND, pv_len(nfp_prog));
 }
 
 static void nfp_outro_tc_legacy(struct nfp_prog *nfp_prog)
 
 };
 
 enum static_regs {
-       STATIC_REG_PKT          = 1,
-#define REG_PKT_BANK   ALU_DST_A
-       STATIC_REG_IMM          = 2, /* Bank AB */
+       STATIC_REG_IMM          = 21, /* Bank AB */
+       STATIC_REG_PKT_LEN      = 22, /* Bank B */
+};
+
+enum pkt_vec {
+       PKT_VEC_PKT_LEN         = 0,
+       PKT_VEC_PKT_PTR         = 2,
 };
 
 enum nfp_bpf_action_type {
        NN_ACT_XDP,
 };
 
-#define pkt_reg(np)    reg_a((np)->regs_per_thread - STATIC_REG_PKT)
-#define imm_a(np)      reg_a((np)->regs_per_thread - STATIC_REG_IMM)
-#define imm_b(np)      reg_b((np)->regs_per_thread - STATIC_REG_IMM)
-#define imm_both(np)   reg_both((np)->regs_per_thread - STATIC_REG_IMM)
+#define pv_len(np)     reg_lm(1, PKT_VEC_PKT_LEN)
+#define pv_ctm_ptr(np) reg_lm(1, PKT_VEC_PKT_PTR)
+
+#define plen_reg(np)   reg_b(STATIC_REG_PKT_LEN)
+#define pptr_reg(np)   pv_ctm_ptr(np)
+#define imm_a(np)      reg_a(STATIC_REG_IMM)
+#define imm_b(np)      reg_b(STATIC_REG_IMM)
+#define imm_both(np)   reg_both(STATIC_REG_IMM)
 
 #define NFP_BPF_ABI_FLAGS      reg_imm(0)
 #define   NFP_BPF_ABI_FLAG_MARK        1
-#define NFP_BPF_ABI_PKT                reg_nnr(2)
-#define NFP_BPF_ABI_LEN                reg_nnr(3)
 
 struct nfp_prog;
 struct nfp_insn_meta;