diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_abi16.c')
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_abi16.c | 29 | 
1 files changed, 20 insertions, 9 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c index cc79c796afe..41241922263 100644 --- a/drivers/gpu/drm/nouveau/nouveau_abi16.c +++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c @@ -241,15 +241,31 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)  	if (unlikely(!abi16))  		return -ENOMEM; -	client = nv_client(abi16->client); -	if (init->fb_ctxdma_handle == ~0 || init->tt_ctxdma_handle == ~0) -		return nouveau_abi16_put(abi16, -EINVAL); +	if (!drm->channel) +		return nouveau_abi16_put(abi16, -ENODEV); +	client = nv_client(abi16->client);  	device = nv_device(abi16->device);  	imem   = nouveau_instmem(device);  	pfb    = nouveau_fb(device); +	/* hack to allow channel engine type specification on kepler */ +	if (device->card_type >= NV_E0) { +		if (init->fb_ctxdma_handle != ~0) +			init->fb_ctxdma_handle = NVE0_CHANNEL_IND_ENGINE_GR; +		else +			init->fb_ctxdma_handle = init->tt_ctxdma_handle; + +		/* allow flips to be executed if this is a graphics channel */ +		init->tt_ctxdma_handle = 0; +		if (init->fb_ctxdma_handle == NVE0_CHANNEL_IND_ENGINE_GR) +			init->tt_ctxdma_handle = 1; +	} + +	if (init->fb_ctxdma_handle == ~0 || init->tt_ctxdma_handle == ~0) +		return nouveau_abi16_put(abi16, -EINVAL); +  	/* allocate "abi16 channel" data and make up a handle for it */  	init->channel = ffsll(~abi16->handles);  	if (!init->channel--) @@ -264,11 +280,6 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)  	abi16->handles |= (1 << init->channel);  	/* create channel object and initialise dma and fence management */ -	if (device->card_type >= NV_E0) { -		init->fb_ctxdma_handle = NVE0_CHANNEL_IND_ENGINE_GR; -		init->tt_ctxdma_handle = 0; -	} -  	ret = nouveau_channel_new(drm, cli, NVDRM_DEVICE, NVDRM_CHAN |  				  init->channel, init->fb_ctxdma_handle,  				  init->tt_ctxdma_handle, &chan->chan); @@ -378,7 +389,7 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS)  	struct nouveau_abi16_chan *chan, *temp;  	struct nouveau_abi16_ntfy *ntfy;  	struct nouveau_object *object; -	struct nv_dma_class args; +	struct nv_dma_class args = {};  	int ret;  	if (unlikely(!abi16))  |