[Nouveau] [PATCH] disp/gf119-: avoid creating non-existent heads

Ben Skeggs skeggsb at gmail.com
Mon Jul 3 22:02:15 UTC 2017


On 07/04/2017 03:06 AM, Ilia Mirkin wrote:
> We assume that each board has 4 heads for GF119+. However this is not
> necessarily true - in the case of a GP108 board, the register indicated
> that there were only 2.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101601
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
> 
> I'm not extremely happy about the fact that we have to duplicate the head count
> in both the nv50_display logic for creating DRM-side CRTC's, as well as the
> nvkm-side logic for creating heads. However I don't immediately see an easy way
> around it without creating a nvif ioctl to get the number of heads.
Yeah, I have WIP stuff from long ago that would make this nicer, but for
now it's fine to do what you've done here.

> 
>  drm/nouveau/nv50_display.c               | 8 +++++---
>  drm/nouveau/nvkm/engine/disp/gf119.c     | 2 +-
>  drm/nouveau/nvkm/engine/disp/headgf119.c | 4 +++-
>  3 files changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/drm/nouveau/nv50_display.c b/drm/nouveau/nv50_display.c
> index e3132a2c..e2170efb 100644
> --- a/drm/nouveau/nv50_display.c
> +++ b/drm/nouveau/nv50_display.c
> @@ -4443,11 +4443,13 @@ nv50_display_create(struct drm_device *dev)
>  
>  	/* create crtc objects to represent the hw heads */
>  	if (disp->disp->oclass >= GF110_DISP)
> -		crtcs = nvif_rd32(&device->object, 0x022448);
> +		crtcs = nvif_rd32(&device->object, 0x612004) & 0xf;
>  	else
> -		crtcs = 2;
> +		crtcs = 0x3;
>  
> -	for (i = 0; i < crtcs; i++) {
> +	for (i = 0; i < fls(crtcs); i++) {
> +		if (!(crtcs & (1 << i)))
> +			continue;
>  		ret = nv50_head_create(dev, i);
>  		if (ret)
>  			goto out;
> diff --git a/drm/nouveau/nvkm/engine/disp/gf119.c b/drm/nouveau/nvkm/engine/disp/gf119.c
> index d8765b57..415987e9 100644
> --- a/drm/nouveau/nvkm/engine/disp/gf119.c
> +++ b/drm/nouveau/nvkm/engine/disp/gf119.c
> @@ -168,7 +168,7 @@ int
>  gf119_disp_new_(const struct nv50_disp_func *func, struct nvkm_device *device,
>  		int index, struct nvkm_disp **pdisp)
>  {
> -	u32 heads = nvkm_rd32(device, 0x022448);
> +	u32 heads = fls(nvkm_rd32(device, 0x612004) & 0xf);
>  	return nv50_disp_new_(func, device, index, heads, pdisp);
I'd drop this change.  I suspect 0x022448 is still the "maximum head
count" register, and that 0x612004 is just a disable mask.

>  }
>  
> diff --git a/drm/nouveau/nvkm/engine/disp/headgf119.c b/drm/nouveau/nvkm/engine/disp/headgf119.c
> index b3355275..8d44bdf6 100644
> --- a/drm/nouveau/nvkm/engine/disp/headgf119.c
> +++ b/drm/nouveau/nvkm/engine/disp/headgf119.c
> @@ -92,5 +92,7 @@ gf119_head = {
>  int
>  gf119_head_new(struct nvkm_disp *disp, int id)
>  {
> -	return nvkm_head_new_(&gf119_head, disp, id);
> +	if (nvkm_rd32(disp->engine.subdev.device, 0x612004) & 0xf & (1 << id))
> +		return nvkm_head_new_(&gf119_head, disp, id);
> +	return 0;
>  }
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/nouveau/attachments/20170704/3bbe6b85/attachment.sig>


More information about the Nouveau mailing list