openwrt/target/linux/bcm27xx/patches-4.19/950-0808-usb-xhci-Raspberry-Pi-FW-loader-for-VIA-VL805.patch
Adrian Schmutzler 7d7aa2fd92 brcm2708: rename target to bcm27xx
This change makes the names of Broadcom targets consistent by using
the common notation based on SoC/CPU ID (which is used internally
anyway), bcmXXXX instead of brcmXXXX.
This is even used for target TITLE in make menuconfig already,
only the short target name used brcm so far.

Despite, since subtargets range from bcm2708 to bcm2711, it seems
appropriate to use bcm27xx instead of bcm2708 (again, as already done
for BOARDNAME).

This also renames the packages brcm2708-userland and brcm2708-gpu-fw.

Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
Acked-by: Álvaro Fernández Rojas <noltari@gmail.com>
2020-02-14 14:10:51 +01:00

85 lines
2.8 KiB
Diff

From fd483c4e43a983d90c308c4d668e83be4fd6a392 Mon Sep 17 00:00:00 2001
From: Tim Gover <990920+timg236@users.noreply.github.com>
Date: Wed, 15 Jan 2020 11:26:19 +0000
Subject: [PATCH] usb: xhci: Raspberry Pi FW loader for VIA VL805
The VL805 FW may either be loaded from an SPI EEPROM or alternatively
loaded directly by the VideoCore firmware. A PCI reset will reset
the VL805 XHCI controller on the Raspberry Pi4 requiring the firmware
to be reloaded if an SPI EEPROM is not present.
Use a VideoCore mailbox to trigger the loading of the VL805
firmware (if necessary) after a PCI reset.
Signed-off-by: Tim Gover <tim.gover@raspberrypi.org>
---
drivers/usb/host/pci-quirks.c | 31 +++++++++++++++++++++-
include/soc/bcm2835/raspberrypi-firmware.h | 2 +-
2 files changed, 31 insertions(+), 2 deletions(-)
--- a/drivers/usb/host/pci-quirks.c
+++ b/drivers/usb/host/pci-quirks.c
@@ -18,7 +18,7 @@
#include <linux/dmi.h>
#include "pci-quirks.h"
#include "xhci-ext-caps.h"
-
+#include <soc/bcm2835/raspberrypi-firmware.h>
#define UHCI_USBLEGSUP 0xc0 /* legacy support */
#define UHCI_USBCMD 0 /* command register */
@@ -632,6 +632,32 @@ EXPORT_SYMBOL_GPL(usb_amd_pt_check_port)
#endif /* CONFIG_PCI_DISABLE_COMMON_QUIRKS */
+/* The VL805 firmware may either be loaded from an EEPROM or by the BIOS into
+ * memory. If run from memory it must be reloaded after a PCI fundmental reset.
+ * The Raspberry Pi firmware acts as the BIOS in this case.
+ */
+static void usb_vl805_init(struct pci_dev *pdev)
+{
+#if IS_ENABLED(CONFIG_RASPBERRYPI_FIRMWARE)
+ struct rpi_firmware *fw;
+ struct {
+ u32 dev_addr;
+ } packet;
+ int ret;
+
+ fw = rpi_firmware_get(NULL);
+ if (!fw)
+ return;
+
+ packet.dev_addr = (pdev->bus->number << 20) |
+ (PCI_SLOT(pdev->devfn) << 15) | (PCI_FUNC(pdev->devfn) << 12);
+
+ dev_dbg(&pdev->dev, "RPI_FIRMWARE_NOTIFY_XHCI_RESET %x", packet.dev_addr);
+ ret = rpi_firmware_property(fw, RPI_FIRMWARE_NOTIFY_XHCI_RESET,
+ &packet, sizeof(packet));
+#endif
+}
+
#if IS_ENABLED(CONFIG_USB_UHCI_HCD)
/*
@@ -1226,6 +1252,9 @@ hc_init:
if (pdev->vendor == PCI_VENDOR_ID_INTEL)
usb_enable_intel_xhci_ports(pdev);
+ if (pdev->vendor == PCI_VENDOR_ID_VIA && pdev->device == 0x3483)
+ usb_vl805_init(pdev);
+
op_reg_base = base + XHCI_HC_LENGTH(readl(base));
/* Wait for the host controller to be ready before writing any
--- a/include/soc/bcm2835/raspberrypi-firmware.h
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
@@ -98,7 +98,7 @@ enum rpi_firmware_property_tag {
RPI_FIRMWARE_SET_PERIPH_REG = 0x00038045,
RPI_FIRMWARE_GET_POE_HAT_VAL = 0x00030049,
RPI_FIRMWARE_SET_POE_HAT_VAL = 0x00030050,
-
+ RPI_FIRMWARE_NOTIFY_XHCI_RESET = 0x00030058,
/* Dispmanx TAGS */
RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE = 0x00040001,