Skip to contentSkip to conversation

PV Passthrough PCI Device Hotplug Support (Linux Part)

RFC PATCH In review Yosuke Iwamatsu 1 participant 1 message Feb 21, 2008 Xen hypervisor interface

lore
Share & tools
lore
#0 lore raw

RFC PATCH 2/3 PV Passthrough PCI Device Hotplug Support (Linux Part)

Linux part of PV PCI hotplug, applied to linux-2.6.18-xen.hg cs417.

Thanks,
-------------------
Yosuke Iwamatsu
NEC Corporation

Linux part of PV PCI hotplug, applied to linux-2.6.18-xen.hg cs417.

drivers/xen/pciback/controller.c +5 -1
diff -r f76e90b4f7ad drivers/xen/pciback/controller.c
@@ -91,7 +91,8 @@ found:
 	return dev;
 }
 
-int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
+int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev,
+			int devid, publish_pci_dev_cb publish_cb)
 {
 	struct controller_dev_data *dev_data = pdev->pci_dev_data;
 	struct controller_dev_entry *dev_entry;
@@ -165,6 +166,9 @@ int pciback_add_pci_dev(struct pciback_d
 
 out:
 	spin_unlock_irqrestore(&dev_data->lock, flags);
+
+	/* TODO: Publish virtual domain:bus:slot.func here. */
+
 	return ret;
 }
 
drivers/xen/pciback/passthrough.c +4 -1
diff -r f76e90b4f7ad drivers/xen/pciback/passthrough.c
@@ -41,7 +41,8 @@ struct pci_dev *pciback_get_pci_dev(stru
 	return dev;
 }
 
-int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
+int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev,
+			int devid, publish_pci_dev_cb publish_cb)
 {
 	struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
 	struct pci_dev_entry *dev_entry;
@@ -55,6 +56,8 @@ int pciback_add_pci_dev(struct pciback_d
 	spin_lock_irqsave(&dev_data->lock, flags);
 	list_add_tail(&dev_entry->list, &dev_data->dev_list);
 	spin_unlock_irqrestore(&dev_data->lock, flags);
+
+	/* TODO: Publish virtual domain:bus:slot.func here. */
 
 	return 0;
 }
drivers/xen/pciback/pciback.h +5 -1
diff -r f76e90b4f7ad drivers/xen/pciback/pciback.h
@@ -70,9 +70,13 @@ int pciback_config_write(struct pci_dev 
 int pciback_config_write(struct pci_dev *dev, int offset, int size, u32 value);
 
 /* Handle requests for specific devices from the frontend */
+typedef int (*publish_pci_dev_cb) (struct pciback_device *pdev,
+				   unsigned int domain, unsigned int bus,
+				   unsigned int devfn, unsigned int devid);
 typedef int (*publish_pci_root_cb) (struct pciback_device * pdev,
 				    unsigned int domain, unsigned int bus);
-int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev);
+int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev,
+			int devid, publish_pci_dev_cb publish_cb);
 void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev);
 struct pci_dev *pciback_get_pci_dev(struct pciback_device *pdev,
 				    unsigned int domain, unsigned int bus,
drivers/xen/pciback/slot.c +7 -1
diff -r f76e90b4f7ad drivers/xen/pciback/slot.c
@@ -44,7 +44,8 @@ struct pci_dev *pciback_get_pci_dev(stru
 	return dev;
 }
 
-int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
+int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev,
+			int devid, publish_pci_dev_cb publish_cb)
 {
 	int err = 0, slot, bus;
 	struct slot_dev_data *slot_dev = pdev->pci_dev_data;
@@ -77,6 +78,11 @@ int pciback_add_pci_dev(struct pciback_d
 
       unlock:
 	spin_unlock_irqrestore(&slot_dev->lock, flags);
+
+	/* Publish this device. */
+	if(!err)
+		err = publish_cb(pdev, 0, 0, PCI_DEVFN(slot, 0), devid);
+
       out:
 	return err;
 }
drivers/xen/pciback/vpci.c +11 -3
diff -r f76e90b4f7ad drivers/xen/pciback/vpci.c
@@ -62,9 +62,10 @@ static inline int match_slot(struct pci_
 	return 0;
 }
 
-int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
-{
-	int err = 0, slot;
+int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev,
+			int devid, publish_pci_dev_cb publish_cb)
+{
+	int err = 0, slot, func;
 	struct pci_dev_entry *t, *dev_entry;
 	struct vpci_dev_data *vpci_dev = pdev->pci_dev_data;
 	unsigned long flags;
@@ -101,6 +102,7 @@ int pciback_add_pci_dev(struct pciback_d
 					PCI_FUNC(dev->devfn));
 				list_add_tail(&dev_entry->list,
 					      &vpci_dev->dev_list[slot]);
+				func = PCI_FUNC(dev->devfn);
 				goto unlock;
 			}
 		}
@@ -114,6 +116,7 @@ int pciback_add_pci_dev(struct pciback_d
 			       pci_name(dev), slot);
 			list_add_tail(&dev_entry->list,
 				      &vpci_dev->dev_list[slot]);
+			func = PCI_FUNC(dev->devfn);
 			goto unlock;
 		}
 	}
@@ -124,6 +127,11 @@ int pciback_add_pci_dev(struct pciback_d
 
       unlock:
 	spin_unlock_irqrestore(&vpci_dev->lock, flags);
+
+	/* Publish this device. */
+	if(!err)
+		err = publish_cb(pdev, 0, 0, PCI_DEVFN(slot, func), devid);
+
       out:
 	return err;
 }
drivers/xen/pciback/xenbus.c +303 -77

426 lines not on this page · raw message

drivers/xen/pcifront/pci_op.c +52 -0

58 lines not on this page · raw message

drivers/xen/pcifront/pcifront.h +2 -0
diff -r f76e90b4f7ad drivers/xen/pcifront/pcifront.h
@@ -35,6 +35,8 @@ void pcifront_disconnect(struct pcifront
 
 int pcifront_scan_root(struct pcifront_device *pdev,
 		       unsigned int domain, unsigned int bus);
+int pcifront_rescan_root(struct pcifront_device *pdev,
+			 unsigned int domain, unsigned int bus);
 void pcifront_free_roots(struct pcifront_device *pdev);
 
 #endif	/* __XEN_PCIFRONT_H__ */
drivers/xen/pcifront/xenbus.c +154 -0

166 lines not on this page · raw message

include/xen/interface/io/xenbus.h +8 -1
diff -r f76e90b4f7ad include/xen/interface/io/xenbus.h
@@ -56,7 +56,14 @@ enum xenbus_state {
      */
     XenbusStateClosing       = 5,
 
-    XenbusStateClosed        = 6
+    XenbusStateClosed        = 6,
+
+    /*
+     * Reconfiguring: The device is being reconfigured.
+     */
+    XenbusStateReconfiguring = 7,
+
+    XenbusStateReconfigured  = 8
 };
 typedef enum xenbus_state XenbusState;
 

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel