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
@@ -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