[PATCH] drm/radeon: Add support for userspace fence waits

David Airlie airlied at redhat.com
Tue Jan 31 10:55:43 PST 2012



Some comments below.

> +	struct radeon_device *rdev = dev->dev_private;
> +	struct drm_gem_object *gobj;
> +	struct radeon_bo *robj;
> +	void *buffer_data;
> +	uint32_t *fence_data;
> +	int r = 0;
> +	long timeout;
> +	int ring = RADEON_RING_TYPE_GFX_INDEX;
> +
> +	/* If you're implementing this for other rings, you'll want to
> share
> +	   code with radeon_cs_get_ring in radeon_cs.c */
> +	if (args->ring != RADEON_CS_RING_GFX) {
> +		return -EINVAL;
> +	}
> +
> +	gobj = drm_gem_object_lookup(dev, filp, args->handle);
> +	if (gobj == NULL) {
> +		return -ENOENT;
> +	}
> +	robj = gem_to_radeon_bo(gobj);
> +
> +	if (gobj->size < args->offset) {
> +		r = -EINVAL;
> +		goto unreference;
> +	}
> +
> +	r = radeon_bo_reserve(robj, true);
> +	if (r) {
> +		goto unreference;
> +	}
> +
> +	r = radeon_bo_pin(robj, RADEON_GEM_DOMAIN_GTT, NULL);
> +	if (r) {
> +		goto unreserve;
> +	}
> +
> +	r = radeon_bo_kmap(robj, &buffer_data);
> +	if (r) {
> +		goto unpin;
> +	}
> +


Do you need to pin it? I think if you have it reserved and you are in here you shouldn't need to. (unless kmapping requires a pin)/


> +	radeon_irq_kms_sw_irq_get(rdev, ring);
> +
> +	fence_data = (uint32_t*)buffer_data;
> +	timeout =
> an
> + * interrupt and the value in the buffer might have changed.
> + */
> +struct drm_radeon_gem_wait_user_fence {
> +	uint32_t                handle;
> +	uint32_t                ring;
> +	uint64_t                offset;
> +	uint32_t                value;
> +	uint64_t                timeout_usec;

Align things here, 64 then 64 then 32 32 32 and a 32 pad.



More information about the dri-devel mailing list