Thread (71 messages) 71 messages, 6 authors, 2023-11-23

RE: [PATCH] PM / devfreq: rockchip-dfi: Add perf support

From: "Chanwoo Choi" <cw00.choi@samsung.com>
Date: 2023-10-19 12:17:02
Also in: linux-devicetree, linux-pm, linux-rockchip, lkml

-----Original Message-----
From: Sascha Hauer <s.hauer@pengutronix.de>
Sent: Thursday, October 19, 2023 3:48 PM
To: linux-rockchip@lists.infradead.org
Cc: linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org;
linux-pm@vger.kernel.org; Heiko Stuebner [off-list ref]; Chanwoo Choi
[off-list ref]; Kyungmin Park [off-list ref]; MyungJoo
Ham [off-list ref]; Will Deacon [off-list ref]; Mark
Rutland [off-list ref]; kernel@pengutronix.de; Michael Riesch
[off-list ref]; Robin Murphy [off-list ref];
Vincent Legoll [off-list ref]; Rob Herring
[off-list ref]; Krzysztof Kozlowski
[off-list ref]; Conor Dooley [off-list ref];
devicetree@vger.kernel.org; Sebastian Reichel
[off-list ref]; Sascha Hauer [off-list ref];
Chanwoo Choi [off-list ref]
Subject: [PATCH] PM / devfreq: rockchip-dfi: Add perf support

The DFI is a unit which is suitable for measuring DDR utilization, but so
far it could only be used as an event driver for the DDR frequency scaling
driver. This adds perf support to the DFI driver.

Usage with the 'perf' tool can look like:

perf stat -a -e rockchip_ddr/cycles/,\
		rockchip_ddr/read-bytes/,\
		rockchip_ddr/write-bytes/,\
		rockchip_ddr/bytes/ sleep 1

 Performance counter stats for 'system wide':

        1582524826      rockchip_ddr/cycles/
           1802.25 MB   rockchip_ddr/read-bytes/
           1793.72 MB   rockchip_ddr/write-bytes/
           3595.90 MB   rockchip_ddr/bytes/

       1.014369709 seconds time elapsed

perf support has been tested on a RK3568 and a RK3399, the latter with
dual channel DDR.

Reviewed-by: Sebastian Reichel <redacted>
Acked-by: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---

Notes:
    Changes since v8:
    - Move rockchip_ddr_perf_counters_add() inside #ifdef
CONFIG_PERF_EVENTS
      to avoid unused function warning with CONFIG_PERF_EVENTS disabled

    Changes since v7:
     - rename variable 'c' to 'count'

    Changes since v5:
     - Add missing initialization of &dfi->last_perf_count

    Changes since v4:

     - use __stringify to ensure event type definitions and event numbers
in sysfs are consistent
     - only use 64bit values in structs holding counters
     - support monitoring individual DDR channels
     - fix return value in rockchip_ddr_perf_event_init(): -EOPNOTSUPP ->
-
quoted hunk ↗ jump to hunk
EINVAL
     - check for invalid event->attr.config values
     - start hrtimer to trigger in one second, not immediately
     - use devm_add_action_or_reset()
     - add suppress_bind_attrs
     - enable DDRMON during probe when perf is enabled
     - use a seqlock to protect perf reading the counters from the hrtimer
callback modifying them

 drivers/devfreq/event/rockchip-dfi.c | 440 ++++++++++++++++++++++++++-
 include/soc/rockchip/rk3399_grf.h    |   2 +
 include/soc/rockchip/rk3568_grf.h    |   1 +
 3 files changed, 438 insertions(+), 5 deletions(-)
diff --git a/drivers/devfreq/event/rockchip-dfi.c
b/drivers/devfreq/event/rockchip-dfi.c
index 3d5c6d737ccd9..a7d7b61518fec 100644
--- a/drivers/devfreq/event/rockchip-dfi.c
+++ b/drivers/devfreq/event/rockchip-dfi.c
@@ -16,10 +16,12 @@
 #include <linux/regmap.h>
 #include <linux/slab.h>
 #include <linux/list.h>
+#include <linux/seqlock.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/bitfield.h>
 #include <linux/bits.h>
+#include <linux/perf_event.h>

 #include <soc/rockchip/rockchip_grf.h>
 #include <soc/rockchip/rk3399_grf.h>
@@ -41,19 +43,39 @@
 					 DDRMON_CTRL_LPDDR4 | \
 					 DDRMON_CTRL_LPDDR23)

+#define DDRMON_CH0_WR_NUM		0x20
+#define DDRMON_CH0_RD_NUM		0x24
 #define DDRMON_CH0_COUNT_NUM		0x28
 #define DDRMON_CH0_DFI_ACCESS_NUM	0x2c
 #define DDRMON_CH1_COUNT_NUM		0x3c
 #define DDRMON_CH1_DFI_ACCESS_NUM	0x40

+#define PERF_EVENT_CYCLES		0x0
+#define PERF_EVENT_READ_BYTES		0x1
+#define PERF_EVENT_WRITE_BYTES		0x2
+#define PERF_EVENT_READ_BYTES0		0x3
+#define PERF_EVENT_WRITE_BYTES0		0x4
+#define PERF_EVENT_READ_BYTES1		0x5
+#define PERF_EVENT_WRITE_BYTES1		0x6
+#define PERF_EVENT_READ_BYTES2		0x7
+#define PERF_EVENT_WRITE_BYTES2		0x8
+#define PERF_EVENT_READ_BYTES3		0x9
+#define PERF_EVENT_WRITE_BYTES3		0xa
+#define PERF_EVENT_BYTES		0xb
+#define PERF_ACCESS_TYPE_MAX		0xc
+
 /**
  * struct dmc_count_channel - structure to hold counter values from the
DDR controller
  * @access:       Number of read and write accesses
  * @clock_cycles: DDR clock cycles
+ * @read_access:  number of read accesses
+ * @write_acccess: number of write accesses

Need to change it to 'write_access' from 'write_acccess'.
When I merge it, I fix it by myself.

And,
Applied it with "Acked-by: Heiko Stuebner [off-list ref]"
according to https://lore.kernel.org/all/27832786.gRfpFWEtPU@diego/ (local).

If you have other opinion, please let me know.

Best Regards,
Chanwoo Choi








_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help