From: Choi Chanwoo <cwchoi00@gmail.com>
To: Sebastian Reichel <sebastian.reichel@collabora.com>,
Stephen Boyd <sboyd@kernel.org>,
Brian Masney <bmasney+clk@redhat.com>,
Jerome Brunet <jbrunet+clk@baylibre.com>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Heiko Stuebner <heiko@sntech.de>,
Chanwoo Choi <cw00.choi@samsung.com>,
MyungJoo Ham <myungjoo.ham@samsung.com>,
Kyungmin Park <kyungmin.park@samsung.com>,
Sascha Hauer <s.hauer@pengutronix.de>
Cc: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>,
linux-clk@vger.kernel.org, devicetree@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org,
linux-pm@vger.kernel.org, kernel@collabora.com
Subject: Re: [PATCH v2 6/7] PM / devfreq: rockchip-dfi: prepare support for v4 DDRMON
Date: Sun, 15 Nov 2026 09:59:39 +0900 [thread overview]
Message-ID: <03c0c33e-9619-4641-92bd-ffd0459f11db@gmail.com> (raw)
In-Reply-To: <20260921-b4-rockchip-dfi-rk3576-support-v2-6-04f847016321@collabora.com>
On 9/22/2026 6:15 AM, Sebastian Reichel wrote:
> Add support for the new control register layout found for DDRMON
> controllers having version 0x40. This prepares the driver for
> adding RK3576 support.
>
> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> ---
> drivers/devfreq/event/rockchip-dfi.c | 85 ++++++++++++++++++++++++++----------
> 1 file changed, 62 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/devfreq/event/rockchip-dfi.c b/drivers/devfreq/event/rockchip-dfi.c
> index 8490219f61be..8ba97af78e3d 100644
> --- a/drivers/devfreq/event/rockchip-dfi.c
> +++ b/drivers/devfreq/event/rockchip-dfi.c
> @@ -42,6 +42,19 @@
> #define DDRMON_CTRL_TIMER_CNT_EN BIT(0)
> #define DDRMON_CTRL_LP5_BANK_MODE_MASK GENMASK(8, 7)
>
> +#define DDRMON_CTRL0 0x04
> +#define DDRMON_CTRL0_EXT_TRIGGER_EN BIT(6)
> +#define DDRMON_CTRL0_DDR4 BIT(5)
> +#define DDRMON_CTRL0_LPDDR4 BIT(4)
> +#define DDRMON_CTRL0_HARDWARE_EN BIT(3)
> +#define DDRMON_CTRL0_LPDDR23 BIT(2)
> +#define DDRMON_CTRL0_SOFTWARE_EN BIT(1)
> +#define DDRMON_CTRL0_TIMER_CNT_EN BIT(0)
> +#define DDRMON_CTRL0_HOT_RANK GENMASK(8, 7)
> +
> +#define DDRMON_CTRL1 0x08
> +#define DDRMON_CTRL1_LPDDR5 BIT(0)
> +#define DDRMON_CTRL1_LP5_BANK_MODE_MASK GENMASK(2, 1)
>
> #define PERF_EVENT_CYCLES 0x0
> #define PERF_EVENT_READ_BYTES 0x1
> @@ -143,8 +156,6 @@ struct rockchip_dfi_variant {
>
> static int rockchip_dfi_ddrtype_to_ctrl(struct rockchip_dfi *dfi, u32 *ctrl)
> {
> - u32 ddrmon_ver;
> -
> switch (dfi->ddr_type) {
> case ROCKCHIP_DDRTYPE_LPDDR2:
> case ROCKCHIP_DDRTYPE_LPDDR3:
> @@ -159,26 +170,43 @@ static int rockchip_dfi_ddrtype_to_ctrl(struct rockchip_dfi *dfi, u32 *ctrl)
> FIELD_PREP_WM16(DDRMON_CTRL_LPDDR5, 0);
> break;
> case ROCKCHIP_DDRTYPE_LPDDR5:
> - ddrmon_ver = readl_relaxed(dfi->regs);
> - if (ddrmon_ver < 0x40) {
> - *ctrl = FIELD_PREP_WM16(DDRMON_CTRL_LPDDR23, 0) |
> - FIELD_PREP_WM16(DDRMON_CTRL_LPDDR4, 0) |
> - FIELD_PREP_WM16(DDRMON_CTRL_LPDDR5, 1) |
> - FIELD_PREP_WM16(DDRMON_CTRL_LP5_BANK_MODE_MASK,
> - dfi->lp5_bank_mode);
> - break;
> - }
> -
> - /*
> - * As it is unknown whether the unpleasant special case
> - * behaviour used by the vendor kernel is needed for any
> - * shipping hardware, ask users to report if they have
> - * some of that hardware.
> - */
> - dev_err(&dfi->edev->dev,
> - "unsupported DDRMON version 0x%04X, please let linux-rockchip know!\n",
> - ddrmon_ver);
> + *ctrl = FIELD_PREP_WM16(DDRMON_CTRL_LPDDR23, 0) |
> + FIELD_PREP_WM16(DDRMON_CTRL_LPDDR4, 0) |
> + FIELD_PREP_WM16(DDRMON_CTRL_LPDDR5, 1) |
> + FIELD_PREP_WM16(DDRMON_CTRL_LP5_BANK_MODE_MASK,
> + dfi->lp5_bank_mode);
> + break;
> + default:
> + dev_err(&dfi->edev->dev, "unsupported memory type 0x%X\n",
> + dfi->ddr_type);
> return -EOPNOTSUPP;
> + }
> +
> + return 0;
> +}
> +
> +static int rockchip_dfi_v4_ddrtype_to_ctrl(struct rockchip_dfi *dfi, u32 *ctrl0, u32 *ctrl1)
> +{
> + switch (dfi->ddr_type) {
> + case ROCKCHIP_DDRTYPE_LPDDR2:
> + case ROCKCHIP_DDRTYPE_LPDDR3:
> + *ctrl0 = FIELD_PREP_WM16(DDRMON_CTRL0_LPDDR23, 1) |
> + FIELD_PREP_WM16(DDRMON_CTRL0_LPDDR4, 0);
> + *ctrl1 = FIELD_PREP_WM16(DDRMON_CTRL1_LPDDR5, 0);
> + break;
> + case ROCKCHIP_DDRTYPE_LPDDR4:
> + case ROCKCHIP_DDRTYPE_LPDDR4X:
> + *ctrl0 = FIELD_PREP_WM16(DDRMON_CTRL0_LPDDR23, 0) |
> + FIELD_PREP_WM16(DDRMON_CTRL0_LPDDR4, 1);
> + *ctrl1 = FIELD_PREP_WM16(DDRMON_CTRL1_LPDDR5, 0);
> + break;
> + case ROCKCHIP_DDRTYPE_LPDDR5:
> + *ctrl0 = FIELD_PREP_WM16(DDRMON_CTRL0_LPDDR23, 0) |
> + FIELD_PREP_WM16(DDRMON_CTRL0_LPDDR4, 0);
> + *ctrl1 = FIELD_PREP_WM16(DDRMON_CTRL1_LPDDR5, 1) |
> + FIELD_PREP_WM16(DDRMON_CTRL_LP5_BANK_MODE_MASK,
> + dfi->lp5_bank_mode);
> + break;
> default:
> dev_err(&dfi->edev->dev, "unsupported memory type 0x%X\n",
> dfi->ddr_type);
> @@ -188,11 +216,12 @@ static int rockchip_dfi_ddrtype_to_ctrl(struct rockchip_dfi *dfi, u32 *ctrl)
> return 0;
> }
>
> +
> static int rockchip_dfi_enable(struct rockchip_dfi *dfi)
> {
> void __iomem *dfi_regs = dfi->regs;
> + u32 ctrl, ctrl1, ddrmon_ver;
> int i, ret = 0;
> - u32 ctrl;
>
> mutex_lock(&dfi->mutex);
>
> @@ -207,10 +236,16 @@ static int rockchip_dfi_enable(struct rockchip_dfi *dfi)
> goto out;
> }
>
> - ret = rockchip_dfi_ddrtype_to_ctrl(dfi, &ctrl);
> + ddrmon_ver = readl_relaxed(dfi->regs);
> + if (ddrmon_ver < 0x40)
> + ret = rockchip_dfi_ddrtype_to_ctrl(dfi, &ctrl);
> + else
> + ret = rockchip_dfi_v4_ddrtype_to_ctrl(dfi, &ctrl, &ctrl1);
> +
> if (ret)
> goto out;
>
> +
> for (i = 0; i < dfi->variant->max_channels; i++) {
>
> if (!(dfi->channel_mask & BIT(i)))
> @@ -225,6 +260,10 @@ static int rockchip_dfi_enable(struct rockchip_dfi *dfi)
> writel_relaxed(ctrl, dfi_regs + i * dfi->variant->stride +
> DDRMON_CTRL);
>
> + if (ddrmon_ver >= 0x40)
> + writel_relaxed(ctrl1, dfi_regs + i * dfi->variant->stride +
> + DDRMON_CTRL1);
> +
> /* enable count, use software mode */
> writel_relaxed(FIELD_PREP_WM16(DDRMON_CTRL_SOFTWARE_EN, 1),
> dfi_regs + i * dfi->variant->stride + DDRMON_CTRL);
>
Acked-by: Chanwoo Choi <cw00.choi@samsung.com>
--
Best Regards,
Chanwoo Choi
Principal Engineer, Samsung Electronics
WARNING: multiple messages have this Message-ID (diff)
From: Choi Chanwoo <cwchoi00@gmail.com>
To: Sebastian Reichel <sebastian.reichel@collabora.com>,
Stephen Boyd <sboyd@kernel.org>,
Brian Masney <bmasney+clk@redhat.com>,
Jerome Brunet <jbrunet+clk@baylibre.com>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Heiko Stuebner <heiko@sntech.de>,
Chanwoo Choi <cw00.choi@samsung.com>,
MyungJoo Ham <myungjoo.ham@samsung.com>,
Kyungmin Park <kyungmin.park@samsung.com>,
Sascha Hauer <s.hauer@pengutronix.de>
Cc: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>,
linux-clk@vger.kernel.org, devicetree@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org,
linux-pm@vger.kernel.org, kernel@collabora.com
Subject: Re: [PATCH v2 6/7] PM / devfreq: rockchip-dfi: prepare support for v4 DDRMON
Date: Sun, 15 Nov 2026 09:59:39 +0900 [thread overview]
Message-ID: <03c0c33e-9619-4641-92bd-ffd0459f11db@gmail.com> (raw)
In-Reply-To: <20260921-b4-rockchip-dfi-rk3576-support-v2-6-04f847016321@collabora.com>
On 9/22/2026 6:15 AM, Sebastian Reichel wrote:
> Add support for the new control register layout found for DDRMON
> controllers having version 0x40. This prepares the driver for
> adding RK3576 support.
>
> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> ---
> drivers/devfreq/event/rockchip-dfi.c | 85 ++++++++++++++++++++++++++----------
> 1 file changed, 62 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/devfreq/event/rockchip-dfi.c b/drivers/devfreq/event/rockchip-dfi.c
> index 8490219f61be..8ba97af78e3d 100644
> --- a/drivers/devfreq/event/rockchip-dfi.c
> +++ b/drivers/devfreq/event/rockchip-dfi.c
> @@ -42,6 +42,19 @@
> #define DDRMON_CTRL_TIMER_CNT_EN BIT(0)
> #define DDRMON_CTRL_LP5_BANK_MODE_MASK GENMASK(8, 7)
>
> +#define DDRMON_CTRL0 0x04
> +#define DDRMON_CTRL0_EXT_TRIGGER_EN BIT(6)
> +#define DDRMON_CTRL0_DDR4 BIT(5)
> +#define DDRMON_CTRL0_LPDDR4 BIT(4)
> +#define DDRMON_CTRL0_HARDWARE_EN BIT(3)
> +#define DDRMON_CTRL0_LPDDR23 BIT(2)
> +#define DDRMON_CTRL0_SOFTWARE_EN BIT(1)
> +#define DDRMON_CTRL0_TIMER_CNT_EN BIT(0)
> +#define DDRMON_CTRL0_HOT_RANK GENMASK(8, 7)
> +
> +#define DDRMON_CTRL1 0x08
> +#define DDRMON_CTRL1_LPDDR5 BIT(0)
> +#define DDRMON_CTRL1_LP5_BANK_MODE_MASK GENMASK(2, 1)
>
> #define PERF_EVENT_CYCLES 0x0
> #define PERF_EVENT_READ_BYTES 0x1
> @@ -143,8 +156,6 @@ struct rockchip_dfi_variant {
>
> static int rockchip_dfi_ddrtype_to_ctrl(struct rockchip_dfi *dfi, u32 *ctrl)
> {
> - u32 ddrmon_ver;
> -
> switch (dfi->ddr_type) {
> case ROCKCHIP_DDRTYPE_LPDDR2:
> case ROCKCHIP_DDRTYPE_LPDDR3:
> @@ -159,26 +170,43 @@ static int rockchip_dfi_ddrtype_to_ctrl(struct rockchip_dfi *dfi, u32 *ctrl)
> FIELD_PREP_WM16(DDRMON_CTRL_LPDDR5, 0);
> break;
> case ROCKCHIP_DDRTYPE_LPDDR5:
> - ddrmon_ver = readl_relaxed(dfi->regs);
> - if (ddrmon_ver < 0x40) {
> - *ctrl = FIELD_PREP_WM16(DDRMON_CTRL_LPDDR23, 0) |
> - FIELD_PREP_WM16(DDRMON_CTRL_LPDDR4, 0) |
> - FIELD_PREP_WM16(DDRMON_CTRL_LPDDR5, 1) |
> - FIELD_PREP_WM16(DDRMON_CTRL_LP5_BANK_MODE_MASK,
> - dfi->lp5_bank_mode);
> - break;
> - }
> -
> - /*
> - * As it is unknown whether the unpleasant special case
> - * behaviour used by the vendor kernel is needed for any
> - * shipping hardware, ask users to report if they have
> - * some of that hardware.
> - */
> - dev_err(&dfi->edev->dev,
> - "unsupported DDRMON version 0x%04X, please let linux-rockchip know!\n",
> - ddrmon_ver);
> + *ctrl = FIELD_PREP_WM16(DDRMON_CTRL_LPDDR23, 0) |
> + FIELD_PREP_WM16(DDRMON_CTRL_LPDDR4, 0) |
> + FIELD_PREP_WM16(DDRMON_CTRL_LPDDR5, 1) |
> + FIELD_PREP_WM16(DDRMON_CTRL_LP5_BANK_MODE_MASK,
> + dfi->lp5_bank_mode);
> + break;
> + default:
> + dev_err(&dfi->edev->dev, "unsupported memory type 0x%X\n",
> + dfi->ddr_type);
> return -EOPNOTSUPP;
> + }
> +
> + return 0;
> +}
> +
> +static int rockchip_dfi_v4_ddrtype_to_ctrl(struct rockchip_dfi *dfi, u32 *ctrl0, u32 *ctrl1)
> +{
> + switch (dfi->ddr_type) {
> + case ROCKCHIP_DDRTYPE_LPDDR2:
> + case ROCKCHIP_DDRTYPE_LPDDR3:
> + *ctrl0 = FIELD_PREP_WM16(DDRMON_CTRL0_LPDDR23, 1) |
> + FIELD_PREP_WM16(DDRMON_CTRL0_LPDDR4, 0);
> + *ctrl1 = FIELD_PREP_WM16(DDRMON_CTRL1_LPDDR5, 0);
> + break;
> + case ROCKCHIP_DDRTYPE_LPDDR4:
> + case ROCKCHIP_DDRTYPE_LPDDR4X:
> + *ctrl0 = FIELD_PREP_WM16(DDRMON_CTRL0_LPDDR23, 0) |
> + FIELD_PREP_WM16(DDRMON_CTRL0_LPDDR4, 1);
> + *ctrl1 = FIELD_PREP_WM16(DDRMON_CTRL1_LPDDR5, 0);
> + break;
> + case ROCKCHIP_DDRTYPE_LPDDR5:
> + *ctrl0 = FIELD_PREP_WM16(DDRMON_CTRL0_LPDDR23, 0) |
> + FIELD_PREP_WM16(DDRMON_CTRL0_LPDDR4, 0);
> + *ctrl1 = FIELD_PREP_WM16(DDRMON_CTRL1_LPDDR5, 1) |
> + FIELD_PREP_WM16(DDRMON_CTRL_LP5_BANK_MODE_MASK,
> + dfi->lp5_bank_mode);
> + break;
> default:
> dev_err(&dfi->edev->dev, "unsupported memory type 0x%X\n",
> dfi->ddr_type);
> @@ -188,11 +216,12 @@ static int rockchip_dfi_ddrtype_to_ctrl(struct rockchip_dfi *dfi, u32 *ctrl)
> return 0;
> }
>
> +
> static int rockchip_dfi_enable(struct rockchip_dfi *dfi)
> {
> void __iomem *dfi_regs = dfi->regs;
> + u32 ctrl, ctrl1, ddrmon_ver;
> int i, ret = 0;
> - u32 ctrl;
>
> mutex_lock(&dfi->mutex);
>
> @@ -207,10 +236,16 @@ static int rockchip_dfi_enable(struct rockchip_dfi *dfi)
> goto out;
> }
>
> - ret = rockchip_dfi_ddrtype_to_ctrl(dfi, &ctrl);
> + ddrmon_ver = readl_relaxed(dfi->regs);
> + if (ddrmon_ver < 0x40)
> + ret = rockchip_dfi_ddrtype_to_ctrl(dfi, &ctrl);
> + else
> + ret = rockchip_dfi_v4_ddrtype_to_ctrl(dfi, &ctrl, &ctrl1);
> +
> if (ret)
> goto out;
>
> +
> for (i = 0; i < dfi->variant->max_channels; i++) {
>
> if (!(dfi->channel_mask & BIT(i)))
> @@ -225,6 +260,10 @@ static int rockchip_dfi_enable(struct rockchip_dfi *dfi)
> writel_relaxed(ctrl, dfi_regs + i * dfi->variant->stride +
> DDRMON_CTRL);
>
> + if (ddrmon_ver >= 0x40)
> + writel_relaxed(ctrl1, dfi_regs + i * dfi->variant->stride +
> + DDRMON_CTRL1);
> +
> /* enable count, use software mode */
> writel_relaxed(FIELD_PREP_WM16(DDRMON_CTRL_SOFTWARE_EN, 1),
> dfi_regs + i * dfi->variant->stride + DDRMON_CTRL);
>
Acked-by: Chanwoo Choi <cw00.choi@samsung.com>
--
Best Regards,
Chanwoo Choi
Principal Engineer, Samsung Electronics
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
next prev parent reply other threads:[~2026-11-15 0:59 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-21 21:15 [PATCH v2 0/7] PM / devfreq: rockchip-dfi: RK3576 support Sebastian Reichel
2026-09-21 21:15 ` Sebastian Reichel
2026-09-21 21:15 ` [PATCH v2 1/7] dt-bindings: clock: rk3576: add more DFI clocks Sebastian Reichel
2026-09-21 21:15 ` Sebastian Reichel
2026-10-05 17:10 ` Rob Herring (Arm)
2026-10-05 17:10 ` Rob Herring (Arm)
2026-09-21 21:15 ` [PATCH v2 2/7] clk: rockchip: rk3576: add missing DFI clock branch Sebastian Reichel
2026-09-21 21:15 ` Sebastian Reichel
2026-09-21 21:15 ` [PATCH v2 3/7] dt-bindings: devfreq: event: rockchip,dfi: add rk3576 Sebastian Reichel
2026-09-21 21:15 ` Sebastian Reichel
2026-10-05 17:11 ` Rob Herring (Arm)
2026-10-05 17:11 ` Rob Herring (Arm)
2026-11-15 0:58 ` Choi Chanwoo
2026-11-15 0:58 ` Choi Chanwoo
2026-09-21 21:15 ` [PATCH v2 4/7] arm64: dts: rockchip: add DFI node to RK3576 Sebastian Reichel
2026-09-21 21:15 ` Sebastian Reichel
2026-09-21 21:15 ` [PATCH v2 5/7] PM / devfreq: rockchip-dfi: move register offsets to variant struct Sebastian Reichel
2026-09-21 21:15 ` Sebastian Reichel
2026-11-15 0:59 ` Choi Chanwoo
2026-11-15 0:59 ` Choi Chanwoo
2026-09-21 21:15 ` [PATCH v2 6/7] PM / devfreq: rockchip-dfi: prepare support for v4 DDRMON Sebastian Reichel
2026-09-21 21:15 ` Sebastian Reichel
2026-11-15 0:59 ` Choi Chanwoo [this message]
2026-11-15 0:59 ` Choi Chanwoo
2026-09-21 21:15 ` [PATCH v2 7/7] PM / devfreq: rockchip-dfi: add RK3576 support Sebastian Reichel
2026-09-21 21:15 ` Sebastian Reichel
2026-11-15 1:00 ` Choi Chanwoo
2026-11-15 1:00 ` Choi Chanwoo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=03c0c33e-9619-4641-92bd-ffd0459f11db@gmail.com \
--to=cwchoi00@gmail.com \
--cc=bmasney+clk@redhat.com \
--cc=chanwoo@kernel.org \
--cc=conor+dt@kernel.org \
--cc=cw00.choi@samsung.com \
--cc=devicetree@vger.kernel.org \
--cc=heiko@sntech.de \
--cc=jbrunet+clk@baylibre.com \
--cc=kernel@collabora.com \
--cc=krzk+dt@kernel.org \
--cc=kyungmin.park@samsung.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=myungjoo.ham@samsung.com \
--cc=nicolas.frattaroli@collabora.com \
--cc=robh@kernel.org \
--cc=s.hauer@pengutronix.de \
--cc=sboyd@kernel.org \
--cc=sebastian.reichel@collabora.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.