summaryrefslogtreecommitdiff
authorshuanglong.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)
commitc1df51d5a9edf5b6b75b4c309878dcd70364aad3 (patch)
tree4a26710404bc0702185ddf9de91fd943001faa8f
parente9fa220af71c923a5646690d4524101d3a031567 (diff)
downloadmedia_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>
Diffstat
-rw-r--r--drivers/frame_provider/decoder/utils/vdec.c44
-rw-r--r--drivers/frame_provider/decoder/utils/vdec.h3
-rw-r--r--drivers/stream_input/amports/amstream.c4
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;