| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- ================================================
- HiSilicon PCIe Performance Monitoring Unit (PMU)
- ================================================
- On Hip09, HiSilicon PCIe Performance Monitoring Unit (PMU) could monitor
- bandwidth, latency, bus utilization and buffer occupancy data of PCIe.
- Each PCIe Core has a PMU to monitor multi Root Ports of this PCIe Core and
- all Endpoints downstream these Root Ports.
- HiSilicon PCIe PMU driver
- =========================
- The PCIe PMU driver registers a perf PMU with the name of its sicl-id and PCIe
- Core id.::
- /sys/bus/event_source/hisi_pcie<sicl>_core<core>
- PMU driver provides description of available events and filter options in sysfs,
- see /sys/bus/event_source/devices/hisi_pcie<sicl>_core<core>.
- The "format" directory describes all formats of the config (events) and config1
- (filter options) fields of the perf_event_attr structure. The "events" directory
- describes all documented events shown in perf list.
- The "identifier" sysfs file allows users to identify the version of the
- PMU hardware device.
- The "bus" sysfs file allows users to get the bus number of Root Ports
- monitored by PMU. Furthermore users can get the Root Ports range in
- [bdf_min, bdf_max] from "bdf_min" and "bdf_max" sysfs attributes
- respectively.
- Example usage of perf::
- $# perf list
- hisi_pcie0_core0/rx_mwr_latency/ [kernel PMU event]
- hisi_pcie0_core0/rx_mwr_cnt/ [kernel PMU event]
- ------------------------------------------
- $# perf stat -e hisi_pcie0_core0/rx_mwr_latency,port=0xffff/
- $# perf stat -e hisi_pcie0_core0/rx_mwr_cnt,port=0xffff/
- The related events usually used to calculate the bandwidth, latency or others.
- They need to start and end counting at the same time, therefore related events
- are best used in the same event group to get the expected value. There are two
- ways to know if they are related events:
- a) By event name, such as the latency events "xxx_latency, xxx_cnt" or
- bandwidth events "xxx_flux, xxx_time".
- b) By event type, such as "event=0xXXXX, event=0x1XXXX".
- Example usage of perf group::
- $# perf stat -e "{hisi_pcie0_core0/rx_mwr_latency,port=0xffff/,hisi_pcie0_core0/rx_mwr_cnt,port=0xffff/}"
- The current driver does not support sampling. So "perf record" is unsupported.
- Also attach to a task is unsupported for PCIe PMU.
- Filter options
- --------------
- 1. Target filter
- PMU could only monitor the performance of traffic downstream target Root
- Ports or downstream target Endpoint. PCIe PMU driver support "port" and
- "bdf" interfaces for users.
- Please notice that, one of these two interfaces must be set, and these two
- interfaces aren't supported at the same time. If they are both set, only
- "port" filter is valid.
- If "port" filter not being set or is set explicitly to zero (default), the
- "bdf" filter will be in effect, because "bdf=0" meaning 0000:000:00.0.
- - port
- "port" filter can be used in all PCIe PMU events, target Root Port can be
- selected by configuring the 16-bits-bitmap "port". Multi ports can be
- selected for AP-layer-events, and only one port can be selected for
- TL/DL-layer-events.
- For example, if target Root Port is 0000:00:00.0 (x8 lanes), bit0 of
- bitmap should be set, port=0x1; if target Root Port is 0000:00:04.0 (x4
- lanes), bit8 is set, port=0x100; if these two Root Ports are both
- monitored, port=0x101.
- Example usage of perf::
- $# perf stat -e hisi_pcie0_core0/rx_mwr_latency,port=0x1/ sleep 5
- - bdf
- "bdf" filter can only be used in bandwidth events, target Endpoint is
- selected by configuring BDF to "bdf". Counter only counts the bandwidth of
- message requested by target Endpoint.
- For example, "bdf=0x3900" means BDF of target Endpoint is 0000:39:00.0.
- Example usage of perf::
- $# perf stat -e hisi_pcie0_core0/rx_mrd_flux,bdf=0x3900/ sleep 5
- 2. Trigger filter
- Event statistics start when the first time TLP length is greater/smaller
- than trigger condition. You can set the trigger condition by writing
- "trig_len", and set the trigger mode by writing "trig_mode". This filter can
- only be used in bandwidth events.
- For example, "trig_len=4" means trigger condition is 2^4 DW, "trig_mode=0"
- means statistics start when TLP length > trigger condition, "trig_mode=1"
- means start when TLP length < condition.
- Example usage of perf::
- $# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,trig_len=0x4,trig_mode=1/ sleep 5
- 3. Threshold filter
- Counter counts when TLP length within the specified range. You can set the
- threshold by writing "thr_len", and set the threshold mode by writing
- "thr_mode". This filter can only be used in bandwidth events.
- For example, "thr_len=4" means threshold is 2^4 DW, "thr_mode=0" means
- counter counts when TLP length >= threshold, and "thr_mode=1" means counts
- when TLP length < threshold.
- Example usage of perf::
- $# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,thr_len=0x4,thr_mode=1/ sleep 5
- 4. TLP Length filter
- When counting bandwidth, the data can be composed of certain parts of TLP
- packets. You can specify it through "len_mode":
- - 2'b00: Reserved (Do not use this since the behaviour is undefined)
- - 2'b01: Bandwidth of TLP payloads
- - 2'b10: Bandwidth of TLP headers
- - 2'b11: Bandwidth of both TLP payloads and headers
- For example, "len_mode=2" means only counting the bandwidth of TLP headers
- and "len_mode=3" means the final bandwidth data is composed of both TLP
- headers and payloads. Default value if not specified is 2'b11.
- Example usage of perf::
- $# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,len_mode=0x1/ sleep 5
|