Commit 0d6fa53f authored by Andy Gross's avatar Andy Gross Committed by Tomi Valkeinen

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: default avatarAndy Gross <andy.gross@ti.com>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent 73d77107
...@@ -363,6 +363,7 @@ struct tiler_block *tiler_reserve_2d(enum tiler_fmt fmt, uint16_t w, ...@@ -363,6 +363,7 @@ struct tiler_block *tiler_reserve_2d(enum tiler_fmt fmt, uint16_t w,
u32 min_align = 128; u32 min_align = 128;
int ret; int ret;
unsigned long flags; unsigned long flags;
size_t slot_bytes;
BUG_ON(!validfmt(fmt)); BUG_ON(!validfmt(fmt));
...@@ -371,13 +372,15 @@ struct tiler_block *tiler_reserve_2d(enum tiler_fmt fmt, uint16_t w, ...@@ -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); h = DIV_ROUND_UP(h, geom[fmt].slot_h);
/* convert alignment to slots */ /* convert alignment to slots */
min_align = max(min_align, (geom[fmt].slot_w * geom[fmt].cpp)); slot_bytes = geom[fmt].slot_w * geom[fmt].cpp;
align = ALIGN(align, min_align); min_align = max(min_align, slot_bytes);
align /= geom[fmt].slot_w * geom[fmt].cpp; align = (align > min_align) ? ALIGN(align, min_align) : min_align;
align /= slot_bytes;
block->fmt = fmt; 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) { if (ret) {
kfree(block); kfree(block);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -739,8 +742,7 @@ static int omap_dmm_probe(struct platform_device *dev) ...@@ -739,8 +742,7 @@ static int omap_dmm_probe(struct platform_device *dev)
programming during reill operations */ programming during reill operations */
for (i = 0; i < omap_dmm->num_lut; i++) { for (i = 0; i < omap_dmm->num_lut; i++) {
omap_dmm->tcm[i] = sita_init(omap_dmm->container_width, omap_dmm->tcm[i] = sita_init(omap_dmm->container_width,
omap_dmm->container_height, omap_dmm->container_height);
NULL);
if (!omap_dmm->tcm[i]) { if (!omap_dmm->tcm[i]) {
dev_err(&dev->dev, "failed to allocate container\n"); dev_err(&dev->dev, "failed to allocate container\n");
......
This diff is collapsed.
...@@ -61,18 +61,17 @@ struct tcm { ...@@ -61,18 +61,17 @@ struct tcm {
unsigned int y_offset; /* offset to use for y coordinates */ unsigned int y_offset; /* offset to use for y coordinates */
/* 'pvt' structure shall contain any tcm details (attr) along with spinlock_t lock;
linked list of allocated areas and mutex for mutually exclusive access unsigned long *bitmap;
to the list. It may also contain copies of width and height to notice size_t map_size;
any changes to the publicly available width and height fields. */
void *pvt;
/* function table */ /* 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); struct tcm_area *area);
s32 (*reserve_1d)(struct tcm *tcm, u32 slots, 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); s32 (*free)(struct tcm *tcm, struct tcm_area *area);
void (*deinit) (struct tcm *tcm); void (*deinit)(struct tcm *tcm);
}; };
/*============================================================================= /*=============================================================================
...@@ -91,7 +90,7 @@ struct 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) ...@@ -120,6 +119,9 @@ static inline void tcm_deinit(struct tcm *tcm)
* all values may be supported by the container manager, * all values may be supported by the container manager,
* but it must support 0 (1), 32 and 64. * but it must support 0 (1), 32 and 64.
* 0 value is equivalent to 1. * 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. * @param area Pointer to where the reserved area should be stored.
* *
* @return 0 on success. Non-0 error code on failure. Also, * @return 0 on success. Non-0 error code on failure. Also,
...@@ -129,7 +131,8 @@ static inline void tcm_deinit(struct tcm *tcm) ...@@ -129,7 +131,8 @@ static inline void tcm_deinit(struct tcm *tcm)
* allocation. * allocation.
*/ */
static inline s32 tcm_reserve_2d(struct tcm *tcm, u16 width, u16 height, 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 */ /* perform rudimentary error checking */
s32 res = tcm == NULL ? -ENODEV : s32 res = tcm == NULL ? -ENODEV :
...@@ -140,7 +143,8 @@ static inline s32 tcm_reserve_2d(struct tcm *tcm, u16 width, u16 height, ...@@ -140,7 +143,8 @@ static inline s32 tcm_reserve_2d(struct tcm *tcm, u16 width, u16 height,
if (!res) { if (!res) {
area->is2d = true; 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; area->tcm = res ? NULL : tcm;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment