summaryrefslogtreecommitdiff
authorZhiqiang Han <zhiqiang.han@amlogic.com>2020-01-13 12:44:42 (GMT)
committer Zhiqiang Han <zhiqiang.han@amlogic.com>2020-01-15 02:46:27 (GMT)
commitf828b96a24c656b7ad66607c7de4258d432af2fc (patch)
treefc81d52200f99fc7b71528a8973cd184bf9794ff
parenta59d2f8c71f7322d2c91861b57b522a968aef030 (diff)
downloadmedia_modules-f828b96a24c656b7ad66607c7de4258d432af2fc.zip
media_modules-f828b96a24c656b7ad66607c7de4258d432af2fc.tar.gz
media_modules-f828b96a24c656b7ad66607c7de4258d432af2fc.tar.bz2
sub: fixed crash in sub process [1/1]
PD#SWPL-19896 Problem: obsolete virt addr Solution: renew the addr of sub buf on every vid start Verify: Patchbuild Change-Id: I709192d0aa0a006a38ea89e5f2eb742c045e922e Signed-off-by: Zhiqiang Han <zhiqiang.han@amlogic.com>
Diffstat
-rw-r--r--drivers/stream_input/parser/hw_demux/aml_dmx.c8
-rw-r--r--drivers/stream_input/parser/hw_demux/aml_dvb.c5
-rw-r--r--drivers/stream_input/parser/hw_demux/aml_dvb.h2
3 files changed, 11 insertions, 4 deletions
diff --git a/drivers/stream_input/parser/hw_demux/aml_dmx.c b/drivers/stream_input/parser/hw_demux/aml_dmx.c
index 33806b6..6bf9186 100644
--- a/drivers/stream_input/parser/hw_demux/aml_dmx.c
+++ b/drivers/stream_input/parser/hw_demux/aml_dmx.c
@@ -4200,12 +4200,12 @@ exit:
}
#endif
-int dmx_init_sub_buffer(struct aml_dmx *dmx)
+int dmx_init_sub_buffer(struct aml_dmx *dmx, unsigned long base, unsigned long virt)
{
- dmx->sub_buf_base = READ_MPEG_REG(PARSER_SUB_START_PTR);
+ dmx->sub_buf_base = (base)? base : READ_MPEG_REG(PARSER_SUB_START_PTR);
pr_inf("sub buf base: 0x%lx\n", dmx->sub_buf_base);
- dmx->sub_buf_base_virt = codec_mm_phys_to_virt(dmx->sub_buf_base);
+ dmx->sub_buf_base_virt = (base)? (u8 *)virt : codec_mm_phys_to_virt(dmx->sub_buf_base);
pr_inf("sub buf base virt: 0x%p\n", dmx->sub_buf_base_virt);
return 0;
@@ -4903,7 +4903,7 @@ int aml_dmx_hw_start_feed(struct dvb_demux_feed *dvbdmxfeed)
if (dvbdmxfeed->type == DMX_TYPE_TS
&& (dvbdmxfeed->pes_type == DMX_PES_SUBTITLE
|| dvbdmxfeed->pes_type == DMX_PES_TELETEXT))
- dmx_init_sub_buffer(dmx);
+ dmx_init_sub_buffer(dmx, 0, 0);
spin_lock_irqsave(&dvb->slock, flags);
ret = dmx_add_feed(dmx, dvbdmxfeed);
diff --git a/drivers/stream_input/parser/hw_demux/aml_dvb.c b/drivers/stream_input/parser/hw_demux/aml_dvb.c
index 1a5e174..5785466 100644
--- a/drivers/stream_input/parser/hw_demux/aml_dvb.c
+++ b/drivers/stream_input/parser/hw_demux/aml_dvb.c
@@ -2884,10 +2884,12 @@ static int aml_tsdemux_set_vid(int vpid)
if (dmx) {
if (dmx->vid_chan != -1) {
dmx_free_chan(dmx, dmx->vid_chan);
+ dmx_init_sub_buffer(dmx, 1, 0);
dmx->vid_chan = -1;
}
if ((vpid >= 0) && (vpid < 0x1FFF)) {
+ dmx_init_sub_buffer(dmx, 0, 0);
dmx->vid_chan =
dmx_alloc_chan(dmx, DMX_TYPE_TS,
DMX_PES_VIDEO, vpid);
@@ -2918,6 +2920,7 @@ static int aml_tsdemux_set_aid(int apid)
}
if ((apid >= 0) && (apid < 0x1FFF)) {
+ dmx_init_sub_buffer(dmx, 0, 0);
dmx->aud_chan =
dmx_alloc_chan(dmx, DMX_TYPE_TS,
DMX_PES_AUDIO, apid);
@@ -2945,10 +2948,12 @@ static int aml_tsdemux_set_sid(int spid)
if (dmx) {
if (dmx->sub_chan != -1) {
dmx_free_chan(dmx, dmx->sub_chan);
+ dmx_init_sub_buffer(dmx, 1, 0);
dmx->sub_chan = -1;
}
if ((spid >= 0) && (spid < 0x1FFF)) {
+ dmx_init_sub_buffer(dmx, 0, 0);
dmx->sub_chan =
dmx_alloc_chan(dmx, DMX_TYPE_TS,
DMX_PES_SUBTITLE, spid);
diff --git a/drivers/stream_input/parser/hw_demux/aml_dvb.h b/drivers/stream_input/parser/hw_demux/aml_dvb.h
index e18bb9b..3fa9cd8 100644
--- a/drivers/stream_input/parser/hw_demux/aml_dvb.h
+++ b/drivers/stream_input/parser/hw_demux/aml_dvb.h
@@ -366,6 +366,8 @@ extern void dmx_free_chan(struct aml_dmx *dmx, int cid);
extern int dmx_get_ts_serial(enum aml_ts_source_t src);
+extern int dmx_init_sub_buffer(struct aml_dmx *dmx, unsigned long base, unsigned long virt);
+
/*AMLogic dsc interface*/
extern int dsc_set_pid(struct aml_dsc_channel *ch, int pid);
extern int dsc_set_key(struct aml_dsc_channel *ch, int flags,