Rev 3260 | Rev 3266 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3260 | Rev 3263 | ||
---|---|---|---|
Line 35... | Line 35... | ||
35 | //#include |
35 | //#include |
36 | #include |
36 | #include |
Line 37... | Line 37... | ||
37 | 37 | ||
Line -... | Line 38... | ||
- | 38 | extern int x86_clflush_size; |
|
- | 39 | ||
- | 40 | #define PROT_READ 0x1 /* page can be read */ |
|
- | 41 | #define PROT_WRITE 0x2 /* page can be written */ |
|
38 | extern int x86_clflush_size; |
42 | #define MAP_SHARED 0x01 /* Share changes */ |
39 | 43 | ||
40 | #undef mb |
44 | #undef mb |
41 | #undef rmb |
45 | #undef rmb |
42 | #undef wmb |
46 | #undef wmb |
43 | #define mb() asm volatile("mfence") |
47 | #define mb() asm volatile("mfence") |
Line -... | Line 48... | ||
- | 48 | #define rmb() asm volatile ("lfence") |
|
- | 49 | #define wmb() asm volatile ("sfence") |
|
- | 50 | ||
- | 51 | unsigned long vm_mmap(struct file *file, unsigned long addr, |
|
44 | #define rmb() asm volatile ("lfence") |
52 | unsigned long len, unsigned long prot, |
45 | #define wmb() asm volatile ("sfence") |
53 | unsigned long flag, unsigned long offset); |
46 | 54 | ||
47 | static inline void clflush(volatile void *__p) |
55 | static inline void clflush(volatile void *__p) |
Line 1294... | Line 1302... | ||
1294 | 1302 | ||
1295 | obj = drm_gem_object_lookup(dev, file, args->handle); |
1303 | obj = drm_gem_object_lookup(dev, file, args->handle); |
1296 | if (obj == NULL) |
1304 | if (obj == NULL) |
Line 1297... | Line 1305... | ||
1297 | return -ENOENT; |
1305 | return -ENOENT; |
1298 | 1306 | ||
1299 | dbgprintf("%s offset %lld size %lld not supported\n", |
1307 | dbgprintf("%s offset %lld size %lld\n", |
1300 | args->offset, args->size); |
1308 | __FUNCTION__, args->offset, args->size); |
1301 | /* prime objects have no backing filp to GEM mmap |
1309 | /* prime objects have no backing filp to GEM mmap |
1302 | * pages from. |
1310 | * pages from. |
1303 | */ |
1311 | */ |
1304 | if (!obj->filp) { |
1312 | if (!obj->filp) { |
1305 | drm_gem_object_unreference_unlocked(obj); |
1313 | drm_gem_object_unreference_unlocked(obj); |
Line 1306... | Line 1314... | ||
1306 | return -EINVAL; |
1314 | return -EINVAL; |
1307 | } |
1315 | } |
1308 | 1316 | ||
1309 | // addr = vm_mmap(obj->filp, 0, args->size, |
1317 | addr = vm_mmap(obj->filp, 0, args->size, |
1310 | // PROT_READ | PROT_WRITE, MAP_SHARED, |
1318 | PROT_READ | PROT_WRITE, MAP_SHARED, |
1311 | // args->offset); |
1319 | args->offset); |
Line 1312... | Line 1320... | ||
1312 | drm_gem_object_unreference_unlocked(obj); |
1320 | drm_gem_object_unreference_unlocked(obj); |
1313 | // if (IS_ERR((void *)addr)) |
- | |
Line 1314... | Line 1321... | ||
1314 | // return addr; |
1321 | if (IS_ERR((void *)addr)) |
1315 | 1322 | return addr; |
|
Line 1442... | Line 1449... | ||
1442 | { |
1449 | { |
1443 | // struct inode *inode; |
1450 | // struct inode *inode; |
Line 1444... | Line 1451... | ||
1444 | 1451 | ||
Line 1445... | Line 1452... | ||
1445 | // i915_gem_object_free_mmap_offset(obj); |
1452 | // i915_gem_object_free_mmap_offset(obj); |
1446 | 1453 | ||
Line 1447... | Line 1454... | ||
1447 | // if (obj->base.filp == NULL) |
1454 | if (obj->base.filp == NULL) |
1448 | // return; |
1455 | return; |
1449 | 1456 | ||
1450 | /* Our goal here is to return as much of the memory as |
1457 | /* Our goal here is to return as much of the memory as |
Line 1489... | Line 1496... | ||
1489 | for_each_sg(obj->pages->sgl, sg, page_count, i) { |
1496 | for_each_sg(obj->pages->sgl, sg, page_count, i) { |
1490 | struct page *page = sg_page(sg); |
1497 | struct page *page = sg_page(sg); |
Line 1491... | Line 1498... | ||
1491 | 1498 | ||
1492 | 1499 | ||
1493 | 1500 | ||
1494 | page_cache_release(page); |
1501 | // page_cache_release(page); |
Line 1495... | Line 1502... | ||
1495 | } |
1502 | } |
Line 1782... | Line 1789... | ||
1782 | request->emitted_jiffies = GetTimerTicks(); |
1789 | request->emitted_jiffies = GetTimerTicks(); |
1783 | was_empty = list_empty(&ring->request_list); |
1790 | was_empty = list_empty(&ring->request_list); |
1784 | list_add_tail(&request->list, &ring->request_list); |
1791 | list_add_tail(&request->list, &ring->request_list); |
1785 | request->file_priv = NULL; |
1792 | request->file_priv = NULL; |
Line -... | Line 1793... | ||
- | 1793 | ||
- | 1794 | if (file) { |
|
Line -... | Line 1795... | ||
- | 1795 | struct drm_i915_file_private *file_priv = file->driver_priv; |
|
- | 1796 | ||
- | 1797 | spin_lock(&file_priv->mm.lock); |
|
- | 1798 | request->file_priv = file_priv; |
|
- | 1799 | list_add_tail(&request->client_list, |
|
- | 1800 | &file_priv->mm.request_list); |
|
- | 1801 | spin_unlock(&file_priv->mm.lock); |
|
- | 1802 | } |
|
1786 | 1803 | ||
Line 1787... | Line 1804... | ||
1787 | 1804 | trace_i915_gem_request_add(ring, request->seqno); |
|
1788 | ring->outstanding_lazy_request = 0; |
1805 | ring->outstanding_lazy_request = 0; |
1789 | 1806 | ||
Line 1803... | Line 1820... | ||
1803 | if (out_seqno) |
1820 | if (out_seqno) |
1804 | *out_seqno = request->seqno; |
1821 | *out_seqno = request->seqno; |
1805 | return 0; |
1822 | return 0; |
1806 | } |
1823 | } |
Line -... | Line 1824... | ||
- | 1824 | ||
- | 1825 | static inline void |
|
- | 1826 | i915_gem_request_remove_from_client(struct drm_i915_gem_request *request) |
|
- | 1827 | { |
|
Line -... | Line 1828... | ||
- | 1828 | struct drm_i915_file_private *file_priv = request->file_priv; |
|
- | 1829 | ||
Line -... | Line 1830... | ||
- | 1830 | if (!file_priv) |
|
- | 1831 | return; |
|
- | 1832 | ||
- | 1833 | spin_lock(&file_priv->mm.lock); |
|
- | 1834 | if (request->file_priv) { |
|
- | 1835 | list_del(&request->client_list); |
|
- | 1836 | request->file_priv = NULL; |
|
Line 1807... | Line 1837... | ||
1807 | 1837 | } |
|
1808 | 1838 | spin_unlock(&file_priv->mm.lock); |
|
1809 | 1839 | } |
|
1810 | 1840 | ||
Line 1817... | Line 1847... | ||
1817 | request = list_first_entry(&ring->request_list, |
1847 | request = list_first_entry(&ring->request_list, |
1818 | struct drm_i915_gem_request, |
1848 | struct drm_i915_gem_request, |
1819 | list); |
1849 | list); |
Line 1820... | Line 1850... | ||
1820 | 1850 | ||
1821 | list_del(&request->list); |
1851 | list_del(&request->list); |
1822 | // i915_gem_request_remove_from_client(request); |
1852 | i915_gem_request_remove_from_client(request); |
1823 | kfree(request); |
1853 | kfree(request); |
Line 1824... | Line 1854... | ||
1824 | } |
1854 | } |
1825 | 1855 | ||
Line 1885... | Line 1915... | ||
1885 | void |
1915 | void |
1886 | i915_gem_retire_requests_ring(struct intel_ring_buffer *ring) |
1916 | i915_gem_retire_requests_ring(struct intel_ring_buffer *ring) |
1887 | { |
1917 | { |
1888 | uint32_t seqno; |
1918 | uint32_t seqno; |
Line -... | Line 1919... | ||
- | 1919 | ||
- | 1920 | ENTER(); |
|
1889 | 1921 | ||
1890 | if (list_empty(&ring->request_list)) |
1922 | if (list_empty(&ring->request_list)) |
Line 1891... | Line 1923... | ||
1891 | return; |
1923 | return; |
Line 1911... | Line 1943... | ||
1911 | * of the GPU head. |
1943 | * of the GPU head. |
1912 | */ |
1944 | */ |
1913 | ring->last_retired_head = request->tail; |
1945 | ring->last_retired_head = request->tail; |
Line 1914... | Line 1946... | ||
1914 | 1946 | ||
- | 1947 | list_del(&request->list); |
|
1915 | list_del(&request->list); |
1948 | i915_gem_request_remove_from_client(request); |
1916 | kfree(request); |
1949 | kfree(request); |
Line 1917... | Line 1950... | ||
1917 | } |
1950 | } |
1918 | 1951 | ||
Line 1937... | Line 1970... | ||
1937 | ring->irq_put(ring); |
1970 | ring->irq_put(ring); |
1938 | ring->trace_irq_seqno = 0; |
1971 | ring->trace_irq_seqno = 0; |
1939 | } |
1972 | } |
Line 1940... | Line 1973... | ||
1940 | 1973 | ||
- | 1974 | WARN_ON(i915_verify_lists(ring->dev)); |
|
1941 | WARN_ON(i915_verify_lists(ring->dev)); |
1975 | LEAVE(); |
Line 1942... | Line 1976... | ||
1942 | } |
1976 | } |
1943 | 1977 | ||
1944 | void |
1978 | void |
Line 1959... | Line 1993... | ||
1959 | struct drm_device *dev; |
1993 | struct drm_device *dev; |
1960 | struct intel_ring_buffer *ring; |
1994 | struct intel_ring_buffer *ring; |
1961 | bool idle; |
1995 | bool idle; |
1962 | int i; |
1996 | int i; |
Line -... | Line 1997... | ||
- | 1997 | ||
- | 1998 | ENTER(); |
|
1963 | 1999 | ||
1964 | dev_priv = container_of(work, drm_i915_private_t, |
2000 | dev_priv = container_of(work, drm_i915_private_t, |
1965 | mm.retire_work.work); |
2001 | mm.retire_work.work); |
Line 1966... | Line 2002... | ||
1966 | dev = dev_priv->dev; |
2002 | dev = dev_priv->dev; |
Line 1988... | Line 2024... | ||
1988 | queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ); |
2024 | queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ); |
1989 | if (idle) |
2025 | if (idle) |
1990 | intel_mark_idle(dev); |
2026 | intel_mark_idle(dev); |
Line 1991... | Line 2027... | ||
1991 | 2027 | ||
- | 2028 | mutex_unlock(&dev->struct_mutex); |
|
- | 2029 | ||
1992 | mutex_unlock(&dev->struct_mutex); |
2030 | LEAVE(); |
Line 1993... | Line 2031... | ||
1993 | } |
2031 | } |
1994 | 2032 | ||
1995 | /** |
2033 | /** |
Line 2125... | Line 2163... | ||
2125 | i915_gem_object_unbind(struct drm_i915_gem_object *obj) |
2163 | i915_gem_object_unbind(struct drm_i915_gem_object *obj) |
2126 | { |
2164 | { |
2127 | drm_i915_private_t *dev_priv = obj->base.dev->dev_private; |
2165 | drm_i915_private_t *dev_priv = obj->base.dev->dev_private; |
2128 | int ret = 0; |
2166 | int ret = 0; |
Line -... | Line 2167... | ||
- | 2167 | ||
- | 2168 | if(obj == get_fb_obj()) |
|
- | 2169 | return 0; |
|
2129 | 2170 | ||
2130 | if (obj->gtt_space == NULL) |
2171 | if (obj->gtt_space == NULL) |
Line 2131... | Line 2172... | ||
2131 | return 0; |
2172 | return 0; |
2132 | 2173 | ||
Line 3103... | Line 3144... | ||
3103 | old_write_domain); |
3144 | old_write_domain); |
Line 3104... | Line 3145... | ||
3104 | 3145 | ||
3105 | return 0; |
3146 | return 0; |
Line 3106... | Line -... | ||
3106 | } |
- | |
3107 | 3147 | } |
|
3108 | #if 0 |
3148 | |
3109 | /* Throttle our rendering by waiting until the ring has completed our requests |
3149 | /* Throttle our rendering by waiting until the ring has completed our requests |
3110 | * emitted over 20 msec ago. |
3150 | * emitted over 20 msec ago. |
3111 | * |
3151 | * |
Line 3119... | Line 3159... | ||
3119 | static int |
3159 | static int |
3120 | i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file) |
3160 | i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file) |
3121 | { |
3161 | { |
3122 | struct drm_i915_private *dev_priv = dev->dev_private; |
3162 | struct drm_i915_private *dev_priv = dev->dev_private; |
3123 | struct drm_i915_file_private *file_priv = file->driver_priv; |
3163 | struct drm_i915_file_private *file_priv = file->driver_priv; |
3124 | unsigned long recent_enough = GetTimerTics() - msecs_to_jiffies(20); |
3164 | unsigned long recent_enough = GetTimerTicks() - msecs_to_jiffies(20); |
3125 | struct drm_i915_gem_request *request; |
3165 | struct drm_i915_gem_request *request; |
3126 | struct intel_ring_buffer *ring = NULL; |
3166 | struct intel_ring_buffer *ring = NULL; |
3127 | u32 seqno = 0; |
3167 | u32 seqno = 0; |
3128 | int ret; |
3168 | int ret; |
Line 3147... | Line 3187... | ||
3147 | if (ret == 0) |
3187 | if (ret == 0) |
3148 | queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, 0); |
3188 | queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, 0); |
Line 3149... | Line 3189... | ||
3149 | 3189 | ||
3150 | return ret; |
3190 | return ret; |
3151 | } |
- | |
Line 3152... | Line 3191... | ||
3152 | #endif |
3191 | } |
3153 | 3192 | ||
3154 | int |
3193 | int |
3155 | i915_gem_object_pin(struct drm_i915_gem_object *obj, |
3194 | i915_gem_object_pin(struct drm_i915_gem_object *obj, |
Line 3160... | Line 3199... | ||
3160 | int ret; |
3199 | int ret; |
Line 3161... | Line 3200... | ||
3161 | 3200 | ||
3162 | if (WARN_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT)) |
3201 | if (WARN_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT)) |
Line 3163... | Line -... | ||
3163 | return -EBUSY; |
- | |
3164 | 3202 | return -EBUSY; |
|
3165 | #if 0 |
3203 | |
3166 | if (obj->gtt_space != NULL) { |
3204 | if (obj->gtt_space != NULL) { |
3167 | if ((alignment && obj->gtt_offset & (alignment - 1)) || |
3205 | if ((alignment && obj->gtt_offset & (alignment - 1)) || |
3168 | (map_and_fenceable && !obj->map_and_fenceable)) { |
3206 | (map_and_fenceable && !obj->map_and_fenceable)) { |
Line 3176... | Line 3214... | ||
3176 | ret = i915_gem_object_unbind(obj); |
3214 | ret = i915_gem_object_unbind(obj); |
3177 | if (ret) |
3215 | if (ret) |
3178 | return ret; |
3216 | return ret; |
3179 | } |
3217 | } |
3180 | } |
3218 | } |
3181 | #endif |
- | |
Line 3182... | Line 3219... | ||
3182 | 3219 | ||
3183 | if (obj->gtt_space == NULL) { |
3220 | if (obj->gtt_space == NULL) { |
Line 3184... | Line 3221... | ||
3184 | struct drm_i915_private *dev_priv = obj->base.dev->dev_private; |
3221 | struct drm_i915_private *dev_priv = obj->base.dev->dev_private; |
Line 3340... | Line 3377... | ||
3340 | unlock: |
3377 | unlock: |
3341 | mutex_unlock(&dev->struct_mutex); |
3378 | mutex_unlock(&dev->struct_mutex); |
3342 | return ret; |
3379 | return ret; |
3343 | } |
3380 | } |
Line 3344... | Line -... | ||
3344 | - | ||
3345 | #if 0 |
3381 | |
3346 | int |
3382 | int |
3347 | i915_gem_throttle_ioctl(struct drm_device *dev, void *data, |
3383 | i915_gem_throttle_ioctl(struct drm_device *dev, void *data, |
3348 | struct drm_file *file_priv) |
3384 | struct drm_file *file_priv) |
3349 | { |
3385 | { |
3350 | return i915_gem_ring_throttle(dev, file_priv); |
3386 | return i915_gem_ring_throttle(dev, file_priv); |
Line -... | Line 3387... | ||
- | 3387 | } |
|
- | 3388 | ||
3351 | } |
3389 | #if 0 |
3352 | 3390 | ||
3353 | int |
3391 | int |
3354 | i915_gem_madvise_ioctl(struct drm_device *dev, void *data, |
3392 | i915_gem_madvise_ioctl(struct drm_device *dev, void *data, |
3355 | struct drm_file *file_priv) |
3393 | struct drm_file *file_priv) |
Line 3543... | Line 3581... | ||
3543 | i915_gem_cleanup_ringbuffer(dev); |
3581 | i915_gem_cleanup_ringbuffer(dev); |
Line 3544... | Line 3582... | ||
3544 | 3582 | ||
Line 3545... | Line 3583... | ||
3545 | mutex_unlock(&dev->struct_mutex); |
3583 | mutex_unlock(&dev->struct_mutex); |
3546 | 3584 | ||
Line 3547... | Line 3585... | ||
3547 | /* Cancel the retire work handler, which should be idle now. */ |
3585 | /* Cancel the retire work handler, which should be idle now. */ |
3548 | // cancel_delayed_work_sync(&dev_priv->mm.retire_work); |
3586 | cancel_delayed_work_sync(&dev_priv->mm.retire_work); |
3549 | 3587 |