mbox series

[v4,00/15] Raspberry PI 4 V3D enablement

Message ID 20220213225646.67761-1-pbrobinson@gmail.com
Headers show
Series Raspberry PI 4 V3D enablement | expand

Message

Peter Robinson Feb. 13, 2022, 10:56 p.m. UTC
This is purely a rebased of Nicolas's v3 patch set from around a year ago.

I've tested this using mesa 21.3.x and Wayland/Gnome on Fedora 35, it's 
more or less stable with basic testing.

From his original cover letter:

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 #9 ("soc: bcm: bcm2835-power: Bypass power_on/off() calls"), 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 #11 ("drm/v3d: Get rid of pm code")

---

Changes since v3:
- Rebase to 5.17-rc1

Changes since v2:
 - Correct ASB names
 - Address dt-binding comments

Changes since v1:
 - Use 'reg-names'
 - Correct ASB names
 - Add missing binding patch for V3D
 - Address Stefan's comments

Nicolas Saenz Julienne (11):
  dt-bindings: soc: bcm: bcm2835-pm: Convert bindings to DT schema
  dt-bindings: soc: bcm: bcm2835-pm: Introduce reg-names
  dt-bindings: soc: bcm: bcm2835-pm: Add support for bcm2711
  ARM: dts: bcm2835/bcm2711: Introduce reg-names in watchdog node
  ARM: dts: bcm2711: Use proper compatible in PM/Watchdog node
  mfd: bcm2835-pm: Use 'reg-names' to get resources
  mfd: bcm2835-pm: Add support for BCM2711
  soc: bcm: bcm2835-power: Add support for BCM2711's RPiVid ASB
  soc: bcm: bcm2835-power: Bypass power_on/off() calls
  dt-bindings: gpu: v3d: Add BCM2711's compatible
  arm64: config: Enable DRM_V3D

Peter Robinson (4):
  drm/v3d: Get rid of pm code
  drm/v3d: Add support for bcm2711
  ARM: dts: bcm2711: Enable V3D
  ARM: configs: Enable DRM_V3D

 .../devicetree/bindings/gpu/brcm,bcm-v3d.yaml |  1 +
 .../bindings/soc/bcm/brcm,bcm2835-pm.txt      | 46 ----------
 .../bindings/soc/bcm/brcm,bcm2835-pm.yaml     | 87 +++++++++++++++++++
 arch/arm/boot/dts/bcm2711.dtsi                | 15 +++-
 arch/arm/boot/dts/bcm2835-common.dtsi         |  1 +
 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                 | 12 +--
 drivers/mfd/bcm2835-pm.c                      | 80 ++++++++++++-----
 drivers/soc/bcm/bcm2835-power.c               | 74 ++++++++++------
 include/linux/mfd/bcm2835-pm.h                |  1 +
 14 files changed, 218 insertions(+), 133 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

Comments

Stefan Wahren Feb. 19, 2022, 12:12 p.m. UTC | #1
Hi Peter,

Am 13.02.22 um 23:56 schrieb Peter Robinson:
> This is purely a rebased of Nicolas's v3 patch set from around a year ago.
>
> I've tested this using mesa 21.3.x and Wayland/Gnome on Fedora 35, it's 
> more or less stable with basic testing.
do you plan to submit a follow-up series?
Peter Robinson Feb. 19, 2022, 12:50 p.m. UTC | #2
On Sat, Feb 19, 2022 at 12:12 PM Stefan Wahren <stefan.wahren@i2se.com> wrote:
>
> Hi Peter,
>
> Am 13.02.22 um 23:56 schrieb Peter Robinson:
> > This is purely a rebased of Nicolas's v3 patch set from around a year ago.
> >
> > I've tested this using mesa 21.3.x and Wayland/Gnome on Fedora 35, it's
> > more or less stable with basic testing.
> do you plan to submit a follow-up series?

You mean a v5 of this one? Yes, I was just awaiting to see if I get
any more feedback, I will probably get time to do it tomorrow.
Stefan Wahren Feb. 19, 2022, 3:21 p.m. UTC | #3
Am 13.02.22 um 23:56 schrieb Peter Robinson:
> From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
>
> In BCM2711 the new RPiVid 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 resources, so get both of them and pass them into
> 'bcm2835-power,' which will take care of selecting which one to use
> accordingly.
>
> Since the RPiVid ASB's resources were being provided prior to formalizing
> the bindings[1], also support the old firmwares that didn't use
> 'reg-names.'
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
>
> [1] See: 7dbe8c62ceeb ("ARM: dts: Add minimal Raspberry Pi 4 support")
>
> ---
> Changes since v2: 
>  - Correct names again!
>                         
> Changes since v1:
>  - Use reg-names
>  - Correct ASB names
>
>  drivers/mfd/bcm2835-pm.c       | 25 +++++++++++++++++++++++--
>  include/linux/mfd/bcm2835-pm.h |  1 +
>  2 files changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mfd/bcm2835-pm.c b/drivers/mfd/bcm2835-pm.c
> index 36fede92775c..a06e9cf19b64 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)
> +
Unfortunately, i don't remember the decision to use bits here. It's just
unexpected, no strong opinion.
Stefan Wahren Feb. 19, 2022, 3:39 p.m. UTC | #4
Hi Peter,

Am 13.02.22 um 23:56 schrieb Peter Robinson:
> From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
>
> In BCM2711 the new RPiVid 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->rpivid_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>
> Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
> ---
> Changes since v2:
>  - Correct names again
>
> Changes since v1:
>  - Correct names
>
>  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..eea31f75dc64 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->rpivid_asb ? power->rpivid_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))
just a general note: passing parameter to decide which register should
be used is not the preferred way. It's harder to maintain. A more data
driven approach is better in the long run.
>  
>  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;
> +	/* RPiVid bridge registers. */
> +	void __iomem		*rpivid_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->rpivid_asb = pm->rpivid_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->rpivid_asb) {
> +		id = ASB_READ(ASB_AXI_BRDG_ID, true);
> +		if (id != 0x62726467 /* "BRDG" */) {

It would be nice to use a define for this id, since we use it twice.

Best regards

> +			dev_err(dev, "RPiVid 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),
Stefan Wahren Feb. 19, 2022, 3:43 p.m. UTC | #5
Hi Peter,

Am 13.02.22 um 23:56 schrieb Peter Robinson:
> This enables V3D for bcm2711 (used in the Raspberry Pi 4).
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
> ---
> Changes since v3:
> - Minor updates for rebase
>
> Changes since v1:
>  - Correct node's name address 
>
>  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 171fc5d2acef..9514c0ba481c 100644
> --- a/arch/arm/boot/dts/bcm2711.dtsi
> +++ b/arch/arm/boot/dts/bcm2711.dtsi
> @@ -551,6 +551,18 @@ genet_mdio: mdio@e14 {
>  				#size-cells = <0x0>;
>  			};
>  		};
> +
> +		v3d: gpu@7ec00000 {
> +			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>;

please move the firmware clock usage to bcm2711-rpi.dtsi, because it's
not defined here.

Best regards

> +			interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
> +		};
>  	};
>  };
>
Stefan Wahren Feb. 19, 2022, 3:48 p.m. UTC | #6
Hi Peter,

Am 13.02.22 um 23:56 schrieb Peter Robinson:
> BCM2711, the SoC used on the Raspberry Pi 4 has a different GPU than its
> predecessors. Enable it.
Marek Szyprowski enabled Raspberry Pi 4 support in bcm2835_defconfig.
Could you please enabled V3D there too?
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
> ---
> Changes since v1:
>  - Correct node's name address 
>
>  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 8863fa969ede..d203587194a1 100644
> --- a/arch/arm/configs/multi_v7_defconfig
> +++ b/arch/arm/configs/multi_v7_defconfig
> @@ -706,6 +706,7 @@ CONFIG_DRM_IMX_PARALLEL_DISPLAY=m
>  CONFIG_DRM_IMX_TVE=m
>  CONFIG_DRM_IMX_LDB=m
>  CONFIG_DRM_IMX_HDMI=m
> +CONFIG_DRM_V3D=m
>  CONFIG_DRM_VC4=m
>  CONFIG_DRM_ETNAVIV=m
>  CONFIG_DRM_MXSFB=m
Peter Robinson Feb. 20, 2022, 7:27 p.m. UTC | #7
Hi Stefan,

On Sat, Feb 19, 2022 at 3:39 PM Stefan Wahren <stefan.wahren@i2se.com> wrote:
>
> Hi Peter,
>
> Am 13.02.22 um 23:56 schrieb Peter Robinson:
> > From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> >
> > In BCM2711 the new RPiVid 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->rpivid_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>
> > Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
> > ---
> > Changes since v2:
> >  - Correct names again
> >
> > Changes since v1:
> >  - Correct names
> >
> >  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..eea31f75dc64 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->rpivid_asb ? power->rpivid_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))
> just a general note: passing parameter to decide which register should
> be used is not the preferred way. It's harder to maintain. A more data
> driven approach is better in the long run.
> >
> >  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;
> > +     /* RPiVid bridge registers. */
> > +     void __iomem            *rpivid_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->rpivid_asb = pm->rpivid_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->rpivid_asb) {
> > +             id = ASB_READ(ASB_AXI_BRDG_ID, true);
> > +             if (id != 0x62726467 /* "BRDG" */) {
>
> It would be nice to use a define for this id, since we use it twice.

Any preferences or suggestion as to what it should be called?

Also are you prepared to add/ok if I add your reviewed-by to the
patches you've reviewed?

Peter

> Best regards
>
> > +                     dev_err(dev, "RPiVid 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),
>
Stefan Wahren Feb. 20, 2022, 9:14 p.m. UTC | #8
Hi Peter,

Am 20.02.22 um 20:27 schrieb Peter Robinson:
> Hi Stefan,
>
> On Sat, Feb 19, 2022 at 3:39 PM Stefan Wahren <stefan.wahren@i2se.com> wrote:
>> Hi Peter,
>>
>> Am 13.02.22 um 23:56 schrieb Peter Robinson:
>>> From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
>>>
>>> In BCM2711 the new RPiVid 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->rpivid_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>
>>> Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
>>> ---
>>> Changes since v2:
>>>  - Correct names again
>>>
>>> Changes since v1:
>>>  - Correct names
>>>
>>>  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..eea31f75dc64 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->rpivid_asb ? power->rpivid_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))
>> just a general note: passing parameter to decide which register should
>> be used is not the preferred way. It's harder to maintain. A more data
>> driven approach is better in the long run.
>>>  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;
>>> +     /* RPiVid bridge registers. */
>>> +     void __iomem            *rpivid_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->rpivid_asb = pm->rpivid_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->rpivid_asb) {
>>> +             id = ASB_READ(ASB_AXI_BRDG_ID, true);
>>> +             if (id != 0x62726467 /* "BRDG" */) {
>> It would be nice to use a define for this id, since we use it twice.
> Any preferences or suggestion as to what it should be called?
Unfortunately i don't have any insight into these register. So a
suggestion would be BCM2835_BRDG_ID
>
> Also are you prepared to add/ok if I add your reviewed-by to the
> patches you've reviewed?

I will give my reviewed-by to the next version. I hope we will get more
feedback. So please add <maxime@cerno.tech> and <melissa.srw@gmail.com>
for the next round.

Best regards

>
> Peter
>
>> Best regards
>>
>>> +                     dev_err(dev, "RPiVid 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),
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Adrien Thierry Feb. 24, 2022, 7:56 p.m. UTC | #9
Hi,

> @@ -193,6 +193,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" },
>  	{},
>  };

The downstream tree [1] uses 'brcm,2711-v3d'. Is there a reason for not
using the same compatible string ? Having the same string would allow
using downstream dtbs (and overlays) with the upstream kernel.

Adrien

[1] https://github.com/raspberrypi/linux/blob/rpi-5.15.y/drivers/gpu/drm/v3d/v3d_drv.c