85 lines
2.4 KiB
Diff
85 lines
2.4 KiB
Diff
From b08008c9f4396787040a48561b908c8acc82c349 Mon Sep 17 00:00:00 2001
|
|
From: Sascha Hauer <s.hauer@pengutronix.de>
|
|
Date: Wed, 24 May 2023 10:31:35 +0200
|
|
Subject: [PATCH 395/414] PM / devfreq: rockchip-dfi: introduce channel mask
|
|
|
|
Different Rockchip SoC variants have a different number of channels.
|
|
Introduce a channel mask to make the number of channels configurable
|
|
from SoC initialization code.
|
|
|
|
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
|
|
---
|
|
drivers/devfreq/event/rockchip-dfi.c | 23 +++++++++++++++++------
|
|
1 file changed, 17 insertions(+), 6 deletions(-)
|
|
|
|
--- a/drivers/devfreq/event/rockchip-dfi.c
|
|
+++ b/drivers/devfreq/event/rockchip-dfi.c
|
|
@@ -18,10 +18,11 @@
|
|
#include <linux/list.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_device.h>
|
|
+#include <linux/bits.h>
|
|
|
|
#include <soc/rockchip/rk3399_grf.h>
|
|
|
|
-#define RK3399_DMC_NUM_CH 2
|
|
+#define DMC_MAX_CHANNELS 2
|
|
|
|
/* DDRMON_CTRL */
|
|
#define DDRMON_CTRL 0x04
|
|
@@ -44,7 +45,7 @@ struct dmc_count_channel {
|
|
};
|
|
|
|
struct dmc_count {
|
|
- struct dmc_count_channel c[RK3399_DMC_NUM_CH];
|
|
+ struct dmc_count_channel c[DMC_MAX_CHANNELS];
|
|
};
|
|
|
|
/*
|
|
@@ -61,6 +62,7 @@ struct rockchip_dfi {
|
|
struct regmap *regmap_pmu;
|
|
struct clk *clk;
|
|
u32 ddr_type;
|
|
+ unsigned int channel_mask;
|
|
};
|
|
|
|
static void rockchip_dfi_start_hardware_counter(struct devfreq_event_dev *edev)
|
|
@@ -95,7 +97,9 @@ static void rockchip_dfi_read_counters(s
|
|
u32 i;
|
|
void __iomem *dfi_regs = dfi->regs;
|
|
|
|
- for (i = 0; i < RK3399_DMC_NUM_CH; i++) {
|
|
+ for (i = 0; i < DMC_MAX_CHANNELS; i++) {
|
|
+ if (!(dfi->channel_mask & BIT(i)))
|
|
+ continue;
|
|
count->c[i].access = readl_relaxed(dfi_regs +
|
|
DDRMON_CH0_DFI_ACCESS_NUM + i * 20);
|
|
count->c[i].total = readl_relaxed(dfi_regs +
|
|
@@ -145,9 +149,14 @@ static int rockchip_dfi_get_event(struct
|
|
rockchip_dfi_read_counters(edev, &count);
|
|
|
|
/* We can only report one channel, so find the busiest one */
|
|
- for (i = 0; i < RK3399_DMC_NUM_CH; i++) {
|
|
- u32 a = count.c[i].access - last->c[i].access;
|
|
- u32 t = count.c[i].total - last->c[i].total;
|
|
+ for (i = 0; i < DMC_MAX_CHANNELS; i++) {
|
|
+ u32 a, t;
|
|
+
|
|
+ if (!(dfi->channel_mask & BIT(i)))
|
|
+ continue;
|
|
+
|
|
+ a = count.c[i].access - last->c[i].access;
|
|
+ t = count.c[i].total - last->c[i].total;
|
|
|
|
if (a > access) {
|
|
access = a;
|
|
@@ -185,6 +194,8 @@ static int rk3399_dfi_init(struct rockch
|
|
dfi->ddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT) &
|
|
RK3399_PMUGRF_DDRTYPE_MASK;
|
|
|
|
+ dfi->channel_mask = GENMASK(1, 0);
|
|
+
|
|
return 0;
|
|
};
|
|
|