Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 2 May 2007 17:50:36 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   cvs commit: src/sys/amd64/amd64 mptable_pci.c msi.c nexus.c src/sys/amd64/include intr_machdep.h src/sys/amd64/pci pci_bus.c src/sys/dev/acpica acpi_pcib_acpi.c acpi_pcib_pci.c src/sys/dev/pci pci.c pci_if.m pci_pci.c pci_private.h pcib_if.m ...
Message-ID:  <200705021750.l42HoaMj067787@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
jhb         2007-05-02 17:50:36 UTC

  FreeBSD src repository

  Modified files:
    sys/amd64/amd64      mptable_pci.c msi.c nexus.c 
    sys/amd64/include    intr_machdep.h 
    sys/amd64/pci        pci_bus.c 
    sys/dev/acpica       acpi_pcib_acpi.c acpi_pcib_pci.c 
    sys/dev/pci          pci.c pci_if.m pci_pci.c pci_private.h 
                         pcib_if.m pcib_private.h pcivar.h 
    sys/i386/i386        mptable_pci.c msi.c nexus.c 
    sys/i386/include     intr_machdep.h 
    sys/i386/pci         pci_bus.c 
  Log:
  Revamp the MSI/MSI-X code a bit to achieve two main goals:
  - Simplify the amount of work that has be done for each architecture by
    pushing more of the truly MI code down into the PCI bus driver.
  - Don't bind MSI-X indicies to IRQs so that we can allow a driver to map
    multiple MSI-X messages into a single IRQ when handling a message
    shortage.
  
  The changes include:
  - Add a new pcib_if method: PCIB_MAP_MSI() which is called by the PCI bus
    to calculate the address and data values for a given MSI/MSI-X IRQ.
    The x86 nexus drivers map this into a call to a new 'msi_map()' function
    in msi.c that does the mapping.
  - Retire the pcib_if method PCIB_REMAP_MSIX() and remove the 'index'
    parameter from PCIB_ALLOC_MSIX().  MD code no longer has any knowledge
    of the MSI-X index for a given MSI-X IRQ.
  - The PCI bus driver now stores more MSI-X state in a child's ivars.
    Specifically, it now stores an array of IRQs (called "message vectors" in
    the code) that have associated address and data values, and a small
    virtual version of the MSI-X table that specifies the message vector
    that a given MSI-X table entry uses.  Sparse mappings are permitted in
    the virtual table.
  - The PCI bus driver now configures the MSI and MSI-X address/data
    registers directly via custom bus_setup_intr() and bus_teardown_intr()
    methods.  pci_setup_intr() invokes PCIB_MAP_MSI() to determine the
    address and data values for a given message as needed.  The MD code
    no longer has to call back down into the PCI bus code to set these
    values from the nexus' bus_setup_intr() handler.
  - The PCI bus code provides a callout (pci_remap_msi_irq()) that the MD
    code can call to force the PCI bus to re-invoke PCIB_MAP_MSI() to get
    new values of the address and data fields for a given IRQ.  The x86
    MSI code uses this when an MSI IRQ is moved to a different CPU, requiring
    a new value of the 'address' field.
  - The x86 MSI psuedo-driver loses a lot of code, and in fact the separate
    MSI/MSI-X pseudo-PICs are collapsed down into a single MSI PIC driver
    since the only remaining diff between the two is a substring in a
    bootverbose printf.
  - The PCI bus driver will now restore MSI-X state (including programming
    entries in the MSI-X table) on device resume.
  - The interface for pci_remap_msix() has changed.  Instead of accepting
    indices for the allocated vectors, it accepts a mini-virtual table
    (with a new length parameter).  This table is an array of u_ints, where
    each value specifies which allocated message vector to use for the
    corresponding MSI-X message.  A vector of 0 forces a message to not
    have an associated IRQ.  The device may choose to only use some of the
    IRQs assigned, in which case the unused IRQs must be at the "end" and
    will be released back to the system.  This allows a driver to use the
    same remap table for different shortage values.  For example, if a driver
    wants 4 messages, it can use the same remap table (which only uses the
    first two messages) for the cases when it only gets 2 or 3 messages and
    in the latter case the PCI bus will release the 3rd IRQ back to the
    system.
  
  MFC after:      1 month
  
  Revision  Changes    Path
  1.8       +15 -5     src/sys/amd64/amd64/mptable_pci.c
  1.5       +59 -109   src/sys/amd64/amd64/msi.c
  1.76      +12 -12    src/sys/amd64/amd64/nexus.c
  1.17      +2 -2      src/sys/amd64/include/intr_machdep.h
  1.121     +14 -4     src/sys/amd64/pci/pci_bus.c
  1.54      +16 -4     src/sys/dev/acpica/acpi_pcib_acpi.c
  1.17      +1 -1      src/sys/dev/acpica/acpi_pcib_pci.c
  1.351     +437 -90   src/sys/dev/pci/pci.c
  1.12      +2 -1      src/sys/dev/pci/pci_if.m
  1.48      +12 -11    src/sys/dev/pci/pci_pci.c
  1.23      +6 -1      src/sys/dev/pci/pci_private.h
  1.11      +9 -8      src/sys/dev/pci/pcib_if.m
  1.12      +2 -2      src/sys/dev/pci/pcib_private.h
  1.79      +27 -10    src/sys/dev/pci/pcivar.h
  1.8       +15 -5     src/sys/i386/i386/mptable_pci.c
  1.5       +59 -109   src/sys/i386/i386/msi.c
  1.72      +12 -12    src/sys/i386/i386/nexus.c
  1.19      +2 -2      src/sys/i386/include/intr_machdep.h
  1.127     +15 -5     src/sys/i386/pci/pci_bus.c



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200705021750.l42HoaMj067787>