diff mbox

[03/12] coda: fix IRAM/AXI handling for i.MX53

Message ID 1345825078-3688-4-git-send-email-p.zabel@pengutronix.de (mailing list archive)
State New, archived
Headers show

Commit Message

Philipp Zabel Aug. 24, 2012, 4:17 p.m. UTC
This uses the genalloc API to allocate a work buffer in the SoC's
on-chip SRAM and sets up the AXI_SRAM_USE register.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
---
 drivers/media/video/Kconfig |    3 ++-
 drivers/media/video/coda.c  |   61 ++++++++++++++++++++++++++++++++++++++++---
 drivers/media/video/coda.h  |   21 ++++++++++++---
 3 files changed, 76 insertions(+), 9 deletions(-)

Comments

Javier Martin Aug. 27, 2012, 8:59 a.m. UTC | #1
Hi Philipp,
thank you for your patch. Please, find some comments below.

On 24 August 2012 18:17, Philipp Zabel <p.zabel@pengutronix.de> wrote:
> This uses the genalloc API to allocate a work buffer in the SoC's
> on-chip SRAM and sets up the AXI_SRAM_USE register.
>
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> ---
>  drivers/media/video/Kconfig |    3 ++-
>  drivers/media/video/coda.c  |   61 ++++++++++++++++++++++++++++++++++++++++---
>  drivers/media/video/coda.h  |   21 ++++++++++++---
>  3 files changed, 76 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
> index 9cebf7b..1c40b1b 100644
> --- a/drivers/media/video/Kconfig
> +++ b/drivers/media/video/Kconfig
> @@ -1181,9 +1181,10 @@ config VIDEO_MEM2MEM_TESTDEV
>
>  config VIDEO_CODA
>         tristate "Chips&Media Coda multi-standard codec IP"
> -       depends on VIDEO_DEV && VIDEO_V4L2
> +       depends on VIDEO_DEV && VIDEO_V4L2 && ARCH_MXC
>         select VIDEOBUF2_DMA_CONTIG
>         select V4L2_MEM2MEM_DEV
> +       select IRAM_ALLOC if SOC_IMX53
>         ---help---
>            Coda is a range of video codec IPs that supports
>            H.264, MPEG-4, and other video formats.
> diff --git a/drivers/media/video/coda.c b/drivers/media/video/coda.c
> index aa12b7b..2e2e8c5 100644
> --- a/drivers/media/video/coda.c
> +++ b/drivers/media/video/coda.c
> @@ -14,6 +14,7 @@
>  #include <linux/clk.h>
>  #include <linux/delay.h>
>  #include <linux/firmware.h>
> +#include <linux/genalloc.h>
>  #include <linux/interrupt.h>
>  #include <linux/io.h>
>  #include <linux/irq.h>
> @@ -24,6 +25,7 @@
>  #include <linux/videodev2.h>
>  #include <linux/of.h>
>
> +#include <mach/iram.h>
>  #include <media/v4l2-ctrls.h>
>  #include <media/v4l2-device.h>
>  #include <media/v4l2-ioctl.h>
> @@ -42,6 +44,7 @@
>  #define CODA7_WORK_BUF_SIZE    (512 * 1024 + CODA_FMO_BUF_SIZE * 8 * 1024)
>  #define CODA_PARA_BUF_SIZE     (10 * 1024)
>  #define CODA_ISRAM_SIZE        (2048 * 2)
> +#define CODA7_IRAM_SIZE                0x14000 /* 81920 bytes */
>
>  #define CODA_OUTPUT_BUFS       4
>  #define CODA_CAPTURE_BUFS      2
> @@ -127,6 +130,9 @@ struct coda_dev {
>
>         struct coda_aux_buf     codebuf;
>         struct coda_aux_buf     workbuf;
> +       struct gen_pool         *iram_pool;
> +       long unsigned int       iram_vaddr;
> +       long unsigned int       iram_paddr;
>
>         spinlock_t              irqlock;
>         struct mutex            dev_mutex;
> @@ -715,6 +721,13 @@ static void coda_device_run(void *m2m_priv)
>         coda_write(dev, pic_stream_buffer_addr, CODA_CMD_ENC_PIC_BB_START);
>         coda_write(dev, pic_stream_buffer_size / 1024,
>                    CODA_CMD_ENC_PIC_BB_SIZE);
> +
> +       if (dev->devtype->product == CODA_7541) {
> +               coda_write(dev, CODA7_USE_BIT_ENABLE | CODA7_USE_HOST_BIT_ENABLE |
> +                               CODA7_USE_ME_ENABLE | CODA7_USE_HOST_ME_ENABLE,
> +                               CODA7_REG_BIT_AXI_SRAM_USE);
> +       }
> +
>         coda_command_async(ctx, CODA_COMMAND_PIC_RUN);
>  }
>
> @@ -946,8 +959,10 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
>                         CODA7_STREAM_BUF_PIC_RESET, CODA_REG_BIT_STREAM_CTRL);
>         }
>
> -       /* Configure the coda */
> -       coda_write(dev, 0xffff4c00, CODA_REG_BIT_SEARCH_RAM_BASE_ADDR);
> +       if (dev->devtype->product == CODA_DX6) {
> +               /* Configure the coda */
> +               coda_write(dev, dev->iram_paddr, CODADX6_REG_BIT_SEARCH_RAM_BASE_ADDR);
> +       }
>
>         /* Could set rotation here if needed */
>         switch (dev->devtype->product) {
> @@ -1022,7 +1037,12 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
>                 value  = (FMO_SLICE_SAVE_BUF_SIZE << 7);
>                 value |= (0 & CODA_FMOPARAM_TYPE_MASK) << CODA_FMOPARAM_TYPE_OFFSET;
>                 value |=  0 & CODA_FMOPARAM_SLICENUM_MASK;
> -               coda_write(dev, value, CODA_CMD_ENC_SEQ_FMO);
> +               if (dev->devtype->product == CODA_DX6) {
> +                       coda_write(dev, value, CODADX6_CMD_ENC_SEQ_FMO);
> +               } else {
> +                       coda_write(dev, dev->iram_paddr, CODA7_CMD_ENC_SEQ_SEARCH_BASE);
> +                       coda_write(dev, 48 * 1024, CODA7_CMD_ENC_SEQ_SEARCH_SIZE);
> +               }
>         }
>
>         if (coda_command_sync(ctx, CODA_COMMAND_SEQ_INIT)) {
> @@ -1052,7 +1072,15 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
>         }
>
>         coda_write(dev, src_vq->num_buffers, CODA_CMD_SET_FRAME_BUF_NUM);
> -       coda_write(dev, q_data_src->width, CODA_CMD_SET_FRAME_BUF_STRIDE);
> +       coda_write(dev, round_up(q_data_src->width, 8), CODA_CMD_SET_FRAME_BUF_STRIDE);
> +       if (dev->devtype->product != CODA_DX6) {
> +               coda_write(dev, round_up(q_data_src->width, 8), CODA7_CMD_SET_FRAME_SOURCE_BUF_STRIDE);
> +               coda_write(dev, dev->iram_paddr + 48 * 1024, CODA7_CMD_SET_FRAME_AXI_DBKY_ADDR);
> +               coda_write(dev, dev->iram_paddr + 53 * 1024, CODA7_CMD_SET_FRAME_AXI_DBKC_ADDR);
> +               coda_write(dev, dev->iram_paddr + 58 * 1024, CODA7_CMD_SET_FRAME_AXI_BIT_ADDR);
> +               coda_write(dev, dev->iram_paddr + 68 * 1024, CODA7_CMD_SET_FRAME_AXI_IPACDC_ADDR);
> +               coda_write(dev, 0x0, CODA7_CMD_SET_FRAME_AXI_OVL_ADDR);
> +       }
>         if (coda_command_sync(ctx, CODA_COMMAND_SET_FRAME_BUF)) {
>                 v4l2_err(v4l2_dev, "CODA_COMMAND_SET_FRAME_BUF timeout\n");
>                 return -ETIMEDOUT;
> @@ -1586,6 +1614,10 @@ static int coda_hw_init(struct coda_dev *dev)
>                 coda_write(dev, CODA7_STREAM_BUF_PIC_FLUSH, CODA_REG_BIT_STREAM_CTRL);
>         }
>         coda_write(dev, 0, CODA_REG_BIT_FRAME_MEM_CTRL);
> +
> +       if (dev->devtype->product != CODA_DX6)
> +               coda_write(dev, 0, CODA7_REG_BIT_AXI_SRAM_USE);
> +
>         coda_write(dev, CODA_INT_INTERRUPT_ENABLE,
>                       CODA_REG_BIT_INT_ENABLE);
>
> @@ -1854,6 +1886,25 @@ static int __devinit coda_probe(struct platform_device *pdev)
>                 return -ENOMEM;
>         }
>
> +       if (dev->devtype->product == CODA_DX6) {
> +               dev->iram_paddr = 0xffff4c00;
> +       } else {
> +               struct device_node *np = pdev->dev.of_node;
> +
> +               dev->iram_pool = of_get_named_gen_pool(np, "iram", 0);

"of_get_named_gen_pool" doesn't exist in linux_media 'for_v3.7'.
Moreover, nobody registers an IRAM through the function 'iram_init' in
mainline [1] so this will never work.
You will have to wait until this functionality gets merge before
sending this patch.

> +               if (!iram_pool) {

I think you meant 'dev->iram_pool' here, otherwise this will not
compile properly:

 CC      drivers/media/video/coda.o
drivers/media/video/coda.c: In function 'coda_probe':
drivers/media/video/coda.c:1893: error: implicit declaration of
function 'of_get_named_gen_pool'
drivers/media/video/coda.c:1893: warning: assignment makes pointer
from integer without a cast
drivers/media/video/coda.c:1894: error: 'iram_pool' undeclared (first
use in this function)
drivers/media/video/coda.c:1894: error: (Each undeclared identifier is
reported only once
drivers/media/video/coda.c:1894: error: for each function it appears in.)


> +                       dev_err(&pdev->dev, "iram pool not available\n");
> +                       return -ENOMEM;
> +               }
> +               dev->iram_vaddr = gen_pool_alloc(dev->iram_pool, CODA7_IRAM_SIZE);
> +               if (!dev->iram_vaddr) {
> +                       dev_err(&pdev->dev, "unable to alloc iram\n");
> +                       return -ENOMEM;
> +               }
> +               dev->iram_paddr = gen_pool_virt_to_phys(iram_pool,
> +                                                       dev->iram_vaddr);
> +       }
> +
>         platform_set_drvdata(pdev, dev);
>
>         return coda_firmware_request(dev);
> @@ -1869,6 +1920,8 @@ static int coda_remove(struct platform_device *pdev)
>         if (dev->alloc_ctx)
>                 vb2_dma_contig_cleanup_ctx(dev->alloc_ctx);
>         v4l2_device_unregister(&dev->v4l2_dev);
> +       if (dev->iram_vaddr)
> +               gen_pool_free(dev->iram_pool, dev->iram_vaddr, CODA7_IRAM_SIZE);
>         if (dev->codebuf.vaddr)
>                 dma_free_coherent(&pdev->dev, dev->codebuf.size,
>                                   &dev->codebuf.vaddr, dev->codebuf.paddr);
> diff --git a/drivers/media/video/coda.h b/drivers/media/video/coda.h
> index 4cf4a04..fffeaf0 100644
> --- a/drivers/media/video/coda.h
> +++ b/drivers/media/video/coda.h
> @@ -45,7 +45,12 @@
>  #define                CODA_IMAGE_ENDIAN_SELECT        (1 << 0)
>  #define CODA_REG_BIT_RD_PTR(x)                 (0x120 + 8 * (x))
>  #define CODA_REG_BIT_WR_PTR(x)                 (0x124 + 8 * (x))
> -#define CODA_REG_BIT_SEARCH_RAM_BASE_ADDR      0x140
> +#define CODADX6_REG_BIT_SEARCH_RAM_BASE_ADDR   0x140
> +#define CODA7_REG_BIT_AXI_SRAM_USE             0x140
> +#define                CODA7_USE_BIT_ENABLE            (1 << 0)
> +#define                CODA7_USE_HOST_BIT_ENABLE       (1 << 7)
> +#define                CODA7_USE_ME_ENABLE             (1 << 4)
> +#define                CODA7_USE_HOST_ME_ENABLE        (1 << 11)
>  #define CODA_REG_BIT_BUSY                      0x160
>  #define                CODA_REG_BIT_BUSY_FLAG          1
>  #define CODA_REG_BIT_RUN_COMMAND               0x164
> @@ -162,11 +167,13 @@
>  #define                CODA_RATECONTROL_ENABLE_MASK                    0x01
>  #define CODA_CMD_ENC_SEQ_RC_BUF_SIZE                           0x1b0
>  #define CODA_CMD_ENC_SEQ_INTRA_REFRESH                         0x1b4
> -#define CODA_CMD_ENC_SEQ_FMO                                   0x1b8
> +#define CODADX6_CMD_ENC_SEQ_FMO                                        0x1b8
>  #define                CODA_FMOPARAM_TYPE_OFFSET                       4
>  #define                CODA_FMOPARAM_TYPE_MASK                         1
>  #define                CODA_FMOPARAM_SLICENUM_OFFSET                   0
>  #define                CODA_FMOPARAM_SLICENUM_MASK                     0x0f
> +#define CODA7_CMD_ENC_SEQ_SEARCH_BASE                          0x1b8
> +#define CODA7_CMD_ENC_SEQ_SEARCH_SIZE                          0x1bc
>  #define CODA_CMD_ENC_SEQ_RC_QP_MAX                             0x1c8
>  #define                CODA_QPMAX_OFFSET                               0
>  #define                CODA_QPMAX_MASK                                 0x3f
> @@ -189,8 +196,14 @@
>  #define CODA_RET_ENC_PIC_FLAG          0x1d0
>
>  /* Set Frame Buffer */
> -#define CODA_CMD_SET_FRAME_BUF_NUM     0x180
> -#define CODA_CMD_SET_FRAME_BUF_STRIDE  0x184
> +#define CODA_CMD_SET_FRAME_BUF_NUM             0x180
> +#define CODA_CMD_SET_FRAME_BUF_STRIDE          0x184
> +#define CODA7_CMD_SET_FRAME_AXI_BIT_ADDR       0x190
> +#define CODA7_CMD_SET_FRAME_AXI_IPACDC_ADDR    0x194
> +#define CODA7_CMD_SET_FRAME_AXI_DBKY_ADDR      0x198
> +#define CODA7_CMD_SET_FRAME_AXI_DBKC_ADDR      0x19c
> +#define CODA7_CMD_SET_FRAME_AXI_OVL_ADDR       0x1a0
> +#define CODA7_CMD_SET_FRAME_SOURCE_BUF_STRIDE  0x1a8
>
>  /* Encoder Header */
>  #define CODA_CMD_ENC_HEADER_CODE       0x180
> --
> 1.7.10.4
>

Regards.

[1] http://lxr.free-electrons.com/source/arch/arm/plat-mxc/iram_alloc.c#L58
Philipp Zabel Aug. 28, 2012, 8:24 a.m. UTC | #2
Hi Javier,

thank you for the comments,

Am Montag, den 27.08.2012, 10:59 +0200 schrieb javier Martin:
> Hi Philipp,
> thank you for your patch. Please, find some comments below.
> 
> On 24 August 2012 18:17, Philipp Zabel <p.zabel@pengutronix.de> wrote:
[...]
> > @@ -1854,6 +1886,25 @@ static int __devinit coda_probe(struct platform_device *pdev)
> >                 return -ENOMEM;
> >         }
> >
> > +       if (dev->devtype->product == CODA_DX6) {
> > +               dev->iram_paddr = 0xffff4c00;
> > +       } else {
> > +               struct device_node *np = pdev->dev.of_node;
> > +
> > +               dev->iram_pool = of_get_named_gen_pool(np, "iram", 0);
> 
> "of_get_named_gen_pool" doesn't exist in linux_media 'for_v3.7'.
> Moreover, nobody registers an IRAM through the function 'iram_init' in
> mainline [1] so this will never work.
> You will have to wait until this functionality gets merge before
> sending this patch.
> 
> > +               if (!iram_pool) {
> 
> I think you meant 'dev->iram_pool' here, otherwise this will not
> compile properly:
> 
>  CC      drivers/media/video/coda.o
> drivers/media/video/coda.c: In function 'coda_probe':
> drivers/media/video/coda.c:1893: error: implicit declaration of
> function 'of_get_named_gen_pool'
> drivers/media/video/coda.c:1893: warning: assignment makes pointer
> from integer without a cast
> drivers/media/video/coda.c:1894: error: 'iram_pool' undeclared (first
> use in this function)
> drivers/media/video/coda.c:1894: error: (Each undeclared identifier is
> reported only once
> drivers/media/video/coda.c:1894: error: for each function it appears in.)

I was a bit overzealous squashing my patches. For the next round, I'm
using the iram_alloc/iram_free functions that are present in
arch/plat-mxc/include/mach/iram.h (and thus gain a temporary dependency
on ARCH_MXC until there is a mechansim to get to the IRAM gen_pool).
A follow-up patch then would convert the driver to the genalloc API
again.

On a related note, is the 45 KiB VRAM at 0xffff4c00 on i.MX27 reserved
exclusively for the CODA? I suppose rather than hard-coding the address
in the driver, we could use the iram_alloc API on i.MX27, too?

regards
Philipp

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Javier Martin Aug. 28, 2012, 8:54 a.m. UTC | #3
On 28 August 2012 10:24, Philipp Zabel <p.zabel@pengutronix.de> wrote:
> Hi Javier,
>
> thank you for the comments,
>
> Am Montag, den 27.08.2012, 10:59 +0200 schrieb javier Martin:
>> Hi Philipp,
>> thank you for your patch. Please, find some comments below.
>>
>> On 24 August 2012 18:17, Philipp Zabel <p.zabel@pengutronix.de> wrote:
> [...]
>> > @@ -1854,6 +1886,25 @@ static int __devinit coda_probe(struct platform_device *pdev)
>> >                 return -ENOMEM;
>> >         }
>> >
>> > +       if (dev->devtype->product == CODA_DX6) {
>> > +               dev->iram_paddr = 0xffff4c00;
>> > +       } else {
>> > +               struct device_node *np = pdev->dev.of_node;
>> > +
>> > +               dev->iram_pool = of_get_named_gen_pool(np, "iram", 0);
>>
>> "of_get_named_gen_pool" doesn't exist in linux_media 'for_v3.7'.
>> Moreover, nobody registers an IRAM through the function 'iram_init' in
>> mainline [1] so this will never work.
>> You will have to wait until this functionality gets merge before
>> sending this patch.
>>
>> > +               if (!iram_pool) {
>>
>> I think you meant 'dev->iram_pool' here, otherwise this will not
>> compile properly:
>>
>>  CC      drivers/media/video/coda.o
>> drivers/media/video/coda.c: In function 'coda_probe':
>> drivers/media/video/coda.c:1893: error: implicit declaration of
>> function 'of_get_named_gen_pool'
>> drivers/media/video/coda.c:1893: warning: assignment makes pointer
>> from integer without a cast
>> drivers/media/video/coda.c:1894: error: 'iram_pool' undeclared (first
>> use in this function)
>> drivers/media/video/coda.c:1894: error: (Each undeclared identifier is
>> reported only once
>> drivers/media/video/coda.c:1894: error: for each function it appears in.)
>
> I was a bit overzealous squashing my patches. For the next round, I'm
> using the iram_alloc/iram_free functions that are present in
> arch/plat-mxc/include/mach/iram.h (and thus gain a temporary dependency
> on ARCH_MXC until there is a mechansim to get to the IRAM gen_pool).
> A follow-up patch then would convert the driver to the genalloc API
> again.

I agree.

> On a related note, is the 45 KiB VRAM at 0xffff4c00 on i.MX27 reserved
> exclusively for the CODA? I suppose rather than hard-coding the address
> in the driver, we could use the iram_alloc API on i.MX27, too?

When I first saw your patch I thought I would be great to do the same
with the i.MX27. Let me share with you some conflicts we have found
between the codadx6 datasheet and the reference code from Freescale:

Regarding whether codadx6 needs to know IRAM size or not:
Code from Freescale: vpu_reg.h: BIT_SEARCH_RAM_SIZE 0x144 (if we try
to read it we get nonsense values)
Datasheet codadx6: p 109: Protected for internal use.


Regarding actual IRAM used size:
i.MX27 datasheet from Freescale: VRAM 0xFFFF4C00 to 0xFFFFFFFF. 45 kiB
(46080 bytes).
Datasheet codadx6: p 17: 33 KB of internal memory are used (33792 bytes)
Datasheet codadx6: p 68: Size of the memory needed is 52 lines =
52*720 =  37440 bytes

Keeping the above in mind, it seems the IRAM size inside the i.MX27 is
bigger than what the codadx6 really uses, so the IRAM could be shared.
However, the datasheet of the codadx6 indicates that static RAM is
used for performance reasons, so sharing it with another block is not
a good idea.

To sum up, after I test/ack the following version of your patches I'll
add proper support for the IRAM inside the i.MX27, reserving the whole
IRAM for the codadx6.
Do you agree?

Regards.
diff mbox

Patch

diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
index 9cebf7b..1c40b1b 100644
--- a/drivers/media/video/Kconfig
+++ b/drivers/media/video/Kconfig
@@ -1181,9 +1181,10 @@  config VIDEO_MEM2MEM_TESTDEV
 
 config VIDEO_CODA
 	tristate "Chips&Media Coda multi-standard codec IP"
-	depends on VIDEO_DEV && VIDEO_V4L2
+	depends on VIDEO_DEV && VIDEO_V4L2 && ARCH_MXC
 	select VIDEOBUF2_DMA_CONTIG
 	select V4L2_MEM2MEM_DEV
+	select IRAM_ALLOC if SOC_IMX53
 	---help---
 	   Coda is a range of video codec IPs that supports
 	   H.264, MPEG-4, and other video formats.
diff --git a/drivers/media/video/coda.c b/drivers/media/video/coda.c
index aa12b7b..2e2e8c5 100644
--- a/drivers/media/video/coda.c
+++ b/drivers/media/video/coda.c
@@ -14,6 +14,7 @@ 
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/firmware.h>
+#include <linux/genalloc.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/irq.h>
@@ -24,6 +25,7 @@ 
 #include <linux/videodev2.h>
 #include <linux/of.h>
 
+#include <mach/iram.h>
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-ioctl.h>
@@ -42,6 +44,7 @@ 
 #define CODA7_WORK_BUF_SIZE	(512 * 1024 + CODA_FMO_BUF_SIZE * 8 * 1024)
 #define CODA_PARA_BUF_SIZE	(10 * 1024)
 #define CODA_ISRAM_SIZE	(2048 * 2)
+#define CODA7_IRAM_SIZE		0x14000 /* 81920 bytes */
 
 #define CODA_OUTPUT_BUFS	4
 #define CODA_CAPTURE_BUFS	2
@@ -127,6 +130,9 @@  struct coda_dev {
 
 	struct coda_aux_buf	codebuf;
 	struct coda_aux_buf	workbuf;
+	struct gen_pool		*iram_pool;
+	long unsigned int	iram_vaddr;
+	long unsigned int	iram_paddr;
 
 	spinlock_t		irqlock;
 	struct mutex		dev_mutex;
@@ -715,6 +721,13 @@  static void coda_device_run(void *m2m_priv)
 	coda_write(dev, pic_stream_buffer_addr, CODA_CMD_ENC_PIC_BB_START);
 	coda_write(dev, pic_stream_buffer_size / 1024,
 		   CODA_CMD_ENC_PIC_BB_SIZE);
+
+	if (dev->devtype->product == CODA_7541) {
+		coda_write(dev, CODA7_USE_BIT_ENABLE | CODA7_USE_HOST_BIT_ENABLE |
+				CODA7_USE_ME_ENABLE | CODA7_USE_HOST_ME_ENABLE,
+				CODA7_REG_BIT_AXI_SRAM_USE);
+	}
+
 	coda_command_async(ctx, CODA_COMMAND_PIC_RUN);
 }
 
@@ -946,8 +959,10 @@  static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
 			CODA7_STREAM_BUF_PIC_RESET, CODA_REG_BIT_STREAM_CTRL);
 	}
 
-	/* Configure the coda */
-	coda_write(dev, 0xffff4c00, CODA_REG_BIT_SEARCH_RAM_BASE_ADDR);
+	if (dev->devtype->product == CODA_DX6) {
+		/* Configure the coda */
+		coda_write(dev, dev->iram_paddr, CODADX6_REG_BIT_SEARCH_RAM_BASE_ADDR);
+	}
 
 	/* Could set rotation here if needed */
 	switch (dev->devtype->product) {
@@ -1022,7 +1037,12 @@  static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
 		value  = (FMO_SLICE_SAVE_BUF_SIZE << 7);
 		value |= (0 & CODA_FMOPARAM_TYPE_MASK) << CODA_FMOPARAM_TYPE_OFFSET;
 		value |=  0 & CODA_FMOPARAM_SLICENUM_MASK;
-		coda_write(dev, value, CODA_CMD_ENC_SEQ_FMO);
+		if (dev->devtype->product == CODA_DX6) {
+			coda_write(dev, value, CODADX6_CMD_ENC_SEQ_FMO);
+		} else {
+			coda_write(dev, dev->iram_paddr, CODA7_CMD_ENC_SEQ_SEARCH_BASE);
+			coda_write(dev, 48 * 1024, CODA7_CMD_ENC_SEQ_SEARCH_SIZE);
+		}
 	}
 
 	if (coda_command_sync(ctx, CODA_COMMAND_SEQ_INIT)) {
@@ -1052,7 +1072,15 @@  static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
 	}
 
 	coda_write(dev, src_vq->num_buffers, CODA_CMD_SET_FRAME_BUF_NUM);
-	coda_write(dev, q_data_src->width, CODA_CMD_SET_FRAME_BUF_STRIDE);
+	coda_write(dev, round_up(q_data_src->width, 8), CODA_CMD_SET_FRAME_BUF_STRIDE);
+	if (dev->devtype->product != CODA_DX6) {
+		coda_write(dev, round_up(q_data_src->width, 8), CODA7_CMD_SET_FRAME_SOURCE_BUF_STRIDE);
+		coda_write(dev, dev->iram_paddr + 48 * 1024, CODA7_CMD_SET_FRAME_AXI_DBKY_ADDR);
+		coda_write(dev, dev->iram_paddr + 53 * 1024, CODA7_CMD_SET_FRAME_AXI_DBKC_ADDR);
+		coda_write(dev, dev->iram_paddr + 58 * 1024, CODA7_CMD_SET_FRAME_AXI_BIT_ADDR);
+		coda_write(dev, dev->iram_paddr + 68 * 1024, CODA7_CMD_SET_FRAME_AXI_IPACDC_ADDR);
+		coda_write(dev, 0x0, CODA7_CMD_SET_FRAME_AXI_OVL_ADDR);
+	}
 	if (coda_command_sync(ctx, CODA_COMMAND_SET_FRAME_BUF)) {
 		v4l2_err(v4l2_dev, "CODA_COMMAND_SET_FRAME_BUF timeout\n");
 		return -ETIMEDOUT;
@@ -1586,6 +1614,10 @@  static int coda_hw_init(struct coda_dev *dev)
 		coda_write(dev, CODA7_STREAM_BUF_PIC_FLUSH, CODA_REG_BIT_STREAM_CTRL);
 	}
 	coda_write(dev, 0, CODA_REG_BIT_FRAME_MEM_CTRL);
+
+	if (dev->devtype->product != CODA_DX6)
+		coda_write(dev, 0, CODA7_REG_BIT_AXI_SRAM_USE);
+
 	coda_write(dev, CODA_INT_INTERRUPT_ENABLE,
 		      CODA_REG_BIT_INT_ENABLE);
 
@@ -1854,6 +1886,25 @@  static int __devinit coda_probe(struct platform_device *pdev)
 		return -ENOMEM;
 	}
 
+	if (dev->devtype->product == CODA_DX6) {
+		dev->iram_paddr = 0xffff4c00;
+	} else {
+		struct device_node *np = pdev->dev.of_node;
+
+		dev->iram_pool = of_get_named_gen_pool(np, "iram", 0);
+		if (!iram_pool) {
+			dev_err(&pdev->dev, "iram pool not available\n");
+			return -ENOMEM;
+		}
+		dev->iram_vaddr = gen_pool_alloc(dev->iram_pool, CODA7_IRAM_SIZE);
+		if (!dev->iram_vaddr) {
+			dev_err(&pdev->dev, "unable to alloc iram\n");
+			return -ENOMEM;
+		}
+		dev->iram_paddr = gen_pool_virt_to_phys(iram_pool,
+							dev->iram_vaddr);
+	}
+
 	platform_set_drvdata(pdev, dev);
 
 	return coda_firmware_request(dev);
@@ -1869,6 +1920,8 @@  static int coda_remove(struct platform_device *pdev)
 	if (dev->alloc_ctx)
 		vb2_dma_contig_cleanup_ctx(dev->alloc_ctx);
 	v4l2_device_unregister(&dev->v4l2_dev);
+	if (dev->iram_vaddr)
+		gen_pool_free(dev->iram_pool, dev->iram_vaddr, CODA7_IRAM_SIZE);
 	if (dev->codebuf.vaddr)
 		dma_free_coherent(&pdev->dev, dev->codebuf.size,
 				  &dev->codebuf.vaddr, dev->codebuf.paddr);
diff --git a/drivers/media/video/coda.h b/drivers/media/video/coda.h
index 4cf4a04..fffeaf0 100644
--- a/drivers/media/video/coda.h
+++ b/drivers/media/video/coda.h
@@ -45,7 +45,12 @@ 
 #define		CODA_IMAGE_ENDIAN_SELECT	(1 << 0)
 #define CODA_REG_BIT_RD_PTR(x)			(0x120 + 8 * (x))
 #define CODA_REG_BIT_WR_PTR(x)			(0x124 + 8 * (x))
-#define CODA_REG_BIT_SEARCH_RAM_BASE_ADDR	0x140
+#define CODADX6_REG_BIT_SEARCH_RAM_BASE_ADDR	0x140
+#define CODA7_REG_BIT_AXI_SRAM_USE		0x140
+#define		CODA7_USE_BIT_ENABLE		(1 << 0)
+#define		CODA7_USE_HOST_BIT_ENABLE	(1 << 7)
+#define		CODA7_USE_ME_ENABLE		(1 << 4)
+#define		CODA7_USE_HOST_ME_ENABLE	(1 << 11)
 #define CODA_REG_BIT_BUSY			0x160
 #define		CODA_REG_BIT_BUSY_FLAG		1
 #define CODA_REG_BIT_RUN_COMMAND		0x164
@@ -162,11 +167,13 @@ 
 #define		CODA_RATECONTROL_ENABLE_MASK			0x01
 #define CODA_CMD_ENC_SEQ_RC_BUF_SIZE				0x1b0
 #define CODA_CMD_ENC_SEQ_INTRA_REFRESH				0x1b4
-#define CODA_CMD_ENC_SEQ_FMO					0x1b8
+#define CODADX6_CMD_ENC_SEQ_FMO					0x1b8
 #define		CODA_FMOPARAM_TYPE_OFFSET			4
 #define		CODA_FMOPARAM_TYPE_MASK				1
 #define		CODA_FMOPARAM_SLICENUM_OFFSET			0
 #define		CODA_FMOPARAM_SLICENUM_MASK			0x0f
+#define CODA7_CMD_ENC_SEQ_SEARCH_BASE				0x1b8
+#define CODA7_CMD_ENC_SEQ_SEARCH_SIZE				0x1bc
 #define CODA_CMD_ENC_SEQ_RC_QP_MAX				0x1c8
 #define		CODA_QPMAX_OFFSET				0
 #define		CODA_QPMAX_MASK					0x3f
@@ -189,8 +196,14 @@ 
 #define CODA_RET_ENC_PIC_FLAG		0x1d0
 
 /* Set Frame Buffer */
-#define CODA_CMD_SET_FRAME_BUF_NUM	0x180
-#define CODA_CMD_SET_FRAME_BUF_STRIDE	0x184
+#define CODA_CMD_SET_FRAME_BUF_NUM		0x180
+#define CODA_CMD_SET_FRAME_BUF_STRIDE		0x184
+#define CODA7_CMD_SET_FRAME_AXI_BIT_ADDR	0x190
+#define CODA7_CMD_SET_FRAME_AXI_IPACDC_ADDR	0x194
+#define CODA7_CMD_SET_FRAME_AXI_DBKY_ADDR	0x198
+#define CODA7_CMD_SET_FRAME_AXI_DBKC_ADDR	0x19c
+#define CODA7_CMD_SET_FRAME_AXI_OVL_ADDR	0x1a0
+#define CODA7_CMD_SET_FRAME_SOURCE_BUF_STRIDE	0x1a8
 
 /* Encoder Header */
 #define CODA_CMD_ENC_HEADER_CODE	0x180