On Tue, Apr 3, 2012 at 8:13 AM, Dave Airlie <airlied at gmail.com> wrote: > From: Dave Airlie <airlied at redhat.com> > > This closes a race seen with kexec where we enable PCI bus mastering > but the card has been reinitialised fully yet. > > This was previously fixed by a patch from Jerome, but this should > close the race completely. > > Reported-and-tested-by: Markus Trippelsdorf <markus at trippelsdorf.de> > Signed-off-by: Dave Airlie <airlied at redhat.com>
For 3.4, you'll need to update si.c as well. Alex > --- > ?drivers/gpu/drm/radeon/r100.c ? ? ? ? ?| ? ?4 ++++ > ?drivers/gpu/drm/radeon/r600.c ? ? ? ? ?| ? ?3 +++ > ?drivers/gpu/drm/radeon/radeon_device.c | ? ?1 - > ?drivers/gpu/drm/radeon/radeon_kms.c ? ?| ? ?2 -- > ?4 files changed, 7 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c > index 81801c1..e11df77 100644 > --- a/drivers/gpu/drm/radeon/r100.c > +++ b/drivers/gpu/drm/radeon/r100.c > @@ -1180,6 +1180,10 @@ int r100_cp_init(struct radeon_device *rdev, unsigned > ring_size) > ? ? ? ?WREG32(RADEON_CP_RB_WPTR_DELAY, 0); > ? ? ? ?WREG32(RADEON_CP_CSQ_MODE, 0x00004D4D); > ? ? ? ?WREG32(RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIBM_INDBM); > + > + ? ? ? /* at this point everything should be setup correctly to enable > master */ > + ? ? ? pci_set_master(rdev->pdev); > + > ? ? ? ?radeon_ring_start(rdev, RADEON_RING_TYPE_GFX_INDEX, > &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]); > ? ? ? ?r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring); > ? ? ? ?if (r) { > diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c > index 5eb2382..50cf034 100644 > --- a/drivers/gpu/drm/radeon/r600.c > +++ b/drivers/gpu/drm/radeon/r600.c > @@ -3034,6 +3034,9 @@ int r600_irq_init(struct radeon_device *rdev) > ? ? ? ?else > ? ? ? ? ? ? ? ?r600_disable_interrupt_state(rdev); > > + ? ? ? /* at this point everything should be setup correctly to enable > master */ > + ? ? ? pci_set_master(rdev->pdev); > + > ? ? ? ?/* enable irqs */ > ? ? ? ?r600_enable_interrupts(rdev); > > diff --git a/drivers/gpu/drm/radeon/radeon_device.c > b/drivers/gpu/drm/radeon/radeon_device.c > index 49f7cb7..a282331 100644 > --- a/drivers/gpu/drm/radeon/radeon_device.c > +++ b/drivers/gpu/drm/radeon/radeon_device.c > @@ -951,7 +951,6 @@ int radeon_resume_kms(struct drm_device *dev) > ? ? ? ? ? ? ? ?console_unlock(); > ? ? ? ? ? ? ? ?return -1; > ? ? ? ?} > - ? ? ? pci_set_master(dev->pdev); > ? ? ? ?/* resume AGP if in use */ > ? ? ? ?radeon_agp_resume(rdev); > ? ? ? ?radeon_resume(rdev); > diff --git a/drivers/gpu/drm/radeon/radeon_kms.c > b/drivers/gpu/drm/radeon/radeon_kms.c > index 1986eba..d335288 100644 > --- a/drivers/gpu/drm/radeon/radeon_kms.c > +++ b/drivers/gpu/drm/radeon/radeon_kms.c > @@ -57,8 +57,6 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned > long flags) > ? ? ? ?} > ? ? ? ?dev->dev_private = (void *)rdev; > > - ? ? ? pci_set_master(dev->pdev); > - > ? ? ? ?/* update BUS flag */ > ? ? ? ?if (drm_pci_device_is_agp(dev)) { > ? ? ? ? ? ? ? ?flags |= RADEON_IS_AGP; > -- > 1.7.7.6 > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel