[Nouveau] [PATCH] drm/nouveau: Acknowledge DMA_VTX_PROTECTION PGRAPH interrupts

Francisco Jerez currojerez at riseup.net
Sun Jan 17 10:16:14 PST 2010


Luca Barbieri <luca at luca-barbieri.com> writes:

> Currently Nouveau is unable to dismiss DMA_VTX_PROTECTION errors,
> which results in an infinite loop in the interrupt handler.
>
> These errors are caused both by bugs in the Gallium driver and by
> user-specified index buffers with out of bounds indices.
>
> By mmio-tracing the nVidia drivers, I found out how this is done.
> On DMA_VTX_PROTECTION, The nVidia driver reads the register 0x402000,
> always getting the value 4, and then writes 4 back to 0x402000.
>
> This patch adds that logic by reading 0x402000 and writing the same
> value back.
> It's unclear what should happen if the value read is not 4, and
> the current approach might not be the correct one.
>
> To test this, modify mesa/progs/trivial/vbo-drawrange.c, defining
> ELTOBJ to 1 and replacing indices with huge out of bounds integers.
>
> Without this patch, the GPU and/or kernel should lock up.
> With this patch, it should misrender as expected but not lock up.
>
> The errors are still logged since they are useful for development.
>
> This has been tested on NV49 and may not work on other cards.
>
> To find out how things work on other cards, run the aforementioned
> test using the blob with mmiotrace and grep for a read of the PGRAPH
> source register.
>
> Signed-off-by: Luca Barbieri <luca at luca-barbieri.com>
> ---
>  drivers/gpu/drm/nouveau/nouveau_irq.c |    9 ++++++++-
>  1 files changed, 8 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/gpu/drm/nouveau/nouveau_irq.c b/drivers/gpu/drm/nouveau/nouveau_irq.c
> index 919a619..14de5a1 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_irq.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_irq.c
> @@ -483,9 +483,16 @@ nouveau_pgraph_intr_error(struct drm_device *dev, uint32_t nsource)
>  	if (nsource & NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD) {
>  		if (nouveau_pgraph_intr_swmthd(dev, &trap))
>  			unhandled = 1;
> -	} else {
> +	} else if(nsource & NV03_PGRAPH_NSOURCE_DMA_VTX_PROTECTION) {
> +		uint32_t v = nv_rd32(dev, 0x402000);
> +		nv_wr32(dev, 0x402000, v);
> +
> +		/* dump the error anyway for now: it's useful for
> +		   Gallium development */
>  		unhandled = 1;
>  	}
> +	else
> +		unhandled = 1;
>  
>  	if (unhandled && nouveau_ratelimit())
>  		nouveau_graph_dump_trap_info(dev, "PGRAPH_ERROR", &trap);

Both pushed. Thanks!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
Url : http://lists.freedesktop.org/archives/nouveau/attachments/20100117/c66b7e74/attachment.pgp 


More information about the Nouveau mailing list