You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
drm/omap: Use bitmaps for TILER placement
Modified Tiler placement to utilize bitmaps for bookkeeping and all placement algorithms. This resulted in a substantial savings in time for all Tiler reservation and free operations. Typical savings are in the range of 28% decrease in time taken with larger buffers showing a 80%+ decrease. Signed-off-by: Andy Gross <andy.gross@ti.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
This commit is contained in:
committed by
Tomi Valkeinen
parent
73d77107b8
commit
0d6fa53fd8
@@ -363,6 +363,7 @@ struct tiler_block *tiler_reserve_2d(enum tiler_fmt fmt, uint16_t w,
|
||||
u32 min_align = 128;
|
||||
int ret;
|
||||
unsigned long flags;
|
||||
size_t slot_bytes;
|
||||
|
||||
BUG_ON(!validfmt(fmt));
|
||||
|
||||
@@ -371,13 +372,15 @@ struct tiler_block *tiler_reserve_2d(enum tiler_fmt fmt, uint16_t w,
|
||||
h = DIV_ROUND_UP(h, geom[fmt].slot_h);
|
||||
|
||||
/* convert alignment to slots */
|
||||
min_align = max(min_align, (geom[fmt].slot_w * geom[fmt].cpp));
|
||||
align = ALIGN(align, min_align);
|
||||
align /= geom[fmt].slot_w * geom[fmt].cpp;
|
||||
slot_bytes = geom[fmt].slot_w * geom[fmt].cpp;
|
||||
min_align = max(min_align, slot_bytes);
|
||||
align = (align > min_align) ? ALIGN(align, min_align) : min_align;
|
||||
align /= slot_bytes;
|
||||
|
||||
block->fmt = fmt;
|
||||
|
||||
ret = tcm_reserve_2d(containers[fmt], w, h, align, &block->area);
|
||||
ret = tcm_reserve_2d(containers[fmt], w, h, align, -1, slot_bytes,
|
||||
&block->area);
|
||||
if (ret) {
|
||||
kfree(block);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
@@ -739,8 +742,7 @@ static int omap_dmm_probe(struct platform_device *dev)
|
||||
programming during reill operations */
|
||||
for (i = 0; i < omap_dmm->num_lut; i++) {
|
||||
omap_dmm->tcm[i] = sita_init(omap_dmm->container_width,
|
||||
omap_dmm->container_height,
|
||||
NULL);
|
||||
omap_dmm->container_height);
|
||||
|
||||
if (!omap_dmm->tcm[i]) {
|
||||
dev_err(&dev->dev, "failed to allocate container\n");
|
||||
|
||||
+202
-641
File diff suppressed because it is too large
Load Diff
@@ -61,18 +61,17 @@ struct tcm {
|
||||
|
||||
unsigned int y_offset; /* offset to use for y coordinates */
|
||||
|
||||
/* 'pvt' structure shall contain any tcm details (attr) along with
|
||||
linked list of allocated areas and mutex for mutually exclusive access
|
||||
to the list. It may also contain copies of width and height to notice
|
||||
any changes to the publicly available width and height fields. */
|
||||
void *pvt;
|
||||
spinlock_t lock;
|
||||
unsigned long *bitmap;
|
||||
size_t map_size;
|
||||
|
||||
/* function table */
|
||||
s32 (*reserve_2d)(struct tcm *tcm, u16 height, u16 width, u8 align,
|
||||
s32 (*reserve_2d)(struct tcm *tcm, u16 height, u16 width, u16 align,
|
||||
int16_t offset, uint16_t slot_bytes,
|
||||
struct tcm_area *area);
|
||||
s32 (*reserve_1d)(struct tcm *tcm, u32 slots, struct tcm_area *area);
|
||||
s32 (*free) (struct tcm *tcm, struct tcm_area *area);
|
||||
void (*deinit) (struct tcm *tcm);
|
||||
s32 (*free)(struct tcm *tcm, struct tcm_area *area);
|
||||
void (*deinit)(struct tcm *tcm);
|
||||
};
|
||||
|
||||
/*=============================================================================
|
||||
@@ -91,7 +90,7 @@ struct tcm {
|
||||
*
|
||||
*/
|
||||
|
||||
struct tcm *sita_init(u16 width, u16 height, struct tcm_pt *attr);
|
||||
struct tcm *sita_init(u16 width, u16 height);
|
||||
|
||||
|
||||
/**
|
||||
@@ -120,6 +119,9 @@ static inline void tcm_deinit(struct tcm *tcm)
|
||||
* all values may be supported by the container manager,
|
||||
* but it must support 0 (1), 32 and 64.
|
||||
* 0 value is equivalent to 1.
|
||||
* @param offset Offset requirement, in bytes. This is the offset
|
||||
* from a 4KiB aligned virtual address.
|
||||
* @param slot_bytes Width of slot in bytes
|
||||
* @param area Pointer to where the reserved area should be stored.
|
||||
*
|
||||
* @return 0 on success. Non-0 error code on failure. Also,
|
||||
@@ -129,7 +131,8 @@ static inline void tcm_deinit(struct tcm *tcm)
|
||||
* allocation.
|
||||
*/
|
||||
static inline s32 tcm_reserve_2d(struct tcm *tcm, u16 width, u16 height,
|
||||
u16 align, struct tcm_area *area)
|
||||
u16 align, int16_t offset, uint16_t slot_bytes,
|
||||
struct tcm_area *area)
|
||||
{
|
||||
/* perform rudimentary error checking */
|
||||
s32 res = tcm == NULL ? -ENODEV :
|
||||
@@ -140,7 +143,8 @@ static inline s32 tcm_reserve_2d(struct tcm *tcm, u16 width, u16 height,
|
||||
|
||||
if (!res) {
|
||||
area->is2d = true;
|
||||
res = tcm->reserve_2d(tcm, height, width, align, area);
|
||||
res = tcm->reserve_2d(tcm, height, width, align, offset,
|
||||
slot_bytes, area);
|
||||
area->tcm = res ? NULL : tcm;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user