Lines Matching refs:dbm
31 static struct xe_guc *dbm_to_guc(struct xe_guc_db_mgr *dbm) in dbm_to_guc() argument
33 return container_of(dbm, struct xe_guc, dbm); in dbm_to_guc()
36 static struct xe_gt *dbm_to_gt(struct xe_guc_db_mgr *dbm) in dbm_to_gt() argument
38 return guc_to_gt(dbm_to_guc(dbm)); in dbm_to_gt()
41 static struct xe_device *dbm_to_xe(struct xe_guc_db_mgr *dbm) in dbm_to_xe() argument
43 return gt_to_xe(dbm_to_gt(dbm)); in dbm_to_xe()
49 static void dbm_print_locked(struct xe_guc_db_mgr *dbm, struct drm_printer *p, int indent);
53 struct xe_guc_db_mgr *dbm = arg; in __fini_dbm() local
56 mutex_lock(dbm_mutex(dbm)); in __fini_dbm()
58 weight = bitmap_weight(dbm->bitmap, dbm->count); in __fini_dbm()
60 struct drm_printer p = xe_gt_info_printer(dbm_to_gt(dbm)); in __fini_dbm()
62 xe_gt_err(dbm_to_gt(dbm), "GuC doorbells manager unclean (%u/%u)\n", in __fini_dbm()
63 weight, dbm->count); in __fini_dbm()
64 dbm_print_locked(dbm, &p, 1); in __fini_dbm()
67 bitmap_free(dbm->bitmap); in __fini_dbm()
68 dbm->bitmap = NULL; in __fini_dbm()
69 dbm->count = 0; in __fini_dbm()
71 mutex_unlock(dbm_mutex(dbm)); in __fini_dbm()
87 int xe_guc_db_mgr_init(struct xe_guc_db_mgr *dbm, unsigned int count) in xe_guc_db_mgr_init() argument
94 dbm_assert(dbm, !dbm->bitmap); in xe_guc_db_mgr_init()
95 dbm_assert(dbm, count <= GUC_NUM_DOORBELLS); in xe_guc_db_mgr_init()
100 dbm->bitmap = bitmap_zalloc(count, GFP_KERNEL); in xe_guc_db_mgr_init()
101 if (!dbm->bitmap) in xe_guc_db_mgr_init()
103 dbm->count = count; in xe_guc_db_mgr_init()
105 ret = drmm_add_action_or_reset(&dbm_to_xe(dbm)->drm, __fini_dbm, dbm); in xe_guc_db_mgr_init()
109 xe_gt_dbg(dbm_to_gt(dbm), "using %u doorbell%s\n", in xe_guc_db_mgr_init()
110 dbm->count, str_plural(dbm->count)); in xe_guc_db_mgr_init()
114 static int dbm_reserve_chunk_locked(struct xe_guc_db_mgr *dbm, in dbm_reserve_chunk_locked() argument
120 dbm_assert(dbm, count); in dbm_reserve_chunk_locked()
121 dbm_assert(dbm, count <= GUC_NUM_DOORBELLS); in dbm_reserve_chunk_locked()
122 dbm_assert(dbm, dbm->count <= GUC_NUM_DOORBELLS); in dbm_reserve_chunk_locked()
123 lockdep_assert_held(dbm_mutex(dbm)); in dbm_reserve_chunk_locked()
125 if (!dbm->count) in dbm_reserve_chunk_locked()
129 used = bitmap_weight(dbm->bitmap, dbm->count); in dbm_reserve_chunk_locked()
130 if (used + count + spare > dbm->count) in dbm_reserve_chunk_locked()
134 index = bitmap_find_next_zero_area(dbm->bitmap, dbm->count, 0, count, 0); in dbm_reserve_chunk_locked()
135 if (index >= dbm->count) in dbm_reserve_chunk_locked()
138 bitmap_set(dbm->bitmap, index, count); in dbm_reserve_chunk_locked()
143 static void dbm_release_chunk_locked(struct xe_guc_db_mgr *dbm, in dbm_release_chunk_locked() argument
146 dbm_assert(dbm, count); in dbm_release_chunk_locked()
147 dbm_assert(dbm, count <= GUC_NUM_DOORBELLS); in dbm_release_chunk_locked()
148 dbm_assert(dbm, dbm->count); in dbm_release_chunk_locked()
149 dbm_assert(dbm, dbm->count <= GUC_NUM_DOORBELLS); in dbm_release_chunk_locked()
150 lockdep_assert_held(dbm_mutex(dbm)); in dbm_release_chunk_locked()
156 dbm_assert(dbm, test_bit(start + n, dbm->bitmap)); in dbm_release_chunk_locked()
158 bitmap_clear(dbm->bitmap, start, count); in dbm_release_chunk_locked()
169 int xe_guc_db_mgr_reserve_id_locked(struct xe_guc_db_mgr *dbm) in xe_guc_db_mgr_reserve_id_locked() argument
171 return dbm_reserve_chunk_locked(dbm, 1, 0); in xe_guc_db_mgr_reserve_id_locked()
181 void xe_guc_db_mgr_release_id_locked(struct xe_guc_db_mgr *dbm, unsigned int id) in xe_guc_db_mgr_release_id_locked() argument
183 return dbm_release_chunk_locked(dbm, id, 1); in xe_guc_db_mgr_release_id_locked()
199 int xe_guc_db_mgr_reserve_range(struct xe_guc_db_mgr *dbm, in xe_guc_db_mgr_reserve_range() argument
204 mutex_lock(dbm_mutex(dbm)); in xe_guc_db_mgr_reserve_range()
205 ret = dbm_reserve_chunk_locked(dbm, count, spare); in xe_guc_db_mgr_reserve_range()
206 mutex_unlock(dbm_mutex(dbm)); in xe_guc_db_mgr_reserve_range()
217 void xe_guc_db_mgr_release_range(struct xe_guc_db_mgr *dbm, in xe_guc_db_mgr_release_range() argument
220 mutex_lock(dbm_mutex(dbm)); in xe_guc_db_mgr_release_range()
221 dbm_release_chunk_locked(dbm, start, count); in xe_guc_db_mgr_release_range()
222 mutex_unlock(dbm_mutex(dbm)); in xe_guc_db_mgr_release_range()
225 static void dbm_print_locked(struct xe_guc_db_mgr *dbm, struct drm_printer *p, int indent) in dbm_print_locked() argument
230 drm_printf_indent(p, indent, "count: %u\n", dbm->count); in dbm_print_locked()
231 if (!dbm->bitmap) in dbm_print_locked()
235 for_each_clear_bitrange(rs, re, dbm->bitmap, dbm->count) { in dbm_print_locked()
243 for_each_set_bitrange(rs, re, dbm->bitmap, dbm->count) { in dbm_print_locked()
257 void xe_guc_db_mgr_print(struct xe_guc_db_mgr *dbm, in xe_guc_db_mgr_print() argument
260 mutex_lock(dbm_mutex(dbm)); in xe_guc_db_mgr_print()
261 dbm_print_locked(dbm, p, indent); in xe_guc_db_mgr_print()
262 mutex_unlock(dbm_mutex(dbm)); in xe_guc_db_mgr_print()