[Nouveau] [PATCH] drm/nouveau: Fix fbcon on mixed pre-NV50 + NV50 multicard.

Ben Skeggs skeggsb at gmail.com
Thu Feb 4 03:48:58 PST 2010


On Wed, 2010-01-27 at 14:03 +0000, Marcin Kościelnicki wrote:
> We used single shared fbops struct and patched it at fb init time with
> pointers to the right variant. On mixed multicard, this meant that
> it was either sending NV50-style commands to all cards, or NV04-style
> commands to all cards.
Good catch :)  Pushed.

> 
> Signed-off-by: Marcin Kościelnicki <koriakin at 0x04.net>
> ---
>  drivers/gpu/drm/nouveau/nouveau_fbcon.c |   30 ++++++++++++++++++++++++++++++
>  drivers/gpu/drm/nouveau/nouveau_fbcon.h |    6 ++++++
>  drivers/gpu/drm/nouveau/nv04_fbcon.c    |    9 +++------
>  drivers/gpu/drm/nouveau/nv50_fbcon.c    |    9 +++------
>  4 files changed, 42 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> index eddadac..ea879a2 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> @@ -107,6 +107,34 @@ static struct fb_ops nouveau_fbcon_ops = {
>  	.fb_setcmap = drm_fb_helper_setcmap,
>  };
>  
> +static struct fb_ops nv04_fbcon_ops = {
> +	.owner = THIS_MODULE,
> +	.fb_check_var = drm_fb_helper_check_var,
> +	.fb_set_par = drm_fb_helper_set_par,
> +	.fb_setcolreg = drm_fb_helper_setcolreg,
> +	.fb_fillrect = nv04_fbcon_fillrect,
> +	.fb_copyarea = nv04_fbcon_copyarea,
> +	.fb_imageblit = nv04_fbcon_imageblit,
> +	.fb_sync = nouveau_fbcon_sync,
> +	.fb_pan_display = drm_fb_helper_pan_display,
> +	.fb_blank = drm_fb_helper_blank,
> +	.fb_setcmap = drm_fb_helper_setcmap,
> +};
> +
> +static struct fb_ops nv50_fbcon_ops = {
> +	.owner = THIS_MODULE,
> +	.fb_check_var = drm_fb_helper_check_var,
> +	.fb_set_par = drm_fb_helper_set_par,
> +	.fb_setcolreg = drm_fb_helper_setcolreg,
> +	.fb_fillrect = nv50_fbcon_fillrect,
> +	.fb_copyarea = nv50_fbcon_copyarea,
> +	.fb_imageblit = nv50_fbcon_imageblit,
> +	.fb_sync = nouveau_fbcon_sync,
> +	.fb_pan_display = drm_fb_helper_pan_display,
> +	.fb_blank = drm_fb_helper_blank,
> +	.fb_setcmap = drm_fb_helper_setcmap,
> +};
> +
>  static void nouveau_fbcon_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
>  				    u16 blue, int regno)
>  {
> @@ -324,9 +352,11 @@ nouveau_fbcon_create(struct drm_device *dev, uint32_t fb_width,
>  		switch (dev_priv->card_type) {
>  		case NV_50:
>  			nv50_fbcon_accel_init(info);
> +			info->fbops = &nv50_fbcon_ops;
>  			break;
>  		default:
>  			nv04_fbcon_accel_init(info);
> +			info->fbops = &nv04_fbcon_ops;
>  			break;
>  		};
>  	}
> diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.h b/drivers/gpu/drm/nouveau/nouveau_fbcon.h
> index 462e0b8..f9c34e1 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.h
> +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.h
> @@ -40,7 +40,13 @@ int nouveau_fbcon_remove(struct drm_device *dev, struct drm_framebuffer *fb);
>  void nouveau_fbcon_restore(void);
>  void nouveau_fbcon_zfill(struct drm_device *dev);
>  
> +void nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region);
> +void nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect);
> +void nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image);
>  int nv04_fbcon_accel_init(struct fb_info *info);
> +void nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect);
> +void nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region);
> +void nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image);
>  int nv50_fbcon_accel_init(struct fb_info *info);
>  
>  void nouveau_fbcon_gpu_lockup(struct fb_info *info);
> diff --git a/drivers/gpu/drm/nouveau/nv04_fbcon.c b/drivers/gpu/drm/nouveau/nv04_fbcon.c
> index d910873..fd01caa 100644
> --- a/drivers/gpu/drm/nouveau/nv04_fbcon.c
> +++ b/drivers/gpu/drm/nouveau/nv04_fbcon.c
> @@ -27,7 +27,7 @@
>  #include "nouveau_dma.h"
>  #include "nouveau_fbcon.h"
>  
> -static void
> +void
>  nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region)
>  {
>  	struct nouveau_fbcon_par *par = info->par;
> @@ -54,7 +54,7 @@ nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region)
>  	FIRE_RING(chan);
>  }
>  
> -static void
> +void
>  nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
>  {
>  	struct nouveau_fbcon_par *par = info->par;
> @@ -88,7 +88,7 @@ nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
>  	FIRE_RING(chan);
>  }
>  
> -static void
> +void
>  nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
>  {
>  	struct nouveau_fbcon_par *par = info->par;
> @@ -307,9 +307,6 @@ nv04_fbcon_accel_init(struct fb_info *info)
>  
>  	FIRE_RING(chan);
>  
> -	info->fbops->fb_fillrect = nv04_fbcon_fillrect;
> -	info->fbops->fb_copyarea = nv04_fbcon_copyarea;
> -	info->fbops->fb_imageblit = nv04_fbcon_imageblit;
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/nouveau/nv50_fbcon.c b/drivers/gpu/drm/nouveau/nv50_fbcon.c
> index e4f279e..0f57cdf 100644
> --- a/drivers/gpu/drm/nouveau/nv50_fbcon.c
> +++ b/drivers/gpu/drm/nouveau/nv50_fbcon.c
> @@ -3,7 +3,7 @@
>  #include "nouveau_dma.h"
>  #include "nouveau_fbcon.h"
>  
> -static void
> +void
>  nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
>  {
>  	struct nouveau_fbcon_par *par = info->par;
> @@ -46,7 +46,7 @@ nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
>  	FIRE_RING(chan);
>  }
>  
> -static void
> +void
>  nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region)
>  {
>  	struct nouveau_fbcon_par *par = info->par;
> @@ -81,7 +81,7 @@ nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region)
>  	FIRE_RING(chan);
>  }
>  
> -static void
> +void
>  nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
>  {
>  	struct nouveau_fbcon_par *par = info->par;
> @@ -262,9 +262,6 @@ nv50_fbcon_accel_init(struct fb_info *info)
>  	OUT_RING(chan, info->fix.smem_start - dev_priv->fb_phys +
>  			 dev_priv->vm_vram_base);
>  
> -	info->fbops->fb_fillrect = nv50_fbcon_fillrect;
> -	info->fbops->fb_copyarea = nv50_fbcon_copyarea;
> -	info->fbops->fb_imageblit = nv50_fbcon_imageblit;
>  	return 0;
>  }
>  




More information about the Nouveau mailing list