* @component_reg_phys: register base of component registers
  * @info: Cached DVSEC information about the device.
  * @serial: PCIe Device Serial Number
+ * @doe_mbs: PCI DOE mailbox array
  * @mbox_send: @dev specific transport for transmitting mailbox commands
  *
  * See section 8.2.9.5.2 Capacity Configuration and Label Storage for
        resource_size_t component_reg_phys;
        u64 serial;
 
+       struct xarray doe_mbs;
+
        int (*mbox_send)(struct cxl_dev_state *cxlds, struct cxl_mbox_cmd *cmd);
 };
 
 
 #include <linux/mutex.h>
 #include <linux/list.h>
 #include <linux/pci.h>
+#include <linux/pci-doe.h>
 #include <linux/io.h>
 #include "cxlmem.h"
 #include "cxlpci.h"
        return rc;
 }
 
+static void cxl_pci_destroy_doe(void *mbs)
+{
+       xa_destroy(mbs);
+}
+
+static void devm_cxl_pci_create_doe(struct cxl_dev_state *cxlds)
+{
+       struct device *dev = cxlds->dev;
+       struct pci_dev *pdev = to_pci_dev(dev);
+       u16 off = 0;
+
+       xa_init(&cxlds->doe_mbs);
+       if (devm_add_action(&pdev->dev, cxl_pci_destroy_doe, &cxlds->doe_mbs)) {
+               dev_err(dev, "Failed to create XArray for DOE's\n");
+               return;
+       }
+
+       /*
+        * Mailbox creation is best effort.  Higher layers must determine if
+        * the lack of a mailbox for their protocol is a device failure or not.
+        */
+       pci_doe_for_each_off(pdev, off) {
+               struct pci_doe_mb *doe_mb;
+
+               doe_mb = pcim_doe_create_mb(pdev, off);
+               if (IS_ERR(doe_mb)) {
+                       dev_err(dev, "Failed to create MB object for MB @ %x\n",
+                               off);
+                       continue;
+               }
+
+               if (xa_insert(&cxlds->doe_mbs, off, doe_mb, GFP_KERNEL)) {
+                       dev_err(dev, "xa_insert failed to insert MB @ %x\n",
+                               off);
+                       continue;
+               }
+
+               dev_dbg(dev, "Created DOE mailbox @%x\n", off);
+       }
+}
+
 static int cxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct cxl_register_map map;
 
        cxlds->component_reg_phys = cxl_regmap_to_base(pdev, &map);
 
+       devm_cxl_pci_create_doe(cxlds);
+
        rc = cxl_pci_setup_mailbox(cxlds);
        if (rc)
                return rc;