diff --git a/tools/p2a.cpp b/tools/p2a.cpp
index b1f8672..5146c85 100644
--- a/tools/p2a.cpp
+++ b/tools/p2a.cpp
@@ -52,35 +52,56 @@
     PciDevice result;
     PciFilter filter;
     bool found = false;
-    pciaddr_t bar1;
+    pciaddr_t bar;
     bool returnValue = false;
     int inputFd = -1;
     ipmi_flash::PciConfigResponse pciResp;
     std::int64_t fileSize;
-    const std::uint32_t p2aLength = aspeedP2aOffset;
     std::unique_ptr<std::uint8_t[]> readBuffer;
 
-    filter.vid = aspeedVendorId;
-    filter.did = aspeedDeviceId;
+    std::uint16_t pciDeviceVID;
+    std::uint16_t pciDeviceDID;
+    std::uint32_t p2aOffset;
+    std::uint32_t p2aLength;
 
-    /* Find the ASPEED PCI device entry we want. */
-    auto output = pci->getPciDevices(filter);
-    for (const auto& d : output)
+    for (auto device : PCIDeviceList)
     {
-        std::fprintf(stderr, "[0x%x 0x%x] ", d.vid, d.did);
+        filter.vid = device.VID;
+        filter.did = device.DID;
 
-        /* Verify it's a memory-based bar -- we want bar1. */
-        bar1 = d.bars[1];
-        if ((bar1 & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO)
+        /* Find the PCI device entry we want. */
+        auto output = pci->getPciDevices(filter);
+        for (const auto& d : output)
         {
-            /* We want it to not be IO-based access. */
-            continue;
+            std::fprintf(stderr, "[0x%x 0x%x] \n", d.vid, d.did);
+
+            /* Verify it's a memory-based bar. */
+            bar = d.bars[device.bar];
+
+            if ((bar & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO)
+            {
+                /* We want it to not be IO-based access. */
+                continue;
+            }
+
+            /* For now capture the entire device even if we're only using BAR0
+             */
+            result = d;
+            found = true;
+            break;
         }
 
-        /* For now capture the entire device even if we're only using BAR1 */
-        result = d;
-        found = true;
-        break;
+        if (found)
+        {
+            std::fprintf(stderr, "Find [0x%x 0x%x] \n", device.VID, device.DID);
+            std::fprintf(stderr, "bar%u[0x%x] \n", device.bar,
+                         (unsigned int)bar);
+            pciDeviceVID = device.VID;
+            pciDeviceDID = device.DID;
+            p2aOffset = device.Offset;
+            p2aLength = device.Length;
+            break;
+        }
     }
 
     if (!found)
@@ -93,27 +114,31 @@
     /* We sent the open command before this, so the window should be open and
      * the bridge enabled on the BMC.
      */
-    std::uint32_t value;
-    if (!io->read(bar1 + aspeedP2aConfig, sizeof(value), &value))
+    if (pciDeviceVID == aspeedPciDeviceInfo.VID &&
+        pciDeviceDID == aspeedPciDeviceInfo.DID)
     {
-        std::fprintf(stderr, "PCI config read failed\n");
-        return false;
-    }
-
-    if (0 == (value & p2ABridgeEnabled))
-    {
-        std::fprintf(stderr, "Bridge not enabled - Enabling from host\n");
-
-        value |= p2ABridgeEnabled;
-        if (!io->write(bar1 + aspeedP2aConfig, sizeof(value), &value))
+        std::uint32_t value;
+        if (!io->read(bar + aspeedP2aConfig, sizeof(value), &value))
         {
-            std::fprintf(stderr, "PCI config write failed\n");
+            std::fprintf(stderr, "PCI config read failed\n");
             return false;
         }
-    }
 
-    /* From this point down we need to disable the bridge. */
-    std::fprintf(stderr, "The bridge is enabled!\n");
+        if (0 == (value & p2ABridgeEnabled))
+        {
+            std::fprintf(stderr, "Bridge not enabled - Enabling from host\n");
+
+            value |= p2ABridgeEnabled;
+            if (!io->write(bar + aspeedP2aConfig, sizeof(value), &value))
+            {
+                std::fprintf(stderr, "PCI config write failed\n");
+                return false;
+            }
+        }
+
+        /* From this point down we need to disable the bridge. */
+        std::fprintf(stderr, "The bridge is enabled!\n");
+    }
 
     /* Read the configuration via blobs metadata (stat). */
     ipmiblob::StatResponse stat = blob->getStat(session);
@@ -127,13 +152,17 @@
     std::memcpy(&pciResp, stat.metadata.data(), sizeof(pciResp));
     std::fprintf(stderr, "Received address: 0x%x\n", pciResp.address);
 
-    /* Configure the mmio to point there. */
-    if (!io->write(bar1 + aspeedP2aBridge, sizeof(pciResp.address),
-                   &pciResp.address))
+    if (pciDeviceVID == aspeedPciDeviceInfo.VID &&
+        pciDeviceDID == aspeedPciDeviceInfo.DID)
     {
-        // Failed to set it up, so fall back.
-        std::fprintf(stderr, "Failed to update the bridge address\n");
-        goto exit;
+        /* Configure the mmio to point there. */
+        if (!io->write(bar + aspeedP2aBridge, sizeof(pciResp.address),
+                       &pciResp.address))
+        {
+            // Failed to set it up, so fall back.
+            std::fprintf(stderr, "Failed to update the bridge address\n");
+            goto exit;
+        }
     }
 
     /* For data blocks in 64kb, stage data, and send blob write command. */
@@ -170,19 +199,18 @@
             bytesRead = sys->read(inputFd, readBuffer.get(), p2aLength);
             if (bytesRead > 0)
             {
-                /* TODO: Will likely need to store an rv somewhere to know
-                 * when we're exiting from failure.
+                /* TODO: Will likely need to store an rv somewhere to know when
+                 * we're exiting from failure.
                  */
-                if (!io->write(bar1 + aspeedP2aOffset, bytesRead,
-                               readBuffer.get()))
+                if (!io->write(bar + p2aOffset, bytesRead, readBuffer.get()))
                 {
                     std::fprintf(stderr,
                                  "Failed to write to region in memory!\n");
                     goto exit;
                 }
 
-                /* Ok, so the data is staged, now send the blob write with
-                 * the details.
+                /* Ok, so the data is staged, now send the blob write with the
+                 * details.
                  */
                 struct ipmi_flash::ExtChunkHdr chunk;
                 chunk.length = bytesRead;
@@ -205,8 +233,12 @@
     returnValue = true;
 
 exit:
-    /* disable PCI bridge. */
-    disablePciBridge(io, bar1);
+    /* disable ASPEED PCI bridge. */
+    if (pciDeviceVID == aspeedPciDeviceInfo.VID &&
+        pciDeviceDID == aspeedPciDeviceInfo.DID)
+    {
+        disablePciBridge(io, bar);
+    }
 
     /* close input file. */
     if (inputFd != -1)
