Lines Matching refs:sa_manager
48 static void amdgpu_sa_bo_try_free(struct amdgpu_sa_manager *sa_manager);
51 struct amdgpu_sa_manager *sa_manager, in amdgpu_sa_bo_manager_init() argument
56 init_waitqueue_head(&sa_manager->wq); in amdgpu_sa_bo_manager_init()
57 sa_manager->bo = NULL; in amdgpu_sa_bo_manager_init()
58 sa_manager->size = size; in amdgpu_sa_bo_manager_init()
59 sa_manager->domain = domain; in amdgpu_sa_bo_manager_init()
60 sa_manager->align = align; in amdgpu_sa_bo_manager_init()
61 sa_manager->hole = &sa_manager->olist; in amdgpu_sa_bo_manager_init()
62 INIT_LIST_HEAD(&sa_manager->olist); in amdgpu_sa_bo_manager_init()
64 INIT_LIST_HEAD(&sa_manager->flist[i]); in amdgpu_sa_bo_manager_init()
68 0, NULL, NULL, &sa_manager->bo); in amdgpu_sa_bo_manager_init()
78 struct amdgpu_sa_manager *sa_manager) in amdgpu_sa_bo_manager_fini() argument
82 if (!list_empty(&sa_manager->olist)) { in amdgpu_sa_bo_manager_fini()
83 sa_manager->hole = &sa_manager->olist, in amdgpu_sa_bo_manager_fini()
84 amdgpu_sa_bo_try_free(sa_manager); in amdgpu_sa_bo_manager_fini()
85 if (!list_empty(&sa_manager->olist)) { in amdgpu_sa_bo_manager_fini()
89 list_for_each_entry_safe(sa_bo, tmp, &sa_manager->olist, olist) { in amdgpu_sa_bo_manager_fini()
92 amdgpu_bo_unref(&sa_manager->bo); in amdgpu_sa_bo_manager_fini()
93 sa_manager->size = 0; in amdgpu_sa_bo_manager_fini()
97 struct amdgpu_sa_manager *sa_manager) in amdgpu_sa_bo_manager_start() argument
101 if (sa_manager->bo == NULL) { in amdgpu_sa_bo_manager_start()
107 r = amdgpu_bo_reserve(sa_manager->bo, false); in amdgpu_sa_bo_manager_start()
112 r = amdgpu_bo_pin(sa_manager->bo, sa_manager->domain, &sa_manager->gpu_addr); in amdgpu_sa_bo_manager_start()
114 amdgpu_bo_unreserve(sa_manager->bo); in amdgpu_sa_bo_manager_start()
118 r = amdgpu_bo_kmap(sa_manager->bo, &sa_manager->cpu_ptr); in amdgpu_sa_bo_manager_start()
119 amdgpu_bo_unreserve(sa_manager->bo); in amdgpu_sa_bo_manager_start()
124 struct amdgpu_sa_manager *sa_manager) in amdgpu_sa_bo_manager_suspend() argument
128 if (sa_manager->bo == NULL) { in amdgpu_sa_bo_manager_suspend()
133 r = amdgpu_bo_reserve(sa_manager->bo, false); in amdgpu_sa_bo_manager_suspend()
135 amdgpu_bo_kunmap(sa_manager->bo); in amdgpu_sa_bo_manager_suspend()
136 amdgpu_bo_unpin(sa_manager->bo); in amdgpu_sa_bo_manager_suspend()
137 amdgpu_bo_unreserve(sa_manager->bo); in amdgpu_sa_bo_manager_suspend()
144 struct amdgpu_sa_manager *sa_manager = sa_bo->manager; in amdgpu_sa_bo_remove_locked() local
145 if (sa_manager->hole == &sa_bo->olist) { in amdgpu_sa_bo_remove_locked()
146 sa_manager->hole = sa_bo->olist.prev; in amdgpu_sa_bo_remove_locked()
154 static void amdgpu_sa_bo_try_free(struct amdgpu_sa_manager *sa_manager) in amdgpu_sa_bo_try_free() argument
158 if (sa_manager->hole->next == &sa_manager->olist) in amdgpu_sa_bo_try_free()
161 sa_bo = list_entry(sa_manager->hole->next, struct amdgpu_sa_bo, olist); in amdgpu_sa_bo_try_free()
162 list_for_each_entry_safe_from(sa_bo, tmp, &sa_manager->olist, olist) { in amdgpu_sa_bo_try_free()
171 static inline unsigned amdgpu_sa_bo_hole_soffset(struct amdgpu_sa_manager *sa_manager) in amdgpu_sa_bo_hole_soffset() argument
173 struct list_head *hole = sa_manager->hole; in amdgpu_sa_bo_hole_soffset()
175 if (hole != &sa_manager->olist) { in amdgpu_sa_bo_hole_soffset()
181 static inline unsigned amdgpu_sa_bo_hole_eoffset(struct amdgpu_sa_manager *sa_manager) in amdgpu_sa_bo_hole_eoffset() argument
183 struct list_head *hole = sa_manager->hole; in amdgpu_sa_bo_hole_eoffset()
185 if (hole->next != &sa_manager->olist) { in amdgpu_sa_bo_hole_eoffset()
188 return sa_manager->size; in amdgpu_sa_bo_hole_eoffset()
191 static bool amdgpu_sa_bo_try_alloc(struct amdgpu_sa_manager *sa_manager, in amdgpu_sa_bo_try_alloc() argument
197 soffset = amdgpu_sa_bo_hole_soffset(sa_manager); in amdgpu_sa_bo_try_alloc()
198 eoffset = amdgpu_sa_bo_hole_eoffset(sa_manager); in amdgpu_sa_bo_try_alloc()
204 sa_bo->manager = sa_manager; in amdgpu_sa_bo_try_alloc()
207 list_add(&sa_bo->olist, sa_manager->hole); in amdgpu_sa_bo_try_alloc()
209 sa_manager->hole = &sa_bo->olist; in amdgpu_sa_bo_try_alloc()
225 static bool amdgpu_sa_event(struct amdgpu_sa_manager *sa_manager, in amdgpu_sa_event() argument
232 if (!list_empty(&sa_manager->flist[i])) { in amdgpu_sa_event()
237 soffset = amdgpu_sa_bo_hole_soffset(sa_manager); in amdgpu_sa_event()
238 eoffset = amdgpu_sa_bo_hole_eoffset(sa_manager); in amdgpu_sa_event()
248 static bool amdgpu_sa_bo_next_hole(struct amdgpu_sa_manager *sa_manager, in amdgpu_sa_bo_next_hole() argument
256 if (sa_manager->hole->next == &sa_manager->olist) { in amdgpu_sa_bo_next_hole()
258 sa_manager->hole = &sa_manager->olist; in amdgpu_sa_bo_next_hole()
262 soffset = amdgpu_sa_bo_hole_soffset(sa_manager); in amdgpu_sa_bo_next_hole()
264 best = sa_manager->size * 2; in amdgpu_sa_bo_next_hole()
271 if (list_empty(&sa_manager->flist[i])) { in amdgpu_sa_bo_next_hole()
275 sa_bo = list_first_entry(&sa_manager->flist[i], in amdgpu_sa_bo_next_hole()
291 tmp += sa_manager->size; in amdgpu_sa_bo_next_hole()
304 sa_manager->hole = best_bo->olist.prev; in amdgpu_sa_bo_next_hole()
314 int amdgpu_sa_bo_new(struct amdgpu_sa_manager *sa_manager, in amdgpu_sa_bo_new() argument
324 BUG_ON(align > sa_manager->align); in amdgpu_sa_bo_new()
325 BUG_ON(size > sa_manager->size); in amdgpu_sa_bo_new()
331 (*sa_bo)->manager = sa_manager; in amdgpu_sa_bo_new()
336 spin_lock(&sa_manager->wq.lock); in amdgpu_sa_bo_new()
344 amdgpu_sa_bo_try_free(sa_manager); in amdgpu_sa_bo_new()
346 if (amdgpu_sa_bo_try_alloc(sa_manager, *sa_bo, in amdgpu_sa_bo_new()
348 spin_unlock(&sa_manager->wq.lock); in amdgpu_sa_bo_new()
353 } while (amdgpu_sa_bo_next_hole(sa_manager, fences, tries)); in amdgpu_sa_bo_new()
360 spin_unlock(&sa_manager->wq.lock); in amdgpu_sa_bo_new()
367 spin_lock(&sa_manager->wq.lock); in amdgpu_sa_bo_new()
371 sa_manager->wq, in amdgpu_sa_bo_new()
372 amdgpu_sa_event(sa_manager, size, align) in amdgpu_sa_bo_new()
378 spin_unlock(&sa_manager->wq.lock); in amdgpu_sa_bo_new()
387 struct amdgpu_sa_manager *sa_manager; in amdgpu_sa_bo_free() local
393 sa_manager = (*sa_bo)->manager; in amdgpu_sa_bo_free()
394 spin_lock(&sa_manager->wq.lock); in amdgpu_sa_bo_free()
399 list_add_tail(&(*sa_bo)->flist, &sa_manager->flist[idx]); in amdgpu_sa_bo_free()
403 wake_up_all_locked(&sa_manager->wq); in amdgpu_sa_bo_free()
404 spin_unlock(&sa_manager->wq.lock); in amdgpu_sa_bo_free()
429 void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager, in amdgpu_sa_bo_dump_debug_info() argument
434 spin_lock(&sa_manager->wq.lock); in amdgpu_sa_bo_dump_debug_info()
435 list_for_each_entry(i, &sa_manager->olist, olist) { in amdgpu_sa_bo_dump_debug_info()
436 uint64_t soffset = i->soffset + sa_manager->gpu_addr; in amdgpu_sa_bo_dump_debug_info()
437 uint64_t eoffset = i->eoffset + sa_manager->gpu_addr; in amdgpu_sa_bo_dump_debug_info()
438 if (&i->olist == sa_manager->hole) { in amdgpu_sa_bo_dump_debug_info()
449 spin_unlock(&sa_manager->wq.lock); in amdgpu_sa_bo_dump_debug_info()