Rev 2344 | Rev 2352 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2344 | Rev 2351 | ||
---|---|---|---|
Line 27... | Line 27... | ||
27 | 27 | ||
28 | #include "drmP.h" |
28 | #include "drmP.h" |
29 | #include "drm.h" |
29 | #include "drm.h" |
30 | #include "i915_drm.h" |
30 | #include "i915_drm.h" |
31 | #include "i915_drv.h" |
31 | #include "i915_drv.h" |
32 | //#include "i915_trace.h" |
32 | #include "i915_trace.h" |
33 | #include "intel_drv.h" |
33 | #include "intel_drv.h" |
34 | //#include |
34 | //#include |
35 | #include |
35 | #include |
36 | //#include |
36 | //#include |
Line 234... | Line 234... | ||
234 | i915_gem_do_init(dev, args->gtt_start, args->gtt_end, args->gtt_end); |
234 | i915_gem_do_init(dev, args->gtt_start, args->gtt_end, args->gtt_end); |
235 | mutex_unlock(&dev->struct_mutex); |
235 | mutex_unlock(&dev->struct_mutex); |
Line 236... | Line 236... | ||
236 | 236 | ||
237 | return 0; |
237 | return 0; |
- | 238 | } |
|
Line 238... | Line 239... | ||
238 | } |
239 | #endif |
239 | 240 | ||
240 | int |
241 | int |
241 | i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, |
242 | i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, |
242 | struct drm_file *file) |
243 | struct drm_file *file) |
243 | { |
244 | { |
244 | struct drm_i915_private *dev_priv = dev->dev_private; |
245 | struct drm_i915_private *dev_priv = dev->dev_private; |
245 | struct drm_i915_gem_get_aperture *args = data; |
246 | struct drm_i915_gem_get_aperture *args = data; |
Line 246... | Line -... | ||
246 | struct drm_i915_gem_object *obj; |
- | |
247 | size_t pinned; |
- | |
Line 248... | Line 247... | ||
248 | 247 | struct drm_i915_gem_object *obj; |
|
249 | if (!(dev->driver->driver_features & DRIVER_GEM)) |
248 | size_t pinned; |
250 | return -ENODEV; |
249 | |
251 | 250 | ||
Line 259... | Line 258... | ||
259 | args->aper_available_size = args->aper_size - pinned; |
258 | args->aper_available_size = args->aper_size - pinned; |
Line 260... | Line 259... | ||
260 | 259 | ||
261 | return 0; |
260 | return 0; |
Line 262... | Line 261... | ||
262 | } |
261 | } |
- | 262 | ||
263 | 263 | #if 0 |
|
264 | static int |
264 | |
265 | i915_gem_create(struct drm_file *file, |
265 | int i915_gem_create(struct drm_file *file, |
266 | struct drm_device *dev, |
266 | struct drm_device *dev, |
267 | uint64_t size, |
267 | uint64_t size, |
268 | uint32_t *handle_p) |
268 | uint32_t *handle_p) |
Line 288... | Line 288... | ||
288 | return ret; |
288 | return ret; |
289 | } |
289 | } |
Line 290... | Line 290... | ||
290 | 290 | ||
291 | /* drop reference from allocate - handle holds it now */ |
291 | /* drop reference from allocate - handle holds it now */ |
- | 292 | drm_gem_object_unreference(&obj->base); |
|
Line 292... | Line 293... | ||
292 | drm_gem_object_unreference(&obj->base); |
293 | trace_i915_gem_object_create(obj); |
293 | 294 | ||
294 | *handle_p = handle; |
295 | *handle_p = handle; |
Line 743... | Line -... | ||
743 | - | ||
744 | - | ||
745 | 744 | ||
746 | 745 | ||
747 | 746 | ||
748 | 747 | ||
749 | 748 | ||
Line 792... | Line 791... | ||
792 | i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj) |
791 | i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj) |
793 | { |
792 | { |
794 | int page_count = obj->base.size / PAGE_SIZE; |
793 | int page_count = obj->base.size / PAGE_SIZE; |
795 | int i; |
794 | int i; |
Line 796... | Line -... | ||
796 | - | ||
797 | ENTER(); |
- | |
798 | 795 | ||
Line 799... | Line 796... | ||
799 | BUG_ON(obj->madv == __I915_MADV_PURGED); |
796 | BUG_ON(obj->madv == __I915_MADV_PURGED); |
800 | 797 | ||
Line 809... | Line 806... | ||
809 | } |
806 | } |
810 | obj->dirty = 0; |
807 | obj->dirty = 0; |
Line 811... | Line 808... | ||
811 | 808 | ||
812 | free(obj->pages); |
809 | free(obj->pages); |
813 | obj->pages = NULL; |
- | |
814 | - | ||
815 | LEAVE(); |
810 | obj->pages = NULL; |
Line 816... | Line 811... | ||
816 | } |
811 | } |
817 | 812 | ||
818 | void |
813 | void |
Line 992... | Line 987... | ||
992 | if ((obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0) |
987 | if ((obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0) |
993 | return; |
988 | return; |
Line 994... | Line 989... | ||
994 | 989 | ||
995 | old_read_domains = obj->base.read_domains; |
990 | old_read_domains = obj->base.read_domains; |
- | 991 | old_write_domain = obj->base.write_domain; |
|
996 | old_write_domain = obj->base.write_domain; |
992 | |
997 | obj->base.read_domains &= ~I915_GEM_DOMAIN_GTT; |
993 | obj->base.read_domains &= ~I915_GEM_DOMAIN_GTT; |
Line -... | Line 994... | ||
- | 994 | obj->base.write_domain &= ~I915_GEM_DOMAIN_GTT; |
|
- | 995 | ||
- | 996 | trace_i915_gem_object_change_domain(obj, |
|
998 | obj->base.write_domain &= ~I915_GEM_DOMAIN_GTT; |
997 | old_read_domains, |
Line 999... | Line 998... | ||
999 | 998 | old_write_domain); |
|
1000 | } |
999 | } |
1001 | 1000 | ||
1002 | /** |
1001 | /** |
1003 | * Unbinds an object from the GTT aperture. |
1002 | * Unbinds an object from the GTT aperture. |
1004 | */ |
1003 | */ |
1005 | int |
1004 | int |
Line 1006... | Line -... | ||
1006 | i915_gem_object_unbind(struct drm_i915_gem_object *obj) |
- | |
1007 | { |
1005 | i915_gem_object_unbind(struct drm_i915_gem_object *obj) |
1008 | int ret = 0; |
1006 | { |
Line 1009... | Line 1007... | ||
1009 | 1007 | int ret = 0; |
|
1010 | ENTER(); |
1008 | |
Line 1045... | Line 1043... | ||
1045 | /* release the fence reg _after_ flushing */ |
1043 | /* release the fence reg _after_ flushing */ |
1046 | ret = i915_gem_object_put_fence(obj); |
1044 | ret = i915_gem_object_put_fence(obj); |
1047 | if (ret == -ERESTARTSYS) |
1045 | if (ret == -ERESTARTSYS) |
1048 | return ret; |
1046 | return ret; |
Line -... | Line 1047... | ||
- | 1047 | ||
Line 1049... | Line 1048... | ||
1049 | 1048 | trace_i915_gem_object_unbind(obj); |
|
1050 | 1049 | ||
Line 1051... | Line 1050... | ||
1051 | i915_gem_gtt_unbind_object(obj); |
1050 | i915_gem_gtt_unbind_object(obj); |
Line 1061... | Line 1060... | ||
1061 | obj->gtt_offset = 0; |
1060 | obj->gtt_offset = 0; |
Line 1062... | Line 1061... | ||
1062 | 1061 | ||
1063 | if (i915_gem_object_is_purgeable(obj)) |
1062 | if (i915_gem_object_is_purgeable(obj)) |
Line 1064... | Line -... | ||
1064 | i915_gem_object_truncate(obj); |
- | |
1065 | 1063 | i915_gem_object_truncate(obj); |
|
1066 | LEAVE(); |
1064 | |
Line 1067... | Line 1065... | ||
1067 | return ret; |
1065 | return ret; |
1068 | } |
1066 | } |
Line 1075... | Line 1073... | ||
1075 | int ret; |
1073 | int ret; |
Line 1076... | Line 1074... | ||
1076 | 1074 | ||
1077 | if (((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) == 0) |
1075 | if (((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) == 0) |
Line -... | Line 1076... | ||
- | 1076 | return 0; |
|
Line 1078... | Line 1077... | ||
1078 | return 0; |
1077 | |
1079 | 1078 | trace_i915_gem_ring_flush(ring, invalidate_domains, flush_domains); |
|
1080 | 1079 | ||
Line 1237... | Line -... | ||
1237 | - | ||
1238 | - | ||
1239 | - | ||
1240 | 1236 | ||
1241 | 1237 | ||
1242 | 1238 | ||
1243 | 1239 | ||
1244 | 1240 | ||
Line 1421... | Line 1417... | ||
1421 | mappable = |
1417 | mappable = |
1422 | obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end; |
1418 | obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end; |
Line 1423... | Line 1419... | ||
1423 | 1419 | ||
Line -... | Line 1420... | ||
- | 1420 | obj->map_and_fenceable = mappable && fenceable; |
|
1424 | obj->map_and_fenceable = mappable && fenceable; |
1421 | |
1425 | 1422 | trace_i915_gem_object_bind(obj, map_and_fenceable); |
|
Line 1426... | Line 1423... | ||
1426 | return 0; |
1423 | return 0; |
1427 | } |
1424 | } |
Line 1526... | Line 1523... | ||
1526 | wmb(); |
1523 | wmb(); |
Line 1527... | Line 1524... | ||
1527 | 1524 | ||
1528 | old_write_domain = obj->base.write_domain; |
1525 | old_write_domain = obj->base.write_domain; |
Line -... | Line 1526... | ||
- | 1526 | obj->base.write_domain = 0; |
|
- | 1527 | ||
- | 1528 | trace_i915_gem_object_change_domain(obj, |
|
1529 | obj->base.write_domain = 0; |
1529 | obj->base.read_domains, |
Line 1530... | Line 1530... | ||
1530 | 1530 | old_write_domain); |
|
1531 | } |
1531 | } |
1532 | 1532 | ||
Line 1542... | Line 1542... | ||
1542 | i915_gem_clflush_object(obj); |
1542 | i915_gem_clflush_object(obj); |
1543 | intel_gtt_chipset_flush(); |
1543 | intel_gtt_chipset_flush(); |
1544 | old_write_domain = obj->base.write_domain; |
1544 | old_write_domain = obj->base.write_domain; |
1545 | obj->base.write_domain = 0; |
1545 | obj->base.write_domain = 0; |
Line -... | Line 1546... | ||
- | 1546 | ||
- | 1547 | trace_i915_gem_object_change_domain(obj, |
|
- | 1548 | obj->base.read_domains, |
|
1546 | 1549 | old_write_domain); |
|
Line 1547... | Line 1550... | ||
1547 | } |
1550 | } |
1548 | 1551 | ||
1549 | /** |
1552 | /** |
Line 1589... | Line 1592... | ||
1589 | obj->base.read_domains = I915_GEM_DOMAIN_GTT; |
1592 | obj->base.read_domains = I915_GEM_DOMAIN_GTT; |
1590 | obj->base.write_domain = I915_GEM_DOMAIN_GTT; |
1593 | obj->base.write_domain = I915_GEM_DOMAIN_GTT; |
1591 | obj->dirty = 1; |
1594 | obj->dirty = 1; |
1592 | } |
1595 | } |
Line -... | Line 1596... | ||
- | 1596 | ||
- | 1597 | trace_i915_gem_object_change_domain(obj, |
|
- | 1598 | old_read_domains, |
|
- | 1599 | old_write_domain); |
|
1593 | 1600 | ||
1594 | return 0; |
1601 | return 0; |
Line 1595... | Line 1602... | ||
1595 | } |
1602 | } |
1596 | 1603 | ||
Line 1644... | Line 1651... | ||
1644 | old_write_domain = obj->base.write_domain; |
1651 | old_write_domain = obj->base.write_domain; |
Line 1645... | Line 1652... | ||
1645 | 1652 | ||
1646 | obj->base.read_domains = I915_GEM_DOMAIN_CPU; |
1653 | obj->base.read_domains = I915_GEM_DOMAIN_CPU; |
Line -... | Line 1654... | ||
- | 1654 | obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
|
- | 1655 | ||
- | 1656 | trace_i915_gem_object_change_domain(obj, |
|
1647 | obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
1657 | old_read_domains, |
Line 1648... | Line 1658... | ||
1648 | 1658 | old_write_domain); |
|
1649 | } |
1659 | } |
1650 | 1660 | ||
Line 1711... | Line 1721... | ||
1711 | * the domain values for our changes. |
1721 | * the domain values for our changes. |
1712 | */ |
1722 | */ |
1713 | BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) != 0); |
1723 | BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) != 0); |
1714 | obj->base.read_domains |= I915_GEM_DOMAIN_GTT; |
1724 | obj->base.read_domains |= I915_GEM_DOMAIN_GTT; |
Line -... | Line 1725... | ||
- | 1725 | ||
- | 1726 | trace_i915_gem_object_change_domain(obj, |
|
- | 1727 | old_read_domains, |
|
Line 1715... | Line 1728... | ||
1715 | 1728 | old_write_domain); |
|
1716 | 1729 | ||
Line 1717... | Line 1730... | ||
1717 | return 0; |
1730 | return 0; |
Line 1788... | Line 1801... | ||
1788 | if (write) { |
1801 | if (write) { |
1789 | obj->base.read_domains = I915_GEM_DOMAIN_CPU; |
1802 | obj->base.read_domains = I915_GEM_DOMAIN_CPU; |
1790 | obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
1803 | obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
1791 | } |
1804 | } |
Line -... | Line 1805... | ||
- | 1805 | ||
- | 1806 | trace_i915_gem_object_change_domain(obj, |
|
- | 1807 | old_read_domains, |
|
Line 1792... | Line 1808... | ||
1792 | 1808 | old_write_domain); |
|
1793 | 1809 | ||
Line 1794... | Line 1810... | ||
1794 | return 0; |
1810 | return 0; |
Line 1931... | Line -... | ||
1931 | - | ||
1932 | - | ||
1933 | 1947 | ||
1934 | 1948 | ||
1935 | 1949 | ||
1936 | 1950 | ||
1937 | 1951 | ||
Line 1998... | Line 2012... | ||
1998 | { |
2012 | { |
1999 | struct drm_device *dev = obj->base.dev; |
2013 | struct drm_device *dev = obj->base.dev; |
2000 | drm_i915_private_t *dev_priv = dev->dev_private; |
2014 | drm_i915_private_t *dev_priv = dev->dev_private; |
2001 | int ret; |
2015 | int ret; |
Line 2002... | Line -... | ||
2002 | - | ||
2003 | ENTER(); |
- | |
2004 | 2016 | ||
2005 | ret = i915_gem_object_unbind(obj); |
2017 | ret = i915_gem_object_unbind(obj); |
2006 | if (ret == -ERESTARTSYS) { |
2018 | if (ret == -ERESTARTSYS) { |
2007 | list_move(&obj->mm_list, |
2019 | list_move(&obj->mm_list, |
2008 | &dev_priv->mm.deferred_free_list); |
2020 | &dev_priv->mm.deferred_free_list); |
2009 | return; |
2021 | return; |
Line -... | Line 2022... | ||
- | 2022 | } |
|
Line 2010... | Line 2023... | ||
2010 | } |
2023 | |
2011 | 2024 | trace_i915_gem_object_destroy(obj); |
|
Line 2012... | Line 2025... | ||
2012 | 2025 | ||
2013 | // if (obj->base.map_list.map) |
2026 | // if (obj->base.map_list.map) |
Line 2014... | Line 2027... | ||
2014 | // drm_gem_free_mmap_offset(&obj->base); |
2027 | // drm_gem_free_mmap_offset(&obj->base); |
2015 | 2028 | ||
2016 | drm_gem_object_release(&obj->base); |
2029 | drm_gem_object_release(&obj->base); |
2017 | i915_gem_info_remove_obj(dev_priv, obj->base.size); |
- | |
2018 | 2030 | i915_gem_info_remove_obj(dev_priv, obj->base.size); |
|
Line 2019... | Line 2031... | ||
2019 | kfree(obj->page_cpu_valid); |
2031 | |
2020 | kfree(obj->bit_17); |
2032 | kfree(obj->page_cpu_valid); |
2021 | kfree(obj); |
2033 | kfree(obj->bit_17); |
2022 | LEAVE(); |
2034 | kfree(obj); |
Line 2023... | Line -... | ||
2023 | } |
- | |
2024 | 2035 | } |
|
2025 | void i915_gem_free_object(struct drm_gem_object *gem_obj) |
2036 | |
Line 2026... | Line 2037... | ||
2026 | { |
2037 | void i915_gem_free_object(struct drm_gem_object *gem_obj) |
2027 | struct drm_i915_gem_object *obj = to_intel_bo(gem_obj); |
2038 | { |
Line 2028... | Line 2039... | ||
2028 | struct drm_device *dev = obj->base.dev; |
2039 | struct drm_i915_gem_object *obj = to_intel_bo(gem_obj); |
2029 | - | ||
2030 | ENTER(); |
2040 | struct drm_device *dev = obj->base.dev; |
Line 2052... | Line 2062... | ||
2052 | int |
2062 | int |
2053 | i915_gem_init_ringbuffer(struct drm_device *dev) |
2063 | i915_gem_init_ringbuffer(struct drm_device *dev) |
2054 | { |
2064 | { |
2055 | drm_i915_private_t *dev_priv = dev->dev_private; |
2065 | drm_i915_private_t *dev_priv = dev->dev_private; |
2056 | int ret; |
2066 | int ret; |
2057 | ENTER(); |
2067 | |
2058 | ret = intel_init_render_ring_buffer(dev); |
2068 | ret = intel_init_render_ring_buffer(dev); |
2059 | if (ret) |
2069 | if (ret) |
2060 | return ret; |
2070 | return ret; |
Line 2061... | Line 2071... | ||
2061 | 2071 | ||
Line 2070... | Line 2080... | ||
2070 | if (ret) |
2080 | if (ret) |
2071 | goto cleanup_bsd_ring; |
2081 | goto cleanup_bsd_ring; |
2072 | } |
2082 | } |
Line 2073... | Line 2083... | ||
2073 | 2083 | ||
2074 | dev_priv->next_seqno = 1; |
2084 | dev_priv->next_seqno = 1; |
2075 | LEAVE(); |
2085 | |
Line 2076... | Line 2086... | ||
2076 | return 0; |
2086 | return 0; |
2077 | 2087 | ||
2078 | cleanup_bsd_ring: |
2088 | cleanup_bsd_ring: |