summaryrefslogtreecommitdiff
path: root/drivers/media/video/tiler/dmm_page_rep.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/tiler/dmm_page_rep.c')
-rw-r--r--drivers/media/video/tiler/dmm_page_rep.c105
1 files changed, 24 insertions, 81 deletions
diff --git a/drivers/media/video/tiler/dmm_page_rep.c b/drivers/media/video/tiler/dmm_page_rep.c
index a0a82fa1adc5..9e185d4661d4 100644
--- a/drivers/media/video/tiler/dmm_page_rep.c
+++ b/drivers/media/video/tiler/dmm_page_rep.c
@@ -14,26 +14,13 @@
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
-#include <linux/vmalloc.h>
-#include <linux/mm.h> /* vmalloc_to_page */
-#include <linux/mmzone.h> /* __page_to_phys */
-#include "dmm_prv.h"
-
-#define __NEWCODE__
-
-#ifdef __NEWCODE__
+#include <linux/mm.h>
+#include <linux/mmzone.h>
#include <asm/cacheflush.h>
#include <linux/mutex.h>
+#include "dmm_prv.h"
static struct mutex mtx;
-#endif
-
-#define __KERN_TO_ALLOC__
-
-#ifndef __KERN_TO_ALLOC__
-#define BASE_MEM_ADDR 0x98000000
-static unsigned long page_addr;
-#endif
#ifdef CHECK_STACK
#define lajosdump(x) printk(KERN_NOTICE "%s::%s():%d: %s=%p\n",\
@@ -79,8 +66,6 @@ static void check_stack(struct dmmPhysPgLLT *stack, char *prefix, int line)
}
#endif
-/*--------function prototypes ---------------------------------*/
-
/* ========================================================================== */
/**
* dmmPhysPageRepRefil()
@@ -96,29 +81,25 @@ static void check_stack(struct dmmPhysPgLLT *stack, char *prefix, int line)
* @see
*/
/* ========================================================================== */
-void dmm_phys_page_rep_refil(void)
+enum errorCodeT dmm_phys_page_rep_refil(void)
{
unsigned long iter;
+ struct page *page = NULL;
- tilerdump(__LINE__);
for (iter = 0; iter < DMM_MNGD_PHYS_PAGES; iter++) {
- struct dmmPhysPgLLT *tmpPgNode = kmalloc
- (sizeof(struct dmmPhysPgLLT), GFP_KERNEL);
+ struct dmmPhysPgLLT *tmpPgNode = NULL;
+
+ tmpPgNode = kmalloc(sizeof(struct dmmPhysPgLLT), GFP_KERNEL);
+ if (!tmpPgNode)
+ return DMM_SYS_ERROR;
memset(tmpPgNode, 0x0, sizeof(struct dmmPhysPgLLT));
if (tmpPgNode != NULL) {
-
tmpPgNode->nextPhysPg = NULL;
tmpPgNode->prevPhysPg = NULL;
-#ifndef __NEWCODE__
- tmpPgNode->physPgPtr =
- (unsigned long *)__get_free_page(
- GFP_KERNEL | GFP_DMA);
-#else
-#ifdef __KERN_TO_ALLOC__
- struct page *page = NULL;
-
page = (struct page *)alloc_page(GFP_KERNEL | GFP_DMA);
+ if (!page)
+ return DMM_SYS_ERROR;
tmpPgNode->physPgPtr =
(unsigned long *)page_to_phys(page);
tmpPgNode->page_addr = page;
@@ -126,11 +107,6 @@ void dmm_phys_page_rep_refil(void)
(void *)page_address(page) + 0x1000);
outer_flush_range((unsigned long)tmpPgNode->physPgPtr,
(unsigned long)tmpPgNode->physPgPtr + 0x1000);
-#else
- tmpPgNode->physPgPtr = (unsigned long *)page_addr;
- page_addr += 0x1000;
-#endif
-#endif
/* add to end */
if (freePagesStack != NULL) {
@@ -150,6 +126,7 @@ void dmm_phys_page_rep_refil(void)
#ifdef CHECK_STACK
check_stack(freePagesStack, "free: ", __LINE__);
#endif
+ return DMM_NO_ERROR;
}
/* ========================================================================== */
@@ -169,24 +146,18 @@ void dmm_phys_page_rep_refil(void)
/* ========================================================================== */
enum errorCodeT dmm_phys_page_rep_init(void)
{
+ int r = DMM_SYS_ERROR;
mutex_init(&mtx);
- /* DMM_ENTER_CRITICAL_SECTION */
mutex_lock(&mtx);
freePagesStack = NULL;
usedPagesStack = NULL;
-
freePageCnt = 0;
-#ifndef __KERN_TO_ALLOC__
- page_addr = BASE_MEM_ADDR;
-#endif
-
- dmm_phys_page_rep_refil();
+ r = dmm_phys_page_rep_refil();
- /* DMM_EXIT_CRITICAL_SETCTION */
mutex_unlock(&mtx);
- return DMM_NO_ERROR;
+ return r;
}
/* ========================================================================== */
@@ -207,43 +178,26 @@ enum errorCodeT dmm_phys_page_rep_init(void)
/* ========================================================================== */
enum errorCodeT dmm_phys_page_rep_deinit(void)
{
- /* DMM_ENTER_CRITICAL_SECTION */
- mutex_lock(&mtx);
struct dmmPhysPgLLT *tmpPgNode = NULL;
+ mutex_lock(&mtx);
+
while (usedPagesStack != NULL) {
tmpPgNode = usedPagesStack->prevPhysPg;
-#ifndef __NEWCODE__
- free_page((unsigned long)usedPagesStack->physPgPtr);
- kfree(usedPagesStack);
-#else
-#ifdef __KERN_TO_ALLOC__
__free_page(usedPagesStack->page_addr);
-#else
-#endif
kfree(usedPagesStack);
-#endif
usedPagesStack = tmpPgNode;
}
while (freePagesStack != NULL) {
tmpPgNode = freePagesStack->prevPhysPg;
-#ifndef __NEWCODE__
- free_page((unsigned long)freePagesStack->physPgPtr);
- kfree(freePagesStack);
-#else
-#ifdef __KERN_TO_ALLOC__
__free_page(freePagesStack->page_addr);
-#else
-#endif
kfree(freePagesStack);
-#endif
freePagesStack = tmpPgNode;
}
freePageCnt = 0;
- /* DMM_EXIT_CRITICAL_SETCTION */
mutex_unlock(&mtx);
mutex_destroy(&mtx);
return DMM_NO_ERROR;
@@ -267,12 +221,15 @@ enum errorCodeT dmm_phys_page_rep_deinit(void)
unsigned long *dmm_get_phys_page(void)
{
unsigned long *physPgPtr = NULL;
+ int r = -1;
- /* DMM_ENTER_CRITICAL_SECTION */
mutex_lock(&mtx);
- if (freePagesStack == NULL)
- dmm_phys_page_rep_refil();
+ if (freePagesStack == NULL) {
+ r = dmm_phys_page_rep_refil();
+ if (r != DMM_NO_ERROR)
+ return NULL;
+ }
if (freePagesStack != NULL) {
struct dmmPhysPgLLT *tmpPgNode = freePagesStack;
@@ -302,7 +259,6 @@ unsigned long *dmm_get_phys_page(void)
check_stack(freePagesStack, "free: ", __LINE__);
check_stack(usedPagesStack, "used: ", __LINE__);
#endif
- /* DMM_EXIT_CRITICAL_SETCTION */
mutex_unlock(&mtx);
return physPgPtr;
}
@@ -329,7 +285,6 @@ enum errorCodeT dmm_free_phys_page(unsigned long *physPgPtr)
{
struct dmmPhysPgLLT *iterPgNode = usedPagesStack;
- /* DMM_ENTER_CRITICAL_SECTION */
mutex_lock(&mtx);
while (iterPgNode != NULL) {
@@ -349,7 +304,6 @@ enum errorCodeT dmm_free_phys_page(unsigned long *physPgPtr)
} else if (iterPgNode == usedPagesStack) {
usedPagesStack = usedPagesStack->prevPhysPg;
} else {
- /* DMM_EXIT_CRITICAL_SETCTION */
mutex_unlock(&mtx);
lajosdump(iterPgNode);
return DMM_SYS_ERROR;
@@ -365,23 +319,13 @@ enum errorCodeT dmm_free_phys_page(unsigned long *physPgPtr)
while (freePageCnt > DMM_MNGD_PHYS_PAGES &&
freePagesStack != NULL) {
iterPgNode = freePagesStack->prevPhysPg;
-#ifndef __NEWCODE__
- free_page((unsigned long)
- freePagesStack->physPgPtr);
- kfree(freePagesStack);
-#else
-#ifdef __KERN_TO_ALLOC__
__free_page(freePagesStack->page_addr);
-#else
-#endif
kfree(freePagesStack);
-#endif
freePagesStack = iterPgNode;
freePageCnt--;
}
freePagesStack->nextPhysPg = NULL;
- /* DMM_EXIT_CRITICAL_SETCTION */
mutex_unlock(&mtx);
#ifdef CHECK_STACK
check_stack(freePagesStack, "free: ", __LINE__);
@@ -393,7 +337,6 @@ enum errorCodeT dmm_free_phys_page(unsigned long *physPgPtr)
iterPgNode = iterPgNode->prevPhysPg;
}
- /* DMM_EXIT_CRITICAL_SETCTION */
mutex_unlock(&mtx);
#ifdef CHECK_STACK
check_stack(freePagesStack, "free: ", __LINE__);