author | Zhiqiang 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) |
commit | f828b96a24c656b7ad66607c7de4258d432af2fc (patch) | |
tree | fc81d52200f99fc7b71528a8973cd184bf9794ff | |
parent | a59d2f8c71f7322d2c91861b57b522a968aef030 (diff) | |
download | media_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>
-rw-r--r-- | drivers/stream_input/parser/hw_demux/aml_dmx.c | 8 | ||||
-rw-r--r-- | drivers/stream_input/parser/hw_demux/aml_dvb.c | 5 | ||||
-rw-r--r-- | drivers/stream_input/parser/hw_demux/aml_dvb.h | 2 |
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, |