summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLajos Molnar <molnar@ti.com>2010-01-29 11:49:09 +0530
committerRicardo Perez Olivares <x0081762@ti.com>2010-02-03 13:42:03 -0600
commit953da5265ab9be874e7a7d74e67d21f91b315c89 (patch)
tree656eaaa32d86029fe41e57679b5578e2640f2cd0
parentc6645c4af69fcad982dff086a010c007041016b8 (diff)
TILER: Added optimization to free tiler buffers
TILER: Added optimization to free tiler buffers Added linked list to track pages used by a tiler area, and use this list to free the pages. Signed-off-by: Lajos Molnar <molnar@ti.com>
-rwxr-xr-xdrivers/media/video/tiler/dmm_2d_alloc.c9
-rwxr-xr-x[-rw-r--r--]drivers/media/video/tiler/dmm_2d_alloc.h1
-rwxr-xr-xdrivers/media/video/tiler/dmm_hl_drv.c13
-rwxr-xr-x[-rw-r--r--]drivers/media/video/tiler/dmm_page_rep.c54
-rwxr-xr-x[-rw-r--r--]drivers/media/video/tiler/dmm_prv.h7
5 files changed, 71 insertions, 13 deletions
diff --git a/drivers/media/video/tiler/dmm_2d_alloc.c b/drivers/media/video/tiler/dmm_2d_alloc.c
index c12137d2f839..65d1eb8a8351 100755
--- a/drivers/media/video/tiler/dmm_2d_alloc.c
+++ b/drivers/media/video/tiler/dmm_2d_alloc.c
@@ -1624,6 +1624,7 @@ enum MSP_BOOL dealloc_2d_area(struct dmmTILERContCtxT *dmmTilerCtx,
to free them.
*/
if (delItm->pgAr.patCustomPages == MSP_FALSE) {
+ struct dmmPhysPgLLT *topPage = areaRem->topPage;
numPages = (delItm->pgAr.x1 - delItm->pgAr.x0 + 1)*
(delItm->pgAr.y1 - delItm->pgAr.y0 + 1);
/* Get the area to free associated physical memory pages
@@ -1637,10 +1638,10 @@ enum MSP_BOOL dealloc_2d_area(struct dmmTILERContCtxT *dmmTilerCtx,
pool leave it be.
*/
for (i = 0;
- i < numPages && eCode == DMM_NO_ERROR; i++) {
- eCode = dmm_free_phys_page(
- (unsigned long *)
- (delItm->pgAr.patPageEntries[i]));
+ i < numPages && eCode == DMM_NO_ERROR &&
+ topPage; i++) {
+ eCode = dmm_free_phys_page_quick(topPage);
+ topPage = topPage->nextPg;
}
}
diff --git a/drivers/media/video/tiler/dmm_2d_alloc.h b/drivers/media/video/tiler/dmm_2d_alloc.h
index d2526102918d..0f3d3c855357 100644..100755
--- a/drivers/media/video/tiler/dmm_2d_alloc.h
+++ b/drivers/media/video/tiler/dmm_2d_alloc.h
@@ -50,6 +50,7 @@ struct dmmTILERContPageAreaT {
unsigned long dma_size;
dma_addr_t dma_pa;
unsigned long *patPageEntries;
+ struct dmmPhysPgLLT *topPage;
};
struct dmmTILERContPageAreaSpecT {
diff --git a/drivers/media/video/tiler/dmm_hl_drv.c b/drivers/media/video/tiler/dmm_hl_drv.c
index c61ab443506a..ca4331349479 100755
--- a/drivers/media/video/tiler/dmm_hl_drv.c
+++ b/drivers/media/video/tiler/dmm_hl_drv.c
@@ -120,7 +120,8 @@ enum errorCodeT dmm_pat_phy2virt_mapping(
if (dmm_tiler_populate_pat_page_entry_data(bfrPages,
NULL,
NULL,
- (void *)bufferMappedZone->patPageEntries
+ (void *)bufferMappedZone->patPageEntries,
+ &(bufferMappedZone->topPage)
) != DMM_NO_ERROR) {
eCode = DMM_SYS_ERROR;
return eCode;
@@ -166,16 +167,22 @@ enum errorCodeT dmm_pat_phy2virt_mapping(
enum errorCodeT dmm_tiler_populate_pat_page_entry_data(unsigned long numPages,
unsigned long **pageEntries,
unsigned long **pageEntriesSpace,
- void *custmPagesPtr)
+ void *custmPagesPtr,
+ struct dmmPhysPgLLT **topPage)
{
signed long iter;
unsigned long *patAreaEntries = NULL;
+ struct dmmPhysPgLLT *page = NULL;
patAreaEntries = (unsigned long *)custmPagesPtr;
+ *topPage = NULL;
for (iter = 0; iter < numPages; iter++) {
+ *topPage = page = dmm_get_phys_page();
+ page->nextPg = NULL;
+ topPage = &(page->nextPg);
patAreaEntries[iter] =
- (unsigned long)dmm_get_phys_page();
+ (unsigned long)page->physPgPtr;
if (patAreaEntries[iter] == 0x0)
return DMM_SYS_ERROR;
}
diff --git a/drivers/media/video/tiler/dmm_page_rep.c b/drivers/media/video/tiler/dmm_page_rep.c
index 9e185d4661d4..bad633e2fd6e 100644..100755
--- a/drivers/media/video/tiler/dmm_page_rep.c
+++ b/drivers/media/video/tiler/dmm_page_rep.c
@@ -218,9 +218,9 @@ enum errorCodeT dmm_phys_page_rep_deinit(void)
* @see
*/
/* ========================================================================== */
-unsigned long *dmm_get_phys_page(void)
+struct dmmPhysPgLLT *dmm_get_phys_page(void)
{
- unsigned long *physPgPtr = NULL;
+ struct dmmPhysPgLLT *page = NULL;
int r = -1;
mutex_lock(&mtx);
@@ -251,7 +251,7 @@ unsigned long *dmm_get_phys_page(void)
tmpPgNode->nextPhysPg = NULL;
usedPagesStack = tmpPgNode;
- physPgPtr = tmpPgNode->physPgPtr;
+ page = tmpPgNode;
freePageCnt--;
}
@@ -260,7 +260,7 @@ unsigned long *dmm_get_phys_page(void)
check_stack(usedPagesStack, "used: ", __LINE__);
#endif
mutex_unlock(&mtx);
- return physPgPtr;
+ return page;
}
/* ========================================================================== */
@@ -345,3 +345,49 @@ enum errorCodeT dmm_free_phys_page(unsigned long *physPgPtr)
return DMM_WRONG_PARAM;
}
+enum errorCodeT dmm_free_phys_page_quick(struct dmmPhysPgLLT *page)
+{
+ mutex_lock(&mtx);
+
+ /* remove from list */
+ if (page->prevPhysPg != NULL) {
+ page->prevPhysPg->nextPhysPg =
+ page->nextPhysPg;
+ }
+
+ if (page->nextPhysPg != NULL) {
+ page->nextPhysPg->prevPhysPg =
+ page->prevPhysPg;
+ } else if (page == usedPagesStack) {
+ usedPagesStack = usedPagesStack->prevPhysPg;
+ } else {
+ mutex_unlock(&mtx);
+ lajosdump(page);
+ return DMM_SYS_ERROR;
+ }
+
+ /* add to end of freepages */
+ if (freePagesStack != NULL)
+ freePagesStack->nextPhysPg = page;
+ page->prevPhysPg = freePagesStack;
+ freePagesStack = page;
+ freePageCnt++;
+
+ while (freePageCnt > DMM_MNGD_PHYS_PAGES &&
+ freePagesStack != NULL) {
+ page = freePagesStack->prevPhysPg;
+ __free_page(freePagesStack->page_addr);
+ kfree(freePagesStack);
+ freePagesStack = page;
+ freePageCnt--;
+ }
+ freePagesStack->nextPhysPg = NULL;
+
+ mutex_unlock(&mtx);
+#ifdef CHECK_STACK
+ check_stack(freePagesStack, "free: ", __LINE__);
+ check_stack(usedPagesStack, "used: ", __LINE__);
+#endif
+ return DMM_NO_ERROR;
+}
+
diff --git a/drivers/media/video/tiler/dmm_prv.h b/drivers/media/video/tiler/dmm_prv.h
index d69c374caac6..249e162bf079 100644..100755
--- a/drivers/media/video/tiler/dmm_prv.h
+++ b/drivers/media/video/tiler/dmm_prv.h
@@ -206,6 +206,7 @@
struct dmmPhysPgLLT {
struct dmmPhysPgLLT *nextPhysPg;
struct dmmPhysPgLLT *prevPhysPg;
+ struct dmmPhysPgLLT *nextPg;
unsigned long *physPgPtr;
struct page *page_addr;
};
@@ -385,7 +386,8 @@ enum errorCodeT dmm_tiler_container_map_area(
enum errorCodeT dmm_tiler_populate_pat_page_entry_data(unsigned long bfrSize,
unsigned long **pageEntries,
unsigned long **pageEntriesSpace,
- void *custmPagesPtr);
+ void *custmPagesPtr,
+ struct dmmPhysPgLLT **topPage);
/* ========================================================================== */
/**
@@ -521,7 +523,7 @@ enum errorCodeT dmm_phys_page_rep_deinit(void);
* @see
*/
/* ========================================================================== */
-unsigned long *dmm_get_phys_page(void);
+struct dmmPhysPgLLT *dmm_get_phys_page(void);
/* ========================================================================== */
/**
@@ -542,6 +544,7 @@ unsigned long *dmm_get_phys_page(void);
*/
/* ========================================================================== */
enum errorCodeT dmm_free_phys_page(unsigned long *physPgPtr);
+enum errorCodeT dmm_free_phys_page_quick(struct dmmPhysPgLLT *page);
/* ========================================================================== */
/**