目录
2.2 通过sysfs显示与更改qos优先级与ddr控制器中的latency配置
2.3 实时带宽与lantency debug功能显示(分别显示2us和20us的实时带宽,主要指示当前哪些ip占用带宽较大,同时也能看到lantency分布情况)
一、NOC模块简介
在一些先进性能的soc中一般会集成noc总线,用于控制带宽的分配,对系统灵活适配多场景起到关键作用。为了方便业务层调用同时方便芯片初期带宽调试,新开发了noc驱动,用于实现noc带宽分配等功能。
其中noc驱动主要有三个功能,带宽限制(包括读写方向配置优先级),实时带宽统计,debug时的latency统计(指示获取带宽延时情况)。
NOC驱动实现方案:
- 能够对各ip的瞬时读写带宽统计和各ip的读写latency的统计(分别统计2us和20us),在proc下面显示。 同时在noc驱动中增加一个线程用于长时间(约1秒)统计整体流量,计算平均带宽与相对峰值带宽)
- 有带宽限制接口,可以使用echo方法配置带宽限制和优先级,也可以通过应用程序调用带宽限制接口去限制带宽
- 完善ioctrl接口,通过/dev/ts_noc_dev设备节点可以读取各ip读写端口限制的带宽值、优先级、latency,同时支持带宽限制
- 配合noc功能,动态调节各ip对应DDR port口上的优先级与QOS latency接口
注:因为一些配置和计算需要知道各模块的时钟频率,驱动初始化阶段会检查是否已经开启各模块上的AXI时钟,如果noc涉及的模块没有使能AXI时钟则会默认将其打开。
二、NOC驱动应用示例
其中,有带宽限制功能与带宽显示功能的模块有:ispr/ispw/vpe/bis/cve/dof/gdc/vpu/rne/vpe/amr/dpulite/ebd。
有latency显示功能的模块有:ispw/ispr/ca53/vpu/cv/rne/vpe (vi/bis/cve/dof/gdc无此功能)
2.1带宽限制与优先级的显示
# cat /proc/noc/limit
-----NOC MAXI QOS show:
--------------------------------------------------------
-----NAME -- PORT -- BANDWIDTH -- P0 -- P1 -- MODE -- RT -- WT -- ULT -- CLK
---
ispr: 1 -- 2456 -- 7 -- 7 -- 3 -- 0x000000ff -- 0x000000ff -- 3335 -- 614
ispw: 1 -- 2456 -- 0 -- 0 -- 3 -- 0x000000ff -- 0x000000ff -- 3335 -- 614
vpe0: 2 -- 1842 -- 0 -- 0 -- 3 -- 0x00200020 -- 0x000000ff -- 1667 -- 614
bis: 5 -- 2000 -- 0 -- 0 -- 3 -- 0x000000ff -- 0x000000ff -- 2048 -- 500
cve: 5 -- 2000 -- 0 -- 0 -- 3 -- 0x000000ff -- 0x000000ff -- 2048 -- 500
dof: 2 -- 2456 -- 0 -- 0 -- 3 -- 0x00200020 -- 0x000000ff -- 1667 -- 614
gdc: 5 -- 2000 -- 0 -- 0 -- 3 -- 0x000000ff -- 0x000000ff -- 2048 -- 500
vpu: 4 -- 614 -- 3 -- 3 -- 1(limit) -- 0x00200020 -- 0x00000020 -- 182 -- 614
rne: 3 -- 500 -- 3 -- 3 -- 1(limit) -- 0x00110011 -- 0x0000000a -- 4096 -- 500
vpe1: 2 -- 1842 -- 0 -- 0 -- 3 -- 0x00200020 -- 0x000000ff -- 1667 -- 614
amr: 5 -- 1000 -- 0 -- 0 -- 3 -- 0x000000ff -- 0x000000ff -- 2048 -- 500
dpu: 5 -- 1000 -- 0 -- 0 -- 3 -- 0x000000ff -- 0x000000ff -- 2048 -- 500
ebd: 2 -- 1000 -- 0 -- 0 -- 3 -- 0x00200020 -- 0x000000ff -- 2048 -- 500
cpu: 0 -- 0000 -- 7 -- 7 -- 3 -- 0x000000ff -- 0x000000ff -- 0 -- 500
#
参数说明:
NAME(IP名称) -- PORT(对应DDR port口) -- BANDWIDTH(限制带宽值MB) -- P0(读优先级) -- P1(写优先级) -- MODE(性能模式还是限制模式) -- RT(DDR中的读timeout) -- WT(DDR中的写timeout) -- ULT(非限制带宽的时间ns) -- CLK(NOC AXI接口时钟频率MHz)
PORT:芯片总共有6个DDR port口,不同模块分配在不同port口上
P0/1:优先级配置范围0~7,数值越大优先级越高,此数值与ddr控制器的qos控制相连;
mode: 配置范围3或1,其中3代表性能模式,1代表限制带宽模式,通常在限制带宽模式下,需要降低P0 P1优先级数值;
RT、WR: 代表port口配置的刷新时间,数值越小,刷新越快,对应接口的lantency越小,此值也是衡量优先级的指标之一。配置范围0~3ff;
ULT: 为此模块在进行限制带宽模式运行时,从开始到进行限制带宽的间隔时间,间隔时间越大,对峰值带宽越友好,可根据实际使用环境调高或调低此值;
2.2 通过sysfs显示与更改qos优先级与ddr控制器中的latency配置
# cat /sys/class/noc_qos_class/ts_noc_dev/ispr_bandwidth
ispr: bandwidth:2456 p0(r):7 p1(w):7 mode:3 rt:0x0000ff wt:0x0000ff unlimit_time:3335 clk:500
# echo "1024 3 3 1 0x10 0x10 1024"> /sys/class/noc_qos_class/ts_noc_dev/ispr_bandwidth //也支持非全7个参数配置,后面的参数程序会读出补全再配置
# cat /sys/class/noc_qos_class/ts_noc_dev/ispr_bandwidth
ispr: bandwidth:614 p0(r):3 p1(w):3 mode:1(limit) rt:0x000010 wt:0x000010 unlimit_time:1016 clk:500
#
注意:1. 通过echo修改的数值要与cat看到的数值的站位一 一对应
2. ispr ispw在限制模式下的带宽可以配制成不一样的值(模块带宽是根据模块的时钟算出的,配置的时候需要配置为时钟的整数倍大一点才能配制成想要的值)
3. 支持通过echo更改对应模块的axi clock(同样,配置的时候需要配置为时钟的整数倍大一点才能配制成想要的值)
2.3 实时带宽与lantency debug功能显示(分别显示2us和20us的实时带宽,主要指示当前哪些ip占用带宽较大,同时也能看到lantency分布情况)
# cat /proc/noc/real_time
NOC BW SHOW REALTIME 2us:
NAME - BYTES01 - CYCLE2 - CYCLE3 - BUSY-CYCLE4 - CYCLE5 - CYCLE6 - CYCLE7 - CYCLE8 - SPEED - SP_MEAN - SP_MEAN_500 - SP_MAX_2US
ispr: 01408512 - 004352 - 574 - 440 - 0 - 0 - 0 - 0 - 53MB/s - 170MB/s - 295MB/s - 752MB/s
ispw: 01291936 - 005384 - 69 - 48 - 0 - 0 - 0 - 0 - 47MB/s - 156MB/s - 294MB/s - 595MB/s
vpe0: 00786944 - 000000 - 00 - 0 - 0 - 0 - 0 - 0 - 00MB/s - 95MB/s - 129MB/s - 338MB/s
cpu: 06204654 - 065535 - 103 - 0 - 0 - 0 - 0 - 0 - 47MB/s - 751MB/s - 375MB/s - 3451MB/s
vpu: 00109718 - 000964 - 98 - 24 - 0 - 0 - 0 - 0 - 62MB/s - 13MB/s - 148MB/s - 1294MB/s
cve: 00000000 - 000000 - 00 - 0 - 0 - 0 - 0 - 0 - 00MB/s - 00MB/s - 00MB/s - 00MB/s
rne: 17637440 - 034451 - 305 - 28 - 0 - 0 - 0 - 0 - 253MB/s - 2135MB/s - 366MB/s - 2975MB/s
NOC BW SHOW REALTIME 20us:
NAME - BYTES01 - CYCLE2 - CYCLE3 - BUSY-CYCLE4 - CYCLE5 - CYCLE6 - CYCLE7 - CYCLE8 - SPEED - SP_MEAN - SP_MEAN_500 - SP_MAX_20US
ispr: 00000000 - 000000 - 00 - 0 - 0 - 0 - 0 - 0 - 00MB/s - 00MB/s - 295MB/s - 780MB/s
ispw: 00000000 - 000000 - 00 - 0 - 0 - 0 - 0 - 0 - 00MB/s - 00MB/s - 294MB/s - 612MB/s
vpe0: 00000000 - 000000 - 00 - 0 - 0 - 0 - 0 - 0 - 00MB/s - 00MB/s - 129MB/s - 334MB/s
cpu: 03057763 - 053386 - 407 - 0 - 0 - 0 - 0 - 0 - 28MB/s - 825MB/s - 375MB/s - 2085MB/s
vpu: 04145096 - 028237 - 3449 - 1465 - 0 - 0 - 0 - 0 - 76MB/s - 1118MB/s - 148MB/s - 1256MB/s
cve: 00000000 - 000000 - 00 - 0 - 0 - 0 - 0 - 0 - 00MB/s - 00MB/s - 00MB/s - 00MB/s
rne: 06085504 - 009734 - 897 - 584 - 0 - 0 - 0 - 0 - 271MB/s - 1642MB/s - 366MB/s - 3744MB/s
#
参数说明:
-----NAME(模块名称)
-- BYTES01(counters 01中统计到的字节数,此值为小于1us区间的cycle数)
-- CYCLE2(counters2中统计到1us区间的cycle数)
-- CYCLE3(counters3中统计到的1.5us区间cycle数)
-- BUSY-CYCLE4(counters4中统计到的2us区间cycle数)
-- CYCLE5(counters5中统计到的大于2us区间cycle数)
-- CYCLE6 -- CYCLE7 -- CYCLE8 -- SPEED(使用cycle与bytes计算的带宽,不准确)
-- SP_MEAN(使用2us或20us与bytes计算的带宽,准确。计算原理,在2us或20us时间内,将BYTES01+CYCLE2+CYCLE3+BYSY-CYCLE4+CYCLE5求和后除以时间)
-- SP_MEAN_500 分别用2us或20us周期统计500次(约1s)时间段内的平均带宽,
-- SP_MAX_20US 用20us周期统计500次数据中的最大带宽(找相对的峰值带宽)
-- SP_MAX_2US 用2us周期统计500次数据中的最大带宽(找相对的峰值带宽)
注: 当上面的数值统计在cycle2 3 4 5 区间越多,说明lantency有些大,需要调小对应ddr口的RT与WT的值
2.4 insmod加载参数说明
可以使用传参debug_level值将平均带宽与峰值带宽通过串口打印出来,可以协助分析某个时刻异常时候的带宽使用情况,如下所示:
# insmod ts_noc.ko debug_level=4
其中debug_level为0,不向串口打印debug信息(加载脚本中默认没加debug_level参数,不会向串口打印),当debug_level为4时会向串口打印,与业务层的打印在一起方便分析。下面是用dmesg看到的打印信息
其中2us后面跟了两个速度,分别是2us统计500次的平均带宽和相对峰值带宽。20us后的数据同样也是500次统计的平均带宽与相对峰值带宽
三、总结
1.在IPC业务场景,通过noc驱动统计各模块带宽,并对NPU(rne)带宽做限制(非限制时间512ns),实现带宽均衡目的,解决了isp与vpe在线模式下vpe写DDR慢导致的overflow问题。
2.在算力盒子业务场景,通过调整CPU NPU优先级实现算力最大性能,同时配置NPU峰值最大限制带宽,解决超高速MIPI摄像机数据丢帧的问题。
使用了noc功能后,能够较灵活的配置不通应用场景,对控制功耗、性能与稳定性都有帮助。后期在实现了自动化监测带宽并自适应调整带宽和IP频率后,能够有效利用系统资源,对系统长期稳定运行有很大帮助。