diff options
-rwxr-xr-x | drivers/media/video/tiler/dmm_2d_alloc.c | 9 | ||||
-rwxr-xr-x[-rw-r--r--] | drivers/media/video/tiler/dmm_2d_alloc.h | 1 | ||||
-rwxr-xr-x | drivers/media/video/tiler/dmm_hl_drv.c | 13 | ||||
-rwxr-xr-x[-rw-r--r--] | drivers/media/video/tiler/dmm_page_rep.c | 54 | ||||
-rwxr-xr-x[-rw-r--r--] | drivers/media/video/tiler/dmm_prv.h | 7 |
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); /* ========================================================================== */ /** |