summaryrefslogtreecommitdiff
authorZhiqiang Han <zhiqiang.han@amlogic.com>2020-03-04 09:41:32 (GMT)
committer Hui Zhang <hui.zhang@amlogic.com>2020-03-18 02:42:44 (GMT)
commitdb34b14b03b48ebdb8c74623dfdc2a6c2880d109 (patch)
tree988da2263240abbbf1e0b455b457c7d9ca3b97a2
parent7a1edaf272020311b4afa10f218f81d26f4fed1b (diff)
downloadmedia_modules-db34b14b03b48ebdb8c74623dfdc2a6c2880d109.zip
media_modules-db34b14b03b48ebdb8c74623dfdc2a6c2880d109.tar.gz
media_modules-db34b14b03b48ebdb8c74623dfdc2a6c2880d109.tar.bz2
subtitle: reset subtitle parser in dmx reset [1/1]
PD#SWPL-22300 Problem: The parser, will be operated in driver dmx and amstream, which must be carefully maintained with its buf ptr. The reset procedure among dmx and amstream, destroyed the buf ptr. Solution: reset the buf ptr in dmx Verify: Patchbuild Change-Id: Idc080e4bbba1f30d44193a02f23996d3b62f767d Signed-off-by: Zhiqiang Han <zhiqiang.han@amlogic.com>
Diffstat
-rw-r--r--drivers/stream_input/parser/hw_demux/aml_dmx.c40
-rw-r--r--drivers/stream_input/parser/tsdemux.c8
2 files changed, 41 insertions, 7 deletions
diff --git a/drivers/stream_input/parser/hw_demux/aml_dmx.c b/drivers/stream_input/parser/hw_demux/aml_dmx.c
index 4375999..373cc18 100644
--- a/drivers/stream_input/parser/hw_demux/aml_dmx.c
+++ b/drivers/stream_input/parser/hw_demux/aml_dmx.c
@@ -73,6 +73,7 @@
#define pr_dbg_ss(args...) pr_dbg_flag(0x8, args)
#define pr_dbg_irq_ss(args...) pr_dbg_irq_flag(0x8, args)
#define pr_dbg_irq_pes(args...) pr_dbg_irq_flag(0x10, args)
+#define pr_dbg_irq_sub(args...) pr_dbg_irq_flag(0x20, args)
#ifdef PR_ERROR_SPEED_LIMIT
static u32 last_pr_error_time;
@@ -315,6 +316,7 @@ static int dsc_set_aes_des_sm4_key(struct aml_dsc_channel *ch, int flags,
enum ca_cw_type type, u8 *key);
static void aml_ci_plus_disable(void);
static void am_ci_plus_set_output(struct aml_dsc_channel *ch);
+static int set_subtitle_pes_buffer(struct aml_dmx *dmx);
static void dmxn_op_chan(int dmx, int ch, int(*op)(int, int), int ch_op)
{
@@ -1159,8 +1161,10 @@ static void process_sub(struct aml_dmx *dmx)
buffer2_virt = (void *)dmx->sub_buf_base_virt + (buffer2 - start_ptr);
#endif
-// printk("rd_ptr %p buffer1 %p len1 %d buffer2 %p len2 %d buffer1_virt %p buffer2_virt %p\n",
-// (void*)rd_ptr, (void*)buffer1, len1, (void*)buffer2, len2, buffer1_virt, buffer2_virt);
+ pr_dbg_irq_sub("sub: rd_ptr:%x buf1:%x len1:%d buf2:%x len2:%d\n",
+ rd_ptr, buffer1, len1, buffer2, len2);
+ pr_dbg_irq_sub("sub: buf1_virt:%p buf2_virt:%p\n",
+ buffer1_virt, buffer2_virt);
if (len1)
dma_sync_single_for_cpu(dmx_get_dev(dmx),
@@ -3971,7 +3975,7 @@ void dmx_reset_hw_ex(struct aml_dvb *dvb, int reset_irq)
(SEC_GRP_LEN_3 << 12));
}
#ifdef NO_SUB
-#ifdef SUB_BUF_DMX
+#ifndef SUB_PARSER
if (dmx->sub_pages) {
addr = virt_to_phys((void *)dmx->sub_pages);
DMX_WRITE_REG(dmx->id, SB_START, addr >> 12);
@@ -3992,6 +3996,20 @@ void dmx_reset_hw_ex(struct aml_dvb *dvb, int reset_irq)
/*if (chan->used)*/
{
+#ifdef NO_SUB
+#ifdef SUB_PARSER
+ /*
+ check if subtitle channel was running,
+ the parser will be used in amstream also,
+ take care of the buff ptr.
+ */
+ u32 v = dmx_get_chan_target(dmx, n);
+ if (v != 0xFFFF &&
+ (v & (0x7 << PID_TYPE))
+ == (SUB_PACKET << PID_TYPE))
+ set_subtitle_pes_buffer(dmx);
+#endif
+#endif
dmx_set_chan_regs(dmx, n);
}
}
@@ -4162,7 +4180,7 @@ void dmx_reset_dmx_hw_ex_unlock(struct aml_dvb *dvb, struct aml_dmx *dmx,
(SEC_GRP_LEN_3 << 12));
}
#ifdef NO_SUB
-#ifdef SUB_BUF_DMX
+#ifndef SUB_PARSER
if (dmx->sub_pages) {
addr = virt_to_phys((void *)dmx->sub_pages);
DMX_WRITE_REG(dmx->id, SB_START, addr >> 12);
@@ -4183,6 +4201,20 @@ void dmx_reset_dmx_hw_ex_unlock(struct aml_dvb *dvb, struct aml_dmx *dmx,
/*if (chan->used)*/
{
+#ifdef NO_SUB
+#ifdef SUB_PARSER
+ /*
+ check if subtitle channel was running,
+ the parser will be used in amstream also,
+ take care of the buff ptr.
+ */
+ u32 v = dmx_get_chan_target(dmx, n);
+ if (v != 0xFFFF &&
+ (v & (0x7 << PID_TYPE))
+ == (SUB_PACKET << PID_TYPE))
+ set_subtitle_pes_buffer(dmx);
+#endif
+#endif
dmx_set_chan_regs(dmx, n);
}
}
diff --git a/drivers/stream_input/parser/tsdemux.c b/drivers/stream_input/parser/tsdemux.c
index 2a02178..e3f61fe 100644
--- a/drivers/stream_input/parser/tsdemux.c
+++ b/drivers/stream_input/parser/tsdemux.c
@@ -597,9 +597,11 @@ s32 tsdemux_init(u32 vid, u32 aid, u32 sid, u32 pcrid, bool is_hevc,
WRITE_AIU_REG(AIU_MEM_AIFIFO_BUF_CNTL, MEM_BUFCTRL_INIT);
CLEAR_AIU_REG_MASK(AIU_MEM_AIFIFO_BUF_CNTL, MEM_BUFCTRL_INIT);
- WRITE_PARSER_REG(PARSER_SUB_START_PTR, parser_sub_start_ptr);
- WRITE_PARSER_REG(PARSER_SUB_END_PTR, parser_sub_end_ptr);
- WRITE_PARSER_REG(PARSER_SUB_RP, parser_sub_rp);
+ if (!enable_demux_driver()) {
+ WRITE_PARSER_REG(PARSER_SUB_START_PTR, parser_sub_start_ptr);
+ WRITE_PARSER_REG(PARSER_SUB_END_PTR, parser_sub_end_ptr);
+ WRITE_PARSER_REG(PARSER_SUB_RP, parser_sub_rp);
+ }
SET_PARSER_REG_MASK(PARSER_ES_CONTROL,
(7 << ES_SUB_WR_ENDIAN_BIT) | ES_SUB_MAN_RD_PTR);