| .. SPDX-License-Identifier: GPL-2.0 |
| |
| ====================================== |
| CXL Performance Monitoring Unit (CPMU) |
| ====================================== |
| |
| The CXL rev 3.0 specification provides a definition of CXL Performance |
| Monitoring Unit in section 13.2: Performance Monitoring. |
| |
| CXL components (e.g. Root Port, Switch Upstream Port, End Point) may have |
| any number of CPMU instances. CPMU capabilities are fully discoverable from |
| the devices. The specification provides event definitions for all CXL protocol |
| message types and a set of additional events for things commonly counted on |
| CXL devices (e.g. DRAM events). |
| |
| CPMU driver |
| =========== |
| |
| The CPMU driver registers a perf PMU with the name pmu_mem<X>.<Y> on the CXL bus |
| representing the Yth CPMU for memX. |
| |
| /sys/bus/cxl/device/pmu_mem<X>.<Y> |
| |
| The associated PMU is registered as |
| |
| /sys/bus/event_sources/devices/cxl_pmu_mem<X>.<Y> |
| |
| In common with other CXL bus devices, the id has no specific meaning and the |
| relationship to specific CXL device should be established via the device parent |
| of the device on the CXL bus. |
| |
| PMU driver provides description of available events and filter options in sysfs. |
| |
| The "format" directory describes all formats of the config (event vendor id, |
| group id and mask) config1 (threshold, filter enables) and config2 (filter |
| parameters) fields of the perf_event_attr structure. The "events" directory |
| describes all documented events show in perf list. |
| |
| The events shown in perf list are the most fine grained events with a single |
| bit of the event mask set. More general events may be enable by setting |
| multiple mask bits in config. For example, all Device to Host Read Requests |
| may be captured on a single counter by setting the bits for all of |
| |
| * d2h_req_rdcurr |
| * d2h_req_rdown |
| * d2h_req_rdshared |
| * d2h_req_rdany |
| * d2h_req_rdownnodata |
| |
| Example of usage:: |
| |
| $#perf list |
| cxl_pmu_mem0.0/clock_ticks/ [Kernel PMU event] |
| cxl_pmu_mem0.0/d2h_req_rdshared/ [Kernel PMU event] |
| cxl_pmu_mem0.0/h2d_req_snpcur/ [Kernel PMU event] |
| cxl_pmu_mem0.0/h2d_req_snpdata/ [Kernel PMU event] |
| cxl_pmu_mem0.0/h2d_req_snpinv/ [Kernel PMU event] |
| ----------------------------------------------------------- |
| |
| $# perf stat -a -e cxl_pmu_mem0.0/clock_ticks/ -e cxl_pmu_mem0.0/d2h_req_rdshared/ |
| |
| Vendor specific events may also be available and if so can be used via |
| |
| $# perf stat -a -e cxl_pmu_mem0.0/vid=VID,gid=GID,mask=MASK/ |
| |
| The driver does not support sampling so "perf record" is unsupported. |
| It only supports system-wide counting so attaching to a task is |
| unsupported. |