summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorDavid Sin <a0869738@una0919475.tif.ti.com>2009-11-14 13:44:53 +0100
committerSantosh Shilimkar <santosh.shilimkar@ti.com>2009-11-16 20:50:56 +0100
commitd04311d7a0b3e07ee0b9c00f5b632aa309ea0150 (patch)
treeefbd630bce2d35f24871d51c68a57f79c7573a23 /drivers
parent3e8ab1f33ee3a0fed86eaa5eb45db0c81917db84 (diff)
add option to alloc pages outside kernel; add PAT reg readl checks
Diffstat (limited to 'drivers')
-rwxr-xr-xdrivers/media/video/tiler/dmm.c1
-rw-r--r--drivers/media/video/tiler/dmm_ll_drv.c50
-rw-r--r--drivers/media/video/tiler/dmm_page_rep.c27
3 files changed, 73 insertions, 5 deletions
diff --git a/drivers/media/video/tiler/dmm.c b/drivers/media/video/tiler/dmm.c
index 0dbf6db289ae..01f9b1c9712b 100755
--- a/drivers/media/video/tiler/dmm.c
+++ b/drivers/media/video/tiler/dmm.c
@@ -89,7 +89,6 @@ static void tiler_or_set() /* (struct tiler_or *or, char id) */
((((unsigned long)0) << field_pos) & bit_field);
__raw_writel(0x88888888, reg); /* __raw_writel(new_val, reg); */
-
reg = (void __iomem *)(
(unsigned long)dmm_base | (unsigned long)TILER_OR__0);
reg_val = __raw_readl(reg);
diff --git a/drivers/media/video/tiler/dmm_ll_drv.c b/drivers/media/video/tiler/dmm_ll_drv.c
index 6161fc678686..fe9bc608a0e6 100644
--- a/drivers/media/video/tiler/dmm_ll_drv.c
+++ b/drivers/media/video/tiler/dmm_ll_drv.c
@@ -341,6 +341,8 @@ enum errorCodeT dmm_pat_area_refill(struct PATDescrT *patDesc,
((unsigned long)dmm_virt_base_addr |
(0x500ul + 0x4));
regval = __raw_readl(reg);
+
+ /* set area to be refilled */
f = BITFIELD(30, 24);
fp = 24;
writeval = (regval & (~(f))) |
@@ -367,6 +369,19 @@ enum errorCodeT dmm_pat_area_refill(struct PATDescrT *patDesc,
writeval = (regval & (~(f))) |
((((char)patDesc->area.x0) << fp) & f);
__raw_writel(writeval, reg);
+
+ /* check the status reg after setting the area */
+ reg = (void __iomem *)(
+ (unsigned long)dmm_virt_base_addr |
+ (unsigned long)PAT_STATUS__0);
+ regdump("PAT_STATUS__0", __raw_readl(reg));
+
+ regval = 0x0;
+ while ((regval & 0x1) != 0x1) {
+ regval = __raw_readl(reg);
+ regdump("PAT_STATUS__0", regval);
+ }
+ regdump("PAT_STATUS__0", regval);
#ifndef __NEWCODE__
/* Apply 4 bit lft shft to counter the 4 bit rt shft */
reg = (void __iomem *)
@@ -437,7 +452,13 @@ enum errorCodeT dmm_pat_area_refill(struct PATDescrT *patDesc,
/* read and print data register again */
reg = (void __iomem *)
((unsigned long)dmm_virt_base_addr | (0x500ul + 0xc));
- regval = __raw_readl(reg);
+
+ /* read back PAT_DATA__0 to see if it got set */
+ regval = 0x0;
+ while (regval != patDesc->data) {
+ regval = __raw_readl(reg);
+ regdump("PAT_DATA__0", regval);
+ }
regdump("PAT_DATA__0", regval);
struct pat_desc pat_desc = {0};
@@ -451,17 +472,42 @@ enum errorCodeT dmm_pat_area_refill(struct PATDescrT *patDesc,
reg = (void __iomem *)(
(unsigned long)dmm_virt_base_addr |
(unsigned long)PAT_STATUS__0);
+
+ regval = 0x0;
+ while (regval != 0xB) {
+ regval = __raw_readl(reg);
+ regdump("PAT_STATUS__0", regval);
+ }
regdump("PAT_STATUS__0", __raw_readl(reg));
reg = (void __iomem *)(
(unsigned long)dmm_virt_base_addr |
(unsigned long)PAT_IRQSTATUS_RAW);
+
+ /* check if the refill was successful */
+ regval = 0x0;
+ while (regval != 0x3) {
+ regval = __raw_readl(reg);
+ regdump("PAT_IRQSTATUS_RAW", regval);
+ }
regdump("PAT_IRQSTATUS_RAW", __raw_readl(reg));
+ /* First, clear the PAT_IRQSTATUS_RAW register */
reg = (void __iomem *)(
(unsigned long)dmm_virt_base_addr |
(unsigned long)PAT_IRQSTATUS);
- regdump("PAT_IRQSTATUS", __raw_readl(reg));
+ __raw_writel(0xFFFFFFFF, reg);
+
+ /* Now, check if PAT_IRQSTATUS_RAW has been cleared */
+ reg = (void __iomem *)(
+ (unsigned long)dmm_virt_base_addr |
+ (unsigned long)PAT_IRQSTATUS_RAW);
+ regval = 0xFFFFFFFF;
+ while (regval != 0x0) {
+ regval = __raw_readl(reg);
+ regdump("PAT_IRQSTATUS_RAW", regval);
+ }
+ regdump("PAT_IRQSTATUS_RAW", __raw_readl(reg));
/* pat_config_set(); */
#endif
diff --git a/drivers/media/video/tiler/dmm_page_rep.c b/drivers/media/video/tiler/dmm_page_rep.c
index 7073a9fa6169..b1672173d0e7 100644
--- a/drivers/media/video/tiler/dmm_page_rep.c
+++ b/drivers/media/video/tiler/dmm_page_rep.c
@@ -21,6 +21,13 @@
#define __NEWCODE__
+#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",\
__FILE__, __func__, __LINE__, #x, x);
@@ -101,12 +108,17 @@ void dmm_phys_page_rep_refil(void)
(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);
tmpPgNode->physPgPtr =
(unsigned long *)page_to_phys(page);
tmpPgNode->page_addr = page;
+#else
+ tmpPgNode->physPgPtr = (unsigned long *)page_addr;
+ page_addr += 0x1000;
+#endif
#endif
/* add to end */
@@ -151,10 +163,12 @@ enum errorCodeT dmm_phys_page_rep_init(void)
freePagesStack = NULL;
usedPagesStack = NULL;
-
-
freePageCnt = 0;
+#ifndef __KERN_TO_ALLOC__
+ page_addr = BASE_MEM_ADDR;
+#endif
+
dmm_phys_page_rep_refil();
/* DMM_EXIT_CRITICAL_SETCTION */
@@ -188,7 +202,10 @@ enum errorCodeT dmm_phys_page_rep_deinit(void)
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;
@@ -200,7 +217,10 @@ enum errorCodeT dmm_phys_page_rep_deinit(void)
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;
@@ -329,7 +349,10 @@ enum errorCodeT dmm_free_phys_page(unsigned long *physPgPtr)
freePagesStack->physPgPtr);
kfree(freePagesStack);
#else
+#ifdef __KERN_TO_ALLOC__
__free_page(freePagesStack->page_addr);
+#else
+#endif
kfree(freePagesStack);
#endif
freePagesStack = iterPgNode;