summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYahui Han <yahui.han@amlogic.com>2018-07-12 16:58:32 +0800
committerZhi Zhou <zhi.zhou@amlogic.com>2018-07-23 00:55:30 -0700
commitde5a335dc2dc140a0bdc565183b1cd018d2b256f (patch)
tree30f4f13a4f62295cdafda3383d905eeb376ee096
parent0520b0b86a74afbb36746961e9c8c890f950e5db (diff)
downloadmedia_modules-de5a335dc2dc140a0bdc565183b1cd018d2b256f.tar.gz
dvb: merge from projects/verimatrix/905d-android-0425. [1/1]
PD# 152116 support config aysncfifo buffer length in dts file. Change-Id: Ie996fb93b654f1c7ebd86cab0656a0959c6fd537
-rw-r--r--drivers/stream_input/parser/hw_demux/aml_dmx.c73
-rw-r--r--drivers/stream_input/parser/hw_demux/aml_dvb.c87
-rw-r--r--drivers/stream_input/parser/hw_demux/aml_dvb.h7
3 files changed, 156 insertions, 11 deletions
diff --git a/drivers/stream_input/parser/hw_demux/aml_dmx.c b/drivers/stream_input/parser/hw_demux/aml_dmx.c
index e5226cc..3d0ba4d 100644
--- a/drivers/stream_input/parser/hw_demux/aml_dmx.c
+++ b/drivers/stream_input/parser/hw_demux/aml_dmx.c
@@ -421,6 +421,7 @@ static u32 first_video_pts;
static u32 first_audio_pts;
static int demux_skipbyte;
static int tsfile_clkdiv = 4;
+static int asyncfifo_buf_len = ASYNCFIFO_BUFFER_SIZE_DEFAULT;
#define SF_DMX_ID 2
#define SF_AFIFO_ID 1
@@ -1358,9 +1359,11 @@ static void dvr_process_channel(struct aml_asyncfifo *afifo,
{
int cnt;
int ret = 0;
+ struct aml_dvr_block blk;
if (afifo->buf_read > afifo->buf_toggle) {
cnt = total - afifo->buf_read;
+ if (!afifo->secure_enable) {
dma_sync_single_for_cpu(asyncfifo_get_dev(afifo),
afifo->pages_map+afifo->buf_read*size,
cnt*size,
@@ -1374,11 +1377,27 @@ static void dvr_process_channel(struct aml_asyncfifo *afifo,
(u8 *)afifo->pages+afifo->buf_read*size,
cnt*size, NULL, 0,
&channel->dvr_feed->feed.ts);
+ } else {
+ blk.addr = afifo->blk.addr+afifo->buf_read*size;
+ blk.len = cnt*size;
+ if (sf)
+ ret = _rbuf_write(&sf->rbuf,
+ (u8 *)afifo->pages+afifo->buf_read*size,
+ cnt*size);
+ else {
+ channel->dvr_feed->cb.ts(
+ (u8 *)&blk,
+ sizeof(struct aml_dvr_block),
+ NULL, 0,
+ &channel->dvr_feed->feed.ts);
+ }
+ }
afifo->buf_read = 0;
}
if (afifo->buf_toggle > afifo->buf_read) {
cnt = afifo->buf_toggle - afifo->buf_read;
+ if (!afifo->secure_enable) {
dma_sync_single_for_cpu(asyncfifo_get_dev(afifo),
afifo->pages_map+afifo->buf_read*size,
cnt*size,
@@ -1388,11 +1407,27 @@ static void dvr_process_channel(struct aml_asyncfifo *afifo,
ret = _rbuf_write(&sf->rbuf,
(u8 *)afifo->pages+afifo->buf_read*size,
cnt*size);
- } else
+ } else {
channel->dvr_feed->cb.ts(
(u8 *)afifo->pages+afifo->buf_read*size,
cnt*size, NULL, 0,
+ &channel->dvr_feed->feed.ts);
+ }
+ } else {
+ blk.addr = afifo->blk.addr+afifo->buf_read*size;
+ blk.len = cnt*size;
+ if (sf)
+ ret = _rbuf_write(&sf->rbuf,
+ (u8 *)afifo->pages+afifo->buf_read*size,
+ cnt*size);
+ else {
+ channel->dvr_feed->cb.ts(
+ (u8 *)&blk,
+ sizeof(struct aml_dvr_block),
+ NULL, 0,
&channel->dvr_feed->feed.ts);
+ }
+ }
afifo->buf_read = afifo->buf_toggle;
}
@@ -1732,7 +1767,9 @@ static int dsc_set_csa_key(struct aml_dsc_channel *ch, int flags,
((ch->id + type * DSC_COUNT)+
(is_dsc2 ? 16 : 0)));
}
- if (get_cpu_type() == MESON_CPU_MAJOR_ID_GXL) {
+ if (get_cpu_type() == MESON_CPU_MAJOR_ID_GXL ||
+ get_cpu_type() == MESON_CPU_MAJOR_ID_GXM) {
+ pr_info("do kl..\n");
WRITE_MPEG_REG(COMM_DESC_KEY_RW,
(type ? (1 << 6) : (1 << 5)) | (1<<7) |
((ch->id + type * DSC_COUNT)+
@@ -2196,7 +2233,7 @@ static int asyncfifo_set_buffer(struct aml_asyncfifo *afifo,
afifo->buf_toggle = 0;
afifo->buf_read = 0;
afifo->buf_len = len;
- pr_error("async fifo %d buf size %d, flush size %d\n",
+ pr_error("++++async fifo %d buf size %d, flush size %d\n",
afifo->id, afifo->buf_len, afifo->flush_size);
if ((afifo->flush_size <= 0)
@@ -2447,12 +2484,22 @@ static int dmx_init(struct aml_dmx *dmx)
{
struct aml_dvb *dvb = (struct aml_dvb *)dmx->demux.priv;
int irq;
+ int ret = 0;
+ char buf[32];
+ u32 value = 0;
if (dmx->init)
return 0;
pr_inf("demux init\n");
+ memset(buf, 0, 32);
+ snprintf(buf, sizeof(buf), "asyncfifo_buf_len");
+ ret = of_property_read_u32(dvb->pdev->dev.of_node, buf, &value);
+ if (!ret) {
+ pr_inf("%s: 0x%x\n", buf, value);
+ asyncfifo_buf_len = value;
+ }
/*Register irq handlers */
if (dmx->dmx_irq != -1) {
pr_dbg("request irq\n");
@@ -2656,7 +2703,10 @@ static int dmx_enable(struct aml_dmx *dmx)
case AM_TS_SRC_HIU:
fec_sel = 7;
fec_ctrl = 0;
+ /*
+ support record in HIU mode
record = 0;
+ */
break;
default:
fec_sel = 0;
@@ -2726,7 +2776,7 @@ static int dmx_enable(struct aml_dmx *dmx)
pr_dbg("dsc2 ctrl: 0x%x\n", READ_MPEG_REG(COMM_DESC_2_CTL));
}
- pr_dbg("[dmx-%d]src: %d, rec: %d, hi_bsf: %d, dsc: %d\n",
+ pr_info("[dmx-%d]src: %d, rec: %d, hi_bsf: %d, dsc: %d\n",
dmx->id, dmx->source, record, hi_bsf, fec_core_sel);
if (dmx->chan_count) {
@@ -3138,12 +3188,13 @@ static void dmx_clear_filter_buffer(struct aml_dmx *dmx, int fid)
static void async_fifo_set_regs(struct aml_asyncfifo *afifo, int source_val)
{
- u32 start_addr = virt_to_phys((void *)afifo->pages);
+ u32 start_addr = afifo->secure_enable ? afifo->blk.addr :
+ virt_to_phys((void *)afifo->pages);
u32 size = afifo->buf_len;
u32 flush_size = afifo->flush_size;
int factor = dmx_get_order(size / flush_size);
-
- pr_dbg("ASYNC FIFO id=%d, link to DMX%d, start_addr %x, buf_size %d,source value 0x%x, factor %d\n",
+ pr_error("ASYNC FIFO id=%d, link to DMX%d, start_addr %x, buf_size %d,"
+ "source value 0x%x, factor %d\n",
afifo->id, afifo->source, start_addr, size, source_val, factor);
/* Destination address */
WRITE_ASYNC_FIFO_REG(afifo->id, REG0, start_addr);
@@ -4351,7 +4402,7 @@ int aml_asyncfifo_hw_init(struct aml_asyncfifo *afifo)
*/
int ret;
- int len = ASYNCFIFO_BUFFER_SIZE_DEFAULT;
+ int len = asyncfifo_buf_len;
unsigned long buf = asyncfifo_alloc_buffer(len);
if (!buf)
@@ -4401,9 +4452,9 @@ int aml_asyncfifo_hw_reset(struct aml_asyncfifo *afifo)
unsigned long flags;
int ret, src = -1;
- int len = ASYNCFIFO_BUFFER_SIZE_DEFAULT;
- unsigned long buf = asyncfifo_alloc_buffer(len);
-
+ unsigned long buf = 0;
+ int len = asyncfifo_buf_len;
+ buf = asyncfifo_alloc_buffer(len);
if (!buf)
return -1;
diff --git a/drivers/stream_input/parser/hw_demux/aml_dvb.c b/drivers/stream_input/parser/hw_demux/aml_dvb.c
index 04f9bb7..afdb8bf 100644
--- a/drivers/stream_input/parser/hw_demux/aml_dvb.c
+++ b/drivers/stream_input/parser/hw_demux/aml_dvb.c
@@ -670,6 +670,9 @@ static int aml_dvb_asyncfifo_init(struct aml_dvb *advb,
asyncfifo->id = id;
asyncfifo->init = 0;
asyncfifo->flush_size = 256 * 1024;
+ asyncfifo->secure_enable = 0;
+ asyncfifo->blk.addr = 0;
+ asyncfifo->blk.len = 0;
return aml_asyncfifo_hw_init(asyncfifo);
}
@@ -1281,6 +1284,77 @@ ASYNCFIFO_FLUSHSIZE_FUNC_DECL(0)
#if ASYNCFIFO_COUNT > 1
ASYNCFIFO_FLUSHSIZE_FUNC_DECL(1)
#endif
+/*Show the async fifo secure buffer addr*/
+#define ASYNCFIFO_SECUREADDR_FUNC_DECL(i) \
+static ssize_t asyncfifo##i##_show_secure_addr(struct class *class, \
+ struct class_attribute *attr, char *buf)\
+{\
+ struct aml_dvb *dvb = &aml_dvb_device;\
+ struct aml_asyncfifo *afifo = &dvb->asyncfifo[i];\
+ ssize_t ret = 0;\
+ ret = sprintf(buf, "0x%x\n", afifo->blk.addr);\
+ return ret;\
+} \
+static ssize_t asyncfifo##i##_store_secure_addr(struct class *class, \
+ struct class_attribute *attr, \
+const char *buf, size_t size)\
+{\
+ struct aml_dvb *dvb = &aml_dvb_device;\
+ struct aml_asyncfifo *afifo = &dvb->asyncfifo[i];\
+ unsigned long value;\
+ int ret = kstrtol(buf, 0, &value);\
+ if (ret == 0 && value != afifo->blk.addr) {\
+ afifo->blk.addr = value;\
+ aml_asyncfifo_hw_reset(&aml_dvb_device.asyncfifo[i]);\
+ } \
+ return size;\
+}
+
+#if ASYNCFIFO_COUNT > 0
+ ASYNCFIFO_SECUREADDR_FUNC_DECL(0)
+#endif
+
+#if ASYNCFIFO_COUNT > 1
+ ASYNCFIFO_SECUREADDR_FUNC_DECL(1)
+#endif
+
+
+/*Show the async fifo secure enable*/
+#define ASYNCFIFO_SECURENABLE_FUNC_DECL(i) \
+static ssize_t asyncfifo##i##_show_secure_enable(struct class *class, \
+ struct class_attribute *attr, char *buf)\
+{\
+ struct aml_dvb *dvb = &aml_dvb_device;\
+ struct aml_asyncfifo *afifo = &dvb->asyncfifo[i];\
+ ssize_t ret = 0;\
+ ret = sprintf(buf, "%d\n", afifo->secure_enable);\
+ return ret;\
+} \
+static ssize_t asyncfifo##i##_store_secure_enable(struct class *class, \
+ struct class_attribute *attr, \
+ const char *buf, size_t size)\
+{\
+ struct aml_dvb *dvb = &aml_dvb_device;\
+ struct aml_asyncfifo *afifo = &dvb->asyncfifo[i];\
+ int enable = 0;\
+ long value;\
+ int ret = kstrtol(buf, 0, &value);\
+ if (ret == 0)\
+ enable = value;\
+ if (enable != afifo->secure_enable) {\
+ afifo->secure_enable = enable;\
+ aml_asyncfifo_hw_reset(&aml_dvb_device.asyncfifo[i]);\
+ } \
+ return size;\
+}
+
+#if ASYNCFIFO_COUNT > 0
+ASYNCFIFO_SECURENABLE_FUNC_DECL(0)
+#endif
+
+#if ASYNCFIFO_COUNT > 1
+ ASYNCFIFO_SECURENABLE_FUNC_DECL(1)
+#endif
/*Reset the Demux*/
static ssize_t demux_do_reset(struct class *class,
struct class_attribute *attr,
@@ -1516,13 +1590,26 @@ static struct class_attribute aml_stb_class_attrs[] = {
__ATTR(asyncfifo##i##_flush_size, 0664,\
asyncfifo##i##_show_flush_size, \
asyncfifo##i##_store_flush_size)
+#define ASYNCFIFO_SECUREADDR_ATTR_DECL(i)\
+ __ATTR(asyncfifo##i##_secure_addr, S_IRUGO | S_IWUSR | S_IWGRP,\
+ asyncfifo##i##_show_secure_addr, \
+ asyncfifo##i##_store_secure_addr)
+#define ASYNCFIFO_SECURENABLE_ATTR_DECL(i)\
+ __ATTR(asyncfifo##i##_secure_enable, S_IRUGO | S_IWUSR | S_IWGRP,\
+ asyncfifo##i##_show_secure_enable, \
+ asyncfifo##i##_store_secure_enable)
+
#if ASYNCFIFO_COUNT > 0
ASYNCFIFO_SOURCE_ATTR_DECL(0),
ASYNCFIFO_FLUSHSIZE_ATTR_DECL(0),
+ ASYNCFIFO_SECUREADDR_ATTR_DECL(0),
+ ASYNCFIFO_SECURENABLE_ATTR_DECL(0),
#endif
#if ASYNCFIFO_COUNT > 1
ASYNCFIFO_SOURCE_ATTR_DECL(1),
ASYNCFIFO_FLUSHSIZE_ATTR_DECL(1),
+ ASYNCFIFO_SECUREADDR_ATTR_DECL(1),
+ ASYNCFIFO_SECURENABLE_ATTR_DECL(1),
#endif
__ATTR(demux_reset, 0644, NULL, demux_do_reset),
diff --git a/drivers/stream_input/parser/hw_demux/aml_dvb.h b/drivers/stream_input/parser/hw_demux/aml_dvb.h
index f04c5c9..4239ff3 100644
--- a/drivers/stream_input/parser/hw_demux/aml_dvb.h
+++ b/drivers/stream_input/parser/hw_demux/aml_dvb.h
@@ -214,6 +214,11 @@ struct aml_dmx {
u32 crc_check_time;
};
+struct aml_dvr_block {
+ u32 addr;
+ u32 len;
+};
+
struct aml_asyncfifo {
int id;
int init;
@@ -225,8 +230,10 @@ struct aml_asyncfifo {
int buf_toggle;
int buf_read;
int flush_size;
+ int secure_enable;
struct tasklet_struct asyncfifo_tasklet;
struct aml_dvb *dvb;
+ struct aml_dvr_block blk;
};
enum{