return bnxt_hwrm_reserve_vf_rings(bp, tx, rx, grp, cp, vnic);
 }
 
+static int bnxt_cp_rings_in_use(struct bnxt *bp)
+{
+       int cp = bp->cp_nr_rings;
+       int ulp_msix, ulp_base;
+
+       ulp_msix = bnxt_get_ulp_msix_num(bp);
+       if (ulp_msix) {
+               ulp_base = bnxt_get_ulp_msix_base(bp);
+               cp += ulp_msix;
+               if ((ulp_base + ulp_msix) > cp)
+                       cp = ulp_base + ulp_msix;
+       }
+       return cp;
+}
+
 static int bnxt_trim_rings(struct bnxt *bp, int *rx, int *tx, int max,
                           bool shared);
 
        bp->hw_resc.max_irqs = max_irqs;
 }
 
+static int bnxt_get_num_msix(struct bnxt *bp)
+{
+       if (!(bp->flags & BNXT_FLAG_NEW_RM))
+               return bnxt_get_max_func_irqs(bp);
+
+       return bnxt_cp_rings_in_use(bp);
+}
+
 static int bnxt_init_msix(struct bnxt *bp)
 {
-       int i, total_vecs, rc = 0, min = 1;
+       int i, total_vecs, max, rc = 0, min = 1;
        struct msix_entry *msix_ent;
 
-       total_vecs = bnxt_get_max_func_irqs(bp);
+       total_vecs = bnxt_get_num_msix(bp);
+       max = bnxt_get_max_func_irqs(bp);
+       if (total_vecs > max)
+               total_vecs = max;
+
        msix_ent = kcalloc(total_vecs, sizeof(struct msix_entry), GFP_KERNEL);
        if (!msix_ent)
                return -ENOMEM;
 
        if (!(bp->flags & BNXT_FLAG_USING_MSIX))
                return -ENODEV;
 
+       if (edev->ulp_tbl[ulp_id].msix_requested)
+               return -EAGAIN;
+
        max_cp_rings = bnxt_get_max_func_cp_rings(bp);
        max_idx = min_t(int, bp->total_irqs, max_cp_rings);
        avail_msix = max_idx - bp->cp_nr_rings;
        if (avail_msix > num_msix)
                avail_msix = num_msix;
 
-       idx = max_idx - avail_msix;
+       if (bp->flags & BNXT_FLAG_NEW_RM)
+               idx = bp->cp_nr_rings;
+       else
+               idx = max_idx - avail_msix;
+       edev->ulp_tbl[ulp_id].msix_base = idx;
        for (i = 0; i < avail_msix; i++) {
                ent[i].vector = bp->irq_tbl[idx + i].vector;
                ent[i].ring_idx = idx + i;
        return 0;
 }
 
+int bnxt_get_ulp_msix_num(struct bnxt *bp)
+{
+       if (bnxt_ulp_registered(bp->edev, BNXT_ROCE_ULP)) {
+               struct bnxt_en_dev *edev = bp->edev;
+
+               return edev->ulp_tbl[BNXT_ROCE_ULP].msix_requested;
+       }
+       return 0;
+}
+
+int bnxt_get_ulp_msix_base(struct bnxt *bp)
+{
+       if (bnxt_ulp_registered(bp->edev, BNXT_ROCE_ULP)) {
+               struct bnxt_en_dev *edev = bp->edev;
+
+               if (edev->ulp_tbl[BNXT_ROCE_ULP].msix_requested)
+                       return edev->ulp_tbl[BNXT_ROCE_ULP].msix_base;
+       }
+       return 0;
+}
+
 void bnxt_subtract_ulp_resources(struct bnxt *bp, int ulp_id)
 {
        ASSERT_RTNL();
 
        unsigned long   *async_events_bmap;
        u16             max_async_event_id;
        u16             msix_requested;
+       u16             msix_base;
        atomic_t        ref_count;
 };
 
        return false;
 }
 
+int bnxt_get_ulp_msix_num(struct bnxt *bp);
+int bnxt_get_ulp_msix_base(struct bnxt *bp);
 void bnxt_subtract_ulp_resources(struct bnxt *bp, int ulp_id);
 void bnxt_ulp_stop(struct bnxt *bp);
 void bnxt_ulp_start(struct bnxt *bp);