author | shuanglong.wang <shuanglong.wang@amlogic.com> | 2019-12-13 02:59:07 (GMT) |
---|---|---|
committer | Shen Liu <shen.liu@amlogic.com> | 2020-01-15 07:49:32 (GMT) |
commit | c1df51d5a9edf5b6b75b4c309878dcd70364aad3 (patch) | |
tree | 4a26710404bc0702185ddf9de91fd943001faa8f | |
parent | e9fa220af71c923a5646690d4524101d3a031567 (diff) | |
download | media_modules-c1df51d5a9edf5b6b75b4c309878dcd70364aad3.zip media_modules-c1df51d5a9edf5b6b75b4c309878dcd70364aad3.tar.gz media_modules-c1df51d5a9edf5b6b75b4c309878dcd70364aad3.tar.bz2 |
vdec: use dmc level control decoder urgent [2/4]
PD#SWPL-19403
Problem:
ampere playback vp9, decoder spend time longer
Solution:
ampere vp9 adaptive playback use decoder dmc access
Verify:
verify by ampere
Change-Id: Ib1f04c0ec92d3a11fd4d09f9472107cc26689815
Signed-off-by: shuanglong.wang <shuanglong.wang@amlogic.com>
-rw-r--r-- | drivers/frame_provider/decoder/utils/vdec.c | 44 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/utils/vdec.h | 3 | ||||
-rw-r--r-- | drivers/stream_input/amports/amstream.c | 4 |
3 files changed, 51 insertions, 0 deletions
diff --git a/drivers/frame_provider/decoder/utils/vdec.c b/drivers/frame_provider/decoder/utils/vdec.c index 2c8787f..6fa36f1 100644 --- a/drivers/frame_provider/decoder/utils/vdec.c +++ b/drivers/frame_provider/decoder/utils/vdec.c @@ -3741,6 +3741,50 @@ void vdec_reset_userdata_fifo(struct vdec_s *vdec, int bInit) } EXPORT_SYMBOL(vdec_reset_userdata_fifo); +void vdec_set_dmc_urgent(struct vdec_s *vdec, int urgentType) +{ +#ifndef DMC_AXI4_G12_CHAN_CTRL +#define DMC_AXI4_G12_CHAN_CTRL (0x90 << 2) +#endif +#define DMC_URGENT_TYPE_NORMAL 1 +#define DMC_URGENT_TYPE_URGENT 2 +#define DMC_URGENT_TYPE_SUPERURGENT 4 + + if (vdec) { + if (urgentType == DMC_URGENT_TYPE_NORMAL || + urgentType == DMC_URGENT_TYPE_URGENT || + urgentType == DMC_URGENT_TYPE_SUPERURGENT) { + int type; + unsigned int val; + + type = vdec_get_hw_type(vdec->port->vformat); + if (type == CORE_MASK_HEVC) { + if (get_cpu_major_id() < AM_MESON_CPU_MAJOR_ID_G12A) { + val = READ_DMCREG(DMC_AXI4_CHAN_CTRL); + val &= (~(0x7 << 16)); + val |= ((urgentType & 0x7) << 16); + WRITE_DMCREG(DMC_AXI4_CHAN_CTRL, val); + } else { + val = READ_DMCREG(DMC_AXI4_G12_CHAN_CTRL); + val &= (~(0x7 << 16)); + val |= ((urgentType & 0x7) << 16); + WRITE_DMCREG(DMC_AXI4_G12_CHAN_CTRL, val); + } + } else if (type == CORE_MASK_VDEC_1) { + if (get_cpu_major_id() < AM_MESON_CPU_MAJOR_ID_G12A) { + val = READ_DMCREG(DMC_AM5_CHAN_CTRL); + val &= (~(0x7 << 16)); + val |= ((urgentType & 0x7) << 16); + WRITE_DMCREG(DMC_AM5_CHAN_CTRL, val); + } + } + } + } + +} +EXPORT_SYMBOL(vdec_set_dmc_urgent); + + static int dump_mode; static ssize_t dump_risc_mem_store(struct class *class, struct class_attribute *attr, diff --git a/drivers/frame_provider/decoder/utils/vdec.h b/drivers/frame_provider/decoder/utils/vdec.h index 358b979..c28f870 100644 --- a/drivers/frame_provider/decoder/utils/vdec.h +++ b/drivers/frame_provider/decoder/utils/vdec.h @@ -71,6 +71,9 @@ extern void vdec_poweron(enum vdec_type_e core); extern void vdec_poweroff(enum vdec_type_e core); extern bool vdec_on(enum vdec_type_e core); extern void vdec_power_reset(void); +extern void vdec_set_dmc_urgent(struct vdec_s *vdec, int urgentType); + + /*irq num as same as .dts*/ diff --git a/drivers/stream_input/amports/amstream.c b/drivers/stream_input/amports/amstream.c index 3daedac..be2dc8d 100644 --- a/drivers/stream_input/amports/amstream.c +++ b/drivers/stream_input/amports/amstream.c @@ -2245,6 +2245,10 @@ static long amstream_ioctl_set(struct port_priv_s *priv, ulong arg) case AMSTREAM_SET_NO_POWERDOWN: vdec_set_no_powerdown(parm.data_32); break; + case AMSTREAM_SET_DMC_URGENT: + vdec_set_dmc_urgent(priv->vdec, parm.data_32); + break; + default: r = -ENOIOCTLCMD; break; |