https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1437520/processors-forum
器件型号:AM67A工具与软件:
您好!
我希望有人能帮助我理解我可能会犯错误的地方。 我有一块具有4GB RAM 的 AM67A 板、其中 CMA 区域(大小为896MB)映射到上部2GB、使用起始地址为0x8c0000000的 DTBO。 我正在使用 Processor SDK 10.00.00.08以及从源代码构建的 ti 内核6.6.6.32-ti-ARM64。 如果我尝试编码大于1920x1080的视频(即4K)、则 jpeg e5010驱动程序会抛出"e5010 fd20000.e5010:大小为12443648的 DMA 分配失败"错误。 当我使用 v4l2h264enc 或 v4l2h265enc 尝试相同的测试流水线时、可以正常工作。 我向 videobuf2-dma-contig.c 驱动程序添加了一些调试语句、请参阅 v4l2jpegenc 插件正在尝试分配缓冲区的位置。 当我对有效的视频分辨率进行编码(1920x1080或更小)时、我看到定义的 CMA 区域中没有发生 DMA 分配。 如果我对 h264/h265视频进行编码(分辨率最高可达指定的4K 编码器限制)、我可以看到 DMA 分配正在 DTBO 中指定的 CMA 区域发生。 我的猜测是 e5010驱动器未正确读取指定的 CMA 区域、或者与使用较高2GB 内存的硬件编码器不兼容、因为它与较低2GB 内存不相邻。 我尝试过的内容有:
1.由于边缘 AI 的其他内存分配、将 CMA 以从896MB 减小的大小移动到较低的2GB。 这种方法有效、我能够编码到高达4K。 遗憾的是、这意味着由于内存大小减小、我的同时 h264和 h265流数量受到限制。 我在测试时没有执行内核驱动程序调试语句、因此我只是监视/proc/meminfo CmaTotal 和 CmaFree、以分别查看在运行和停止管道时内存被分配和释放。
2.将 CMA 区域移至上部2GB 区域中的其它起始地址。 这没有改变任何内容、并且仍然引发相同的内存分配错误。
3.使用软件 jpegenc 插件和预期,工作正常。
我在 AM67A 的 Processor SDK 文档中看不到 E5010内核驱动程序部分、但 AM62A 有一个部分。 假设处理器中的一切都是相同的、我发现"不支持在内存中分配为物理非连续的缓冲区"。 这是否与将 CMA 移至上部2GB 有关?
使用的测试流水线:
JPEG
工作
GST-LAUNCH-1.0 videotestsrc ! video/x-raw、format=NV12、width=1920、height=1080! v4l2jpegenc! 链接
驱动程序调试输出
[ 1452.475966] vb2_dc_alloc_相干:尝试分配 DMA 缓冲区
[ 1452.483747]缓冲区大小:3112960、GFP 标志:CC0、属性:0
[ 1452.491636] DMA 分配成功:地址:0x000000008a000000、大小:3112960
[ 1452.498495] vb2_dc_alloc_相干:尝试分配 DMA 缓冲区
[ 1452.504569]缓冲区大小:3112960、GFP 标志:CC0、属性:0
[ 1452.511829] DMA 分配成功:地址:0x0000000089c00000、大小:3112960
[ 1452.548022] vb2_dc_alloc_相干:尝试分配 DMA 缓冲区
[ 1452.554050]缓冲区大小:4149248、GFP 标志:CC0、属性:0
[ 1452.562217] DMA 分配成功:地址:0x0000000089800000、大小:4149248
[ 1452.569075] vb2_dc_alloc_相干:尝试分配 DMA 缓冲区
[ 1452.575098]缓冲区大小:4149248、GFP 标志:CC0、属性:0
[ 1452.582753] DMA 分配成功:地址:0x0000000089400000、大小:4149248
[ 1452.589573] vb2_dc_alloc_相干:尝试分配 DMA 缓冲区
[ 1452.595578]缓冲区大小:4149248、GFP 标志:CC0、属性:0
[ 1452.603160] DMA 分配成功:地址:0x0000000089000000、大小:4149248
[ 1452.609981] vb2_dc_alloc_相干:尝试分配 DMA 缓冲区
[ 1452.615988]缓冲区大小:4149248、GFP 标志:CC0、属性:0
[ 1452.623572] DMA 分配成功:地址:0x0000000088c00000、大小:4149248
不工作
GST-LAUNCH-1.0 videotestsrc ! video/x-raw、format=NV12、width=3840、height=2160! v4l2jpegenc! 链接
[ 2836.621667] vb2_dc_alloc_相干:尝试分配 DMA 缓冲器
[ 2836.629446]缓冲区大小:12443648、GFP 标志:CC0、属性:0
[ 2836.637982] e5010 fd20000.e5010:大小为12443648的 DMA 分配失败
[ 2836.644215] e5010 fd20000.e5010:大小为12443648的 DMA 分配失败
错误:来自元素/GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0:内部数据流错误。
其他调试信息:
/usr/4510debug/gstreamer1.0/1.22.12/libs/gst/base/gstbasesrc.c src (3134):gst_base_src_loop ():/GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0:
流已停止、未协商原因(-4)
错误:管道不想预览。
H264/H265
工作
GST-LAUNCH-1.0 videotestsrc ! video/x-raw、format=NV12、width=3840、height=2160! v4l2h264enc! 链接
[ 3002.165557] vb2_dc_alloc_相干:尝试分配 DMA 缓冲区
[ 3002.173221]缓冲区大小:12443648、GFP 标志:CC0、属性:0
[ 3002.191653] DMA 分配成功:地址:0x00000008c1000000、大小:12443648
[3002.198728] vb2_dc_alloc_相干:尝试分配 DMA 缓冲区
[ 3002.204760]缓冲区大小:12443648、GFP 标志:CC0、属性:0
[ 3002.215557] DMA alloc 成功:地址:0x00000008c2000000、大小:12443648
[ 3002.322405] vb2_dc_alloc_相干:尝试分配 DMA 缓冲区
[ 3002.328441]缓冲区大小:3112960、GFP 标志:CC0、属性:0
[ 3002.335484] DMA alloc 成功:地址:0x00000008c0c00000、大小:3112960
[ 3002.342295] vb2_dc_alloc_相干:尝试分配 DMA 缓冲区
[ 3002.348309]缓冲区大小:3112960、GFP 标志:CC0、属性:0
[ 3002.355296] DMA 分配成功:地址:0x00000008c1c00000、大小:3112960
[ 3002.362096] vb2_dc_alloc_相干:尝试分配 DMA 缓冲区
[ 3002.368098]缓冲区大小:3112960、GFP 标志:CC0、属性:0
[ 3002.375081] DMA 分配成功:地址:0x00000008c2c00000、大小:3112960
[ 3002.382080] vb2_dc_alloc_相干:尝试分配 DMA 缓冲区
[ 3002.388096]缓冲区大小:3112960、GFP 标志:CC0、属性:0
[ 3002.398347] DMA 分配成功:地址:0x00000008c3000000、大小:3112960
您可以看到 dma alloc 发生在 h264和 h265管道的 CMA 区域、但"working" v4l2jpegenc 管道在较低的2GB 内存中分配内存。 非常感谢您提供任何帮助或指导。 谢谢。
Neal