105 static inline void tcm_deinit(
struct tcm *
tcm)
134 (area ==
NULL || width == 0 || height == 0 ||
136 (align & (align - 1))) ? -
EINVAL :
141 res = tcm->
reserve_2d(tcm, height, width, align, area);
161 static inline s32 tcm_reserve_1d(
struct tcm *tcm,
u32 slots,
195 if (area && area->
tcm) {
196 res = area->
tcm->free(area->
tcm, area);
223 if (slice->
tcm && !slice->
is2d &&
224 slice->
p0.y != slice->
p1.y &&
225 (slice->
p0.x || (slice->
p1.x != slice->
tcm->width - 1))) {
227 slice->
p1.x = slice->
tcm->width - 1;
228 slice->
p1.y = (slice->
p0.x) ? slice->
p0.y : slice->
p1.y - 1;
231 parent->
p0.y = slice->
p1.y + 1;
239 static inline bool tcm_area_is_valid(
struct tcm_area *area)
241 return area && area->
tcm &&
243 area->
p1.x < area->
tcm->width &&
244 area->
p1.y < area->
tcm->height &&
245 area->
p0.y <= area->
p1.y &&
248 area->
p0.x < area->
tcm->width &&
249 area->
p0.x + area->
p0.y * area->
tcm->width <=
250 area->
p1.x + area->
p1.y * area->
tcm->width) ||
253 area->
p0.x <= area->
p1.x));
262 return p->
x >= a->
p0.x && p->
x <= a->
p1.x &&
263 p->
y >= a->
p0.y && p->
y <= a->
p1.y;
265 i = p->
x + p->
y * a->
tcm->width;
266 return i >= a->
p0.x + a->
p0.y * a->
tcm->width &&
267 i <= a->
p1.x + a->
p1.y * a->
tcm->width;
272 static inline u16 __tcm_area_width(
struct tcm_area *area)
274 return area->
p1.x - area->
p0.x + 1;
278 static inline u16 __tcm_area_height(
struct tcm_area *area)
280 return area->
p1.y - area->
p0.y + 1;
284 static inline u16 __tcm_sizeof(
struct tcm_area *area)
287 __tcm_area_width(area) * __tcm_area_height(area) :
288 (area->
p1.
x - area->
p0.
x + 1) + (area->
p1.
y - area->
p0.
y) *
291 #define tcm_sizeof(area) __tcm_sizeof(&(area))
292 #define tcm_awidth(area) __tcm_area_width(&(area))
293 #define tcm_aheight(area) __tcm_area_height(&(area))
294 #define tcm_is_in(pt, area) __tcm_is_in(&(pt), &(area))
299 if (__tcm_sizeof(a) < num_pg)
304 a->
p1.x = (a->
p0.x + num_pg - 1) % a->
tcm->width;
305 a->
p1.y = a->
p0.y + ((a->
p0.x + num_pg - 1) / a->
tcm->width);
321 #define tcm_for_each_slice(var, area, safe) \
323 tcm_slice(&safe, &var); \
324 var.tcm; tcm_slice(&safe, &var))