diff options
author | Dave Airlie <airlied@redhat.com> | 2016-08-15 02:46:36 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-08-15 02:46:36 -0400 |
commit | f8725ad1da5182aea9b08c8ef300e83bac74f756 (patch) | |
tree | e98c5046b05422db1f3ce900daa0c5391b9d2d6d /drivers/gpu/drm/drm_vma_manager.c | |
parent | a02b5a155e21b6d324045eca2e30e93f4ff4c51c (diff) | |
parent | 3590d50e2313644cd192ff55e83df76dea232319 (diff) |
Merge tag 'topic/drm-misc-2016-08-12' of git://anongit.freedesktop.org/drm-intel into drm-next
- more fence destaging and cleanup (Gustavo&Sumit)
- DRIVER_LEGACY to untangle from DRIVER_MODESET
- drm_mm refactor (Chris)
- fbdev-less compile fies
- clipped plane src/dst rects (Ville)
- + a few mediatek patches that build on top of that (Bibby+Daniel)
- small stuff all over really
* tag 'topic/drm-misc-2016-08-12' of git://anongit.freedesktop.org/drm-intel: (43 commits)
dma-buf/fence: kerneldoc: remove spurious section header
dma-buf/fence: kerneldoc: remove unused struct members
Revert "gpu: drm: omapdrm: dss-of: add missing of_node_put after calling of_parse_phandle"
drm: Protect fb_defio in drivers with CONFIG_KMS_FBDEV_EMULATION
drm/radeon|amgpu: Make fbdev emulation optional
drm/vmwgfx: select CONFIG_FB
drm: Remove superflous linux/fb.h includes
drm/fb-helper: Add a dummy remove_conflicting_framebuffers
dma-buf/sync_file: only enable fence signalling on poll()
Documentation: add doc for sync_file_get_fence()
dma-buf/sync_file: add sync_file_get_fence()
dma-buf/sync_file: refactor fence storage in struct sync_file
dma-buf/fence-array: add fence_is_array()
drm/dp_helper: Rate limit timeout errors from drm_dp_i2c_do_msg()
drm/dp_helper: Print first error received on failure in drm_dp_dpcd_access()
drm: Add ratelimited versions of the DRM_DEBUG* macros
drm: Make sure drm_vblank_no_hw_counter isn't abused
drm/mediatek: Fix mtk_atomic_complete for runtime_pm
drm/mediatek: plane: Use FB's format's cpp to compute x offset
drm/mediatek: plane: Merge mtk_plane_enable into mtk_plane_atomic_update
...
Diffstat (limited to 'drivers/gpu/drm/drm_vma_manager.c')
-rw-r--r-- | drivers/gpu/drm/drm_vma_manager.c | 43 |
1 files changed, 9 insertions, 34 deletions
diff --git a/drivers/gpu/drm/drm_vma_manager.c b/drivers/gpu/drm/drm_vma_manager.c index f306c8855978..0aef432679f9 100644 --- a/drivers/gpu/drm/drm_vma_manager.c +++ b/drivers/gpu/drm/drm_vma_manager.c | |||
@@ -86,7 +86,6 @@ void drm_vma_offset_manager_init(struct drm_vma_offset_manager *mgr, | |||
86 | unsigned long page_offset, unsigned long size) | 86 | unsigned long page_offset, unsigned long size) |
87 | { | 87 | { |
88 | rwlock_init(&mgr->vm_lock); | 88 | rwlock_init(&mgr->vm_lock); |
89 | mgr->vm_addr_space_rb = RB_ROOT; | ||
90 | drm_mm_init(&mgr->vm_addr_space_mm, page_offset, size); | 89 | drm_mm_init(&mgr->vm_addr_space_mm, page_offset, size); |
91 | } | 90 | } |
92 | EXPORT_SYMBOL(drm_vma_offset_manager_init); | 91 | EXPORT_SYMBOL(drm_vma_offset_manager_init); |
@@ -145,16 +144,16 @@ struct drm_vma_offset_node *drm_vma_offset_lookup_locked(struct drm_vma_offset_m | |||
145 | unsigned long start, | 144 | unsigned long start, |
146 | unsigned long pages) | 145 | unsigned long pages) |
147 | { | 146 | { |
148 | struct drm_vma_offset_node *node, *best; | 147 | struct drm_mm_node *node, *best; |
149 | struct rb_node *iter; | 148 | struct rb_node *iter; |
150 | unsigned long offset; | 149 | unsigned long offset; |
151 | 150 | ||
152 | iter = mgr->vm_addr_space_rb.rb_node; | 151 | iter = mgr->vm_addr_space_mm.interval_tree.rb_node; |
153 | best = NULL; | 152 | best = NULL; |
154 | 153 | ||
155 | while (likely(iter)) { | 154 | while (likely(iter)) { |
156 | node = rb_entry(iter, struct drm_vma_offset_node, vm_rb); | 155 | node = rb_entry(iter, struct drm_mm_node, rb); |
157 | offset = node->vm_node.start; | 156 | offset = node->start; |
158 | if (start >= offset) { | 157 | if (start >= offset) { |
159 | iter = iter->rb_right; | 158 | iter = iter->rb_right; |
160 | best = node; | 159 | best = node; |
@@ -167,38 +166,17 @@ struct drm_vma_offset_node *drm_vma_offset_lookup_locked(struct drm_vma_offset_m | |||
167 | 166 | ||
168 | /* verify that the node spans the requested area */ | 167 | /* verify that the node spans the requested area */ |
169 | if (best) { | 168 | if (best) { |
170 | offset = best->vm_node.start + best->vm_node.size; | 169 | offset = best->start + best->size; |
171 | if (offset < start + pages) | 170 | if (offset < start + pages) |
172 | best = NULL; | 171 | best = NULL; |
173 | } | 172 | } |
174 | 173 | ||
175 | return best; | 174 | if (!best) |
176 | } | 175 | return NULL; |
177 | EXPORT_SYMBOL(drm_vma_offset_lookup_locked); | ||
178 | |||
179 | /* internal helper to link @node into the rb-tree */ | ||
180 | static void _drm_vma_offset_add_rb(struct drm_vma_offset_manager *mgr, | ||
181 | struct drm_vma_offset_node *node) | ||
182 | { | ||
183 | struct rb_node **iter = &mgr->vm_addr_space_rb.rb_node; | ||
184 | struct rb_node *parent = NULL; | ||
185 | struct drm_vma_offset_node *iter_node; | ||
186 | |||
187 | while (likely(*iter)) { | ||
188 | parent = *iter; | ||
189 | iter_node = rb_entry(*iter, struct drm_vma_offset_node, vm_rb); | ||
190 | 176 | ||
191 | if (node->vm_node.start < iter_node->vm_node.start) | 177 | return container_of(best, struct drm_vma_offset_node, vm_node); |
192 | iter = &(*iter)->rb_left; | ||
193 | else if (node->vm_node.start > iter_node->vm_node.start) | ||
194 | iter = &(*iter)->rb_right; | ||
195 | else | ||
196 | BUG(); | ||
197 | } | ||
198 | |||
199 | rb_link_node(&node->vm_rb, parent, iter); | ||
200 | rb_insert_color(&node->vm_rb, &mgr->vm_addr_space_rb); | ||
201 | } | 178 | } |
179 | EXPORT_SYMBOL(drm_vma_offset_lookup_locked); | ||
202 | 180 | ||
203 | /** | 181 | /** |
204 | * drm_vma_offset_add() - Add offset node to manager | 182 | * drm_vma_offset_add() - Add offset node to manager |
@@ -240,8 +218,6 @@ int drm_vma_offset_add(struct drm_vma_offset_manager *mgr, | |||
240 | if (ret) | 218 | if (ret) |
241 | goto out_unlock; | 219 | goto out_unlock; |
242 | 220 | ||
243 | _drm_vma_offset_add_rb(mgr, node); | ||
244 | |||
245 | out_unlock: | 221 | out_unlock: |
246 | write_unlock(&mgr->vm_lock); | 222 | write_unlock(&mgr->vm_lock); |
247 | return ret; | 223 | return ret; |
@@ -265,7 +241,6 @@ void drm_vma_offset_remove(struct drm_vma_offset_manager *mgr, | |||
265 | write_lock(&mgr->vm_lock); | 241 | write_lock(&mgr->vm_lock); |
266 | 242 | ||
267 | if (drm_mm_node_allocated(&node->vm_node)) { | 243 | if (drm_mm_node_allocated(&node->vm_node)) { |
268 | rb_erase(&node->vm_rb, &mgr->vm_addr_space_rb); | ||
269 | drm_mm_remove_node(&node->vm_node); | 244 | drm_mm_remove_node(&node->vm_node); |
270 | memset(&node->vm_node, 0, sizeof(node->vm_node)); | 245 | memset(&node->vm_node, 0, sizeof(node->vm_node)); |
271 | } | 246 | } |