return 0;
 }
 
+static int config_rsvd_lut_win(struct switchtec_ntb *sndev,
+                              struct ntb_ctrl_regs __iomem *ctl,
+                              int lut_idx, int partition,
+                              dma_addr_t addr)
+{
+       int peer_bar = sndev->peer_direct_mw_to_bar[0];
+       u32 ctl_val;
+       int rc;
+
+       rc = switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_LOCK,
+                                  NTB_CTRL_PART_STATUS_LOCKED);
+       if (rc)
+               return rc;
+
+       ctl_val = ioread32(&ctl->bar_entry[peer_bar].ctl);
+       ctl_val &= 0xFF;
+       ctl_val |= NTB_CTRL_BAR_LUT_WIN_EN;
+       ctl_val |= ilog2(LUT_SIZE) << 8;
+       ctl_val |= (sndev->nr_lut_mw - 1) << 14;
+       iowrite32(ctl_val, &ctl->bar_entry[peer_bar].ctl);
+
+       iowrite64((NTB_CTRL_LUT_EN | (partition << 1) | addr),
+                 &ctl->lut_entry[lut_idx]);
+
+       rc = switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_CFG,
+                                  NTB_CTRL_PART_STATUS_NORMAL);
+       if (rc) {
+               u32 bar_error, lut_error;
+
+               bar_error = ioread32(&ctl->bar_error);
+               lut_error = ioread32(&ctl->lut_error);
+               dev_err(&sndev->stdev->dev,
+                       "Error setting up reserved lut window: %08x / %08x\n",
+                       bar_error, lut_error);
+               return rc;
+       }
+
+       return 0;
+}
+
 static int map_bars(int *map, struct ntb_ctrl_regs __iomem *ctrl)
 {
        int i;
 
 static int switchtec_ntb_init_shared_mw(struct switchtec_ntb *sndev)
 {
-       struct ntb_ctrl_regs __iomem *ctl = sndev->mmio_peer_ctrl;
        int self_bar = sndev->direct_mw_to_bar[0];
-       int peer_bar = sndev->peer_direct_mw_to_bar[0];
-       u32 ctl_val;
        int rc;
 
        sndev->nr_rsvd_luts++;
 
        switchtec_ntb_init_shared(sndev);
 
-       rc = switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_LOCK,
-                                  NTB_CTRL_PART_STATUS_LOCKED);
+       rc = config_rsvd_lut_win(sndev, sndev->mmio_peer_ctrl, 0,
+                                sndev->self_partition,
+                                sndev->self_shared_dma);
        if (rc)
                goto unalloc_and_exit;
 
-       ctl_val = ioread32(&ctl->bar_entry[peer_bar].ctl);
-       ctl_val &= 0xFF;
-       ctl_val |= NTB_CTRL_BAR_LUT_WIN_EN;
-       ctl_val |= ilog2(LUT_SIZE) << 8;
-       ctl_val |= (sndev->nr_lut_mw - 1) << 14;
-       iowrite32(ctl_val, &ctl->bar_entry[peer_bar].ctl);
-
-       iowrite64((NTB_CTRL_LUT_EN | (sndev->self_partition << 1) |
-                  sndev->self_shared_dma),
-                 &ctl->lut_entry[0]);
-
-       rc = switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_CFG,
-                                  NTB_CTRL_PART_STATUS_NORMAL);
-       if (rc) {
-               u32 bar_error, lut_error;
-
-               bar_error = ioread32(&ctl->bar_error);
-               lut_error = ioread32(&ctl->lut_error);
-               dev_err(&sndev->stdev->dev,
-                       "Error setting up shared MW: %08x / %08x\n",
-                       bar_error, lut_error);
-               goto unalloc_and_exit;
-       }
-
        sndev->peer_shared = pci_iomap(sndev->stdev->pdev, self_bar, LUT_SIZE);
        if (!sndev->peer_shared) {
                rc = -ENOMEM;