Conflict between video-lut and pmu on meson-g12

Marc Gonzalez marc.w.gonzalez at free.fr
Tue Feb 28 08:48:02 PST 2023


Hello everyone,

Running 6.2.0-rc8 on a S905X2 board, I note the following error
in the kernel log:

[    1.059175] meson-g12-ddr-pmu ff638000.pmu: can't request region for resource [mem 0xff638000-0xff6380ff]
[    1.068647] meson-g12-ddr-pmu: probe of ff638000.pmu failed with error -16

Relevant DT node from decompiled DTB:
(arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi + arch/arm64/boot/dts/amlogic/meson-g12a.dtsi)

	pmu at ff638000 {
		reg = <0x0 0xff638000 0x0 0x100 0x0 0xff638c00 0x0 0x100>;
		interrupts = <0x0 0x34 0x1>;
		compatible = "amlogic,g12a-ddr-pmu";
	};

However, according to /proc/iomem
ff638048-ff63805b : ff638048.video-lut video-lut at 48

Corresponding DT node:
(arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi)

	video-lut at 48 {
		compatible = "amlogic,canvas";
		reg = <0x0 0x48 0x0 0x14>;
		phandle = <0x22>;
	};

(with a base of 0xff600000 + 0x38000 = 0xff638000)

Unless I'm mistaken, ff638000-0xff6380ff and ff638048-ff63805b
cannot co-exist?

A simple solution might be to specify the "actual" base of
the register set, and count from 0 in the driver?


diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
index 534178eaaf373..cf37eecfba5b2 100644
--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
@@ -1712,7 +1712,7 @@ internal_ephy: ethernet-phy at 8 {
 		};
 
 		pmu: pmu at ff638000 {
-			reg = <0x0 0xff638000 0x0 0x100>,
+			reg = <0x0 0xff638080 0x0 0x40>,
 			      <0x0 0xff638c00 0x0 0x100>;
 			interrupts = <GIC_SPI 52 IRQ_TYPE_EDGE_RISING>;
 		};
diff --git a/drivers/perf/amlogic/meson_g12_ddr_pmu.c b/drivers/perf/amlogic/meson_g12_ddr_pmu.c
index a78fdb15e26c2..8b643888d5036 100644
--- a/drivers/perf/amlogic/meson_g12_ddr_pmu.c
+++ b/drivers/perf/amlogic/meson_g12_ddr_pmu.c
@@ -21,23 +21,23 @@
 #define DMC_QOS_IRQ		BIT(30)
 
 /* DMC bandwidth monitor register address offset */
-#define DMC_MON_G12_CTRL0		(0x20  << 2)
-#define DMC_MON_G12_CTRL1		(0x21  << 2)
-#define DMC_MON_G12_CTRL2		(0x22  << 2)
-#define DMC_MON_G12_CTRL3		(0x23  << 2)
-#define DMC_MON_G12_CTRL4		(0x24  << 2)
-#define DMC_MON_G12_CTRL5		(0x25  << 2)
-#define DMC_MON_G12_CTRL6		(0x26  << 2)
-#define DMC_MON_G12_CTRL7		(0x27  << 2)
-#define DMC_MON_G12_CTRL8		(0x28  << 2)
-
-#define DMC_MON_G12_ALL_REQ_CNT		(0x29  << 2)
-#define DMC_MON_G12_ALL_GRANT_CNT	(0x2a  << 2)
-#define DMC_MON_G12_ONE_GRANT_CNT	(0x2b  << 2)
-#define DMC_MON_G12_SEC_GRANT_CNT	(0x2c  << 2)
-#define DMC_MON_G12_THD_GRANT_CNT	(0x2d  << 2)
-#define DMC_MON_G12_FOR_GRANT_CNT	(0x2e  << 2)
-#define DMC_MON_G12_TIMER		(0x2f  << 2)
+#define DMC_MON_G12_CTRL0		(0x0  << 2)
+#define DMC_MON_G12_CTRL1		(0x1  << 2)
+#define DMC_MON_G12_CTRL2		(0x2  << 2)
+#define DMC_MON_G12_CTRL3		(0x3  << 2)
+#define DMC_MON_G12_CTRL4		(0x4  << 2)
+#define DMC_MON_G12_CTRL5		(0x5  << 2)
+#define DMC_MON_G12_CTRL6		(0x6  << 2)
+#define DMC_MON_G12_CTRL7		(0x7  << 2)
+#define DMC_MON_G12_CTRL8		(0x8  << 2)
+
+#define DMC_MON_G12_ALL_REQ_CNT		(0x9  << 2)
+#define DMC_MON_G12_ALL_GRANT_CNT	(0xa  << 2)
+#define DMC_MON_G12_ONE_GRANT_CNT	(0xb  << 2)
+#define DMC_MON_G12_SEC_GRANT_CNT	(0xc  << 2)
+#define DMC_MON_G12_THD_GRANT_CNT	(0xd  << 2)
+#define DMC_MON_G12_FOR_GRANT_CNT	(0xe  << 2)
+#define DMC_MON_G12_TIMER		(0xf  << 2)
 
 /* Each bit represent a axi line */
 PMU_FORMAT_ATTR(event, "config:0-7");


With the above patch, /proc/iomem becomes:

ff638048-ff63805b : ff638048.video-lut video-lut at 48
ff638080-ff6380bf : ff638080.pmu pmu at ff638000
ff638c00-ff638cff : ff638080.pmu pmu at ff638000

(I didn't test that the driver actually works.
I suppose one needs perf for that?)

Regards.



More information about the linux-arm-kernel mailing list