summaryrefslogtreecommitdiff
path: root/drivers/media/video/tiler/dmm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/tiler/dmm.c')
-rwxr-xr-xdrivers/media/video/tiler/dmm.c429
1 files changed, 417 insertions, 12 deletions
diff --git a/drivers/media/video/tiler/dmm.c b/drivers/media/video/tiler/dmm.c
index 4061fe413e90..0dbf6db289ae 100755
--- a/drivers/media/video/tiler/dmm.c
+++ b/drivers/media/video/tiler/dmm.c
@@ -33,6 +33,385 @@
#include "dmm_prv.h"
#include "dmm_def.h"
+#define __NEWCODE__
+#ifdef __NEWCODE__
+struct pat_area {
+ int x0:8;
+ int y0:8;
+ int x1:8;
+ int y1:8;
+};
+
+struct pat_ctrl {
+ int start:4;
+ int direction:4;
+ int lut_id:8;
+ int sync:12;
+ int initiator:4;
+};
+
+struct pat_desc {
+ struct pat_desc *next;
+ struct pat_area area;
+ struct pat_ctrl ctrl;
+ unsigned long data;
+};
+
+void *dmm_base;
+
+static void pat_area_set(struct pat_area *area, char id);
+static void pat_data_set(unsigned long data, char id);
+static void pat_ctrl_set(struct pat_ctrl *ctrl, char id);
+static void pat_desc_set(struct pat_desc *desc, char id);
+static void hwinfo_get();
+static void pat_view_set();
+static void pat_view_map_set();
+static void pat_view_map_base_set();
+static void tiler_or_set();
+
+static void tiler_or_set() /* (struct tiler_or *or, char id) */
+{
+ void __iomem *reg = NULL;
+ unsigned long reg_val = 0x0;
+ unsigned long new_val = 0x0;
+ unsigned long bit_field = 0x0;
+ unsigned long field_pos = 0x0;
+
+ /* set TILER_OR__0 register */
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)TILER_OR__0);
+ reg_val = __raw_readl(reg);
+ regdump("TILER_OR__0", reg_val);
+
+ bit_field = BITFIELD(31, 0);
+ field_pos = 0;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((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);
+ regdump("TILER_OR__0", reg_val);
+
+ /* set TILER_OR__1 register */
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)TILER_OR__1);
+ reg_val = __raw_readl(reg);
+ regdump("TILER_OR__1", reg_val);
+
+ bit_field = BITFIELD(31, 0);
+ field_pos = 0;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((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__1);
+ reg_val = __raw_readl(reg);
+ regdump("TILER_OR__1", reg_val);
+}
+static void pat_view_set() /* (struct pat_view *view, char id) */
+{
+ void __iomem *reg = NULL;
+ unsigned long reg_val = 0x0;
+ unsigned long new_val = 0x0;
+ unsigned long bit_field = 0x0;
+ unsigned long field_pos = 0x0;
+
+ /* set PAT_VIEW__0 register */
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_VIEW__0);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_VIEW__0", reg_val);
+
+ bit_field = BITFIELD(31, 0);
+ field_pos = 0;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((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)PAT_VIEW__0);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_VIEW__0", reg_val);
+
+ /* set PAT_VIEW__1 register */
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_VIEW__1);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_VIEW__1", reg_val);
+
+ bit_field = BITFIELD(31, 0);
+ field_pos = 0;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((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)PAT_VIEW__1);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_VIEW__1", reg_val);
+}
+static void pat_view_map_set() /* (struct pat_view_map *map, char id) */
+{
+ void __iomem *reg = NULL;
+ unsigned long reg_val = 0x0;
+ unsigned long new_val = 0x0;
+ unsigned long bit_field = 0x0;
+ unsigned long field_pos = 0x0;
+
+ /* set PAT_VIEW_MAP__0 register */
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_VIEW_MAP__0);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_VIEW_MAP__0", reg_val);
+
+ bit_field = BITFIELD(31, 0);
+ field_pos = 0;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)0) << field_pos) & bit_field);
+ __raw_writel(0x80808080, reg); /* __raw_writel(new_val, reg); */
+
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_VIEW_MAP__0);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_VIEW_MAP__0", reg_val);
+}
+
+static void pat_view_map_base_set()/*(struct pat_view_map_base *base, char id)*/
+{
+ void __iomem *reg = NULL;
+ unsigned long reg_val = 0x0;
+ unsigned long new_val = 0x0;
+ unsigned long bit_field = 0x0;
+ unsigned long field_pos = 0x0;
+
+ /* set PAT_VIEW_MAP_BASE register */
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_VIEW_MAP_BASE);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_VIEW_MAP_BASE", reg_val);
+
+ bit_field = BITFIELD(31, 0);
+ field_pos = 0;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)0) << field_pos) & bit_field);
+ __raw_writel(0x80000000, reg); /* __raw_writel(new_val, reg); */
+
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_VIEW_MAP_BASE);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_VIEW_MAP_BASE", reg_val);
+}
+
+static void hwinfo_get()
+{
+ void __iomem *reg = NULL;
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)DMM_REVISION);
+ regdump("DMM_REVISION", __raw_readl(reg));
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)DMM_HWINFO);
+ regdump("DMM_HWINFO", __raw_readl(reg));
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)LISA_HWINFO);
+ regdump("LISA_HWINFO", __raw_readl(reg));
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)TILER_HWINFO);
+ regdump("TILER_HWINFO", __raw_readl(reg));
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_HWINFO);
+ regdump("PAT_HWINFO", __raw_readl(reg));
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_GEOMETRY);
+ regdump("PAT_GEOMETRY", __raw_readl(reg));
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_STATUS__0);
+ regdump("PAT_STATUS__0", __raw_readl(reg));
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_STATUS__1);
+ regdump("PAT_STATUS__1", __raw_readl(reg));
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_STATUS__2);
+ regdump("PAT_STATUS__2", __raw_readl(reg));
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_STATUS__3);
+ regdump("PAT_STATUS__3", __raw_readl(reg));
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PEG_HWINFO);
+ regdump("PEG_HWINFO", __raw_readl(reg));
+}
+static void pat_desc_set(struct pat_desc *desc, char id)
+{
+ void __iomem *reg = NULL;
+ unsigned long reg_val = 0x0;
+ unsigned long new_val = 0x0;
+ unsigned long bit_field = 0x0;
+ unsigned long field_pos = 0x0;
+
+ /* write to pat registers */
+ /* opt to individually set each reg, so set PAT_DESC register to NULL */
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_DESCR__0);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_DESCR__0", reg_val);
+
+ bit_field = BITFIELD(31, 4);
+ field_pos = 4;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)desc) << field_pos) & bit_field);
+ __raw_writel(new_val, reg);
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_DESCR__0);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_DESCR__0", reg_val);
+}
+static void pat_ctrl_set(struct pat_ctrl *ctrl, char id)
+{
+ void __iomem *reg = NULL;
+ unsigned long reg_val = 0x0;
+ unsigned long new_val = 0x0;
+ unsigned long bit_field = 0x0;
+ unsigned long field_pos = 0x0;
+
+ /* set PAT_CTRL register */
+ /* TODO: casting as unsigned long */
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_CTRL__0);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_CTRL__0", reg_val);
+
+ bit_field = BITFIELD(31, 28);
+ field_pos = 28;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)ctrl->initiator) << field_pos) & bit_field);
+ __raw_writel(new_val, reg);
+
+ reg_val = __raw_readl(reg);
+ bit_field = BITFIELD(16, 16);
+ field_pos = 16;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)ctrl->sync) << field_pos) & bit_field);
+ __raw_writel(new_val, reg);
+
+ reg_val = __raw_readl(reg);
+ bit_field = BITFIELD(9, 8);
+ field_pos = 8;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)ctrl->lut_id) << field_pos) & bit_field);
+ __raw_writel(new_val, reg);
+
+ reg_val = __raw_readl(reg);
+ bit_field = BITFIELD(6, 4);
+ field_pos = 4;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)ctrl->direction) << field_pos) & bit_field);
+ __raw_writel(new_val, reg);
+
+ reg_val = __raw_readl(reg);
+ bit_field = BITFIELD(0, 0);
+ field_pos = 0;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)ctrl->start) << field_pos) & bit_field);
+ __raw_writel(new_val, reg);
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_CTRL__0);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_CTRL__0", reg_val);
+}
+static void pat_data_set(unsigned long data, char id)
+{
+ void __iomem *reg = NULL;
+ unsigned long reg_val = 0x0;
+ unsigned long new_val = 0x0;
+ unsigned long bit_field = 0x0;
+ unsigned long field_pos = 0x0;
+
+ /* set PAT_DATA register */
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_DATA__0);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_DATA__0", reg_val);
+
+ bit_field = BITFIELD(31, 4);
+ field_pos = 4;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)data >> 4) << field_pos) & bit_field);
+ __raw_writel(new_val, reg);
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_DATA__0);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_DATA__0", reg_val);
+}
+static void pat_area_set(struct pat_area *area, char id)
+{
+ void __iomem *reg = NULL;
+ unsigned long reg_val = 0x0;
+ unsigned long new_val = 0x0;
+ unsigned long bit_field = 0x0;
+ unsigned long field_pos = 0x0;
+
+ /* set PAT_AREA register */
+ /* TODO: changed casting from char to unsigned long */
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_AREA__0);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_AREA__0", reg_val);
+
+ bit_field = BITFIELD(30, 24);
+ field_pos = 24;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)area->y1) << field_pos) & bit_field);
+ __raw_writel(new_val, reg);
+
+ reg_val = __raw_readl(reg);
+ bit_field = BITFIELD(23, 16);
+ field_pos = 16;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)area->x1) << field_pos) & bit_field);
+ __raw_writel(new_val, reg);
+
+ reg_val = __raw_readl(reg);
+ bit_field = BITFIELD(14, 8);
+ field_pos = 8;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)area->y0) << field_pos) & bit_field);
+ __raw_writel(new_val, reg);
+
+ reg_val = __raw_readl(reg);
+ bit_field = BITFIELD(7, 0);
+ field_pos = 0;
+ new_val = (reg_val & (~(bit_field))) |
+ ((((unsigned long)area->x0) << field_pos) & bit_field);
+ __raw_writel(new_val, reg);
+
+ reg_val = __raw_readl(reg);
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)PAT_AREA__0);
+ reg_val = __raw_readl(reg);
+ regdump("PAT_AREA__0", reg_val);
+}
+#endif /* end: #ifdef __NEWCODE__ */
+
#define DMM_MAJOR 0
#define DMM_MINOR 0
#define DMM_IO_BASE_ADDR 0x4e000000
@@ -156,8 +535,26 @@ __init dmm_init(void)
return retval;
}
+#ifndef __NEWCODE__
/* config LISA/PAT */
dmm_config();
+#else
+ void __iomem *reg = NULL;
+ dmm_base = ioremap(DMM_BASE, 0x1000);
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)LISA_MAP__0);
+ regdump("LISA_MAP__0", __raw_readl(reg));
+
+ reg = (void __iomem *)(
+ (unsigned long)dmm_base | (unsigned long)LISA_MAP__1);
+ regdump("LISA_MAP__1", __raw_readl(reg));
+
+ pat_view_set();
+ pat_view_map_set();
+ pat_view_map_base_set();
+ tiler_or_set();
+#endif
/* create buffer info list */
createlist(&lsthd);
@@ -220,15 +617,15 @@ dmm_ioctl(struct inode *ip, struct file *filp, unsigned int cmd,
switch (cmd) {
case TILIOC_OPEN:
- tilerdump(__LINE__);
+ debug(__LINE__);
retval = 0;
break;
case TILIOC_CLOSE:
- tilerdump(__LINE__);
+ debug(__LINE__);
retval = 0;
break;
case TILIOC_GBUF:
- tilerdump(__LINE__);
+ debug(__LINE__);
bytes = copy_from_user((void *)(&block_info),
(const void *)arg, sizeof(struct tiler_block_info));
@@ -259,7 +656,7 @@ dmm_ioctl(struct inode *ip, struct file *filp, unsigned int cmd,
retval = 0;
break;
case TILIOC_FBUF:
- tilerdump(__LINE__);
+ debug(__LINE__);
bytes = copy_from_user((void *)(&block_info),
(const void *)arg, sizeof(struct tiler_block_info));
@@ -271,7 +668,7 @@ dmm_ioctl(struct inode *ip, struct file *filp, unsigned int cmd,
retval = 0;
break;
case TILIOC_GSSP:
- tilerdump(__LINE__);
+ debug(__LINE__);
pgd = pgd_offset(current->mm, arg);
if (!(pgd_none(*pgd) || pgd_bad(*pgd))) {
@@ -292,11 +689,11 @@ dmm_ioctl(struct inode *ip, struct file *filp, unsigned int cmd,
retval = 0x0; /* va not in page table */
break;
case TILIOC_MBUF:
- tilerdump(__LINE__);
+ debug(__LINE__);
retval = 0;
break;
case TILIOC_QBUF:
- tilerdump(__LINE__);
+ debug(__LINE__);
bytes = copy_from_user((void *)(&buf_info),
(const void *)arg, sizeof(struct tiler_buf_info));
@@ -316,7 +713,7 @@ dmm_ioctl(struct inode *ip, struct file *filp, unsigned int cmd,
retval = 0;
break;
case TILIOC_RBUF:
- tilerdump(__LINE__);
+ debug(__LINE__);
bufinfo = kmalloc(sizeof(struct tiler_buf_info), GFP_KERNEL);
memset(bufinfo, 0x0, sizeof(struct tiler_buf_info));
@@ -339,7 +736,7 @@ dmm_ioctl(struct inode *ip, struct file *filp, unsigned int cmd,
retval = 0;
break;
case TILIOC_URBUF:
- tilerdump(__LINE__);
+ debug(__LINE__);
bytes = copy_from_user((void *)(&buf_info),
(const void *)arg, sizeof(struct tiler_buf_info));
@@ -354,7 +751,7 @@ dmm_ioctl(struct inode *ip, struct file *filp, unsigned int cmd,
retval = 0;
break;
case TILIOC_QUERY_BLK:
- tilerdump(__LINE__);
+ debug(__LINE__);
bytes = copy_from_user((void *)(&block_info),
(const void *)arg, sizeof(struct tiler_block_info));
@@ -362,8 +759,16 @@ dmm_ioctl(struct inode *ip, struct file *filp, unsigned int cmd,
return retval;
error = tiler_find_buf(block_info.ssptr, &block_info);
- if (error == 0)
- retval = 0;
+ if (error != 0)
+ return retval;
+
+ bytes = copy_to_user((void *)arg,
+ (const void *)(&block_info),
+ sizeof(struct tiler_block_info));
+ if (bytes != 0)
+ return retval;
+
+ retval = 0;
break;
}
return retval;