[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