162306a36Sopenharmony_ci===================================================== 262306a36Sopenharmony_ciFreescale i.MX8 DDR Performance Monitoring Unit (PMU) 362306a36Sopenharmony_ci===================================================== 462306a36Sopenharmony_ci 562306a36Sopenharmony_ciThere are no performance counters inside the DRAM controller, so performance 662306a36Sopenharmony_cisignals are brought out to the edge of the controller where a set of 4 x 32 bit 762306a36Sopenharmony_cicounters is implemented. This is controlled by the CSV modes programmed in counter 862306a36Sopenharmony_cicontrol register which causes a large number of PERF signals to be generated. 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ciSelection of the value for each counter is done via the config registers. There 1162306a36Sopenharmony_ciis one register for each counter. Counter 0 is special in that it always counts 1262306a36Sopenharmony_ci“time” and when expired causes a lock on itself and the other counters and an 1362306a36Sopenharmony_ciinterrupt is raised. If any other counter overflows, it continues counting, and 1462306a36Sopenharmony_cino interrupt is raised. 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciThe "format" directory describes format of the config (event ID) and config1 1762306a36Sopenharmony_ci(AXI filtering) fields of the perf_event_attr structure, see /sys/bus/event_source/ 1862306a36Sopenharmony_cidevices/imx8_ddr0/format/. The "events" directory describes the events types 1962306a36Sopenharmony_cihardware supported that can be used with perf tool, see /sys/bus/event_source/ 2062306a36Sopenharmony_cidevices/imx8_ddr0/events/. The "caps" directory describes filter features implemented 2162306a36Sopenharmony_ciin DDR PMU, see /sys/bus/events_source/devices/imx8_ddr0/caps/. 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci .. code-block:: bash 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci perf stat -a -e imx8_ddr0/cycles/ cmd 2662306a36Sopenharmony_ci perf stat -a -e imx8_ddr0/read/,imx8_ddr0/write/ cmd 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ciAXI filtering is only used by CSV modes 0x41 (axid-read) and 0x42 (axid-write) 2962306a36Sopenharmony_cito count reading or writing matches filter setting. Filter setting is various 3062306a36Sopenharmony_cifrom different DRAM controller implementations, which is distinguished by quirks 3162306a36Sopenharmony_ciin the driver. You also can dump info from userspace, filter in "caps" directory 3262306a36Sopenharmony_ciindicates whether PMU supports AXI ID filter or not; enhanced_filter indicates 3362306a36Sopenharmony_ciwhether PMU supports enhanced AXI ID filter or not. Value 0 for un-supported, and 3462306a36Sopenharmony_civalue 1 for supported. 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci* With DDR_CAP_AXI_ID_FILTER quirk(filter: 1, enhanced_filter: 0). 3762306a36Sopenharmony_ci Filter is defined with two configuration parts: 3862306a36Sopenharmony_ci --AXI_ID defines AxID matching value. 3962306a36Sopenharmony_ci --AXI_MASKING defines which bits of AxID are meaningful for the matching. 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci - 0: corresponding bit is masked. 4262306a36Sopenharmony_ci - 1: corresponding bit is not masked, i.e. used to do the matching. 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci AXI_ID and AXI_MASKING are mapped on DPCR1 register in performance counter. 4562306a36Sopenharmony_ci When non-masked bits are matching corresponding AXI_ID bits then counter is 4662306a36Sopenharmony_ci incremented. Perf counter is incremented if:: 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci AxID && AXI_MASKING == AXI_ID && AXI_MASKING 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci This filter doesn't support filter different AXI ID for axid-read and axid-write 5162306a36Sopenharmony_ci event at the same time as this filter is shared between counters. 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci .. code-block:: bash 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci perf stat -a -e imx8_ddr0/axid-read,axi_mask=0xMMMM,axi_id=0xDDDD/ cmd 5662306a36Sopenharmony_ci perf stat -a -e imx8_ddr0/axid-write,axi_mask=0xMMMM,axi_id=0xDDDD/ cmd 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci .. note:: 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci axi_mask is inverted in userspace(i.e. set bits are bits to mask), and 6162306a36Sopenharmony_ci it will be reverted in driver automatically. so that the user can just specify 6262306a36Sopenharmony_ci axi_id to monitor a specific id, rather than having to specify axi_mask. 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci .. code-block:: bash 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci perf stat -a -e imx8_ddr0/axid-read,axi_id=0x12/ cmd, which will monitor ARID=0x12 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci* With DDR_CAP_AXI_ID_FILTER_ENHANCED quirk(filter: 1, enhanced_filter: 1). 6962306a36Sopenharmony_ci This is an extension to the DDR_CAP_AXI_ID_FILTER quirk which permits 7062306a36Sopenharmony_ci counting the number of bytes (as opposed to the number of bursts) from DDR 7162306a36Sopenharmony_ci read and write transactions concurrently with another set of data counters. 72