| .. 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. |