Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+8 −6
Original line number Original line Diff line number Diff line
@@ -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,
	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)
	   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");
+181 −620

File changed.

Preview size limit exceeded, changes collapsed.

+15 −11
Original line number Original line Diff line number Diff line
@@ -61,14 +61,13 @@ 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);
@@ -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,
 *			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)
 *	    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,


	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;
	}
	}