* Backport USB PCIe/XHCI patches to U-Boot 2020.07 Backport relevant patches required to make PCIe/USB XHCI work. * Backport/integrate PCIe device tree changes from upstream Linux U-Boot uses the device tree provided by upstream Linux. Make sure the device tree has the relevant chanages to make VL805 USB controller reset work. * Document RPi 4 USB mass storage support (#746)
132 lines
4.0 KiB
Diff
132 lines
4.0 KiB
Diff
From 2899e2cbe5412ee6f6a01855467fa37534ffc2be Mon Sep 17 00:00:00 2001
|
|
Message-Id: <2899e2cbe5412ee6f6a01855467fa37534ffc2be.1595101389.git.stefan@agner.ch>
|
|
In-Reply-To: <040a141f84f2f84bf8be18f85b4cdb34bf066df0.1595101389.git.stefan@agner.ch>
|
|
References: <040a141f84f2f84bf8be18f85b4cdb34bf066df0.1595101389.git.stefan@agner.ch>
|
|
From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
|
Date: Mon, 29 Jun 2020 18:37:22 +0200
|
|
Subject: [PATCH 11/20] arm: rpi: Add function to trigger VL805's firmware load
|
|
|
|
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 VideCore (the SoC's co-processor). Introduce the function that
|
|
informs VideCore that VL805 may need its firmware loaded.
|
|
|
|
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
|
---
|
|
arch/arm/mach-bcm283x/include/mach/mbox.h | 13 +++++++
|
|
arch/arm/mach-bcm283x/include/mach/msg.h | 7 ++++
|
|
arch/arm/mach-bcm283x/msg.c | 46 +++++++++++++++++++++++
|
|
3 files changed, 66 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);
|
|
+
|
|
#endif
|
|
diff --git a/arch/arm/mach-bcm283x/msg.c b/arch/arm/mach-bcm283x/msg.c
|
|
index 94b75283f8..347aece3cd 100644
|
|
--- a/arch/arm/mach-bcm283x/msg.c
|
|
+++ b/arch/arm/mach-bcm283x/msg.c
|
|
@@ -7,6 +7,7 @@
|
|
#include <memalign.h>
|
|
#include <phys2bus.h>
|
|
#include <asm/arch/mbox.h>
|
|
+#include <linux/delay.h>
|
|
|
|
struct msg_set_power_state {
|
|
struct bcm2835_mbox_hdr hdr;
|
|
@@ -40,6 +41,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 +158,42 @@ 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;
|
|
+ }
|
|
+
|
|
+ udelay(200);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
--
|
|
2.27.0
|
|
|