diff options
author | David Sin <a0869738@una0919475.tif.ti.com> | 2009-11-14 13:44:53 +0100 |
---|---|---|
committer | Santosh Shilimkar <santosh.shilimkar@ti.com> | 2009-11-16 20:50:56 +0100 |
commit | d04311d7a0b3e07ee0b9c00f5b632aa309ea0150 (patch) | |
tree | efbd630bce2d35f24871d51c68a57f79c7573a23 /drivers | |
parent | 3e8ab1f33ee3a0fed86eaa5eb45db0c81917db84 (diff) |
add option to alloc pages outside kernel; add PAT reg readl checks
Diffstat (limited to 'drivers')
-rwxr-xr-x | drivers/media/video/tiler/dmm.c | 1 | ||||
-rw-r--r-- | drivers/media/video/tiler/dmm_ll_drv.c | 50 | ||||
-rw-r--r-- | drivers/media/video/tiler/dmm_page_rep.c | 27 |
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; |