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 | } |