resource_size_t start, end;
        int ret = 0;
 
-       if (res->flags & IORESOURCE_IO)
-               root = &ioport_resource;
-       else
-               root = &iomem_resource;
-
        start = res->start;
        end = res->end;
        res->start = dev->fw_addr[resno];
        res->end = res->start + size - 1;
+
+       root = pci_find_parent_resource(dev, res);
+       if (!root) {
+               if (res->flags & IORESOURCE_IO)
+                       root = &ioport_resource;
+               else
+                       root = &iomem_resource;
+       }
+
        dev_info(&dev->dev, "BAR %d: trying firmware assignment %pR\n",
                 resno, res);
        conflict = request_resource_conflict(root, res);