[PATCH] drm/radeon: Add early unregister of firmware fb's

Marcin Slusarz marcin.slusarz at gmail.com
Wed Oct 6 11:20:15 PDT 2010


On Wed, Oct 06, 2010 at 06:39:07PM +0200, Daniel Vetter wrote:
> From: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> 
> Without this, we attempt the handover too late, the firmware fb
> might be accessing the chip simultaneously to us re-initializing
> various parts of it, which might frighten babies or cause all sort
> of nasty psychologic trauma to kitten.
> 
> Cc: stable at kernel.org
> Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> [danvet: add cc: stable, forward ported and compile-fixed for X86]
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
> 
> This patch is required to get the agp rv270 in my ppc Mac Mini working with
> kms.  Also tested on my agp rv570 on amd64, doesn't seem to have ill
> effects there.
> 
> Please review and apply.
> 
> Thanks, Daniel
> 
>  drivers/gpu/drm/radeon/radeon_device.c |   19 +++++++++++++++++++
>  1 files changed, 19 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
> index 256d204..3aea1a8 100644
> --- a/drivers/gpu/drm/radeon/radeon_device.c
> +++ b/drivers/gpu/drm/radeon/radeon_device.c
> @@ -584,6 +584,22 @@ static bool radeon_switcheroo_can_switch(struct pci_dev *pdev)
>  }
>  
>  
> +static void radeon_kick_out_firmware_fb(struct drm_device *ddev)
> +{
> +	struct apertures_struct *ap;
> +	bool primary = false;
> +
> +	ap = alloc_apertures(1);
> +	ap->ranges[0].base = pci_resource_start(ddev->pdev, 0);
> +	ap->ranges[0].size = pci_resource_len(ddev->pdev, 0);

Any reason why this range differs from the one in radeonfb_create?
Maybe it needs to be fixed there too?

> +
> +#ifdef CONFIG_X86
> +	primary = ddev->pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
> +#endif
> +	remove_conflicting_framebuffers(ap, "radeondrmfb", primary);
> +	kfree(ap);
> +}
> +
>  int radeon_device_init(struct radeon_device *rdev,
>  		       struct drm_device *ddev,
>  		       struct pci_dev *pdev,
> @@ -623,6 +639,9 @@ int radeon_device_init(struct radeon_device *rdev,
>  	init_waitqueue_head(&rdev->irq.vblank_queue);
>  	init_waitqueue_head(&rdev->irq.idle_queue);
>  
> +	/* Get rid of things like offb */
> +	radeon_kick_out_firmware_fb(ddev);
> +
>  	/* setup workqueue */
>  	rdev->wq = create_workqueue("radeon");
>  	if (rdev->wq == NULL)
> -- 
> 1.7.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list