diff options
| -rw-r--r-- | intel/intel_bufmgr_gem.c | 145 | 
1 files changed, 62 insertions, 83 deletions
diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c index 3446390c..968cb783 100644 --- a/intel/intel_bufmgr_gem.c +++ b/intel/intel_bufmgr_gem.c @@ -507,9 +507,7 @@ drm_intel_gem_bo_busy(drm_intel_bo *bo)  	memset(&busy, 0, sizeof(busy));  	busy.handle = bo_gem->gem_handle; -	do { -		ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_BUSY, &busy); -	} while (ret == -1 && errno == EINTR); +	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_BUSY, &busy);  	return (ret == 0 && busy.busy);  } @@ -523,7 +521,7 @@ drm_intel_gem_bo_madvise_internal(drm_intel_bufmgr_gem *bufmgr_gem,  	madv.handle = bo_gem->gem_handle;  	madv.madv = state;  	madv.retained = 1; -	ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_MADVISE, &madv); +	drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_MADVISE, &madv);  	return madv.retained;  } @@ -650,11 +648,9 @@ retry:  		memset(&create, 0, sizeof(create));  		create.size = bo_size; -		do { -			ret = ioctl(bufmgr_gem->fd, -				    DRM_IOCTL_I915_GEM_CREATE, -				    &create); -		} while (ret == -1 && errno == EINTR); +		ret = drmIoctl(bufmgr_gem->fd, +			       DRM_IOCTL_I915_GEM_CREATE, +			       &create);  		bo_gem->gem_handle = create.handle;  		bo_gem->bo.handle = bo_gem->gem_handle;  		if (ret != 0) { @@ -782,11 +778,9 @@ drm_intel_bo_gem_create_from_name(drm_intel_bufmgr *bufmgr,  	memset(&open_arg, 0, sizeof(open_arg));  	open_arg.name = handle; -	do { -		ret = ioctl(bufmgr_gem->fd, -			    DRM_IOCTL_GEM_OPEN, -			    &open_arg); -	} while (ret == -1 && errno == EINTR); +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_GEM_OPEN, +		       &open_arg);  	if (ret != 0) {  		fprintf(stderr, "Couldn't reference %s handle 0x%08x: %s\n",  			name, handle, strerror(errno)); @@ -806,7 +800,9 @@ drm_intel_bo_gem_create_from_name(drm_intel_bufmgr *bufmgr,  	memset(&get_tiling, 0, sizeof(get_tiling));  	get_tiling.handle = bo_gem->gem_handle; -	ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_GET_TILING, &get_tiling); +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_I915_GEM_GET_TILING, +		       &get_tiling);  	if (ret != 0) {  		drm_intel_gem_bo_unreference(&bo_gem->bo);  		return NULL; @@ -837,7 +833,7 @@ drm_intel_gem_bo_free(drm_intel_bo *bo)  	/* Close this object */  	memset(&close, 0, sizeof(close));  	close.handle = bo_gem->gem_handle; -	ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_GEM_CLOSE, &close); +	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_CLOSE, &close);  	if (ret != 0) {  		fprintf(stderr,  			"DRM_IOCTL_GEM_CLOSE %d failed (%s): %s\n", @@ -974,11 +970,9 @@ static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)  		mmap_arg.handle = bo_gem->gem_handle;  		mmap_arg.offset = 0;  		mmap_arg.size = bo->size; -		do { -			ret = ioctl(bufmgr_gem->fd, -				    DRM_IOCTL_I915_GEM_MMAP, -				    &mmap_arg); -		} while (ret == -1 && errno == EINTR); +		ret = drmIoctl(bufmgr_gem->fd, +			       DRM_IOCTL_I915_GEM_MMAP, +			       &mmap_arg);  		if (ret != 0) {  			ret = -errno;  			fprintf(stderr, @@ -1000,11 +994,9 @@ static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)  		set_domain.write_domain = I915_GEM_DOMAIN_CPU;  	else  		set_domain.write_domain = 0; -	do { -		ret = ioctl(bufmgr_gem->fd, -			    DRM_IOCTL_I915_GEM_SET_DOMAIN, -			    &set_domain); -	} while (ret == -1 && errno == EINTR); +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_I915_GEM_SET_DOMAIN, +		       &set_domain);  	if (ret != 0) {  		fprintf(stderr, "%s:%d: Error setting to CPU domain %d: %s\n",  			__FILE__, __LINE__, bo_gem->gem_handle, @@ -1036,11 +1028,9 @@ int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)  		mmap_arg.handle = bo_gem->gem_handle;  		/* Get the fake offset back... */ -		do { -			ret = ioctl(bufmgr_gem->fd, -				    DRM_IOCTL_I915_GEM_MMAP_GTT, -				    &mmap_arg); -		} while (ret == -1 && errno == EINTR); +		ret = drmIoctl(bufmgr_gem->fd, +			       DRM_IOCTL_I915_GEM_MMAP_GTT, +			       &mmap_arg);  		if (ret != 0) {  			ret = -errno;  			fprintf(stderr, @@ -1078,11 +1068,9 @@ int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)  	set_domain.handle = bo_gem->gem_handle;  	set_domain.read_domains = I915_GEM_DOMAIN_GTT;  	set_domain.write_domain = I915_GEM_DOMAIN_GTT; -	do { -		ret = ioctl(bufmgr_gem->fd, -			    DRM_IOCTL_I915_GEM_SET_DOMAIN, -			    &set_domain); -	} while (ret == -1 && errno == EINTR); +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_I915_GEM_SET_DOMAIN, +		       &set_domain);  	if (ret != 0) {  		fprintf(stderr, "%s:%d: Error setting domain %d: %s\n",  			__FILE__, __LINE__, bo_gem->gem_handle, @@ -1130,11 +1118,9 @@ static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)  	 * results show up in a timely manner.  	 */  	sw_finish.handle = bo_gem->gem_handle; -	do { -		ret = ioctl(bufmgr_gem->fd, -			    DRM_IOCTL_I915_GEM_SW_FINISH, -			    &sw_finish); -	} while (ret == -1 && errno == EINTR); +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_I915_GEM_SW_FINISH, +		       &sw_finish);  	ret = ret == -1 ? -errno : 0;  	bo->virtual = NULL; @@ -1157,11 +1143,9 @@ drm_intel_gem_bo_subdata(drm_intel_bo *bo, unsigned long offset,  	pwrite.offset = offset;  	pwrite.size = size;  	pwrite.data_ptr = (uint64_t) (uintptr_t) data; -	do { -		ret = ioctl(bufmgr_gem->fd, -			    DRM_IOCTL_I915_GEM_PWRITE, -			    &pwrite); -	} while (ret == -1 && errno == EINTR); +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_I915_GEM_PWRITE, +		       &pwrite);  	if (ret != 0) {  		ret = -errno;  		fprintf(stderr, @@ -1181,8 +1165,9 @@ drm_intel_gem_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, int crtc_id)  	int ret;  	get_pipe_from_crtc_id.crtc_id = crtc_id; -	ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID, -		    &get_pipe_from_crtc_id); +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID, +		       &get_pipe_from_crtc_id);  	if (ret != 0) {  		/* We return -1 here to signal that we don't  		 * know which pipe is associated with this crtc. @@ -1210,11 +1195,9 @@ drm_intel_gem_bo_get_subdata(drm_intel_bo *bo, unsigned long offset,  	pread.offset = offset;  	pread.size = size;  	pread.data_ptr = (uint64_t) (uintptr_t) data; -	do { -		ret = ioctl(bufmgr_gem->fd, -			    DRM_IOCTL_I915_GEM_PREAD, -			    &pread); -	} while (ret == -1 && errno == EINTR); +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_I915_GEM_PREAD, +		       &pread);  	if (ret != 0) {  		ret = -errno;  		fprintf(stderr, @@ -1251,11 +1234,9 @@ drm_intel_gem_bo_start_gtt_access(drm_intel_bo *bo, int write_enable)  	set_domain.handle = bo_gem->gem_handle;  	set_domain.read_domains = I915_GEM_DOMAIN_GTT;  	set_domain.write_domain = write_enable ? I915_GEM_DOMAIN_GTT : 0; -	do { -		ret = ioctl(bufmgr_gem->fd, -			    DRM_IOCTL_I915_GEM_SET_DOMAIN, -			    &set_domain); -	} while (ret == -1 && errno == EINTR); +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_I915_GEM_SET_DOMAIN, +		       &set_domain);  	if (ret != 0) {  		fprintf(stderr,  			"%s:%d: Error setting memory domains %d (%08x %08x): %s .\n", @@ -1526,12 +1507,9 @@ drm_intel_gem_bo_exec(drm_intel_bo *bo, int used,  	execbuf.DR1 = 0;  	execbuf.DR4 = DR4; -	do { -		ret = ioctl(bufmgr_gem->fd, -			    DRM_IOCTL_I915_GEM_EXECBUFFER, -			    &execbuf); -	} while (ret != 0 && errno == EINTR); - +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_I915_GEM_EXECBUFFER, +		       &execbuf);  	if (ret != 0) {  		ret = -errno;  		if (errno == ENOSPC) { @@ -1599,11 +1577,9 @@ drm_intel_gem_bo_mrb_exec2(drm_intel_bo *bo, int used,  	execbuf.rsvd1 = 0;  	execbuf.rsvd2 = 0; -	do { -		ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, -			    &execbuf); -	} while (ret != 0 && errno == EINTR); - +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_I915_GEM_EXECBUFFER2, +		       &execbuf);  	if (ret != 0) {  		ret = -errno;  		if (ret == -ENOSPC) { @@ -1658,12 +1634,9 @@ drm_intel_gem_bo_pin(drm_intel_bo *bo, uint32_t alignment)  	pin.handle = bo_gem->gem_handle;  	pin.alignment = alignment; -	do { -		ret = ioctl(bufmgr_gem->fd, -			    DRM_IOCTL_I915_GEM_PIN, -			    &pin); -	} while (ret == -1 && errno == EINTR); - +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_I915_GEM_PIN, +		       &pin);  	if (ret != 0)  		return -errno; @@ -1682,7 +1655,7 @@ drm_intel_gem_bo_unpin(drm_intel_bo *bo)  	memset(&unpin, 0, sizeof(unpin));  	unpin.handle = bo_gem->gem_handle; -	ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_UNPIN, &unpin); +	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_UNPIN, &unpin);  	if (ret != 0)  		return -errno; @@ -1706,6 +1679,10 @@ drm_intel_gem_bo_set_tiling_internal(drm_intel_bo *bo,  	memset(&set_tiling, 0, sizeof(set_tiling));  	do { +		/* set_tiling is slightly broken and overwrites the +		 * input on the error path, so we have to open code +		 * rmIoctl. +		 */  		set_tiling.handle = bo_gem->gem_handle;  		set_tiling.tiling_mode = tiling_mode;  		set_tiling.stride = stride; @@ -1713,7 +1690,7 @@ drm_intel_gem_bo_set_tiling_internal(drm_intel_bo *bo,  		ret = ioctl(bufmgr_gem->fd,  			    DRM_IOCTL_I915_GEM_SET_TILING,  			    &set_tiling); -	} while (ret == -1 && errno == EINTR); +	} while (ret == -1 && (errno == EINTR || errno == EAGAIN));  	if (ret == -1)  		return -errno; @@ -1768,7 +1745,7 @@ drm_intel_gem_bo_flink(drm_intel_bo *bo, uint32_t * name)  		memset(&flink, 0, sizeof(flink));  		flink.handle = bo_gem->gem_handle; -		ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_GEM_FLINK, &flink); +		ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_FLINK, &flink);  		if (ret != 0)  			return -errno;  		bo_gem->global_name = flink.name; @@ -2099,7 +2076,9 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size)  		return NULL;  	} -	ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture); +	ret = drmIoctl(bufmgr_gem->fd, +		       DRM_IOCTL_I915_GEM_GET_APERTURE, +		       &aperture);  	if (ret == 0)  		bufmgr_gem->gtt_size = aperture.aper_available_size; @@ -2115,7 +2094,7 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size)  	gp.param = I915_PARAM_CHIPSET_ID;  	gp.value = &bufmgr_gem->pci_device; -	ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); +	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);  	if (ret) {  		fprintf(stderr, "get chip id failed: %d [%d]\n", ret, errno);  		fprintf(stderr, "param: %d, val: %d\n", gp.param, *gp.value); @@ -2131,19 +2110,19 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size)  		bufmgr_gem->gen = 6;  	gp.param = I915_PARAM_HAS_EXECBUF2; -	ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); +	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);  	if (!ret)  		exec2 = 1;  	gp.param = I915_PARAM_HAS_BSD; -	ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); +	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);  	if (!ret)  		has_bsd = 1;  	if (bufmgr_gem->gen < 4) {  		gp.param = I915_PARAM_NUM_FENCES_AVAIL;  		gp.value = &bufmgr_gem->available_fences; -		ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); +		ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);  		if (ret) {  			fprintf(stderr, "get fences failed: %d [%d]\n", ret,  				errno);  | 
