12 Oct, 2010

2 commits


31 Jul, 2010

1 commit

  • commit 2ca1af9aa3285c6a5f103ed31ad09f7399fc65d7 "PCI: MSI: Remove
    unsafe and unnecessary hardware access" changed read_msi_msg_desc() to
    return the last MSI message written instead of reading it from the
    device, since it may be called while the device is in a reduced
    power state.

    However, the pSeries platform code really does need to read messages
    from the device, since they are initially written by firmware.
    Therefore:
    - Restore the previous behaviour of read_msi_msg_desc()
    - Add new functions get_cached_msi_msg{,_desc}() which return the
    last MSI message written
    - Use the new functions where appropriate

    Acked-by: Michael Ellerman
    Signed-off-by: Ben Hutchings
    Signed-off-by: Jesse Barnes

    Ben Hutchings
     

21 Mar, 2009

4 commits

  • Add the new API pci_enable_msi_block() to allow drivers to
    request multiple MSI and reimplement pci_enable_msi in terms of
    pci_enable_msi_block. Ensure that the architecture back ends don't
    have to know about multiple MSI.

    Signed-off-by: Matthew Wilcox
    Signed-off-by: Jesse Barnes

    Matthew Wilcox
     
  • Since most of the callers already know whether they have an MSI or
    an MSI-X capability, split msi_set_mask_bits() into msi_mask_irq()
    and msix_mask_irq(). The only callers which don't (mask_msi_irq()
    and unmask_msi_irq()) can share code in msi_set_mask_bit(). This then
    becomes the only caller of msix_flush_writes(), so we can inline it.
    The flushing read can be to any address that belongs to the device,
    so we can eliminate the calculation too.

    We can also get rid of maskbits_mask from struct msi_desc and simply
    recalculate it on the rare occasion that we need it. The single-bit
    'masked' element is replaced by a copy of the 32-bit 'masked' register,
    so this patch does not affect the size of msi_desc.

    Signed-off-by: Matthew Wilcox
    Signed-off-by: Jesse Barnes

    Matthew Wilcox
     
  • MSI interrupts have a mask_pos where MSI-X have a mask_base. Use a
    transparent union to get rid of some ugly casts.

    Signed-off-by: Matthew Wilcox
    Signed-off-by: Jesse Barnes

    Matthew Wilcox
     
  • By changing from a 5-bit field to a 1-bit field, we free up some bits
    that can be used by a later patch. Also rearrange the fields for better
    packing on 64-bit platforms (reducing the size of msi_desc from 72 bytes
    to 64 bytes).

    Signed-off-by: Matthew Wilcox
    Signed-off-by: Jesse Barnes

    Matthew Wilcox
     

08 Dec, 2008

1 commit


30 Apr, 2008

1 commit

  • [PATCH 1/2] pci/irq: restore mask_bits in msi shutdown -v3

    Yinghai found that kexec'ing a RHEL 5.1 kernel with 2.6.25-rc3+ kernels
    prevents his NIC from working. He bisected to

    | commit 89d694b9dbe769ca1004e01db0ca43964806a611
    | Author: Thomas Gleixner
    | Date: Mon Feb 18 18:25:17 2008 +0100
    |
    | genirq: do not leave interupts enabled on free_irq
    |
    | The default_disable() function was changed in commit:
    |
    | 76d2160147f43f982dfe881404cfde9fd0a9da21
    | genirq: do not mask interrupts by default
    |

    For MSI, default_shutdown will call mask_bit for msi device. All mask bits
    will left disabled after free_irq. Then in the kexec case, the next kernel
    can only use msi_enable bit, so all device's MSI can not be used.

    So lets to restore the mask bit to its pci reset defined value (enabled) when
    we disable the kernels use of msi to be a little friendlier to kexec'd kernels.

    Extend msi_set_mask_bit to msi_set_mask_bits to take mask, so we can fully
    restore that to 0x00 instead of 0xfe.

    Signed-off-by: Yinghai Lu
    Signed-off-by: Jesse Barnes

    Yinghai Lu
     

03 May, 2007

4 commits

  • This patch introduces an optional function, arch_teardown_msi_irqs(),
    which gives an arch the opportunity to do per-device teardown for
    MSI/X. If that's not required, the default version simply calls
    arch_teardown_msi_irq() for each msi irq required.

    arch_teardown_msi_irqs() is simply passed a pdev, attached to the pdev
    is a list of msi_descs, it is up to the arch to free the irq associated
    with each of these as appropriate.

    For archs that _don't_ implement arch_teardown_msi_irqs(), all msi_descs
    with irq == 0 are considered unallocated, and the arch teardown routine
    is not called on them.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Greg Kroah-Hartman

    Michael Ellerman
     
  • This patch introduces an optional function, arch_setup_msi_irqs(),
    (note the plural) which gives an arch the opportunity to do per-device
    setup for MSI/X and then allocate all the requested MSI/Xs at once.

    If that's not required by the arch, the default version simply calls
    arch_setup_msi_irq() for each MSI irq required.

    arch_setup_msi_irqs() is passed a pdev, attached to the pdev is a list
    of msi_descs with irq == 0, it is up to the arch to connect these up to
    an irq (via set_irq_msi()) or return an error. For convenience the number
    of vectors and the type are passed also.

    All msi_descs with irq != 0 are considered allocated, and the arch
    teardown routine will be called on them when necessary.

    The existing semantics of pci_enable_msix() are that if the requested
    number of irqs can not be allocated, the maximum number that _could_ be
    allocated is returned. To support that, we define that in case of an
    error from arch_setup_msi_irqs(), the number of msi_descs with irq != 0
    are considered allocated, and are counted toward the "max that could be
    allocated".

    Signed-off-by: Michael Ellerman
    Signed-off-by: Greg Kroah-Hartman

    Michael Ellerman
     
  • The msi descriptors are linked together with what looks a lot like
    a linked list, but isn't a struct list_head list. Make it one.

    The only complication is that previously we walked a list of irqs, and
    got the descriptor for each with get_irq_msi(). Now we have a list of
    descriptors and need to get the irq out of it, so it needs to be in the
    actual struct msi_desc. We use 0 to indicate no irq is setup.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Greg Kroah-Hartman

    Michael Ellerman
     
  • Add an arch_check_device(), which gives archs a chance to check the input
    to pci_enable_msi/x. The arch might be interested in the value of nvec so
    pass it in. Propagate the error value returned from the arch routine out
    to the caller.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Greg Kroah-Hartman

    Michael Ellerman
     

13 Mar, 2007

1 commit

  • There are two ways pci_save_state and pci_restore_state are used. As
    helper functions during suspend/resume, and as helper functions around
    a hardware reset event. When used as helper functions around a hardware
    reset event there is no reason to believe the calls will be paired, nor
    is there a good reason to believe that if we restore the msi state from
    before the reset that it will match the current msi state. Since arch
    code may change the msi message without going through the driver, drivers
    currently do not have enough information to even know when to call
    pci_save_state to ensure they will have msi state in sync with the other
    kernel irq reception data structures.

    It turns out the solution is straight forward, cache the state in the
    existing msi data structures (not the magic pci saved things) and
    have the msi code update the cached state each time we write to the hardware.
    This means we never need to read the hardware to figure out what the hardware
    state should be.

    By modifying the caching in this manner we get to remove our save_state
    routines and only need to provide restore_state routines.

    The only fields that were at all tricky to regenerate were the msi and msi-x
    control registers and the way we regenerate them currently is a bit dependent
    upon assumptions on how we use the allow msi registers to be configured and used
    making the code a little bit brittle. If we ever change what cases we allow
    or how we configure the msi bits we can address the fragility then.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: Greg Kroah-Hartman
    Acked-by: Auke Kok
    Signed-off-by: Linus Torvalds

    Eric W. Biederman
     

08 Feb, 2007

2 commits

  • The arch hooks arch_setup_msi_irq and arch_teardown_msi_irq are now
    responsible for allocating and freeing the linux irq in addition to
    setting up the the linux irq to work with the interrupt.

    arch_setup_msi_irq now takes a pci_device and a msi_desc and returns
    an irq.

    With this change in place this code should be useable by all platforms
    except those that won't let the OS touch the hardware like ppc RTAS.

    Signed-off-by: Eric W. Biederman
    Acked-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Eric W. Biederman
     
  • Cleanup MSI code as follows:

    - fix some types
    - fix strange local variable definition
    - delete unnecessary blank line
    - add comment to #endif which is far from corresponding #ifdef

    Signed-off-by: Satoru Takeuchi
    Signed-off-by: Greg Kroah-Hartman

    Satoru Takeuchi
     

04 Oct, 2006

1 commit

  • It turns out msi_ops was simply not enough to abstract the architecture
    specific details of msi. So I have moved the resposibility of constructing
    the struct irq_chip to the architectures, and have two architecture specific
    functions arch_setup_msi_irq, and arch_teardown_msi_irq.

    For simple architectures those functions can do all of the work. For
    architectures with platform dependencies they can call into the appropriate
    platform code.

    With this msi.c is finally free of assuming you have an apic, and this
    actually takes less code.

    The helpers for the architecture specific code are declared in the linux/msi.h
    to keep them separate from the msi functions used by drivers in linux/pci.h

    Signed-off-by: Eric W. Biederman
    Cc: Ingo Molnar
    Cc: Tony Luck
    Cc: Andi Kleen
    Cc: Thomas Gleixner
    Cc: Greg KH
    Cc: Benjamin Herrenschmidt
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Eric W. Biederman