diff options
author | Ben Widawsky <ben@bwidawsk.net> | 2012-04-26 19:03:03 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-05-03 05:18:22 -0400 |
commit | 604dd3ec75b2488dc81cd25dd85fcea23df25a9e (patch) | |
tree | 6967289798e3c3980150704f4ba54033bda5b2ee /drivers/gpu/drm/i915/i915_gem.c | |
parent | c58cf4f1082d81c42be89e9c6eeca6466954a70c (diff) |
drm/i915: extract __wait_seqno from i915_wait_request
i915_wait_request is actually a fairly large function encapsulating
quite a few different operations. Because being able to wait on seqnos
in various conditions is useful, extracting that bit of code to a helper
function seems useful
v2: pull the irq_get/put as well (Ben)
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 148e04baceb..b7a99bfa423 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -1819,6 +1819,36 @@ i915_gem_retire_work_handler(struct work_struct *work) | |||
1819 | mutex_unlock(&dev->struct_mutex); | 1819 | mutex_unlock(&dev->struct_mutex); |
1820 | } | 1820 | } |
1821 | 1821 | ||
1822 | static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno, | ||
1823 | bool interruptible) | ||
1824 | { | ||
1825 | drm_i915_private_t *dev_priv = ring->dev->dev_private; | ||
1826 | int ret = 0; | ||
1827 | |||
1828 | if (i915_seqno_passed(ring->get_seqno(ring), seqno)) | ||
1829 | return 0; | ||
1830 | |||
1831 | trace_i915_gem_request_wait_begin(ring, seqno); | ||
1832 | if (WARN_ON(!ring->irq_get(ring))) | ||
1833 | return -ENODEV; | ||
1834 | |||
1835 | #define EXIT_COND \ | ||
1836 | (i915_seqno_passed(ring->get_seqno(ring), seqno) || \ | ||
1837 | atomic_read(&dev_priv->mm.wedged)) | ||
1838 | |||
1839 | if (interruptible) | ||
1840 | ret = wait_event_interruptible(ring->irq_queue, | ||
1841 | EXIT_COND); | ||
1842 | else | ||
1843 | wait_event(ring->irq_queue, EXIT_COND); | ||
1844 | |||
1845 | ring->irq_put(ring); | ||
1846 | trace_i915_gem_request_wait_end(ring, seqno); | ||
1847 | #undef EXIT_COND | ||
1848 | |||
1849 | return ret; | ||
1850 | } | ||
1851 | |||
1822 | /** | 1852 | /** |
1823 | * Waits for a sequence number to be signaled, and cleans up the | 1853 | * Waits for a sequence number to be signaled, and cleans up the |
1824 | * request and object lists appropriately for that event. | 1854 | * request and object lists appropriately for that event. |
@@ -1861,24 +1891,7 @@ i915_wait_request(struct intel_ring_buffer *ring, | |||
1861 | seqno = request->seqno; | 1891 | seqno = request->seqno; |
1862 | } | 1892 | } |
1863 | 1893 | ||
1864 | if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) { | 1894 | ret = __wait_seqno(ring, seqno, dev_priv->mm.interruptible); |
1865 | trace_i915_gem_request_wait_begin(ring, seqno); | ||
1866 | |||
1867 | if (WARN_ON(!ring->irq_get(ring))) | ||
1868 | return -ENODEV; | ||
1869 | |||
1870 | if (dev_priv->mm.interruptible) | ||
1871 | ret = wait_event_interruptible(ring->irq_queue, | ||
1872 | i915_seqno_passed(ring->get_seqno(ring), seqno) | ||
1873 | || atomic_read(&dev_priv->mm.wedged)); | ||
1874 | else | ||
1875 | wait_event(ring->irq_queue, | ||
1876 | i915_seqno_passed(ring->get_seqno(ring), seqno) | ||
1877 | || atomic_read(&dev_priv->mm.wedged)); | ||
1878 | |||
1879 | ring->irq_put(ring); | ||
1880 | trace_i915_gem_request_wait_end(ring, seqno); | ||
1881 | } | ||
1882 | if (atomic_read(&dev_priv->mm.wedged)) | 1895 | if (atomic_read(&dev_priv->mm.wedged)) |
1883 | ret = -EAGAIN; | 1896 | ret = -EAGAIN; |
1884 | 1897 | ||