[Nouveau] [PATCH 2/2] drm/nv04-nv10: Don't jump back to our PUT offset on PUSHBUF_CALL.

Ben Skeggs skeggsb at gmail.com
Sun Nov 8 14:20:06 PST 2009


On Fri, 2009-11-06 at 16:11 +0100, Francisco Jerez wrote:
> It causes occasional DMA_PUSHER errors.
> 
> Signed-off-by: Francisco Jerez <currojerez at riseup.net>
Reviewed-by: Ben Skeggs <bskeggs at redhat.com>

> ---
>  drivers/gpu/drm/nouveau/nouveau_gem.c |   12 ++++++++----
>  1 files changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
> index a95b8f7..b8c3664 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_gem.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
> @@ -604,7 +604,7 @@ nouveau_gem_ioctl_pushbuf_call(struct drm_device *dev, void *data,
>  	struct drm_gem_object *gem;
>  	struct nouveau_bo *pbbo;
>  	struct list_head list;
> -	int ret = 0, do_reloc = 0;
> +	int i, ret = 0, do_reloc = 0;
>  
>  	NOUVEAU_CHECK_INITIALISED_WITH_RETURN;
>  	NOUVEAU_GET_USER_CHANNEL_WITH_RETURN(req->channel, file_priv, chan);
> @@ -680,8 +680,8 @@ nouveau_gem_ioctl_pushbuf_call(struct drm_device *dev, void *data,
>  	if (!PUSHBUF_CAL) {
>  		uint32_t retaddy;
>  
> -		if (chan->dma.free < 4) {
> -			ret = nouveau_dma_wait(chan, 4);
> +		if (chan->dma.free < 4 + NOUVEAU_DMA_SKIPS) {
> +			ret = nouveau_dma_wait(chan, 4 + NOUVEAU_DMA_SKIPS);
>  			if (ret) {
>  				NV_ERROR(dev, "jmp_space: %d\n", ret);
>  				goto out;
> @@ -738,7 +738,7 @@ nouveau_gem_ioctl_pushbuf_call(struct drm_device *dev, void *data,
>  				  req->offset) | 2);
>  		OUT_RING(chan, 0);
>  	} else {
> -		ret = RING_SPACE(chan, 2);
> +		ret = RING_SPACE(chan, 2 + NOUVEAU_DMA_SKIPS);
>  		if (ret) {
>  			NV_ERROR(dev, "jmp_space: %d\n", ret);
>  			goto out;
> @@ -746,6 +746,10 @@ nouveau_gem_ioctl_pushbuf_call(struct drm_device *dev, void *data,
>  		OUT_RING(chan, ((pbbo->bo.mem.mm_node->start << PAGE_SHIFT) +
>  				  req->offset) | 0x20000000);
>  		OUT_RING(chan, 0);
> +
> +		/* Space the jumps apart with NOPs. */
> +		for (i = 0; i < NOUVEAU_DMA_SKIPS; i++)
> +			OUT_RING(chan, 0);
>  	}
>  
>  	ret = nouveau_fence_emit(fence);




More information about the Nouveau mailing list