Lines Matching defs:sa_manager

52 static void radeon_sa_bo_try_free(struct radeon_sa_manager *sa_manager);
55 struct radeon_sa_manager *sa_manager,
60 sx_init(&sa_manager->wq_lock, "drm__radeon_sa_manager_wq_mtx");
61 cv_init(&sa_manager->wq, "drm__radeon_sa_manager__wq");
62 sa_manager->bo = NULL;
63 sa_manager->size = size;
64 sa_manager->domain = domain;
65 sa_manager->hole = &sa_manager->olist;
66 INIT_LIST_HEAD(&sa_manager->olist);
68 INIT_LIST_HEAD(&sa_manager->flist[i]);
72 RADEON_GEM_DOMAIN_CPU, NULL, &sa_manager->bo);
82 struct radeon_sa_manager *sa_manager)
86 if (!list_empty(&sa_manager->olist)) {
87 sa_manager->hole = &sa_manager->olist,
88 radeon_sa_bo_try_free(sa_manager);
89 if (!list_empty(&sa_manager->olist)) {
90 dev_err(rdev->dev, "sa_manager is not empty, clearing anyway\n");
93 list_for_each_entry_safe(sa_bo, tmp, &sa_manager->olist, olist) {
96 radeon_bo_unref(&sa_manager->bo);
97 sa_manager->size = 0;
98 cv_destroy(&sa_manager->wq);
99 sx_destroy(&sa_manager->wq_lock);
103 struct radeon_sa_manager *sa_manager)
107 if (sa_manager->bo == NULL) {
113 r = radeon_bo_reserve(sa_manager->bo, false);
118 r = radeon_bo_pin(sa_manager->bo, sa_manager->domain, &sa_manager->gpu_addr);
120 radeon_bo_unreserve(sa_manager->bo);
124 r = radeon_bo_kmap(sa_manager->bo, &sa_manager->cpu_ptr);
125 radeon_bo_unreserve(sa_manager->bo);
130 struct radeon_sa_manager *sa_manager)
134 if (sa_manager->bo == NULL) {
139 r = radeon_bo_reserve(sa_manager->bo, false);
141 radeon_bo_kunmap(sa_manager->bo);
142 radeon_bo_unpin(sa_manager->bo);
143 radeon_bo_unreserve(sa_manager->bo);
150 struct radeon_sa_manager *sa_manager = sa_bo->manager;
151 if (sa_manager->hole == &sa_bo->olist) {
152 sa_manager->hole = sa_bo->olist.prev;
160 static void radeon_sa_bo_try_free(struct radeon_sa_manager *sa_manager)
164 if (sa_manager->hole->next == &sa_manager->olist)
167 sa_bo = list_entry(sa_manager->hole->next, struct radeon_sa_bo, olist);
168 list_for_each_entry_safe_from(sa_bo, tmp, &sa_manager->olist, olist) {
176 static inline unsigned radeon_sa_bo_hole_soffset(struct radeon_sa_manager *sa_manager)
178 struct list_head *hole = sa_manager->hole;
180 if (hole != &sa_manager->olist) {
186 static inline unsigned radeon_sa_bo_hole_eoffset(struct radeon_sa_manager *sa_manager)
188 struct list_head *hole = sa_manager->hole;
190 if (hole->next != &sa_manager->olist) {
193 return sa_manager->size;
196 static bool radeon_sa_bo_try_alloc(struct radeon_sa_manager *sa_manager,
202 soffset = radeon_sa_bo_hole_soffset(sa_manager);
203 eoffset = radeon_sa_bo_hole_eoffset(sa_manager);
209 sa_bo->manager = sa_manager;
212 list_add(&sa_bo->olist, sa_manager->hole);
214 sa_manager->hole = &sa_bo->olist;
223 * @sa_manager: pointer to the sa_manager
230 static bool radeon_sa_event(struct radeon_sa_manager *sa_manager,
237 if (!list_empty(&sa_manager->flist[i])) {
242 soffset = radeon_sa_bo_hole_soffset(sa_manager);
243 eoffset = radeon_sa_bo_hole_eoffset(sa_manager);
253 static bool radeon_sa_bo_next_hole(struct radeon_sa_manager *sa_manager,
261 if (sa_manager->hole->next == &sa_manager->olist) {
263 sa_manager->hole = &sa_manager->olist;
267 soffset = radeon_sa_bo_hole_soffset(sa_manager);
268 /* to handle wrap around we add sa_manager->size */
269 best = sa_manager->size * 2;
276 if (list_empty(&sa_manager->flist[i])) {
280 sa_bo = list_first_entry(&sa_manager->flist[i],
296 tmp += sa_manager->size;
308 sa_manager->hole = best_bo->olist.prev;
319 struct radeon_sa_manager *sa_manager,
328 KASSERT(size <= sa_manager->size, ("size > sa_manager->size"));
334 (*sa_bo)->manager = sa_manager;
339 sx_xlock(&sa_manager->wq_lock);
347 radeon_sa_bo_try_free(sa_manager);
349 if (radeon_sa_bo_try_alloc(sa_manager, *sa_bo,
351 sx_xunlock(&sa_manager->wq_lock);
356 } while (radeon_sa_bo_next_hole(sa_manager, fences, tries));
358 sx_xunlock(&sa_manager->wq_lock);
360 sx_xlock(&sa_manager->wq_lock);
363 while (!radeon_sa_event(sa_manager, size, align)) {
364 r = -cv_wait_sig(&sa_manager->wq,
365 &sa_manager->wq_lock);
378 sx_xunlock(&sa_manager->wq_lock);
387 struct radeon_sa_manager *sa_manager;
393 sa_manager = (*sa_bo)->manager;
394 sx_xlock(&sa_manager->wq_lock);
398 &sa_manager->flist[fence->ring]);
402 cv_broadcast(&sa_manager->wq);
403 sx_xunlock(&sa_manager->wq_lock);
408 void radeon_sa_bo_dump_debug_info(struct radeon_sa_manager *sa_manager,
413 spin_lock(&sa_manager->wq.lock);
414 list_for_each_entry(i, &sa_manager->olist, olist) {
415 if (&i->olist == sa_manager->hole) {
428 spin_unlock(&sa_manager->wq.lock);