lkml.org 
[lkml]   [2011]   [May]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/2] drm/nouveau: Check that the device is enabled before processing interrupt
    Date
    We're likely to be sharing an interrupt line with other devices,
    which means our handler might get called after we've turned off
    the device via vga switcheroo. This can lead to all sorts of
    badness, like nv04_fifo_isr() spewing "PFIFO still angry after
    100 spins, halt" to the console before the system enters a hard
    hang.

    We can avoid this by simply checking if the device is still
    enabled before processing an interrupt. To avoid races, flush
    any inflight interrupts using synchronize_irq(). Note that
    since pci_intx() is called after pci_save_state(),
    pci_restore_state() will automatically re-enable INTx.

    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    ---

    drivers/gpu/drm/nouveau/nouveau_drv.c | 2 ++
    drivers/gpu/drm/nouveau/nouveau_irq.c | 3 +++
    2 files changed, 5 insertions(+), 0 deletions(-)

    diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.c b/drivers/gpu/drm/nouveau/nouveau_drv.c
    index 155ebdc..405d4f1 100644
    --- a/drivers/gpu/drm/nouveau/nouveau_drv.c
    +++ b/drivers/gpu/drm/nouveau/nouveau_drv.c
    @@ -230,7 +230,9 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state)
    NV_INFO(dev, "And we're gone!\n");
    pci_save_state(pdev);
    if (pm_state.event == PM_EVENT_SUSPEND) {
    + pci_intx(pdev, 0);
    pci_disable_device(pdev);
    + synchronize_irq(drm_dev_to_irq(dev));
    pci_set_power_state(pdev, PCI_D3hot);
    }

    diff --git a/drivers/gpu/drm/nouveau/nouveau_irq.c b/drivers/gpu/drm/nouveau/nouveau_irq.c
    index 2ba7265..8fd17e6 100644
    --- a/drivers/gpu/drm/nouveau/nouveau_irq.c
    +++ b/drivers/gpu/drm/nouveau/nouveau_irq.c
    @@ -78,6 +78,9 @@ nouveau_irq_handler(DRM_IRQ_ARGS)
    u32 stat;
    int i;

    + if (unlikely(!pci_is_enabled(dev->pdev)))
    + return IRQ_NONE;
    +
    stat = nv_rd32(dev, NV03_PMC_INTR_0);
    if (!stat)
    return IRQ_NONE;


    \
     
     \ /
      Last update: 2011-05-02 02:53    [W:0.023 / U:121.236 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site