All of lore.kernel.org
 help / color / mirror / Atom feed
From: "j.glisse" <j.glisse@gmail.com>
To: Alex Deucher <alexdeucher@gmail.com>
Cc: Christian Koenig <christian.koenig@amd.com>,
	dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 07/10] drm/radeon: apply Murphy's law to the kms irq code
Date: Thu, 24 May 2012 11:53:54 -0400	[thread overview]
Message-ID: <20120524155353.GA3467@gmail.com> (raw)
In-Reply-To: <CADnq5_PqgeHdSGCnZ+rWAZivcjBiq-Ye9OqX+AEetQWgJB5yzg@mail.gmail.com>

On Thu, May 24, 2012 at 11:35:15AM -0400, Alex Deucher wrote:
> On Thu, May 24, 2012 at 3:49 AM, Christian König
> <deathsimple@vodafone.de> wrote:
> > From: Christian Koenig <christian.koenig@amd.com>
> >
> > 1. It is really dangerous to have more than one
> >   spinlock protecting the same information.
> >
> > 2. radeon_irq_set sometimes wasn't called with lock
> >   protection, so it can happen that more than one
> >   CPU would tamper with the irq regs at the same
> >   time.
> >
> > 3. The pm.gui_idle variable was assuming that the 3D
> >   engine wasn't becoming idle between testing the
> >   register and setting the variable. So just remove
> >   it and test the register directly.
> >
> > Signed-off-by: Christian Koenig <christian.koenig@amd.com>
> > ---
> >  drivers/gpu/drm/radeon/evergreen.c      |    1 -
> >  drivers/gpu/drm/radeon/r100.c           |    1 -
> >  drivers/gpu/drm/radeon/r600.c           |    1 -
> >  drivers/gpu/drm/radeon/r600_hdmi.c      |    6 +--
> >  drivers/gpu/drm/radeon/radeon.h         |   33 +++++++-------
> >  drivers/gpu/drm/radeon/radeon_irq_kms.c |   72 +++++++++++++++++++++++++------
> >  drivers/gpu/drm/radeon/radeon_kms.c     |   12 ++++--
> >  drivers/gpu/drm/radeon/radeon_pm.c      |   12 +-----
> >  drivers/gpu/drm/radeon/rs600.c          |    1 -
> >  drivers/gpu/drm/radeon/si.c             |    1 -
> >  10 files changed, 90 insertions(+), 50 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
> > index bfcb39e..9e9b3bb 100644
> > --- a/drivers/gpu/drm/radeon/evergreen.c
> > +++ b/drivers/gpu/drm/radeon/evergreen.c
> > @@ -3254,7 +3254,6 @@ restart_ih:
> >                        break;
> >                case 233: /* GUI IDLE */
> >                        DRM_DEBUG("IH: GUI idle\n");
> > -                       rdev->pm.gui_idle = true;
> >                        wake_up(&rdev->irq.idle_queue);
> >                        break;
> >                default:
> > diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
> > index 415b7d8..2587426 100644
> > --- a/drivers/gpu/drm/radeon/r100.c
> > +++ b/drivers/gpu/drm/radeon/r100.c
> > @@ -782,7 +782,6 @@ int r100_irq_process(struct radeon_device *rdev)
> >                /* gui idle interrupt */
> >                if (status & RADEON_GUI_IDLE_STAT) {
> >                        rdev->irq.gui_idle_acked = true;
> > -                       rdev->pm.gui_idle = true;
> >                        wake_up(&rdev->irq.idle_queue);
> >                }
> >                /* Vertical blank interrupts */
> > diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> > index eadbb06..90c6639 100644
> > --- a/drivers/gpu/drm/radeon/r600.c
> > +++ b/drivers/gpu/drm/radeon/r600.c
> > @@ -3542,7 +3542,6 @@ restart_ih:
> >                        break;
> >                case 233: /* GUI IDLE */
> >                        DRM_DEBUG("IH: GUI idle\n");
> > -                       rdev->pm.gui_idle = true;
> >                        wake_up(&rdev->irq.idle_queue);
> >                        break;
> >                default:
> > diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c
> > index 226379e..b76c0f2 100644
> > --- a/drivers/gpu/drm/radeon/r600_hdmi.c
> > +++ b/drivers/gpu/drm/radeon/r600_hdmi.c
> > @@ -523,8 +523,7 @@ void r600_hdmi_enable(struct drm_encoder *encoder)
> >
> >        if (rdev->irq.installed) {
> >                /* if irq is available use it */
> > -               rdev->irq.afmt[dig->afmt->id] = true;
> > -               radeon_irq_set(rdev);
> > +               radeon_irq_kms_enable_afmt(rdev, dig->afmt->id);
> >        }
> >
> >        dig->afmt->enabled = true;
> > @@ -560,8 +559,7 @@ void r600_hdmi_disable(struct drm_encoder *encoder)
> >                  offset, radeon_encoder->encoder_id);
> >
> >        /* disable irq */
> > -       rdev->irq.afmt[dig->afmt->id] = false;
> > -       radeon_irq_set(rdev);
> > +       radeon_irq_kms_disable_afmt(rdev, dig->afmt->id);
> >
> >        /* Older chipsets not handled by AtomBIOS */
> >        if (rdev->family >= CHIP_R600 && !ASIC_IS_DCE3(rdev)) {
> > diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> > index 8479096..23552b4 100644
> > --- a/drivers/gpu/drm/radeon/radeon.h
> > +++ b/drivers/gpu/drm/radeon/radeon.h
> > @@ -610,21 +610,20 @@ union radeon_irq_stat_regs {
> >  #define RADEON_MAX_AFMT_BLOCKS 6
> >
> >  struct radeon_irq {
> > -       bool            installed;
> > -       bool            sw_int[RADEON_NUM_RINGS];
> > -       bool            crtc_vblank_int[RADEON_MAX_CRTCS];
> > -       bool            pflip[RADEON_MAX_CRTCS];
> > -       wait_queue_head_t       vblank_queue;
> > -       bool            hpd[RADEON_MAX_HPD_PINS];
> > -       bool            gui_idle;
> > -       bool            gui_idle_acked;
> > -       wait_queue_head_t       idle_queue;
> > -       bool            afmt[RADEON_MAX_AFMT_BLOCKS];
> > -       spinlock_t sw_lock;
> > -       int sw_refcount[RADEON_NUM_RINGS];
> > -       union radeon_irq_stat_regs stat_regs;
> > -       spinlock_t pflip_lock[RADEON_MAX_CRTCS];
> > -       int pflip_refcount[RADEON_MAX_CRTCS];
> > +       bool                            installed;
> > +       spinlock_t                      lock;
> > +       bool                            sw_int[RADEON_NUM_RINGS];
> > +       int                             sw_refcount[RADEON_NUM_RINGS];
> > +       bool                            crtc_vblank_int[RADEON_MAX_CRTCS];
> > +       bool                            pflip[RADEON_MAX_CRTCS];
> > +       int                             pflip_refcount[RADEON_MAX_CRTCS];
> > +       wait_queue_head_t               vblank_queue;
> > +       bool                            hpd[RADEON_MAX_HPD_PINS];
> > +       bool                            gui_idle;
> > +       bool                            gui_idle_acked;
> > +       wait_queue_head_t               idle_queue;
> > +       bool                            afmt[RADEON_MAX_AFMT_BLOCKS];
> > +       union radeon_irq_stat_regs      stat_regs;
> >  };
> >
> >  int radeon_irq_kms_init(struct radeon_device *rdev);
> > @@ -633,6 +632,9 @@ void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev, int ring);
> >  void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev, int ring);
> >  void radeon_irq_kms_pflip_irq_get(struct radeon_device *rdev, int crtc);
> >  void radeon_irq_kms_pflip_irq_put(struct radeon_device *rdev, int crtc);
> > +void radeon_irq_kms_enable_afmt(struct radeon_device *rdev, int block);
> > +void radeon_irq_kms_disable_afmt(struct radeon_device *rdev, int block);
> > +int radeon_irq_kms_wait_gui_idle(struct radeon_device *rdev);
> >
> >  /*
> >  * CP & rings.
> > @@ -1058,7 +1060,6 @@ struct radeon_pm {
> >        int                     active_crtc_count;
> >        int                     req_vblank;
> >        bool                    vblank_sync;
> > -       bool                    gui_idle;
> >        fixed20_12              max_bandwidth;
> >        fixed20_12              igp_sideport_mclk;
> >        fixed20_12              igp_system_mclk;
> > diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
> > index 5df58d1..11fc4f7 100644
> > --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
> > +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
> > @@ -32,6 +32,8 @@
> >  #include "radeon.h"
> >  #include "atom.h"
> >
> > +#define RADEON_WAIT_IDLE_TIMEOUT 200
> > +
> >  irqreturn_t radeon_driver_irq_handler_kms(DRM_IRQ_ARGS)
> >  {
> >        struct drm_device *dev = (struct drm_device *) arg;
> > @@ -62,8 +64,10 @@ static void radeon_hotplug_work_func(struct work_struct *work)
> >  void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
> >  {
> >        struct radeon_device *rdev = dev->dev_private;
> > +       unsigned long irqflags;
> >        unsigned i;
> >
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> >        /* Disable *all* interrupts */
> >        for (i = 0; i < RADEON_NUM_RINGS; i++)
> >                rdev->irq.sw_int[i] = false;
> > @@ -76,6 +80,7 @@ void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
> >                rdev->irq.afmt[i] = false;
> >        }
> >        radeon_irq_set(rdev);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> >        /* Clear bits */
> >        radeon_irq_process(rdev);
> >  }
> > @@ -83,23 +88,28 @@ void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
> >  int radeon_driver_irq_postinstall_kms(struct drm_device *dev)
> >  {
> >        struct radeon_device *rdev = dev->dev_private;
> > +       unsigned long irqflags;
> >        unsigned i;
> >
> >        dev->max_vblank_count = 0x001fffff;
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> >        for (i = 0; i < RADEON_NUM_RINGS; i++)
> >                rdev->irq.sw_int[i] = true;
> >        radeon_irq_set(rdev);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> >        return 0;
> >  }
> >
> >  void radeon_driver_irq_uninstall_kms(struct drm_device *dev)
> >  {
> >        struct radeon_device *rdev = dev->dev_private;
> > +       unsigned long irqflags;
> >        unsigned i;
> >
> >        if (rdev == NULL) {
> >                return;
> >        }
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> >        /* Disable *all* interrupts */
> >        for (i = 0; i < RADEON_NUM_RINGS; i++)
> >                rdev->irq.sw_int[i] = false;
> > @@ -112,6 +122,7 @@ void radeon_driver_irq_uninstall_kms(struct drm_device *dev)
> >                rdev->irq.afmt[i] = false;
> >        }
> >        radeon_irq_set(rdev);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> >  }
> >
> >  static bool radeon_msi_ok(struct radeon_device *rdev)
> > @@ -168,15 +179,12 @@ static bool radeon_msi_ok(struct radeon_device *rdev)
> >
> >  int radeon_irq_kms_init(struct radeon_device *rdev)
> >  {
> > -       int i;
> >        int r = 0;
> >
> >        INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func);
> >        INIT_WORK(&rdev->audio_work, r600_audio_update_hdmi);
> >
> > -       spin_lock_init(&rdev->irq.sw_lock);
> > -       for (i = 0; i < rdev->num_crtc; i++)
> > -               spin_lock_init(&rdev->irq.pflip_lock[i]);
> > +       spin_lock_init(&rdev->irq.lock);
> >        r = drm_vblank_init(rdev->ddev, rdev->num_crtc);
> >        if (r) {
> >                return r;
> > @@ -217,25 +225,25 @@ void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev, int ring)
> >  {
> >        unsigned long irqflags;
> >
> > -       spin_lock_irqsave(&rdev->irq.sw_lock, irqflags);
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> >        if (rdev->ddev->irq_enabled && (++rdev->irq.sw_refcount[ring] == 1)) {
> >                rdev->irq.sw_int[ring] = true;
> >                radeon_irq_set(rdev);
> >        }
> > -       spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> >  }
> >
> >  void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev, int ring)
> >  {
> >        unsigned long irqflags;
> >
> > -       spin_lock_irqsave(&rdev->irq.sw_lock, irqflags);
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> >        BUG_ON(rdev->ddev->irq_enabled && rdev->irq.sw_refcount[ring] <= 0);
> >        if (rdev->ddev->irq_enabled && (--rdev->irq.sw_refcount[ring] == 0)) {
> >                rdev->irq.sw_int[ring] = false;
> >                radeon_irq_set(rdev);
> >        }
> > -       spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> >  }
> >
> >  void radeon_irq_kms_pflip_irq_get(struct radeon_device *rdev, int crtc)
> > @@ -245,12 +253,12 @@ void radeon_irq_kms_pflip_irq_get(struct radeon_device *rdev, int crtc)
> >        if (crtc < 0 || crtc >= rdev->num_crtc)
> >                return;
> >
> > -       spin_lock_irqsave(&rdev->irq.pflip_lock[crtc], irqflags);
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> >        if (rdev->ddev->irq_enabled && (++rdev->irq.pflip_refcount[crtc] == 1)) {
> >                rdev->irq.pflip[crtc] = true;
> >                radeon_irq_set(rdev);
> >        }
> > -       spin_unlock_irqrestore(&rdev->irq.pflip_lock[crtc], irqflags);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> >  }
> >
> >  void radeon_irq_kms_pflip_irq_put(struct radeon_device *rdev, int crtc)
> > @@ -260,12 +268,52 @@ void radeon_irq_kms_pflip_irq_put(struct radeon_device *rdev, int crtc)
> >        if (crtc < 0 || crtc >= rdev->num_crtc)
> >                return;
> >
> > -       spin_lock_irqsave(&rdev->irq.pflip_lock[crtc], irqflags);
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> >        BUG_ON(rdev->ddev->irq_enabled && rdev->irq.pflip_refcount[crtc] <= 0);
> >        if (rdev->ddev->irq_enabled && (--rdev->irq.pflip_refcount[crtc] == 0)) {
> >                rdev->irq.pflip[crtc] = false;
> >                radeon_irq_set(rdev);
> >        }
> > -       spin_unlock_irqrestore(&rdev->irq.pflip_lock[crtc], irqflags);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> > +}
> > +
> > +void radeon_irq_kms_enable_afmt(struct radeon_device *rdev, int block)
> > +{
> > +       unsigned long irqflags;
> > +
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> > +       rdev->irq.afmt[block] = true;
> > +       radeon_irq_set(rdev);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> > +
> > +}
> > +
> > +void radeon_irq_kms_disable_afmt(struct radeon_device *rdev, int block)
> > +{
> > +       unsigned long irqflags;
> > +
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> > +       rdev->irq.afmt[block] = false;
> > +       radeon_irq_set(rdev);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> >  }
> >
> 
> Should probably also add radeon_irq_kms_[en|dis]able_hpd() function
> and call replaced the calls to *_irq_set() in the *_hpd_init() and
> *_hpd_fini() callbacks for display hotplug.
> 
> Alex

Agree, otherwise:
Reviewed-by: Jerome Glisse <jglisse@redhat.com>

Cheers,
Jerome

> > +int radeon_irq_kms_wait_gui_idle(struct radeon_device *rdev)
> > +{
> > +       unsigned long irqflags;
> > +       int r;
> > +
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> > +       rdev->irq.gui_idle = true;
> > +       radeon_irq_set(rdev);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> > +
> > +       r = wait_event_timeout(rdev->irq.idle_queue, radeon_gui_idle(rdev),
> > +                              msecs_to_jiffies(RADEON_WAIT_IDLE_TIMEOUT));
> > +
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> > +       rdev->irq.gui_idle = false;
> > +       radeon_irq_set(rdev);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> > +       return r;
> > +}
> > diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
> > index f1016a5..abbb04d 100644
> > --- a/drivers/gpu/drm/radeon/radeon_kms.c
> > +++ b/drivers/gpu/drm/radeon/radeon_kms.c
> > @@ -382,29 +382,35 @@ u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc)
> >  int radeon_enable_vblank_kms(struct drm_device *dev, int crtc)
> >  {
> >        struct radeon_device *rdev = dev->dev_private;
> > +       unsigned long irqflags;
> > +       int r;
> >
> >        if (crtc < 0 || crtc >= rdev->num_crtc) {
> >                DRM_ERROR("Invalid crtc %d\n", crtc);
> >                return -EINVAL;
> >        }
> >
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> >        rdev->irq.crtc_vblank_int[crtc] = true;
> > -
> > -       return radeon_irq_set(rdev);
> > +       r = radeon_irq_set(rdev);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> > +       return r;
> >  }
> >
> >  void radeon_disable_vblank_kms(struct drm_device *dev, int crtc)
> >  {
> >        struct radeon_device *rdev = dev->dev_private;
> > +       unsigned long irqflags;
> >
> >        if (crtc < 0 || crtc >= rdev->num_crtc) {
> >                DRM_ERROR("Invalid crtc %d\n", crtc);
> >                return;
> >        }
> >
> > +       spin_lock_irqsave(&rdev->irq.lock, irqflags);
> >        rdev->irq.crtc_vblank_int[crtc] = false;
> > -
> >        radeon_irq_set(rdev);
> > +       spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
> >  }
> >
> >  int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
> > diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
> > index d13b6ae..79642cd 100644
> > --- a/drivers/gpu/drm/radeon/radeon_pm.c
> > +++ b/drivers/gpu/drm/radeon/radeon_pm.c
> > @@ -34,7 +34,6 @@
> >  #define RADEON_IDLE_LOOP_MS 100
> >  #define RADEON_RECLOCK_DELAY_MS 200
> >  #define RADEON_WAIT_VBLANK_TIMEOUT 200
> > -#define RADEON_WAIT_IDLE_TIMEOUT 200
> >
> >  static const char *radeon_pm_state_type_name[5] = {
> >        "Default",
> > @@ -257,15 +256,8 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev)
> >        /* gui idle int has issues on older chips it seems */
> >        if (rdev->family >= CHIP_R600) {
> >                if (rdev->irq.installed) {
> > -                       /* wait for GPU idle */
> > -                       rdev->pm.gui_idle = false;
> > -                       rdev->irq.gui_idle = true;
> > -                       radeon_irq_set(rdev);
> > -                       wait_event_interruptible_timeout(
> > -                               rdev->irq.idle_queue, rdev->pm.gui_idle,
> > -                               msecs_to_jiffies(RADEON_WAIT_IDLE_TIMEOUT));
> > -                       rdev->irq.gui_idle = false;
> > -                       radeon_irq_set(rdev);
> > +                       /* wait for GPU to become idle */
> > +                       radeon_irq_kms_wait_gui_idle(rdev);
> >                }
> >        } else {
> >                struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
> > diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
> > index 25f9eef..4e9c41a 100644
> > --- a/drivers/gpu/drm/radeon/rs600.c
> > +++ b/drivers/gpu/drm/radeon/rs600.c
> > @@ -686,7 +686,6 @@ int rs600_irq_process(struct radeon_device *rdev)
> >                /* GUI idle */
> >                if (G_000040_GUI_IDLE(status)) {
> >                        rdev->irq.gui_idle_acked = true;
> > -                       rdev->pm.gui_idle = true;
> >                        wake_up(&rdev->irq.idle_queue);
> >                }
> >                /* Vertical blank interrupts */
> > diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
> > index f969487..23be691 100644
> > --- a/drivers/gpu/drm/radeon/si.c
> > +++ b/drivers/gpu/drm/radeon/si.c
> > @@ -3773,7 +3773,6 @@ restart_ih:
> >                        break;
> >                case 233: /* GUI IDLE */
> >                        DRM_DEBUG("IH: GUI idle\n");
> > -                       rdev->pm.gui_idle = true;
> >                        wake_up(&rdev->irq.idle_queue);
> >                        break;
> >                default:
> > --
> > 1.7.9.5
> >
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2012-05-24 15:54 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-24  7:49 [PATCH 01/10] drm/radeon: remove radeon_fence_create Christian König
2012-05-24  7:49 ` [PATCH 02/10] drm/radeon: add infrastructure for advanced ring synchronization Christian König
2012-05-24 15:56   ` j.glisse
2012-05-24  7:49 ` [PATCH 03/10] drm/radeon: rework ring syncing code Christian König
2012-05-24 15:57   ` j.glisse
2012-05-24  7:49 ` [PATCH 04/10] drm/radeon: replace vmram_mutex with mclk_lock v2 Christian König
2012-05-24 15:57   ` j.glisse
2012-05-24  7:49 ` [PATCH 05/10] drm/radeon: remove some unneeded structure members Christian König
2012-05-24 15:58   ` j.glisse
2012-05-24  7:49 ` [PATCH 06/10] drm/radeon: fix & improve ih ring handling Christian König
2012-05-24 15:59   ` j.glisse
2012-05-24  7:49 ` [PATCH 07/10] drm/radeon: apply Murphy's law to the kms irq code Christian König
2012-05-24 15:35   ` Alex Deucher
2012-05-24 15:53     ` j.glisse [this message]
2012-05-31 18:15     ` Alex Deucher
2012-05-31 18:39       ` Jerome Glisse
2012-05-31 20:15       ` Christian König
2012-05-24  7:49 ` [PATCH 08/10] drm/radeon: replace pflip and sw_int counters with atomics Christian König
2012-05-24 11:59   ` Sylvain BERTRAND
2012-05-24 12:29     ` Koenig, Christian
2012-05-24 12:46       ` Sylvain BERTRAND
2012-05-24 12:53         ` Dave Airlie
2012-05-24 12:54           ` Dave Airlie
2012-05-24 14:23             ` Sylvain BERTRAND
2012-05-24  7:49 ` [PATCH 09/10] drm/radeon: replace cs_mutex with vm_mutex Christian König
2012-05-24  7:49 ` [PATCH 10/10] drm/radeon: work around bugs in caymans compute rings Christian König
2012-05-24 15:54 ` [PATCH 01/10] drm/radeon: remove radeon_fence_create j.glisse

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120524155353.GA3467@gmail.com \
    --to=j.glisse@gmail.com \
    --cc=alexdeucher@gmail.com \
    --cc=christian.koenig@amd.com \
    --cc=dri-devel@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.