summaryrefslogtreecommitdiff
authorshihong.zheng <shihong.zheng@amlogic.com>2020-01-01 03:37:33 (GMT)
committer Hui Zhang <hui.zhang@amlogic.com>2020-01-06 05:04:01 (GMT)
commit043ae8b4e264b34ecea4c0b23a4a084db43a9b29 (patch)
tree4b5fd89750d8588ed5c5383ebf1aea58587e6eb2
parent13e14fdcbdc2f6f68759583b7cd12dfba9aad601 (diff)
downloadmedia_modules-043ae8b4e264b34ecea4c0b23a4a084db43a9b29.zip
media_modules-043ae8b4e264b34ecea4c0b23a4a084db43a9b29.tar.gz
media_modules-043ae8b4e264b34ecea4c0b23a4a084db43a9b29.tar.bz2
amstream: dump streambuf data. [1/1]
PD#OTT-7937 Problem: demux error data cause decoder reset. Solution: dump stream buf to locate issue. usage: change stbuf size and block the stream mode decode to dump more data. dump video stbuf cmd: mdkir -p /data/tmp -m 777;setenforce 0; echo 0 > /sys/class/amstream/dump_stream; Verify: P212 Change-Id: I1f44a95841038265d71c746889d01b46c6154fb1 Signed-off-by: shihong.zheng <shihong.zheng@amlogic.com>
Diffstat
-rw-r--r--drivers/stream_input/amports/amstream.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/drivers/stream_input/amports/amstream.c b/drivers/stream_input/amports/amstream.c
index 51fd4b7..4d72647 100644
--- a/drivers/stream_input/amports/amstream.c
+++ b/drivers/stream_input/amports/amstream.c
@@ -3951,6 +3951,117 @@ static ssize_t audio_path_store(struct class *class,
return size;
}
+ssize_t dump_stream_show(struct class *class,
+ struct class_attribute *attr, char *buf)
+{
+ char *p_buf = buf;
+
+ p_buf += sprintf(p_buf, "\nmdkir -p /data/tmp -m 777;setenforce 0;\n\n");
+ p_buf += sprintf(p_buf, "video:\n\t echo 0 > /sys/class/amstream/dump_stream;\n");
+ p_buf += sprintf(p_buf, "hevc :\n\t echo 4 > /sys/class/amstream/dump_stream;\n");
+
+ return p_buf - buf;
+}
+
+#define DUMP_STREAM_FILE "/data/tmp/dump_stream.h264"
+ssize_t dump_stream_store(struct class *class,
+ struct class_attribute *attr,
+ const char *buf, size_t size)
+{
+ struct stream_buf_s *p_buf;
+ int ret = 0, id = 0;
+ unsigned int stride, remain, level, vmap_size;
+ int write_size;
+ void *stbuf_vaddr;
+ unsigned long offset;
+ struct file *fp;
+ mm_segment_t old_fs;
+ loff_t fpos;
+
+ ret = sscanf(buf, "%d", &id);
+ if (ret < 0) {
+ pr_info("paser buf id fail, default id = 0\n");
+ id = 0;
+ }
+ if (id != BUF_TYPE_VIDEO && id != BUF_TYPE_HEVC) {
+ pr_info("buf id out of range, max %d, id %d, set default id 0\n", BUF_MAX_NUM - 1, id);
+ id = 0;
+ }
+ p_buf = get_stream_buffer(id);
+ if (!p_buf) {
+ pr_info("get buf fail, id %d\n", id);
+ return size;
+ }
+ if ((!p_buf->buf_size) || (p_buf->is_secure) || (!(p_buf->flag & BUF_FLAG_IN_USE))) {
+ pr_info("buf size %d, is_secure %d, in_use %d, it can not dump\n",
+ p_buf->buf_size, p_buf->is_secure, (p_buf->flag & BUF_FLAG_IN_USE));
+ return size;
+ }
+
+ level = stbuf_level(p_buf);
+ if (!level || level > p_buf->buf_size) {
+ pr_info("stream buf level %d, buf size %d, error return\n", level, p_buf->buf_size);
+ return size;
+ }
+
+ fp = filp_open(DUMP_STREAM_FILE, O_CREAT | O_RDWR, 0666);
+ if (IS_ERR(fp)) {
+ fp = NULL;
+ pr_info("create dump stream file failed\n");
+ return size;
+ }
+
+ offset = p_buf->buf_start;
+ remain = level;
+ stride = SZ_1M;
+ vmap_size = 0;
+ fpos = 0;
+ pr_info("create file success, it will dump from addr 0x%lx, size 0x%x\n", offset, remain);
+ while (remain > 0) {
+ if (remain > stride)
+ vmap_size = stride;
+ else {
+ stride = remain;
+ vmap_size = stride;
+ }
+
+ stbuf_vaddr = codec_mm_vmap(offset, vmap_size);
+ if (stbuf_vaddr == NULL) {
+ stride >>= 1;
+ pr_info("vmap fail change vmap stide size 0x%x\n", stride);
+ continue;
+ }
+ codec_mm_dma_flush(stbuf_vaddr, vmap_size, DMA_FROM_DEVICE);
+
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+ write_size = vfs_write(fp, stbuf_vaddr, vmap_size, &fpos);
+ if (write_size < vmap_size) {
+ write_size += vfs_write(fp, stbuf_vaddr + write_size, vmap_size - write_size, &fpos);
+ pr_info("fail write retry, total %d, write %d\n", vmap_size, write_size);
+ if (write_size < vmap_size) {
+ pr_info("retry fail, interrupt dump stream, break\n");
+ break;
+ }
+ }
+ set_fs(old_fs);
+ vfs_fsync(fp, 0);
+ pr_info("vmap_size 0x%x dump size 0x%x\n", vmap_size, write_size);
+
+ offset += vmap_size;
+ remain -= vmap_size;
+ codec_mm_unmap_phyaddr(stbuf_vaddr);
+ }
+
+ filp_close(fp, current->files);
+ pr_info("dump stream buf end\n");
+
+ return size;
+}
+
+
+
+
static struct class_attribute amstream_class_attrs[] = {
__ATTR_RO(ports),
__ATTR_RO(bufs),
@@ -3962,6 +4073,8 @@ static struct class_attribute amstream_class_attrs[] = {
store_maxdelay),
__ATTR(reset_audio_port, S_IRUGO | S_IWUSR | S_IWGRP,
NULL, audio_path_store),
+ __ATTR(dump_stream, S_IRUGO | S_IWUSR | S_IWGRP,
+ dump_stream_show, dump_stream_store),
__ATTR_NULL
};