aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_vma_manager.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2016-08-15 02:46:36 -0400
committerDave Airlie <airlied@redhat.com>2016-08-15 02:46:36 -0400
commitf8725ad1da5182aea9b08c8ef300e83bac74f756 (patch)
treee98c5046b05422db1f3ce900daa0c5391b9d2d6d /drivers/gpu/drm/drm_vma_manager.c
parenta02b5a155e21b6d324045eca2e30e93f4ff4c51c (diff)
parent3590d50e2313644cd192ff55e83df76dea232319 (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.c43
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}
92EXPORT_SYMBOL(drm_vma_offset_manager_init); 91EXPORT_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;
177EXPORT_SYMBOL(drm_vma_offset_lookup_locked);
178
179/* internal helper to link @node into the rb-tree */
180static 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}
179EXPORT_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
245out_unlock: 221out_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 }