Message ID | 1345825078-3688-4-git-send-email-p.zabel@pengutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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
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
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 --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
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(-)