PV Passthrough PCI Device Hotplug Support (Linux Part)
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.
Signed-off-by Yosuke Iwamatsu <[email protected]>
drivers/xen/pciback/controller.c +5 -1
@@ -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
@@ -41,7 +41,8 @@ struct pci_dev *pciback_get_pci_dev(strureturn 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_dspin_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
@@ -70,9 +70,13 @@ int pciback_config_write(struct pci_devint 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
@@ -44,7 +44,8 @@ struct pci_dev *pciback_get_pci_dev(strureturn 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
@@ -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
@@ -35,6 +35,8 @@ void pcifront_disconnect(struct pcifrontint 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
@@ -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