Subversion Repositories Kolibri OS

Rev

Rev 1125 | Rev 1182 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1125 Rev 1179
Line 51... Line 51...
51
	if (!rdev->cp.ready) {
51
	if (!rdev->cp.ready) {
52
		/* FIXME: cp is not running assume everythings is done right
52
		/* FIXME: cp is not running assume everythings is done right
53
		 * away
53
		 * away
54
		 */
54
		 */
55
		WREG32(rdev->fence_drv.scratch_reg, fence->seq);
55
		WREG32(rdev->fence_drv.scratch_reg, fence->seq);
56
	} else {
56
	} else
57
		radeon_fence_ring_emit(rdev, fence);
57
		radeon_fence_ring_emit(rdev, fence);
58
	}
58
 
59
	fence->emited = true;
59
	fence->emited = true;
60
	fence->timeout = jiffies + ((2000 * HZ) / 1000);
60
	fence->timeout = jiffies + ((2000 * HZ) / 1000);
61
	list_del(&fence->list);
61
	list_del(&fence->list);
62
	list_add_tail(&fence->list, &rdev->fence_drv.emited);
62
	list_add_tail(&fence->list, &rdev->fence_drv.emited);
63
	write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
63
	write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
Line 166... Line 166...
166
	}
166
	}
167
	write_unlock_irqrestore(&fence->rdev->fence_drv.lock, irq_flags);
167
	write_unlock_irqrestore(&fence->rdev->fence_drv.lock, irq_flags);
168
	return signaled;
168
	return signaled;
169
}
169
}
Line -... Line 170...
-
 
170
 
-
 
171
int r600_fence_wait(struct radeon_fence *fence,  bool intr, bool lazy)
-
 
172
{
-
 
173
	struct radeon_device *rdev;
-
 
174
	int ret = 0;
-
 
175
 
-
 
176
	rdev = fence->rdev;
-
 
177
 
-
 
178
	__set_current_state(intr ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
-
 
179
 
-
 
180
	while (1) {
-
 
181
		if (radeon_fence_signaled(fence))
-
 
182
			break;
-
 
183
 
-
 
184
		if (time_after_eq(jiffies, fence->timeout)) {
-
 
185
			ret = -EBUSY;
-
 
186
			break;
-
 
187
		}
-
 
188
 
-
 
189
		if (lazy)
-
 
190
			schedule_timeout(1);
-
 
191
 
-
 
192
		if (intr && signal_pending(current)) {
-
 
193
			ret = -ERESTARTSYS;
-
 
194
			break;
-
 
195
		}
-
 
196
	}
-
 
197
	__set_current_state(TASK_RUNNING);
-
 
198
	return ret;
-
 
199
}
-
 
200
 
170
 
201
 
171
int radeon_fence_wait(struct radeon_fence *fence, bool interruptible)
202
int radeon_fence_wait(struct radeon_fence *fence, bool intr)
172
{
203
{
173
	struct radeon_device *rdev;
204
	struct radeon_device *rdev;
174
	unsigned long cur_jiffies;
205
	unsigned long cur_jiffies;
175
	unsigned long timeout;
206
	unsigned long timeout;
Line 183... Line 214...
183
	}
214
	}
184
	rdev = fence->rdev;
215
	rdev = fence->rdev;
185
	if (radeon_fence_signaled(fence)) {
216
	if (radeon_fence_signaled(fence)) {
186
		return 0;
217
		return 0;
187
	}
218
	}
-
 
219
 
-
 
220
	if (rdev->family >= CHIP_R600) {
-
 
221
		r = r600_fence_wait(fence, intr, 0);
-
 
222
		if (r == -ERESTARTSYS)
-
 
223
			return -EBUSY;
-
 
224
		return r;
-
 
225
	}
-
 
226
 
188
retry:
227
retry:
189
	cur_jiffies = jiffies;
228
	cur_jiffies = jiffies;
190
	timeout = HZ / 100;
229
	timeout = HZ / 100;
191
	if (time_after(fence->timeout, cur_jiffies)) {
230
	if (time_after(fence->timeout, cur_jiffies)) {
192
		timeout = fence->timeout - cur_jiffies;
231
		timeout = fence->timeout - cur_jiffies;
193
	}
232
	}
194
	if (interruptible) {
233
	if (intr) {
195
		r = wait_event_interruptible_timeout(rdev->fence_drv.queue,
234
		r = wait_event_interruptible_timeout(rdev->fence_drv.queue,
196
				radeon_fence_signaled(fence), timeout);
235
				radeon_fence_signaled(fence), timeout);
197
		if (unlikely(r == -ERESTARTSYS)) {
236
		if (unlikely(r == -ERESTARTSYS)) {
198
			return -ERESTART;
237
			return -EBUSY;
199
		}
238
		}
200
	} else {
239
	} else {
201
		r = wait_event_timeout(rdev->fence_drv.queue,
240
		r = wait_event_timeout(rdev->fence_drv.queue,
202
			 radeon_fence_signaled(fence), timeout);
241
			 radeon_fence_signaled(fence), timeout);
203
	}
242
	}