Author: mav
Date: Mon Jun 14 07:10:37 2010
New Revision: 209154
URL: http://svn.freebsd.org/changeset/base/209154

Log:
  Virtualize pci_remap_msi_irq() call from general MSI code. It allows MSI
  (FSB interrupts) to be used by non-PCI devices, such as HPET.

Modified:
  head/sys/dev/pci/pci.c
  head/sys/dev/pci/pcivar.h
  head/sys/kern/bus_if.m
  head/sys/x86/x86/msi.c

Modified: head/sys/dev/pci/pci.c
==============================================================================
--- head/sys/dev/pci/pci.c      Mon Jun 14 06:23:47 2010        (r209153)
+++ head/sys/dev/pci/pci.c      Mon Jun 14 07:10:37 2010        (r209154)
@@ -118,6 +118,8 @@ static void         pci_unmask_msix(device_t de
 static int             pci_msi_blacklisted(void);
 static void            pci_resume_msi(device_t dev);
 static void            pci_resume_msix(device_t dev);
+static int             pci_remap_intr_method(device_t bus, device_t dev,
+                           u_int irq);
 
 static device_method_t pci_methods[] = {
        /* Device interface */
@@ -147,6 +149,7 @@ static device_method_t pci_methods[] = {
        DEVMETHOD(bus_deactivate_resource, pci_deactivate_resource),
        DEVMETHOD(bus_child_pnpinfo_str, pci_child_pnpinfo_str_method),
        DEVMETHOD(bus_child_location_str, pci_child_location_str_method),
+       DEVMETHOD(bus_remap_intr,       pci_remap_intr_method),
 
        /* PCI interface */
        DEVMETHOD(pci_read_config,      pci_read_config_method),
@@ -1736,21 +1739,18 @@ pci_resume_msi(device_t dev)
            2);
 }
 
-int
-pci_remap_msi_irq(device_t dev, u_int irq)
+static int
+pci_remap_intr_method(device_t bus, device_t dev, u_int irq)
 {
        struct pci_devinfo *dinfo = device_get_ivars(dev);
        pcicfgregs *cfg = &dinfo->cfg;
        struct resource_list_entry *rle;
        struct msix_table_entry *mte;
        struct msix_vector *mv;
-       device_t bus;
        uint64_t addr;
        uint32_t data;  
        int error, i, j;
 
-       bus = device_get_parent(dev);
-
        /*
         * Handle MSI first.  We try to find this IRQ among our list
         * of MSI IRQs.  If we find it, we request updated address and

Modified: head/sys/dev/pci/pcivar.h
==============================================================================
--- head/sys/dev/pci/pcivar.h   Mon Jun 14 06:23:47 2010        (r209153)
+++ head/sys/dev/pci/pcivar.h   Mon Jun 14 07:10:37 2010        (r209154)
@@ -445,12 +445,6 @@ device_t pci_find_bsf(uint8_t, uint8_t, 
 device_t pci_find_dbsf(uint32_t, uint8_t, uint8_t, uint8_t);
 device_t pci_find_device(uint16_t, uint16_t);
 
-/*
- * Can be used by MD code to request the PCI bus to re-map an MSI or
- * MSI-X message.
- */
-int    pci_remap_msi_irq(device_t dev, u_int irq);
-
 /* Can be used by drivers to manage the MSI-X table. */
 int    pci_pending_msix(device_t dev, u_int index);
 

Modified: head/sys/kern/bus_if.m
==============================================================================
--- head/sys/kern/bus_if.m      Mon Jun 14 06:23:47 2010        (r209153)
+++ head/sys/kern/bus_if.m      Mon Jun 14 07:10:37 2010        (r209154)
@@ -47,6 +47,15 @@ CODE {
        {
            return (0);
        }
+
+       static int
+       null_remap_intr(device_t bus, device_t dev, u_int irq)
+       {
+
+               if (dev != NULL)
+                       return (BUS_REMAP_INTR(dev, NULL, irq));
+               return (ENXIO);
+       }
 };
 
 /**
@@ -600,3 +609,16 @@ METHOD void hint_device_unit {
 METHOD void new_pass {
        device_t        _dev;
 } DEFAULT bus_generic_new_pass;
+
+/**
+ * @brief Notify a bus that specified child's IRQ should be remapped.
+ *
+ * @param _dev         the bus device
+ * @param _child       the child device
+ * @param _irq         the irq number
+ */
+METHOD int remap_intr {
+       device_t        _dev;
+       device_t        _child;
+       u_int           _irq;
+} DEFAULT null_remap_intr;

Modified: head/sys/x86/x86/msi.c
==============================================================================
--- head/sys/x86/x86/msi.c      Mon Jun 14 06:23:47 2010        (r209153)
+++ head/sys/x86/x86/msi.c      Mon Jun 14 07:10:37 2010        (r209154)
@@ -247,7 +247,8 @@ msi_assign_cpu(struct intsrc *isrc, u_in
                    "msi: Assigning MSI IRQ %d to local APIC %u vector %u\n",
                            sib->msi_irq, sib->msi_cpu, sib->msi_vector);
        }
-       pci_remap_msi_irq(msi->msi_dev, msi->msi_irq);
+       BUS_REMAP_INTR(device_get_parent(msi->msi_dev), msi->msi_dev,
+           msi->msi_irq);
 
        /*
         * Free the old vector after the new one is established.  This is done
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to