summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2011-07-26 11:25:05 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2011-08-05 15:36:51 +0200
commit32936d759c49ba5abfb3f1937fc7a02e4ab36804 (patch)
tree7e65cb99456389984411f35e68060e389582bdf9
parent53dfaefd26ef2e89f6f6293b406d1ba9d99f95ab (diff)
downloadgst-plugins-fsl-vpu-32936d759c49ba5abfb3f1937fc7a02e4ab36804.tar.gz
gst-plugins-fsl-vpu-32936d759c49ba5abfb3f1937fc7a02e4ab36804.tar.xz
kernel module: Fix mpeg4 formats (wip)
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--module/imx-vpu.c26
-rw-r--r--module/imx-vpu.h1
2 files changed, 23 insertions, 4 deletions
diff --git a/module/imx-vpu.c b/module/imx-vpu.c
index 6fb5a43..7cb5f28 100644
--- a/module/imx-vpu.c
+++ b/module/imx-vpu.c
@@ -240,7 +240,7 @@ struct memalloc_record {
void __iomem *cpu_addr;
};
-#define VPU_MAX_FB 3
+#define VPU_MAX_FB 10
struct vpu_instance {
struct vpu *vpu;
@@ -523,7 +523,7 @@ static int vpu_alloc_fb_v2(struct vpu_instance *instance)
size += mvsize;
- for (i = 0; i < instance->num_fb; i++) {
+ for (i = 0; i < instance->num_fb + 1; i++) {
struct memalloc_record *rec = &instance->rec[i];
rec->cpu_addr = dma_alloc_coherent(NULL, size, &rec->dma_addr,
@@ -552,6 +552,9 @@ static int vpu_alloc_fb_v2(struct vpu_instance *instance)
if (instance->standard == STD_AVC)
para_buf[96 + i] = para_buf[i * 3 + 4] + (instance->width / 2) * (instance->height / 2);
}
+ if (instance->standard == STD_MPEG4) {
+ para_buf[97] = instance->rec[instance->num_fb].dma_addr;
+ }
out:
if (ret)
dev_dbg(vpu->dev, "%s failed with %d\n", __func__, ret);
@@ -795,6 +798,14 @@ out:
return ret;
}
+enum
+{
+ MP4_MPEG4 = 0,
+ MP4_DIVX5_HIGHER = 1,
+ MP4_XVID = 2,
+ MP4_DIVX4 = 5,
+};
+
static int noinline vpu_dec_get_initial_info(struct vpu_instance *instance)
{
struct vpu *vpu = instance->vpu;
@@ -827,8 +838,15 @@ static int noinline vpu_dec_get_initial_info(struct vpu_instance *instance)
vpu_write(vpu, CMD_DEC_SEQ_START_BYTE, instance->bitstream_buf_phys);
vpu_write(vpu, CMD_DEC_SEQ_BB_SIZE, regs->bitstream_buf_size / 1024);
vpu_write(vpu, CMD_DEC_SEQ_OPTION, 0);
- vpu_write(vpu, CMD_DEC_SEQ_PS_BB_START, instance->ps_mem_buf_phys);
- vpu_write(vpu, CMD_DEC_SEQ_PS_BB_SIZE, (PS_SAVE_SIZE / 1024));
+ if (instance->format == VPU_CODEC_AVC_DEC) {
+ vpu_write(vpu, CMD_DEC_SEQ_PS_BB_START, instance->ps_mem_buf_phys);
+ vpu_write(vpu, CMD_DEC_SEQ_PS_BB_SIZE, (PS_SAVE_SIZE / 1024));
+ }
+ if (instance->format == VPU_CODEC_MP4_DEC) {
+ vpu_write(vpu, CMD_DEC_SEQ_MP4_ASP_CLASS, MP4_MPEG4);
+ }
+
+ vpu_write(vpu, V2_BIT_RUN_AUX_STD, 0);
vpu_write(vpu, BIT_BUSY_FLAG, 0x1);
vpu_bit_issue_command(instance, SEQ_INIT);
diff --git a/module/imx-vpu.h b/module/imx-vpu.h
index b51d1a4..d2de056 100644
--- a/module/imx-vpu.h
+++ b/module/imx-vpu.h
@@ -86,6 +86,7 @@
#define CMD_DEC_SEQ_START_BYTE 0x190
#define CMD_DEC_SEQ_PS_BB_START 0x194
#define CMD_DEC_SEQ_PS_BB_SIZE 0x198
+#define CMD_DEC_SEQ_MP4_ASP_CLASS 0x19C
#define CMD_DEC_SEQ_INIT_ESCAPE 0x114