[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH RFC 11/13] pci: introduce a new event on PCI device detection



Add a new event that will fire each time a PCI device is added to the
system, and allows us to register the device with Xen.
---
 sys/dev/pci/pci.c       |    1 +
 sys/sys/eventhandler.h  |    5 +++++
 sys/x86/xen/pv.c        |   21 +++++++++++++++++++++
 sys/x86/xen/xen_nexus.c |    6 ++++++
 sys/xen/pv.h            |    1 +
 5 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 4d8837f..2ee5093 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -3293,6 +3293,7 @@ pci_add_child(device_t bus, struct pci_devinfo *dinfo)
        resource_list_init(&dinfo->resources);
        pci_cfg_save(dinfo->cfg.dev, dinfo, 0);
        pci_cfg_restore(dinfo->cfg.dev, dinfo);
+       EVENTHANDLER_INVOKE(pci_add, dinfo);
        pci_print_verbose(dinfo);
        pci_add_resources(bus, dinfo->cfg.dev, 0, 0);
 }
diff --git a/sys/sys/eventhandler.h b/sys/sys/eventhandler.h
index 111c21b..3201848 100644
--- a/sys/sys/eventhandler.h
+++ b/sys/sys/eventhandler.h
@@ -269,5 +269,10 @@ typedef void (*unregister_framebuffer_fn)(void *, struct 
fb_info *);
 EVENTHANDLER_DECLARE(register_framebuffer, register_framebuffer_fn);
 EVENTHANDLER_DECLARE(unregister_framebuffer, unregister_framebuffer_fn);
 
+/* PCI events */
+struct pci_devinfo;
+typedef void (*pci_add_fn)(void *, struct pci_devinfo *);
+EVENTHANDLER_DECLARE(pci_add, pci_add_fn);
+
 #endif /* _SYS_EVENTHANDLER_H_ */
 
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index e5ad200..a44f8ca 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -39,6 +39,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/rwlock.h>
 #include <sys/mutex.h>
 #include <sys/smp.h>
+#include <sys/reboot.h>
+#include <sys/pciio.h>
+#include <sys/eventhandler.h>
 
 #include <vm/vm.h>
 #include <vm/vm_extern.h>
@@ -63,6 +66,8 @@ __FBSDID("$FreeBSD$");
 
 #include <xen/interface/vcpu.h>
 
+#include <dev/pci/pcivar.h>
+
 /* Native initial function */
 extern u_int64_t hammer_time(u_int64_t, u_int64_t);
 /* Xen initial function */
@@ -384,6 +389,22 @@ xen_pv_ioapic_register_intr(struct ioapic_intsrc *pin)
        xen_register_pirq(pin->io_irq, pin->io_activehi, pin->io_edgetrigger);
 }
 
+void
+xen_pv_pci_device_add(void *arg, struct pci_devinfo *dinfo)
+{
+       struct physdev_pci_device_add add_pci;
+       int error;
+
+       bzero(&add_pci, sizeof(add_pci));
+       add_pci.seg = dinfo->cfg.domain;
+       add_pci.bus = dinfo->cfg.bus;
+       add_pci.devfn = (dinfo->cfg.slot << 3) | dinfo->cfg.func;
+       error = HYPERVISOR_physdev_op(PHYSDEVOP_pci_device_add, &add_pci);
+       if (error)
+               printf("unable to add device bus %u devfn %u error: %d\n",
+                      add_pci.bus, add_pci.devfn, error);
+}
+
 static void
 xen_pv_set_init_ops(void)
 {
diff --git a/sys/x86/xen/xen_nexus.c b/sys/x86/xen/xen_nexus.c
index 823b3bc..60c6c5d 100644
--- a/sys/x86/xen/xen_nexus.c
+++ b/sys/x86/xen/xen_nexus.c
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/sysctl.h>
 #include <sys/systm.h>
 #include <sys/smp.h>
+#include <sys/eventhandler.h>
 
 #include <contrib/dev/acpica/include/acpi.h>
 
@@ -42,6 +43,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/nexusvar.h>
 
 #include <xen/xen-os.h>
+#include <xen/pv.h>
 
 static const char *xen_devices[] =
 {
@@ -87,6 +89,10 @@ nexus_xen_attach(device_t dev)
                /* Disable some ACPI devices that are not usable by Dom0 */
                setenv("debug.acpi.disabled", "cpu hpet timer");
 
+               /* Register PCI add hook */
+               EVENTHANDLER_REGISTER(pci_add, xen_pv_pci_device_add, NULL,
+                                     EVENTHANDLER_PRI_FIRST);
+
                acpi_dev = BUS_ADD_CHILD(dev, 10, "acpi", 0);
                if (acpi_dev == NULL)
                        panic("Unable to add ACPI bus to Xen Dom0");
diff --git a/sys/xen/pv.h b/sys/xen/pv.h
index a9d6eb0..ac737a7 100644
--- a/sys/xen/pv.h
+++ b/sys/xen/pv.h
@@ -24,5 +24,6 @@
 #define        __XEN_PV_H__
 
 int    xen_pv_start_all_aps(void);
+void   xen_pv_pci_device_add(void *, struct pci_devinfo *);
 
 #endif /* __XEN_PV_H__ */
-- 
1.7.7.5 (Apple Git-26)


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.