diff mbox series

[v2,1/2] arm: rpi: Add function to trigger VL805's firmware load

Message ID 20200430130433.11248-2-nsaenzjulienne@suse.de
State Superseded
Headers show
Series Raspberry Pi 4 VL805 firmware load | expand

Commit Message

Nicolas Saenz Julienne April 30, 2020, 1:04 p.m. UTC
On the Raspberry Pi 4, after a PCI reset, VL805's (a xHCI chip) firmware
may either be loaded directly from an EEPROM or, if not present, by the
SoC's VideoCore (the SoC's co-processor). Introduce the function that
informs VideoCore that VL805 may need its firmware loaded.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne at suse.de>

---
Changes since v1:
 - Rename function so it's not mistaken with regular firmware loading

 arch/arm/mach-bcm283x/include/mach/mbox.h | 13 +++++++
 arch/arm/mach-bcm283x/include/mach/msg.h  |  7 ++++
 arch/arm/mach-bcm283x/msg.c               | 43 +++++++++++++++++++++++
 3 files changed, 63 insertions(+)

Comments

Mark Kettenis April 30, 2020, 1:31 p.m. UTC | #1
> From: Nicolas Saenz Julienne <nsaenzjulienne at suse.de>
> Date: Thu, 30 Apr 2020 15:04:32 +0200
> 
> On the Raspberry Pi 4, after a PCI reset, VL805's (a xHCI chip) firmware
> may either be loaded directly from an EEPROM or, if not present, by the
> SoC's VideoCore (the SoC's co-processor). Introduce the function that
> informs VideoCore that VL805 may need its firmware loaded.
> 
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne at suse.de>
> 
> ---
> Changes since v1:
>  - Rename function so it's not mistaken with regular firmware loading
> 
>  arch/arm/mach-bcm283x/include/mach/mbox.h | 13 +++++++
>  arch/arm/mach-bcm283x/include/mach/msg.h  |  7 ++++
>  arch/arm/mach-bcm283x/msg.c               | 43 +++++++++++++++++++++++
>  3 files changed, 63 insertions(+)
> 
> diff --git a/arch/arm/mach-bcm283x/include/mach/mbox.h b/arch/arm/mach-bcm283x/include/mach/mbox.h
> index 60e226ce1d..2ae2d3d97c 100644
> --- a/arch/arm/mach-bcm283x/include/mach/mbox.h
> +++ b/arch/arm/mach-bcm283x/include/mach/mbox.h
> @@ -491,6 +491,19 @@ struct bcm2835_mbox_tag_set_palette {
>  	} body;
>  };
>  
> +#define BCM2835_MBOX_TAG_NOTIFY_XHCI_RESET          0x00030058
> +
> +struct bcm2835_mbox_tag_pci_dev_addr {
> +	struct bcm2835_mbox_tag_hdr tag_hdr;
> +	union {
> +		struct {
> +			u32 dev_addr;
> +		} req;
> +		struct {
> +		} resp;
> +	} body;
> +};
> +
>  /*
>   * Pass a raw u32 message to the VC, and receive a raw u32 back.
>   *
> diff --git a/arch/arm/mach-bcm283x/include/mach/msg.h b/arch/arm/mach-bcm283x/include/mach/msg.h
> index 4afb08631b..e45c1bf010 100644
> --- a/arch/arm/mach-bcm283x/include/mach/msg.h
> +++ b/arch/arm/mach-bcm283x/include/mach/msg.h
> @@ -48,4 +48,11 @@ int bcm2835_set_video_params(int *widthp, int *heightp, int depth_bpp,
>  			     int pixel_order, int alpha_mode, ulong *fb_basep,
>  			     ulong *fb_sizep, int *pitchp);
>  
> +/**
> + * bcm2711_load_vl805_firmware() - get vl805's firmware loaded
> + *
> + * @return 0 if OK, -EIO on error
> + */
> +int bcm2711_notify_vl805_reset(void);

Now the comment and function prototype don't agree :(.

> +
>  #endif
> diff --git a/arch/arm/mach-bcm283x/msg.c b/arch/arm/mach-bcm283x/msg.c
> index 94b75283f8..a338190d33 100644
> --- a/arch/arm/mach-bcm283x/msg.c
> +++ b/arch/arm/mach-bcm283x/msg.c
> @@ -40,6 +40,12 @@ struct msg_setup {
>  	u32 end_tag;
>  };
>  
> +struct msg_notify_vl805_reset {
> +	struct bcm2835_mbox_hdr hdr;
> +	struct bcm2835_mbox_tag_pci_dev_addr dev_addr;
> +	u32 end_tag;
> +};
> +
>  int bcm2835_power_on_module(u32 module)
>  {
>  	ALLOC_CACHE_ALIGN_BUFFER(struct msg_set_power_state, msg_pwr, 1);
> @@ -151,3 +157,40 @@ int bcm2835_set_video_params(int *widthp, int *heightp, int depth_bpp,
>  
>  	return 0;
>  }
> +
> +/*
> + * On the Raspberry Pi 4, after a PCI reset, VL805's (the xHCI chip) firmware
> + * may either be loaded directly from an EEPROM or, if not present, by the
> + * SoC's VideoCore. This informs VideoCore that VL805 needs its firmware
> + * loaded.
> + */
> +int bcm2711_notify_vl805_reset(void)
> +{
> +	ALLOC_CACHE_ALIGN_BUFFER(struct msg_notify_vl805_reset,
> +				 msg_notify_vl805_reset, 1);
> +	int ret;
> +
> +	BCM2835_MBOX_INIT_HDR(msg_notify_vl805_reset);
> +	BCM2835_MBOX_INIT_TAG(&msg_notify_vl805_reset->dev_addr,
> +			      NOTIFY_XHCI_RESET);
> +
> +	/*
> +	 * The pci device address is expected like this:
> +	 *
> +	 *   PCI_BUS << 20 | PCI_SLOT << 15 | PCI_FUNC << 12
> +	 *
> +	 * But since RPi4's PCIe setup is hardwired, we know the address in
> +	 * advance.
> +	 */
> +	msg_notify_vl805_reset->dev_addr.body.req.dev_addr = 0x100000;
> +
> +	ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN,
> +				     &msg_notify_vl805_reset->hdr);
> +	if (ret) {
> +		printf("bcm2711: Faild to load vl805's firmware, %d\n", ret);
> +		return -EIO;
> +	}
> +
> +	return 0;
> +}
> +
> -- 
> 2.26.2
> 
>
Nicolas Saenz Julienne April 30, 2020, 1:33 p.m. UTC | #2
On Thu, 2020-04-30 at 15:31 +0200, Mark Kettenis wrote:
> > From: Nicolas Saenz Julienne <nsaenzjulienne at suse.de>
> > Date: Thu, 30 Apr 2020 15:04:32 +0200
> > 
> > On the Raspberry Pi 4, after a PCI reset, VL805's (a xHCI chip) firmware
> > may either be loaded directly from an EEPROM or, if not present, by the
> > SoC's VideoCore (the SoC's co-processor). Introduce the function that
> > informs VideoCore that VL805 may need its firmware loaded.
> > 
> > Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne at suse.de>
> > 
> > ---
> > Changes since v1:
> >  - Rename function so it's not mistaken with regular firmware loading
> > 
> >  arch/arm/mach-bcm283x/include/mach/mbox.h | 13 +++++++
> >  arch/arm/mach-bcm283x/include/mach/msg.h  |  7 ++++
> >  arch/arm/mach-bcm283x/msg.c               | 43 +++++++++++++++++++++++
> >  3 files changed, 63 insertions(+)
> > 
> > diff --git a/arch/arm/mach-bcm283x/include/mach/mbox.h b/arch/arm/mach-
> > bcm283x/include/mach/mbox.h
> > index 60e226ce1d..2ae2d3d97c 100644
> > --- a/arch/arm/mach-bcm283x/include/mach/mbox.h
> > +++ b/arch/arm/mach-bcm283x/include/mach/mbox.h
> > @@ -491,6 +491,19 @@ struct bcm2835_mbox_tag_set_palette {
> >  	} body;
> >  };
> >  
> > +#define BCM2835_MBOX_TAG_NOTIFY_XHCI_RESET          0x00030058
> > +
> > +struct bcm2835_mbox_tag_pci_dev_addr {
> > +	struct bcm2835_mbox_tag_hdr tag_hdr;
> > +	union {
> > +		struct {
> > +			u32 dev_addr;
> > +		} req;
> > +		struct {
> > +		} resp;
> > +	} body;
> > +};
> > +
> >  /*
> >   * Pass a raw u32 message to the VC, and receive a raw u32 back.
> >   *
> > diff --git a/arch/arm/mach-bcm283x/include/mach/msg.h b/arch/arm/mach-
> > bcm283x/include/mach/msg.h
> > index 4afb08631b..e45c1bf010 100644
> > --- a/arch/arm/mach-bcm283x/include/mach/msg.h
> > +++ b/arch/arm/mach-bcm283x/include/mach/msg.h
> > @@ -48,4 +48,11 @@ int bcm2835_set_video_params(int *widthp, int *heightp,
> > int depth_bpp,
> >  			     int pixel_order, int alpha_mode, ulong *fb_basep,
> >  			     ulong *fb_sizep, int *pitchp);
> >  
> > +/**
> > + * bcm2711_load_vl805_firmware() - get vl805's firmware loaded
> > + *
> > + * @return 0 if OK, -EIO on error
> > + */
> > +int bcm2711_notify_vl805_reset(void);
> 
> Now the comment and function prototype don't agree :(.

Aargh, went too fast... I'll fix it on the next revision.

Regards,
Nicolas

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: This is a digitally signed message part
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20200430/fdb82920/attachment.sig>
diff mbox series

Patch

diff --git a/arch/arm/mach-bcm283x/include/mach/mbox.h b/arch/arm/mach-bcm283x/include/mach/mbox.h
index 60e226ce1d..2ae2d3d97c 100644
--- a/arch/arm/mach-bcm283x/include/mach/mbox.h
+++ b/arch/arm/mach-bcm283x/include/mach/mbox.h
@@ -491,6 +491,19 @@  struct bcm2835_mbox_tag_set_palette {
 	} body;
 };
 
+#define BCM2835_MBOX_TAG_NOTIFY_XHCI_RESET          0x00030058
+
+struct bcm2835_mbox_tag_pci_dev_addr {
+	struct bcm2835_mbox_tag_hdr tag_hdr;
+	union {
+		struct {
+			u32 dev_addr;
+		} req;
+		struct {
+		} resp;
+	} body;
+};
+
 /*
  * Pass a raw u32 message to the VC, and receive a raw u32 back.
  *
diff --git a/arch/arm/mach-bcm283x/include/mach/msg.h b/arch/arm/mach-bcm283x/include/mach/msg.h
index 4afb08631b..e45c1bf010 100644
--- a/arch/arm/mach-bcm283x/include/mach/msg.h
+++ b/arch/arm/mach-bcm283x/include/mach/msg.h
@@ -48,4 +48,11 @@  int bcm2835_set_video_params(int *widthp, int *heightp, int depth_bpp,
 			     int pixel_order, int alpha_mode, ulong *fb_basep,
 			     ulong *fb_sizep, int *pitchp);
 
+/**
+ * bcm2711_load_vl805_firmware() - get vl805's firmware loaded
+ *
+ * @return 0 if OK, -EIO on error
+ */
+int bcm2711_notify_vl805_reset(void);
+
 #endif
diff --git a/arch/arm/mach-bcm283x/msg.c b/arch/arm/mach-bcm283x/msg.c
index 94b75283f8..a338190d33 100644
--- a/arch/arm/mach-bcm283x/msg.c
+++ b/arch/arm/mach-bcm283x/msg.c
@@ -40,6 +40,12 @@  struct msg_setup {
 	u32 end_tag;
 };
 
+struct msg_notify_vl805_reset {
+	struct bcm2835_mbox_hdr hdr;
+	struct bcm2835_mbox_tag_pci_dev_addr dev_addr;
+	u32 end_tag;
+};
+
 int bcm2835_power_on_module(u32 module)
 {
 	ALLOC_CACHE_ALIGN_BUFFER(struct msg_set_power_state, msg_pwr, 1);
@@ -151,3 +157,40 @@  int bcm2835_set_video_params(int *widthp, int *heightp, int depth_bpp,
 
 	return 0;
 }
+
+/*
+ * On the Raspberry Pi 4, after a PCI reset, VL805's (the xHCI chip) firmware
+ * may either be loaded directly from an EEPROM or, if not present, by the
+ * SoC's VideoCore. This informs VideoCore that VL805 needs its firmware
+ * loaded.
+ */
+int bcm2711_notify_vl805_reset(void)
+{
+	ALLOC_CACHE_ALIGN_BUFFER(struct msg_notify_vl805_reset,
+				 msg_notify_vl805_reset, 1);
+	int ret;
+
+	BCM2835_MBOX_INIT_HDR(msg_notify_vl805_reset);
+	BCM2835_MBOX_INIT_TAG(&msg_notify_vl805_reset->dev_addr,
+			      NOTIFY_XHCI_RESET);
+
+	/*
+	 * The pci device address is expected like this:
+	 *
+	 *   PCI_BUS << 20 | PCI_SLOT << 15 | PCI_FUNC << 12
+	 *
+	 * But since RPi4's PCIe setup is hardwired, we know the address in
+	 * advance.
+	 */
+	msg_notify_vl805_reset->dev_addr.body.req.dev_addr = 0x100000;
+
+	ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN,
+				     &msg_notify_vl805_reset->hdr);
+	if (ret) {
+		printf("bcm2711: Faild to load vl805's firmware, %d\n", ret);
+		return -EIO;
+	}
+
+	return 0;
+}
+