linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement
@ 2021-02-05 13:52 Nicolas Saenz Julienne
  2021-02-05 13:52 ` [RFC/PATCH 01/11] dt-bindings: soc: bcm: bcm2835-pm: Convert bindings to DT schema Nicolas Saenz Julienne
                   ` (10 more replies)
  0 siblings, 11 replies; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 13:52 UTC (permalink / raw)
  To: f.fainelli, Saenz Julienne, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree
  Cc: phil, wahrenst, linux-kernel, dri-devel

This series attempts to enable V3D on BCM2711, the SoC available on the
Raspberry Pi 4 family of boards.

Due to the lack of documentation some things are taken as it from
testing/downstream implementation[1], which I'm hilighting here:

- It's not clear that the following is 100% true, maybe someone can confirm:

	"In BCM2711 the new ARGON ASB took over V3D. The old ASB is still
	present with the ISP and H264 bits, and V3D is in the same place in the
	new ASB as the old one."

- Patch #6 I took as is from the downstream implementation, I can't really
  provide an exact explanation on what changed HW wise.

Ultimately, I need confirmation from the Broadcom folks that they are alright
with patch #7.

With all this, I get a more or less stable experience using mesa 20.3.4 and
X11/Gnome.

Regards,
Nicolas

---

Nicolas Saenz Julienne (11):
  dt-bindings: soc: bcm: bcm2835-pm: Convert bindings to DT schema
  dt-bindings: soc: bcm: brcm,bcm2835-pm: Add support for bcm2711
  ARM: dts: bcm2711: Use proper compatible in PM/Watchdog node
  mfd: bcm2835-pm: Add support for BCM2711
  soc: bcm: bcm2835-power: Add support for BCM2711's ARSAN ASB
  soc: bcm: bcm2835-power: Bypass power_on/off() calls
  drm/v3d: Get rid of pm code
  drm/v3d: Add support for bcm2711
  ARM: dts: bcm2711: Enable V3D
  ARM: configs: Enable DRM_V3D
  arm64: config: Enable DRM_V3D

 .../bindings/soc/bcm/brcm,bcm2835-pm.txt      | 46 -----------
 .../bindings/soc/bcm/brcm,bcm2835-pm.yaml     | 80 +++++++++++++++++++
 arch/arm/boot/dts/bcm2711.dtsi                | 14 +++-
 arch/arm/configs/multi_v7_defconfig           |  1 +
 arch/arm64/configs/defconfig                  |  1 +
 drivers/gpu/drm/v3d/Kconfig                   |  2 +-
 drivers/gpu/drm/v3d/v3d_debugfs.c             | 18 +----
 drivers/gpu/drm/v3d/v3d_drv.c                 | 12 +--
 drivers/gpu/drm/v3d/v3d_gem.c                 |  9 ---
 drivers/mfd/bcm2835-pm.c                      | 55 ++++++++++---
 drivers/soc/bcm/bcm2835-power.c               | 74 +++++++++++------
 include/linux/mfd/bcm2835-pm.h                |  1 +
 12 files changed, 190 insertions(+), 123 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.txt
 create mode 100644 Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml

-- 
2.30.0


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [RFC/PATCH 01/11] dt-bindings: soc: bcm: bcm2835-pm: Convert bindings to DT schema
  2021-02-05 13:52 [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement Nicolas Saenz Julienne
@ 2021-02-05 13:52 ` Nicolas Saenz Julienne
  2021-02-06 11:34   ` Stefan Wahren
  2021-02-05 13:52 ` [RFC/PATCH 02/11] dt-bindings: soc: bcm: brcm,bcm2835-pm: Add support for bcm2711 Nicolas Saenz Julienne
                   ` (9 subsequent siblings)
  10 siblings, 1 reply; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 13:52 UTC (permalink / raw)
  To: f.fainelli, Saenz Julienne, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Ray Jui,
	Scott Branden
  Cc: phil, wahrenst, Rob Herring, linux-kernel

This converts the brcm,bcm2835-pc bindings from text to proper schema.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
 .../bindings/soc/bcm/brcm,bcm2835-pm.txt      | 46 -----------
 .../bindings/soc/bcm/brcm,bcm2835-pm.yaml     | 79 +++++++++++++++++++
 2 files changed, 79 insertions(+), 46 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.txt
 create mode 100644 Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml

diff --git a/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.txt b/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.txt
deleted file mode 100644
index 72ff033565e5..000000000000
--- a/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-BCM2835 PM (Power domains, watchdog)
-
-The PM block controls power domains and some reset lines, and includes
-a watchdog timer.  This binding supersedes the brcm,bcm2835-pm-wdt
-binding which covered some of PM's register range and functionality.
-
-Required properties:
-
-- compatible:		Should be "brcm,bcm2835-pm"
-- reg:			Specifies base physical address and size of the two
-			  register ranges ("PM" and "ASYNC_BRIDGE" in that
-			  order)
-- clocks:		a) v3d: The V3D clock from CPRMAN
-			b) peri_image: The PERI_IMAGE clock from CPRMAN
-			c) h264: The H264 clock from CPRMAN
-			d) isp: The ISP clock from CPRMAN
-- #reset-cells: 	Should be 1.  This property follows the reset controller
-			  bindings[1].
-- #power-domain-cells:	Should be 1.  This property follows the power domain
-			  bindings[2].
-
-Optional properties:
-
-- timeout-sec:		Contains the watchdog timeout in seconds
-- system-power-controller: Whether the watchdog is controlling the
-    system power.  This node follows the power controller bindings[3].
-
-[1] Documentation/devicetree/bindings/reset/reset.txt
-[2] Documentation/devicetree/bindings/power/power-domain.yaml
-[3] Documentation/devicetree/bindings/power/power-controller.txt
-
-Example:
-
-pm {
-	compatible = "brcm,bcm2835-pm", "brcm,bcm2835-pm-wdt";
-	#power-domain-cells = <1>;
-	#reset-cells = <1>;
-	reg = <0x7e100000 0x114>,
-	      <0x7e00a000 0x24>;
-	clocks = <&clocks BCM2835_CLOCK_V3D>,
-		 <&clocks BCM2835_CLOCK_PERI_IMAGE>,
-		 <&clocks BCM2835_CLOCK_H264>,
-		 <&clocks BCM2835_CLOCK_ISP>;
-	clock-names = "v3d", "peri_image", "h264", "isp";
-	system-power-controller;
-};
diff --git a/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml b/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml
new file mode 100644
index 000000000000..5e0555fc0666
--- /dev/null
+++ b/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml
@@ -0,0 +1,79 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: "http://devicetree.org/schemas/soc/bcm/brcm,bcm2835-pm.yaml#"
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
+
+title: BCM2835 PM (Power domains, watchdog)
+
+description: |
+  The PM block controls power domains and some reset lines, and includes a
+  watchdog timer.
+
+maintainers:
+  - Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+
+allOf:
+  - $ref: ../../watchdog/watchdog.yaml#
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - brcm,bcm2835-pm
+      - const: brcm,bcm2835-pm-wdt
+
+  reg:
+    minItems: 1
+    maxItems: 2
+    description: Specifies base physical address and size of the two register
+                 ranges, "PM" and "ASYNC_BRIDGE" in that order.
+
+  "#power-domain-cells":
+    const: 1
+
+  "#reset-cells":
+    const: 1
+
+  clocks:
+    minItems: 4
+    maxItems: 4
+
+  clock-names:
+    items:
+      - const: v3d
+      - const: peri_image
+      - const: h264
+      - const: isp
+
+  system-power-controller:
+    type: boolean
+
+  timeout-sec: true
+
+required:
+  - compatible
+  - reg
+  - "#power-domain-cells"
+  - "#reset-cells"
+  - clocks
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/bcm2835.h>
+
+    watchdog@0 {
+        compatible = "brcm,bcm2835-pm", "brcm,bcm2835-pm-wdt";
+        #power-domain-cells = <1>;
+        #reset-cells = <1>;
+        reg = <0x7e100000 0x114>,
+              <0x7e00a000 0x24>;
+        clocks = <&clocks BCM2835_CLOCK_V3D>,
+        	 <&clocks BCM2835_CLOCK_PERI_IMAGE>,
+        	 <&clocks BCM2835_CLOCK_H264>,
+        	 <&clocks BCM2835_CLOCK_ISP>;
+        clock-names = "v3d", "peri_image", "h264", "isp";
+        system-power-controller;
+    };
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC/PATCH 02/11] dt-bindings: soc: bcm: brcm,bcm2835-pm: Add support for bcm2711
  2021-02-05 13:52 [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement Nicolas Saenz Julienne
  2021-02-05 13:52 ` [RFC/PATCH 01/11] dt-bindings: soc: bcm: bcm2835-pm: Convert bindings to DT schema Nicolas Saenz Julienne
@ 2021-02-05 13:52 ` Nicolas Saenz Julienne
  2021-02-06 11:36   ` Stefan Wahren
  2021-02-05 13:52 ` [RFC/PATCH 03/11] ARM: dts: bcm2711: Use proper compatible in PM/Watchdog node Nicolas Saenz Julienne
                   ` (8 subsequent siblings)
  10 siblings, 1 reply; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 13:52 UTC (permalink / raw)
  To: f.fainelli, Saenz Julienne, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Ray Jui,
	Scott Branden
  Cc: phil, wahrenst, Rob Herring, linux-kernel

Add a new compatible string for bcm2711 and the option to provide a
third reg property for the board's new Argon ASB.

The new Argon ASB took over V3D, which is our only consumer of this
driver so far. The old ASB is still be present with ISP and H264 bits
but no V3D.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
 .../devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml       | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml b/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml
index 5e0555fc0666..a1f2e25e68db 100644
--- a/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml
+++ b/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml
@@ -21,13 +21,14 @@ properties:
     items:
       - enum:
           - brcm,bcm2835-pm
+          - brcm,bcm2711-pm
       - const: brcm,bcm2835-pm-wdt
 
   reg:
     minItems: 1
-    maxItems: 2
-    description: Specifies base physical address and size of the two register
-                 ranges, "PM" and "ASYNC_BRIDGE" in that order.
+    maxItems: 3
+    description: Specifies base physical address and size of the register
+                 ranges, "PM", "ASYNC_BRIDGE" and "ARGON_BRIDGE" in that order.
 
   "#power-domain-cells":
     const: 1
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC/PATCH 03/11] ARM: dts: bcm2711: Use proper compatible in PM/Watchdog node
  2021-02-05 13:52 [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement Nicolas Saenz Julienne
  2021-02-05 13:52 ` [RFC/PATCH 01/11] dt-bindings: soc: bcm: bcm2835-pm: Convert bindings to DT schema Nicolas Saenz Julienne
  2021-02-05 13:52 ` [RFC/PATCH 02/11] dt-bindings: soc: bcm: brcm,bcm2835-pm: Add support for bcm2711 Nicolas Saenz Julienne
@ 2021-02-05 13:52 ` Nicolas Saenz Julienne
  2021-02-05 13:52 ` [RFC/PATCH 04/11] mfd: bcm2835-pm: Add support for BCM2711 Nicolas Saenz Julienne
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 13:52 UTC (permalink / raw)
  To: f.fainelli, Saenz Julienne, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Rob Herring
  Cc: phil, wahrenst, linux-kernel

A new compatible string was introduced specifically for BCM2711, so make
use of it.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
 arch/arm/boot/dts/bcm2711.dtsi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/bcm2711.dtsi b/arch/arm/boot/dts/bcm2711.dtsi
index 462b1dfb0385..537498a93a3a 100644
--- a/arch/arm/boot/dts/bcm2711.dtsi
+++ b/arch/arm/boot/dts/bcm2711.dtsi
@@ -107,7 +107,7 @@ dma: dma@7e007000 {
 		};
 
 		pm: watchdog@7e100000 {
-			compatible = "brcm,bcm2835-pm", "brcm,bcm2835-pm-wdt";
+			compatible = "brcm,bcm2711-pm", "brcm,bcm2835-pm-wdt";
 			#power-domain-cells = <1>;
 			#reset-cells = <1>;
 			reg = <0x7e100000 0x114>,
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC/PATCH 04/11] mfd: bcm2835-pm: Add support for BCM2711
  2021-02-05 13:52 [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement Nicolas Saenz Julienne
                   ` (2 preceding siblings ...)
  2021-02-05 13:52 ` [RFC/PATCH 03/11] ARM: dts: bcm2711: Use proper compatible in PM/Watchdog node Nicolas Saenz Julienne
@ 2021-02-05 13:52 ` Nicolas Saenz Julienne
  2021-02-05 13:52 ` [RFC/PATCH 05/11] soc: bcm: bcm2835-power: Add support for BCM2711's ARSAN ASB Nicolas Saenz Julienne
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 13:52 UTC (permalink / raw)
  To: f.fainelli, Saenz Julienne, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Lee Jones,
	Ray Jui, Scott Branden
  Cc: phil, wahrenst, linux-kernel

In BCM2711 the new ARGON ASB took over V3D. The old ASB is still present
with the ISP and H264 bits, and V3D is in the same place in the new ASB
as the old one.

As per the devicetree bindings, BCM2711 will provide both the old and
new ASB registers, so get both of them and pass them into
'bcm2835-power,' which will take care of selecting which one to use
accordingly.

We're being extra careful when dealing with older firmware. We can't
assume all V3D users will use the new "brcm,bcm2711-pm" compatible
string, so use the fact that a 3rd resource is present in firmware as a
hint we're running on BCM2711.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
 drivers/mfd/bcm2835-pm.c       | 55 ++++++++++++++++++++++++++--------
 include/linux/mfd/bcm2835-pm.h |  1 +
 2 files changed, 43 insertions(+), 13 deletions(-)

diff --git a/drivers/mfd/bcm2835-pm.c b/drivers/mfd/bcm2835-pm.c
index 42fe67f1538e..98c6943d3cd0 100644
--- a/drivers/mfd/bcm2835-pm.c
+++ b/drivers/mfd/bcm2835-pm.c
@@ -6,6 +6,7 @@
  * the WDT and power drivers.
  */
 
+#include <linux/bits.h>
 #include <linux/delay.h>
 #include <linux/io.h>
 #include <linux/mfd/bcm2835-pm.h>
@@ -17,6 +18,9 @@
 #include <linux/types.h>
 #include <linux/watchdog.h>
 
+#define BCM2835		BIT(1)
+#define BCM2711		BIT(2)
+
 static const struct mfd_cell bcm2835_pm_devs[] = {
 	{ .name = "bcm2835-wdt" },
 };
@@ -30,6 +34,7 @@ static int bcm2835_pm_probe(struct platform_device *pdev)
 	struct resource *res;
 	struct device *dev = &pdev->dev;
 	struct bcm2835_pm *pm;
+	bool is_bcm2711;
 	int ret;
 
 	pm = devm_kzalloc(dev, sizeof(*pm), GFP_KERNEL);
@@ -38,6 +43,7 @@ static int bcm2835_pm_probe(struct platform_device *pdev)
 	platform_set_drvdata(pdev, pm);
 
 	pm->dev = dev;
+	is_bcm2711 = (uintptr_t)device_get_match_data(&pdev->dev) & BCM2711;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	pm->base = devm_ioremap_resource(dev, res);
@@ -50,30 +56,53 @@ static int bcm2835_pm_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	/* We'll use the presence of the AXI ASB regs in the
-	 * bcm2835-pm binding as the key for whether we can reference
-	 * the full PM register range and support power domains.
+	/* To support old firmware, check if a third resource was defined and
+	 * use that as a hint that we're on bcm2711.
 	 */
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
+	if (res) {
+		pm->arsan_asb = devm_ioremap_resource(dev, res);
+		if (IS_ERR(pm->arsan_asb)) {
+			dev_err(dev, "Failed to map Arsan ASB: %ld\n",
+				PTR_ERR(pm->arsan_asb));
+			return PTR_ERR(pm->arsan_asb);
+		}
+
+		if (!is_bcm2711) {
+			dev_warn(dev, "Using an outdated DT, please update it\n");
+			is_bcm2711 = true;
+		}
+	}
+
+	if (is_bcm2711 && !pm->arsan_asb) {
+		dev_err(dev, "Arsan ASB resource missing\n");
+		return -EINVAL;
+	}
+
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
 	if (res) {
 		pm->asb = devm_ioremap_resource(dev, res);
-		if (IS_ERR(pm->asb))
+		if (IS_ERR(pm->asb)) {
+			dev_err(dev, "Failed to map ASB: %ld\n", PTR_ERR(pm->asb));
 			return PTR_ERR(pm->asb);
-
-		ret = devm_mfd_add_devices(dev, -1,
-					   bcm2835_power_devs,
-					   ARRAY_SIZE(bcm2835_power_devs),
-					   NULL, 0, NULL);
-		if (ret)
-			return ret;
+		}
 	}
 
+	/* We'll use the presence of the ASB regs in the bcm2835-pm binding as
+	 * the key for whether we can reference the full PM register range and
+	 * support power domains.
+	 */
+	if (pm->asb)
+		return devm_mfd_add_devices(dev, -1, bcm2835_power_devs,
+					    ARRAY_SIZE(bcm2835_power_devs),
+					    NULL, 0, NULL);
 	return 0;
 }
 
 static const struct of_device_id bcm2835_pm_of_match[] = {
-	{ .compatible = "brcm,bcm2835-pm-wdt", },
-	{ .compatible = "brcm,bcm2835-pm", },
+	{ .compatible = "brcm,bcm2835-pm-wdt", .data = (void *)BCM2835},
+	{ .compatible = "brcm,bcm2835-pm", .data = (void *)BCM2835},
+	{ .compatible = "brcm,bcm2711-pm", .data = (void *)BCM2711},
 	{},
 };
 MODULE_DEVICE_TABLE(of, bcm2835_pm_of_match);
diff --git a/include/linux/mfd/bcm2835-pm.h b/include/linux/mfd/bcm2835-pm.h
index ed37dc40e82a..536e3c85347c 100644
--- a/include/linux/mfd/bcm2835-pm.h
+++ b/include/linux/mfd/bcm2835-pm.h
@@ -9,6 +9,7 @@ struct bcm2835_pm {
 	struct device *dev;
 	void __iomem *base;
 	void __iomem *asb;
+	void __iomem *arsan_asb;
 };
 
 #endif /* BCM2835_MFD_PM_H */
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC/PATCH 05/11] soc: bcm: bcm2835-power: Add support for BCM2711's ARSAN ASB
  2021-02-05 13:52 [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement Nicolas Saenz Julienne
                   ` (3 preceding siblings ...)
  2021-02-05 13:52 ` [RFC/PATCH 04/11] mfd: bcm2835-pm: Add support for BCM2711 Nicolas Saenz Julienne
@ 2021-02-05 13:52 ` Nicolas Saenz Julienne
  2021-02-05 16:56   ` Florian Fainelli
  2021-02-05 13:52 ` [RFC/PATCH 06/11] soc: bcm: bcm2835-power: Bypass power_on/off() calls Nicolas Saenz Julienne
                   ` (5 subsequent siblings)
  10 siblings, 1 reply; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 13:52 UTC (permalink / raw)
  To: f.fainelli, Saenz Julienne, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Ray Jui,
	Scott Branden
  Cc: phil, wahrenst, linux-kernel

In BCM2711 the new ARGON ASB took over V3D. The old ASB is still present
with the ISP and H264 bits, and V3D is in the same place in the new ASB
as the old one.

Use the fact that 'pm->arsan_asb' is populated as a hint that we're on
BCM2711. On top of that introduce the macro ASB_BASE() which will select
the correct ASB register base, based on whether we're trying to access
V3D and which platform we're on.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
 drivers/soc/bcm/bcm2835-power.c | 66 ++++++++++++++++++++-------------
 1 file changed, 41 insertions(+), 25 deletions(-)

diff --git a/drivers/soc/bcm/bcm2835-power.c b/drivers/soc/bcm/bcm2835-power.c
index 1e0041ec8132..17bc71fd243c 100644
--- a/drivers/soc/bcm/bcm2835-power.c
+++ b/drivers/soc/bcm/bcm2835-power.c
@@ -126,8 +126,9 @@
 
 #define ASB_AXI_BRDG_ID			0x20
 
-#define ASB_READ(reg) readl(power->asb + (reg))
-#define ASB_WRITE(reg, val) writel(PM_PASSWORD | (val), power->asb + (reg))
+#define ASB_BASE(is_v3d) (is_v3d && power->arsan_asb ? power->arsan_asb : power->asb)
+#define ASB_READ(reg, is_v3d) readl(ASB_BASE(is_v3d) + (reg))
+#define ASB_WRITE(reg, val, is_v3d) writel(PM_PASSWORD | (val), ASB_BASE(is_v3d) + (reg))
 
 struct bcm2835_power_domain {
 	struct generic_pm_domain base;
@@ -142,13 +143,16 @@ struct bcm2835_power {
 	void __iomem		*base;
 	/* AXI Async bridge registers. */
 	void __iomem		*asb;
+	/* ARSAN bridge registers. */
+	void __iomem		*arsan_asb;
 
 	struct genpd_onecell_data pd_xlate;
 	struct bcm2835_power_domain domains[BCM2835_POWER_DOMAIN_COUNT];
 	struct reset_controller_dev reset;
 };
 
-static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg)
+static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg,
+			      bool is_v3d)
 {
 	u64 start;
 
@@ -158,8 +162,8 @@ static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg)
 	start = ktime_get_ns();
 
 	/* Enable the module's async AXI bridges. */
-	ASB_WRITE(reg, ASB_READ(reg) & ~ASB_REQ_STOP);
-	while (ASB_READ(reg) & ASB_ACK) {
+	ASB_WRITE(reg, ASB_READ(reg, is_v3d) & ~ASB_REQ_STOP, is_v3d);
+	while (ASB_READ(reg, is_v3d) & ASB_ACK) {
 		cpu_relax();
 		if (ktime_get_ns() - start >= 1000)
 			return -ETIMEDOUT;
@@ -168,7 +172,8 @@ static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg)
 	return 0;
 }
 
-static int bcm2835_asb_disable(struct bcm2835_power *power, u32 reg)
+static int bcm2835_asb_disable(struct bcm2835_power *power, u32 reg,
+			       bool is_v3d)
 {
 	u64 start;
 
@@ -178,8 +183,8 @@ static int bcm2835_asb_disable(struct bcm2835_power *power, u32 reg)
 	start = ktime_get_ns();
 
 	/* Enable the module's async AXI bridges. */
-	ASB_WRITE(reg, ASB_READ(reg) | ASB_REQ_STOP);
-	while (!(ASB_READ(reg) & ASB_ACK)) {
+	ASB_WRITE(reg, ASB_READ(reg, is_v3d) | ASB_REQ_STOP, is_v3d);
+	while (!(ASB_READ(reg, is_v3d) & ASB_ACK)) {
 		cpu_relax();
 		if (ktime_get_ns() - start >= 1000)
 			return -ETIMEDOUT;
@@ -274,7 +279,8 @@ static int bcm2835_asb_power_on(struct bcm2835_power_domain *pd,
 				u32 pm_reg,
 				u32 asb_m_reg,
 				u32 asb_s_reg,
-				u32 reset_flags)
+				u32 reset_flags,
+				bool is_v3d)
 {
 	struct bcm2835_power *power = pd->power;
 	int ret;
@@ -301,13 +307,13 @@ static int bcm2835_asb_power_on(struct bcm2835_power_domain *pd,
 		goto err_enable_resets;
 	}
 
-	ret = bcm2835_asb_enable(power, asb_m_reg);
+	ret = bcm2835_asb_enable(power, asb_m_reg, is_v3d);
 	if (ret) {
 		dev_err(power->dev, "Failed to enable ASB master for %s\n",
 			pd->base.name);
 		goto err_disable_clk;
 	}
-	ret = bcm2835_asb_enable(power, asb_s_reg);
+	ret = bcm2835_asb_enable(power, asb_s_reg, is_v3d);
 	if (ret) {
 		dev_err(power->dev, "Failed to enable ASB slave for %s\n",
 			pd->base.name);
@@ -317,7 +323,7 @@ static int bcm2835_asb_power_on(struct bcm2835_power_domain *pd,
 	return 0;
 
 err_disable_asb_master:
-	bcm2835_asb_disable(power, asb_m_reg);
+	bcm2835_asb_disable(power, asb_m_reg, is_v3d);
 err_disable_clk:
 	clk_disable_unprepare(pd->clk);
 err_enable_resets:
@@ -329,22 +335,23 @@ static int bcm2835_asb_power_off(struct bcm2835_power_domain *pd,
 				 u32 pm_reg,
 				 u32 asb_m_reg,
 				 u32 asb_s_reg,
-				 u32 reset_flags)
+				 u32 reset_flags,
+				 bool is_v3d)
 {
 	struct bcm2835_power *power = pd->power;
 	int ret;
 
-	ret = bcm2835_asb_disable(power, asb_s_reg);
+	ret = bcm2835_asb_disable(power, asb_s_reg, is_v3d);
 	if (ret) {
 		dev_warn(power->dev, "Failed to disable ASB slave for %s\n",
 			 pd->base.name);
 		return ret;
 	}
-	ret = bcm2835_asb_disable(power, asb_m_reg);
+	ret = bcm2835_asb_disable(power, asb_m_reg, is_v3d);
 	if (ret) {
 		dev_warn(power->dev, "Failed to disable ASB master for %s\n",
 			 pd->base.name);
-		bcm2835_asb_enable(power, asb_s_reg);
+		bcm2835_asb_enable(power, asb_s_reg, is_v3d);
 		return ret;
 	}
 
@@ -369,7 +376,7 @@ static int bcm2835_power_pd_power_on(struct generic_pm_domain *domain)
 	case BCM2835_POWER_DOMAIN_GRAFX_V3D:
 		return bcm2835_asb_power_on(pd, PM_GRAFX,
 					    ASB_V3D_M_CTRL, ASB_V3D_S_CTRL,
-					    PM_V3DRSTN);
+					    PM_V3DRSTN, true);
 
 	case BCM2835_POWER_DOMAIN_IMAGE:
 		return bcm2835_power_power_on(pd, PM_IMAGE);
@@ -377,17 +384,17 @@ static int bcm2835_power_pd_power_on(struct generic_pm_domain *domain)
 	case BCM2835_POWER_DOMAIN_IMAGE_PERI:
 		return bcm2835_asb_power_on(pd, PM_IMAGE,
 					    0, 0,
-					    PM_PERIRSTN);
+					    PM_PERIRSTN, false);
 
 	case BCM2835_POWER_DOMAIN_IMAGE_ISP:
 		return bcm2835_asb_power_on(pd, PM_IMAGE,
 					    ASB_ISP_M_CTRL, ASB_ISP_S_CTRL,
-					    PM_ISPRSTN);
+					    PM_ISPRSTN, false);
 
 	case BCM2835_POWER_DOMAIN_IMAGE_H264:
 		return bcm2835_asb_power_on(pd, PM_IMAGE,
 					    ASB_H264_M_CTRL, ASB_H264_S_CTRL,
-					    PM_H264RSTN);
+					    PM_H264RSTN, false);
 
 	case BCM2835_POWER_DOMAIN_USB:
 		PM_WRITE(PM_USB, PM_USB_CTRLEN);
@@ -435,7 +442,7 @@ static int bcm2835_power_pd_power_off(struct generic_pm_domain *domain)
 	case BCM2835_POWER_DOMAIN_GRAFX_V3D:
 		return bcm2835_asb_power_off(pd, PM_GRAFX,
 					     ASB_V3D_M_CTRL, ASB_V3D_S_CTRL,
-					     PM_V3DRSTN);
+					     PM_V3DRSTN, true);
 
 	case BCM2835_POWER_DOMAIN_IMAGE:
 		return bcm2835_power_power_off(pd, PM_IMAGE);
@@ -443,17 +450,17 @@ static int bcm2835_power_pd_power_off(struct generic_pm_domain *domain)
 	case BCM2835_POWER_DOMAIN_IMAGE_PERI:
 		return bcm2835_asb_power_off(pd, PM_IMAGE,
 					     0, 0,
-					     PM_PERIRSTN);
+					     PM_PERIRSTN, false);
 
 	case BCM2835_POWER_DOMAIN_IMAGE_ISP:
 		return bcm2835_asb_power_off(pd, PM_IMAGE,
 					     ASB_ISP_M_CTRL, ASB_ISP_S_CTRL,
-					     PM_ISPRSTN);
+					     PM_ISPRSTN, false);
 
 	case BCM2835_POWER_DOMAIN_IMAGE_H264:
 		return bcm2835_asb_power_off(pd, PM_IMAGE,
 					     ASB_H264_M_CTRL, ASB_H264_S_CTRL,
-					     PM_H264RSTN);
+					     PM_H264RSTN, false);
 
 	case BCM2835_POWER_DOMAIN_USB:
 		PM_WRITE(PM_USB, 0);
@@ -626,13 +633,22 @@ static int bcm2835_power_probe(struct platform_device *pdev)
 	power->dev = dev;
 	power->base = pm->base;
 	power->asb = pm->asb;
+	power->arsan_asb = pm->arsan_asb;
 
-	id = ASB_READ(ASB_AXI_BRDG_ID);
+	id = ASB_READ(ASB_AXI_BRDG_ID, false);
 	if (id != 0x62726467 /* "BRDG" */) {
 		dev_err(dev, "ASB register ID returned 0x%08x\n", id);
 		return -ENODEV;
 	}
 
+	if (pm->arsan_asb) {
+		id = ASB_READ(ASB_AXI_BRDG_ID, true);
+		if (id != 0x62726467 /* "BRDG" */) {
+			dev_err(dev, "ARSAN ASB register ID returned 0x%08x\n", id);
+			return -ENODEV;
+		}
+	}
+
 	power->pd_xlate.domains = devm_kcalloc(dev,
 					       ARRAY_SIZE(power_domain_names),
 					       sizeof(*power->pd_xlate.domains),
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC/PATCH 06/11] soc: bcm: bcm2835-power: Bypass power_on/off() calls
  2021-02-05 13:52 [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement Nicolas Saenz Julienne
                   ` (4 preceding siblings ...)
  2021-02-05 13:52 ` [RFC/PATCH 05/11] soc: bcm: bcm2835-power: Add support for BCM2711's ARSAN ASB Nicolas Saenz Julienne
@ 2021-02-05 13:52 ` Nicolas Saenz Julienne
  2021-02-05 13:52 ` [RFC/PATCH 07/11] drm/v3d: Get rid of pm code Nicolas Saenz Julienne
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 13:52 UTC (permalink / raw)
  To: f.fainelli, Saenz Julienne, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Ray Jui,
	Scott Branden
  Cc: phil, wahrenst, linux-kernel

Bypass power_on/power_off() when running on BCM2711 as they are not
needed.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
 drivers/soc/bcm/bcm2835-power.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/soc/bcm/bcm2835-power.c b/drivers/soc/bcm/bcm2835-power.c
index 17bc71fd243c..ea65f459161d 100644
--- a/drivers/soc/bcm/bcm2835-power.c
+++ b/drivers/soc/bcm/bcm2835-power.c
@@ -197,6 +197,10 @@ static int bcm2835_power_power_off(struct bcm2835_power_domain *pd, u32 pm_reg)
 {
 	struct bcm2835_power *power = pd->power;
 
+	/* We don't run this on BCM2711 */
+	if (power->arsan_asb)
+		return 0;
+
 	/* Enable functional isolation */
 	PM_WRITE(pm_reg, PM_READ(pm_reg) & ~PM_ISFUNC);
 
@@ -218,6 +222,10 @@ static int bcm2835_power_power_on(struct bcm2835_power_domain *pd, u32 pm_reg)
 	int inrush;
 	bool powok;
 
+	/* We don't run this on BCM2711 */
+	if (power->arsan_asb)
+		return 0;
+
 	/* If it was already powered on by the fw, leave it that way. */
 	if (PM_READ(pm_reg) & PM_POWUP)
 		return 0;
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC/PATCH 07/11] drm/v3d: Get rid of pm code
  2021-02-05 13:52 [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement Nicolas Saenz Julienne
                   ` (5 preceding siblings ...)
  2021-02-05 13:52 ` [RFC/PATCH 06/11] soc: bcm: bcm2835-power: Bypass power_on/off() calls Nicolas Saenz Julienne
@ 2021-02-05 13:52 ` Nicolas Saenz Julienne
  2021-02-05 13:52 ` [RFC/PATCH 08/11] drm/v3d: Add support for bcm2711 Nicolas Saenz Julienne
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 13:52 UTC (permalink / raw)
  To: f.fainelli, Saenz Julienne, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Eric Anholt
  Cc: phil, wahrenst, David Airlie, Daniel Vetter, dri-devel, linux-kernel

Runtime PM doesn't seem to work correctly on this driver. On top of
that, commit 8b6864e3e138 (drm/v3d/v3d_drv: Remove unused static
variable 'v3d_v3d_pm_ops') hints that it most likely never did properly
as the driver's PM ops were not hooked-up.

So, in order to support regular operation with V3D on BCM2711 (Raspberry
Pi 4), get rid of the PM code. PM will be reinstated once we figure out
the underlying issues.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
 drivers/gpu/drm/v3d/v3d_debugfs.c | 18 +-----------------
 drivers/gpu/drm/v3d/v3d_drv.c     | 11 -----------
 drivers/gpu/drm/v3d/v3d_gem.c     |  9 ---------
 3 files changed, 1 insertion(+), 37 deletions(-)

diff --git a/drivers/gpu/drm/v3d/v3d_debugfs.c b/drivers/gpu/drm/v3d/v3d_debugfs.c
index e76b24bb8828..e1d5f3423059 100644
--- a/drivers/gpu/drm/v3d/v3d_debugfs.c
+++ b/drivers/gpu/drm/v3d/v3d_debugfs.c
@@ -4,7 +4,6 @@
 #include <linux/circ_buf.h>
 #include <linux/ctype.h>
 #include <linux/debugfs.h>
-#include <linux/pm_runtime.h>
 #include <linux/seq_file.h>
 
 #include <drm/drm_debugfs.h>
@@ -130,11 +129,7 @@ static int v3d_v3d_debugfs_ident(struct seq_file *m, void *unused)
 	struct drm_device *dev = node->minor->dev;
 	struct v3d_dev *v3d = to_v3d_dev(dev);
 	u32 ident0, ident1, ident2, ident3, cores;
-	int ret, core;
-
-	ret = pm_runtime_get_sync(v3d->drm.dev);
-	if (ret < 0)
-		return ret;
+	int core;
 
 	ident0 = V3D_READ(V3D_HUB_IDENT0);
 	ident1 = V3D_READ(V3D_HUB_IDENT1);
@@ -187,9 +182,6 @@ static int v3d_v3d_debugfs_ident(struct seq_file *m, void *unused)
 			   (misccfg & V3D_MISCCFG_OVRTMUOUT) != 0);
 	}
 
-	pm_runtime_mark_last_busy(v3d->drm.dev);
-	pm_runtime_put_autosuspend(v3d->drm.dev);
-
 	return 0;
 }
 
@@ -217,11 +209,6 @@ static int v3d_measure_clock(struct seq_file *m, void *unused)
 	uint32_t cycles;
 	int core = 0;
 	int measure_ms = 1000;
-	int ret;
-
-	ret = pm_runtime_get_sync(v3d->drm.dev);
-	if (ret < 0)
-		return ret;
 
 	if (v3d->ver >= 40) {
 		V3D_CORE_WRITE(core, V3D_V4_PCTR_0_SRC_0_3,
@@ -245,9 +232,6 @@ static int v3d_measure_clock(struct seq_file *m, void *unused)
 		   cycles / (measure_ms * 1000),
 		   (cycles / (measure_ms * 100)) % 10);
 
-	pm_runtime_mark_last_busy(v3d->drm.dev);
-	pm_runtime_put_autosuspend(v3d->drm.dev);
-
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
index 99e22beea90b..7a3336443a12 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.c
+++ b/drivers/gpu/drm/v3d/v3d_drv.c
@@ -19,7 +19,6 @@
 #include <linux/module.h>
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
-#include <linux/pm_runtime.h>
 #include <linux/reset.h>
 
 #include <drm/drm_drv.h>
@@ -43,7 +42,6 @@ static int v3d_get_param_ioctl(struct drm_device *dev, void *data,
 {
 	struct v3d_dev *v3d = to_v3d_dev(dev);
 	struct drm_v3d_get_param *args = data;
-	int ret;
 	static const u32 reg_map[] = {
 		[DRM_V3D_PARAM_V3D_UIFCFG] = V3D_HUB_UIFCFG,
 		[DRM_V3D_PARAM_V3D_HUB_IDENT1] = V3D_HUB_IDENT1,
@@ -69,17 +67,12 @@ static int v3d_get_param_ioctl(struct drm_device *dev, void *data,
 		if (args->value != 0)
 			return -EINVAL;
 
-		ret = pm_runtime_get_sync(v3d->drm.dev);
-		if (ret < 0)
-			return ret;
 		if (args->param >= DRM_V3D_PARAM_V3D_CORE0_IDENT0 &&
 		    args->param <= DRM_V3D_PARAM_V3D_CORE0_IDENT2) {
 			args->value = V3D_CORE_READ(0, offset);
 		} else {
 			args->value = V3D_READ(offset);
 		}
-		pm_runtime_mark_last_busy(v3d->drm.dev);
-		pm_runtime_put_autosuspend(v3d->drm.dev);
 		return 0;
 	}
 
@@ -271,10 +264,6 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
 		return -ENOMEM;
 	}
 
-	pm_runtime_use_autosuspend(dev);
-	pm_runtime_set_autosuspend_delay(dev, 50);
-	pm_runtime_enable(dev);
-
 	ret = v3d_gem_init(drm);
 	if (ret)
 		goto dma_free;
diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
index 4eb354226972..75582b03470b 100644
--- a/drivers/gpu/drm/v3d/v3d_gem.c
+++ b/drivers/gpu/drm/v3d/v3d_gem.c
@@ -6,7 +6,6 @@
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
-#include <linux/pm_runtime.h>
 #include <linux/reset.h>
 #include <linux/sched/signal.h>
 #include <linux/uaccess.h>
@@ -372,9 +371,6 @@ v3d_job_free(struct kref *ref)
 	dma_fence_put(job->irq_fence);
 	dma_fence_put(job->done_fence);
 
-	pm_runtime_mark_last_busy(job->v3d->drm.dev);
-	pm_runtime_put_autosuspend(job->v3d->drm.dev);
-
 	kfree(job);
 }
 
@@ -441,10 +437,6 @@ v3d_job_init(struct v3d_dev *v3d, struct drm_file *file_priv,
 	job->v3d = v3d;
 	job->free = free;
 
-	ret = pm_runtime_get_sync(v3d->drm.dev);
-	if (ret < 0)
-		return ret;
-
 	xa_init_flags(&job->deps, XA_FLAGS_ALLOC);
 
 	ret = drm_syncobj_find_fence(file_priv, in_sync, 0, 0, &in_fence);
@@ -460,7 +452,6 @@ v3d_job_init(struct v3d_dev *v3d, struct drm_file *file_priv,
 	return 0;
 fail:
 	xa_destroy(&job->deps);
-	pm_runtime_put_autosuspend(v3d->drm.dev);
 	return ret;
 }
 
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC/PATCH 08/11] drm/v3d: Add support for bcm2711
  2021-02-05 13:52 [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement Nicolas Saenz Julienne
                   ` (6 preceding siblings ...)
  2021-02-05 13:52 ` [RFC/PATCH 07/11] drm/v3d: Get rid of pm code Nicolas Saenz Julienne
@ 2021-02-05 13:52 ` Nicolas Saenz Julienne
  2021-02-05 13:52 ` [RFC/PATCH 09/11] ARM: dts: bcm2711: Enable V3D Nicolas Saenz Julienne
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 13:52 UTC (permalink / raw)
  To: f.fainelli, Saenz Julienne, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Eric Anholt
  Cc: phil, wahrenst, David Airlie, Daniel Vetter, dri-devel, linux-kernel

Add compatible string and Kconfig options for bcm2711.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
 drivers/gpu/drm/v3d/Kconfig   | 2 +-
 drivers/gpu/drm/v3d/v3d_drv.c | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/v3d/Kconfig b/drivers/gpu/drm/v3d/Kconfig
index 9a5c44606337..b0e048697964 100644
--- a/drivers/gpu/drm/v3d/Kconfig
+++ b/drivers/gpu/drm/v3d/Kconfig
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 config DRM_V3D
 	tristate "Broadcom V3D 3.x and newer"
-	depends on ARCH_BCM || ARCH_BCMSTB || COMPILE_TEST
+	depends on ARCH_BCM || ARCH_BCMSTB || ARCH_BCM2835 || COMPILE_TEST
 	depends on DRM
 	depends on COMMON_CLK
 	depends on MMU
diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
index 7a3336443a12..1504b6f84441 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.c
+++ b/drivers/gpu/drm/v3d/v3d_drv.c
@@ -184,6 +184,7 @@ static const struct drm_driver v3d_drm_driver = {
 static const struct of_device_id v3d_of_match[] = {
 	{ .compatible = "brcm,7268-v3d" },
 	{ .compatible = "brcm,7278-v3d" },
+	{ .compatible = "brcm,bcm2711-v3d" },
 	{},
 };
 MODULE_DEVICE_TABLE(of, v3d_of_match);
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC/PATCH 09/11] ARM: dts: bcm2711: Enable V3D
  2021-02-05 13:52 [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement Nicolas Saenz Julienne
                   ` (7 preceding siblings ...)
  2021-02-05 13:52 ` [RFC/PATCH 08/11] drm/v3d: Add support for bcm2711 Nicolas Saenz Julienne
@ 2021-02-05 13:52 ` Nicolas Saenz Julienne
  2021-02-06 11:50   ` Stefan Wahren
  2021-02-05 13:52 ` [RFC/PATCH 10/11] ARM: configs: Enable DRM_V3D Nicolas Saenz Julienne
  2021-02-05 13:52 ` [RFC/PATCH 11/11] arm64: config: " Nicolas Saenz Julienne
  10 siblings, 1 reply; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 13:52 UTC (permalink / raw)
  To: f.fainelli, Saenz Julienne, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Rob Herring
  Cc: phil, wahrenst, linux-kernel

This enables V3D for bcm2711 (used in the Raspberry Pi 4).

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
 arch/arm/boot/dts/bcm2711.dtsi | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/arch/arm/boot/dts/bcm2711.dtsi b/arch/arm/boot/dts/bcm2711.dtsi
index 537498a93a3a..dd8376f474db 100644
--- a/arch/arm/boot/dts/bcm2711.dtsi
+++ b/arch/arm/boot/dts/bcm2711.dtsi
@@ -548,6 +548,18 @@ genet_mdio: mdio@e14 {
 				#size-cells = <0x1>;
 			};
 		};
+
+		v3d: gpu@7ec04000 {
+			compatible = "brcm,bcm2711-v3d";
+			reg = <0x0 0x7ec00000 0x4000>,
+			      <0x0 0x7ec04000 0x4000>;
+			reg-names = "hub", "core0";
+
+			power-domains = <&pm BCM2835_POWER_DOMAIN_GRAFX_V3D>;
+			resets = <&pm BCM2835_RESET_V3D>;
+			clocks = <&firmware_clocks 5>;
+			interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
+		};
 	};
 };
 
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC/PATCH 10/11] ARM: configs: Enable DRM_V3D
  2021-02-05 13:52 [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement Nicolas Saenz Julienne
                   ` (8 preceding siblings ...)
  2021-02-05 13:52 ` [RFC/PATCH 09/11] ARM: dts: bcm2711: Enable V3D Nicolas Saenz Julienne
@ 2021-02-05 13:52 ` Nicolas Saenz Julienne
  2021-02-05 13:52 ` [RFC/PATCH 11/11] arm64: config: " Nicolas Saenz Julienne
  10 siblings, 0 replies; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 13:52 UTC (permalink / raw)
  To: f.fainelli, Saenz Julienne, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, linux-kernel
  Cc: phil, wahrenst, Russell King

BCM2711, the SoC used on the Raspberry Pi 4 has a different GPU than its
predecessors. Enable it.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
 arch/arm/configs/multi_v7_defconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig
index 3823da605430..0ad4ffe4e6f6 100644
--- a/arch/arm/configs/multi_v7_defconfig
+++ b/arch/arm/configs/multi_v7_defconfig
@@ -713,6 +713,7 @@ CONFIG_DRM_TOSHIBA_TC358764=m
 CONFIG_DRM_I2C_ADV7511=m
 CONFIG_DRM_I2C_ADV7511_AUDIO=y
 CONFIG_DRM_STI=m
+CONFIG_DRM_V3D=m
 CONFIG_DRM_VC4=m
 CONFIG_DRM_ETNAVIV=m
 CONFIG_DRM_MXSFB=m
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC/PATCH 11/11] arm64: config: Enable DRM_V3D
  2021-02-05 13:52 [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement Nicolas Saenz Julienne
                   ` (9 preceding siblings ...)
  2021-02-05 13:52 ` [RFC/PATCH 10/11] ARM: configs: Enable DRM_V3D Nicolas Saenz Julienne
@ 2021-02-05 13:52 ` Nicolas Saenz Julienne
  10 siblings, 0 replies; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 13:52 UTC (permalink / raw)
  To: f.fainelli, Saenz Julienne, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, linux-kernel
  Cc: phil, wahrenst, Catalin Marinas, Will Deacon

BCM2711, the SoC used on the Raspberry Pi 4 has a different GPU than its
predecessors. Enable it.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
 arch/arm64/configs/defconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
index 5348c0be2fcf..bc31b07c4c63 100644
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@ -698,6 +698,7 @@ CONFIG_DRM_I2C_ADV7511_AUDIO=y
 CONFIG_DRM_DW_HDMI_AHB_AUDIO=m
 CONFIG_DRM_DW_HDMI_CEC=m
 CONFIG_DRM_IMX_DCSS=m
+CONFIG_DRM_V3D=m
 CONFIG_DRM_VC4=m
 CONFIG_DRM_ETNAVIV=m
 CONFIG_DRM_HISI_HIBMC=m
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [RFC/PATCH 05/11] soc: bcm: bcm2835-power: Add support for BCM2711's ARSAN ASB
  2021-02-05 13:52 ` [RFC/PATCH 05/11] soc: bcm: bcm2835-power: Add support for BCM2711's ARSAN ASB Nicolas Saenz Julienne
@ 2021-02-05 16:56   ` Florian Fainelli
  2021-02-05 18:30     ` Nicolas Saenz Julienne
  0 siblings, 1 reply; 17+ messages in thread
From: Florian Fainelli @ 2021-02-05 16:56 UTC (permalink / raw)
  To: Nicolas Saenz Julienne, f.fainelli, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Ray Jui,
	Scott Branden
  Cc: phil, wahrenst, linux-kernel

On 2/5/21 5:52 AM, Nicolas Saenz Julienne wrote:
> In BCM2711 the new ARGON ASB took over V3D. The old ASB is still present
> with the ISP and H264 bits, and V3D is in the same place in the new ASB
> as the old one.
> 
> Use the fact that 'pm->arsan_asb' is populated as a hint that we're on
> BCM2711. On top of that introduce the macro ASB_BASE() which will select
> the correct ASB register base, based on whether we're trying to access
> V3D and which platform we're on.

Your subject has a typo, you most likely intended to write "Argon ASB",
right?

I will review the series a little later today.
-- 
Florian

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [RFC/PATCH 05/11] soc: bcm: bcm2835-power: Add support for BCM2711's ARSAN ASB
  2021-02-05 16:56   ` Florian Fainelli
@ 2021-02-05 18:30     ` Nicolas Saenz Julienne
  0 siblings, 0 replies; 17+ messages in thread
From: Nicolas Saenz Julienne @ 2021-02-05 18:30 UTC (permalink / raw)
  To: phil, Florian Fainelli, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Ray Jui,
	Scott Branden
  Cc: wahrenst, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1211 bytes --]

Hi Florian, Phil,

On Fri, 2021-02-05 at 08:56 -0800, Florian Fainelli wrote:
> On 2/5/21 5:52 AM, Nicolas Saenz Julienne wrote:
> > In BCM2711 the new ARGON ASB took over V3D. The old ASB is still present
> > with the ISP and H264 bits, and V3D is in the same place in the new ASB
> > as the old one.
> > 
> > Use the fact that 'pm->arsan_asb' is populated as a hint that we're on
> > BCM2711. On top of that introduce the macro ASB_BASE() which will select
> > the correct ASB register base, based on whether we're trying to access
> > V3D and which platform we're on.
> 
> Your subject has a typo, you most likely intended to write "Argon ASB",
> right?

Yes, sorry for that, the typo is also present in code. I mindlessly decided
both words meant the same and went with it...

So, for the record, s/arsan/argon/ should be applied on all patches, binding is
fine in that regards. On the other hand, the old arsan/rpivid ASB is referenced
as 'asb' in code, and as 'arsan' in the bindings, I'll rename both to 'rpivid'
in v2.

Actually, if all this is too confusing, let me know and I'll send a v2 right
away.

> I will review the series a little later today.

Thanks!
Nicolas


[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [RFC/PATCH 01/11] dt-bindings: soc: bcm: bcm2835-pm: Convert bindings to DT schema
  2021-02-05 13:52 ` [RFC/PATCH 01/11] dt-bindings: soc: bcm: bcm2835-pm: Convert bindings to DT schema Nicolas Saenz Julienne
@ 2021-02-06 11:34   ` Stefan Wahren
  0 siblings, 0 replies; 17+ messages in thread
From: Stefan Wahren @ 2021-02-06 11:34 UTC (permalink / raw)
  To: Nicolas Saenz Julienne, f.fainelli, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Ray Jui,
	Scott Branden
  Cc: phil, Rob Herring, linux-kernel

Hi,

Am 05.02.21 um 14:52 schrieb Nicolas Saenz Julienne:
> This converts the brcm,bcm2835-pc bindings from text to proper schema.

s/bcm2835-pc/bcm2835-pm/

>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> ---
>  .../bindings/soc/bcm/brcm,bcm2835-pm.txt      | 46 -----------
>  .../bindings/soc/bcm/brcm,bcm2835-pm.yaml     | 79 +++++++++++++++++++
>  2 files changed, 79 insertions(+), 46 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.txt
>  create mode 100644 Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml
>
> diff --git a/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.txt b/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.txt
> deleted file mode 100644
> index 72ff033565e5..000000000000
> --- a/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.txt
> +++ /dev/null
> @@ -1,46 +0,0 @@
> -BCM2835 PM (Power domains, watchdog)
> -
> -The PM block controls power domains and some reset lines, and includes
> -a watchdog timer.  This binding supersedes the brcm,bcm2835-pm-wdt
> -binding which covered some of PM's register range and functionality.
> -
> -Required properties:
> -
> -- compatible:		Should be "brcm,bcm2835-pm"
> -- reg:			Specifies base physical address and size of the two
> -			  register ranges ("PM" and "ASYNC_BRIDGE" in that
> -			  order)
> -- clocks:		a) v3d: The V3D clock from CPRMAN
> -			b) peri_image: The PERI_IMAGE clock from CPRMAN
> -			c) h264: The H264 clock from CPRMAN
> -			d) isp: The ISP clock from CPRMAN
> -- #reset-cells: 	Should be 1.  This property follows the reset controller
> -			  bindings[1].
> -- #power-domain-cells:	Should be 1.  This property follows the power domain
> -			  bindings[2].
> -
> -Optional properties:
> -
> -- timeout-sec:		Contains the watchdog timeout in seconds
> -- system-power-controller: Whether the watchdog is controlling the
> -    system power.  This node follows the power controller bindings[3].
> -
> -[1] Documentation/devicetree/bindings/reset/reset.txt
> -[2] Documentation/devicetree/bindings/power/power-domain.yaml
> -[3] Documentation/devicetree/bindings/power/power-controller.txt
> -
> -Example:
> -
> -pm {
> -	compatible = "brcm,bcm2835-pm", "brcm,bcm2835-pm-wdt";
> -	#power-domain-cells = <1>;
> -	#reset-cells = <1>;
> -	reg = <0x7e100000 0x114>,
> -	      <0x7e00a000 0x24>;
> -	clocks = <&clocks BCM2835_CLOCK_V3D>,
> -		 <&clocks BCM2835_CLOCK_PERI_IMAGE>,
> -		 <&clocks BCM2835_CLOCK_H264>,
> -		 <&clocks BCM2835_CLOCK_ISP>;
> -	clock-names = "v3d", "peri_image", "h264", "isp";
> -	system-power-controller;
> -};
> diff --git a/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml b/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml
> new file mode 100644
> index 000000000000..5e0555fc0666
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml
> @@ -0,0 +1,79 @@
> +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
> +%YAML 1.2
> +---
> +$id: "http://devicetree.org/schemas/soc/bcm/brcm,bcm2835-pm.yaml#"
> +$schema: "http://devicetree.org/meta-schemas/core.yaml#"
> +
> +title: BCM2835 PM (Power domains, watchdog)
> +
> +description: |
> +  The PM block controls power domains and some reset lines, and includes a
> +  watchdog timer.
> +
> +maintainers:
> +  - Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> +
> +allOf:
> +  - $ref: ../../watchdog/watchdog.yaml#
> +
> +properties:
> +  compatible:
> +    items:
> +      - enum:
> +          - brcm,bcm2835-pm
> +      - const: brcm,bcm2835-pm-wdt
> +
> +  reg:
> +    minItems: 1
> +    maxItems: 2
> +    description: Specifies base physical address and size of the two register
> +                 ranges, "PM" and "ASYNC_BRIDGE" in that order.
> +
> +  "#power-domain-cells":
> +    const: 1
> +
> +  "#reset-cells":
> +    const: 1
> +
> +  clocks:
> +    minItems: 4
> +    maxItems: 4
> +
> +  clock-names:
> +    items:
> +      - const: v3d
> +      - const: peri_image
> +      - const: h264
> +      - const: isp
> +
> +  system-power-controller:
> +    type: boolean
> +
> +  timeout-sec: true
> +
> +required:
> +  - compatible
> +  - reg
> +  - "#power-domain-cells"
> +  - "#reset-cells"
> +  - clocks
> +
> +additionalProperties: false
> +
> +examples:
> +  - |
> +    #include <dt-bindings/clock/bcm2835.h>
> +
> +    watchdog@0 {
Shouldn't the 0 been replaced by a register?
> +        compatible = "brcm,bcm2835-pm", "brcm,bcm2835-pm-wdt";
> +        #power-domain-cells = <1>;
> +        #reset-cells = <1>;
> +        reg = <0x7e100000 0x114>,
> +              <0x7e00a000 0x24>;
> +        clocks = <&clocks BCM2835_CLOCK_V3D>,
> +        	 <&clocks BCM2835_CLOCK_PERI_IMAGE>,
> +        	 <&clocks BCM2835_CLOCK_H264>,
> +        	 <&clocks BCM2835_CLOCK_ISP>;
> +        clock-names = "v3d", "peri_image", "h264", "isp";
> +        system-power-controller;
> +    };

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [RFC/PATCH 02/11] dt-bindings: soc: bcm: brcm,bcm2835-pm: Add support for bcm2711
  2021-02-05 13:52 ` [RFC/PATCH 02/11] dt-bindings: soc: bcm: brcm,bcm2835-pm: Add support for bcm2711 Nicolas Saenz Julienne
@ 2021-02-06 11:36   ` Stefan Wahren
  0 siblings, 0 replies; 17+ messages in thread
From: Stefan Wahren @ 2021-02-06 11:36 UTC (permalink / raw)
  To: Nicolas Saenz Julienne, f.fainelli, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Ray Jui,
	Scott Branden
  Cc: phil, Rob Herring, linux-kernel

Hi,

Am 05.02.21 um 14:52 schrieb Nicolas Saenz Julienne:
> Add a new compatible string for bcm2711 and the option to provide a
> third reg property for the board's new Argon ASB.
>
> The new Argon ASB took over V3D, which is our only consumer of this
> driver so far. The old ASB is still be present with ISP and H264 bits
> but no V3D.
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> ---
>  .../devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml       | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml b/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml
> index 5e0555fc0666..a1f2e25e68db 100644
> --- a/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml
> +++ b/Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml
> @@ -21,13 +21,14 @@ properties:
>      items:
>        - enum:
>            - brcm,bcm2835-pm
> +          - brcm,bcm2711-pm
>        - const: brcm,bcm2835-pm-wdt
>
>    reg:
>      minItems: 1
> -    maxItems: 2
> -    description: Specifies base physical address and size of the two register
> -                 ranges, "PM" and "ASYNC_BRIDGE" in that order.
> +    maxItems: 3
> +    description: Specifies base physical address and size of the register
> +                 ranges, "PM", "ASYNC_BRIDGE" and "ARGON_BRIDGE" in that order.
i know it's not trivial, but maybe we have reached the point to
introduce reg-names here.
>
>    "#power-domain-cells":
>      const: 1

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [RFC/PATCH 09/11] ARM: dts: bcm2711: Enable V3D
  2021-02-05 13:52 ` [RFC/PATCH 09/11] ARM: dts: bcm2711: Enable V3D Nicolas Saenz Julienne
@ 2021-02-06 11:50   ` Stefan Wahren
  0 siblings, 0 replies; 17+ messages in thread
From: Stefan Wahren @ 2021-02-06 11:50 UTC (permalink / raw)
  To: Nicolas Saenz Julienne, f.fainelli, bcm-kernel-feedback-list,
	linux-rpi-kernel, linux-arm-kernel, devicetree, Rob Herring
  Cc: phil, linux-kernel

Hi,

Am 05.02.21 um 14:52 schrieb Nicolas Saenz Julienne:
> This enables V3D for bcm2711 (used in the Raspberry Pi 4).
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> ---
>  arch/arm/boot/dts/bcm2711.dtsi | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
>
> diff --git a/arch/arm/boot/dts/bcm2711.dtsi b/arch/arm/boot/dts/bcm2711.dtsi
> index 537498a93a3a..dd8376f474db 100644
> --- a/arch/arm/boot/dts/bcm2711.dtsi
> +++ b/arch/arm/boot/dts/bcm2711.dtsi
> @@ -548,6 +548,18 @@ genet_mdio: mdio@e14 {
>  				#size-cells = <0x1>;
>  			};
>  		};
> +
> +		v3d: gpu@7ec04000 {
just a nit. I prefer the lowest register value here.
> +			compatible = "brcm,bcm2711-v3d";
> +			reg = <0x0 0x7ec00000 0x4000>,
> +			      <0x0 0x7ec04000 0x4000>;
> +			reg-names = "hub", "core0";
> +
> +			power-domains = <&pm BCM2835_POWER_DOMAIN_GRAFX_V3D>;
> +			resets = <&pm BCM2835_RESET_V3D>;
> +			clocks = <&firmware_clocks 5>;
> +			interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
> +		};
>  	};
>  };
>

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2021-02-06 11:52 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-05 13:52 [RFC/PATCH 00/11] Raspberry PI 4 V3D enablement Nicolas Saenz Julienne
2021-02-05 13:52 ` [RFC/PATCH 01/11] dt-bindings: soc: bcm: bcm2835-pm: Convert bindings to DT schema Nicolas Saenz Julienne
2021-02-06 11:34   ` Stefan Wahren
2021-02-05 13:52 ` [RFC/PATCH 02/11] dt-bindings: soc: bcm: brcm,bcm2835-pm: Add support for bcm2711 Nicolas Saenz Julienne
2021-02-06 11:36   ` Stefan Wahren
2021-02-05 13:52 ` [RFC/PATCH 03/11] ARM: dts: bcm2711: Use proper compatible in PM/Watchdog node Nicolas Saenz Julienne
2021-02-05 13:52 ` [RFC/PATCH 04/11] mfd: bcm2835-pm: Add support for BCM2711 Nicolas Saenz Julienne
2021-02-05 13:52 ` [RFC/PATCH 05/11] soc: bcm: bcm2835-power: Add support for BCM2711's ARSAN ASB Nicolas Saenz Julienne
2021-02-05 16:56   ` Florian Fainelli
2021-02-05 18:30     ` Nicolas Saenz Julienne
2021-02-05 13:52 ` [RFC/PATCH 06/11] soc: bcm: bcm2835-power: Bypass power_on/off() calls Nicolas Saenz Julienne
2021-02-05 13:52 ` [RFC/PATCH 07/11] drm/v3d: Get rid of pm code Nicolas Saenz Julienne
2021-02-05 13:52 ` [RFC/PATCH 08/11] drm/v3d: Add support for bcm2711 Nicolas Saenz Julienne
2021-02-05 13:52 ` [RFC/PATCH 09/11] ARM: dts: bcm2711: Enable V3D Nicolas Saenz Julienne
2021-02-06 11:50   ` Stefan Wahren
2021-02-05 13:52 ` [RFC/PATCH 10/11] ARM: configs: Enable DRM_V3D Nicolas Saenz Julienne
2021-02-05 13:52 ` [RFC/PATCH 11/11] arm64: config: " Nicolas Saenz Julienne

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).