* [PATCH v2 1/9] dt-bindings: reset: Add a binding for the RPi Firmware reset controller
2020-06-09 17:49 [PATCH v2 0/9] Raspberry Pi 4 USB firmware initialization rework Nicolas Saenz Julienne
@ 2020-06-09 17:49 ` Nicolas Saenz Julienne
2020-06-09 18:07 ` Florian Fainelli
2020-06-09 17:49 ` [PATCH v2 2/9] reset: Add Raspberry Pi 4 firmware " Nicolas Saenz Julienne
` (7 subsequent siblings)
8 siblings, 1 reply; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-09 17:49 UTC (permalink / raw)
To: f.fainelli, gregkh, wahrenst, p.zabel, linux-kernel, Ray Jui,
Scott Branden, bcm-kernel-feedback-list, Nicolas Saenz Julienne,
Eric Anholt
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel, tim.gover,
linux-pci, helgaas, andy.shevchenko, mathias.nyman,
lorenzo.pieralisi, Rob Herring, devicetree
The firmware running on the RPi VideoCore can be used to reset and
initialize HW controlled by the firmware.
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
Changes since v1:
- Correct cells binding as per Florian's comment
- Change compatible string to be more generic
.../arm/bcm/raspberrypi,bcm2835-firmware.yaml | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml b/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml
index b48ed875eb8e..23a885af3a28 100644
--- a/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml
+++ b/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml
@@ -39,6 +39,22 @@ properties:
- compatible
- "#clock-cells"
+ reset:
+ type: object
+
+ properties:
+ compatible:
+ const: raspberrypi,firmware-reset
+
+ "#reset-cells":
+ const: 1
+ description: >
+ The argument is the ID of the firmware reset line to affect.
+
+ required:
+ - compatible
+ - "#reset-cells"
+
additionalProperties: false
required:
@@ -55,5 +71,10 @@ examples:
compatible = "raspberrypi,firmware-clocks";
#clock-cells = <1>;
};
+
+ reset: reset {
+ compatible = "raspberrypi,firmware-reset";
+ #reset-cells = <1>;
+ };
};
...
--
2.26.2
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v2 1/9] dt-bindings: reset: Add a binding for the RPi Firmware reset controller
2020-06-09 17:49 ` [PATCH v2 1/9] dt-bindings: reset: Add a binding for the RPi Firmware reset controller Nicolas Saenz Julienne
@ 2020-06-09 18:07 ` Florian Fainelli
2020-06-10 15:37 ` Nicolas Saenz Julienne
0 siblings, 1 reply; 23+ messages in thread
From: Florian Fainelli @ 2020-06-09 18:07 UTC (permalink / raw)
To: Nicolas Saenz Julienne, gregkh, wahrenst, p.zabel, linux-kernel,
Ray Jui, Scott Branden, bcm-kernel-feedback-list, Eric Anholt
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel, tim.gover,
linux-pci, helgaas, andy.shevchenko, mathias.nyman,
lorenzo.pieralisi, Rob Herring, devicetree
On 6/9/2020 10:49 AM, Nicolas Saenz Julienne wrote:
> The firmware running on the RPi VideoCore can be used to reset and
> initialize HW controlled by the firmware.
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
>
> ---
>
> Changes since v1:
> - Correct cells binding as per Florian's comment
> - Change compatible string to be more generic
>
> .../arm/bcm/raspberrypi,bcm2835-firmware.yaml | 21 +++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml b/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml
> index b48ed875eb8e..23a885af3a28 100644
> --- a/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml
> +++ b/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml
> @@ -39,6 +39,22 @@ properties:
> - compatible
> - "#clock-cells"
>
> + reset:
> + type: object
> +
> + properties:
> + compatible:
> + const: raspberrypi,firmware-reset
> +
> + "#reset-cells":
> + const: 1
> + description: >
Is this a stray '>' character? If so, with that fixed:
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
--
Florian
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v2 1/9] dt-bindings: reset: Add a binding for the RPi Firmware reset controller
2020-06-09 18:07 ` Florian Fainelli
@ 2020-06-10 15:37 ` Nicolas Saenz Julienne
0 siblings, 0 replies; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-10 15:37 UTC (permalink / raw)
To: Florian Fainelli, gregkh, wahrenst, p.zabel, linux-kernel,
Ray Jui, Scott Branden, bcm-kernel-feedback-list, Eric Anholt
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel, tim.gover,
linux-pci, helgaas, andy.shevchenko, mathias.nyman,
lorenzo.pieralisi, Rob Herring, devicetree
[-- Attachment #1: Type: text/plain, Size: 1604 bytes --]
Hi Florian, thanks for the review :)
On Tue, 2020-06-09 at 11:07 -0700, Florian Fainelli wrote:
>
> On 6/9/2020 10:49 AM, Nicolas Saenz Julienne wrote:
> > The firmware running on the RPi VideoCore can be used to reset and
> > initialize HW controlled by the firmware.
> >
> > Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> >
> > ---
> >
> > Changes since v1:
> > - Correct cells binding as per Florian's comment
> > - Change compatible string to be more generic
> >
> > .../arm/bcm/raspberrypi,bcm2835-firmware.yaml | 21 +++++++++++++++++++
> > 1 file changed, 21 insertions(+)
> >
> > diff --git a/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-
> > firmware.yaml
> > b/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-
> > firmware.yaml
> > index b48ed875eb8e..23a885af3a28 100644
> > --- a/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-
> > firmware.yaml
> > +++ b/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-
> > firmware.yaml
> > @@ -39,6 +39,22 @@ properties:
> > - compatible
> > - "#clock-cells"
> >
> > + reset:
> > + type: object
> > +
> > + properties:
> > + compatible:
> > + const: raspberrypi,firmware-reset
> > +
> > + "#reset-cells":
> > + const: 1
> > + description: >
>
> Is this a stray '>' character? If so, with that fixed:
No, it marks the formatting of the text below. | will keep the formatting as
is, > will leave the formatting to whatever is going to use it.
Regards,
Nicolas
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v2 2/9] reset: Add Raspberry Pi 4 firmware reset controller
2020-06-09 17:49 [PATCH v2 0/9] Raspberry Pi 4 USB firmware initialization rework Nicolas Saenz Julienne
2020-06-09 17:49 ` [PATCH v2 1/9] dt-bindings: reset: Add a binding for the RPi Firmware reset controller Nicolas Saenz Julienne
@ 2020-06-09 17:49 ` Nicolas Saenz Julienne
2020-06-09 18:14 ` Florian Fainelli
2020-06-09 17:49 ` [PATCH v2 3/9] ARM: dts: bcm2711: Add firmware usb reset node Nicolas Saenz Julienne
` (6 subsequent siblings)
8 siblings, 1 reply; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-09 17:49 UTC (permalink / raw)
To: f.fainelli, gregkh, wahrenst, p.zabel, linux-kernel
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel,
bcm-kernel-feedback-list, tim.gover, linux-pci, helgaas,
andy.shevchenko, mathias.nyman, lorenzo.pieralisi,
Nicolas Saenz Julienne
Raspberry Pi 4's co-processor controls some of the board's HW
initialization process, but it's up to Linux to trigger it when
relevant. Introduce a reset controller capable of interfacing with
RPi4's co-processor that models these firmware initialization routines as
reset lines.
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
Changes since v1:
- Make the whole driver less USB centric as per Florian's comments
drivers/reset/Kconfig | 11 +++
drivers/reset/Makefile | 1 +
drivers/reset/reset-raspberrypi.c | 126 ++++++++++++++++++++++++++++++
3 files changed, 138 insertions(+)
create mode 100644 drivers/reset/reset-raspberrypi.c
diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
index d9efbfd29646..97e848740e13 100644
--- a/drivers/reset/Kconfig
+++ b/drivers/reset/Kconfig
@@ -140,6 +140,17 @@ config RESET_QCOM_PDC
to control reset signals provided by PDC for Modem, Compute,
Display, GPU, Debug, AOP, Sensors, Audio, SP and APPS.
+config RESET_RASPBERRYPI
+ tristate "Raspberry Pi 4 Firmware Reset Driver"
+ depends on RASPBERRYPI_FIRMWARE || (RASPBERRYPI_FIRMWARE=n && COMPILE_TEST)
+ default USB_XHCI_PCI
+ help
+ Raspberry Pi 4's co-processor controls some of the board's HW
+ initialization process, but it's up to Linux to trigger it when
+ relevant. This driver provides a reset controller capable of
+ interfacing with RPi4's co-processor and model these firmware
+ initialization routines as reset lines.
+
config RESET_SCMI
tristate "Reset driver controlled via ARM SCMI interface"
depends on ARM_SCMI_PROTOCOL || COMPILE_TEST
diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
index 249ed357c997..16947610cc3b 100644
--- a/drivers/reset/Makefile
+++ b/drivers/reset/Makefile
@@ -21,6 +21,7 @@ obj-$(CONFIG_RESET_OXNAS) += reset-oxnas.o
obj-$(CONFIG_RESET_PISTACHIO) += reset-pistachio.o
obj-$(CONFIG_RESET_QCOM_AOSS) += reset-qcom-aoss.o
obj-$(CONFIG_RESET_QCOM_PDC) += reset-qcom-pdc.o
+obj-$(CONFIG_RESET_RASPBERRYPI) += reset-raspberrypi.o
obj-$(CONFIG_RESET_SCMI) += reset-scmi.o
obj-$(CONFIG_RESET_SIMPLE) += reset-simple.o
obj-$(CONFIG_RESET_STM32MP157) += reset-stm32mp1.o
diff --git a/drivers/reset/reset-raspberrypi.c b/drivers/reset/reset-raspberrypi.c
new file mode 100644
index 000000000000..5fc8c6319a20
--- /dev/null
+++ b/drivers/reset/reset-raspberrypi.c
@@ -0,0 +1,126 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Raspberry Pi 4 firmware reset driver
+ *
+ * Copyright (C) 2020 Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+ */
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/reset-controller.h>
+#include <soc/bcm2835/raspberrypi-firmware.h>
+
+struct rpi_reset {
+ struct reset_controller_dev rcdev;
+ struct rpi_firmware *fw;
+};
+
+enum rpi_reset_ids {
+ RASPBERRYPI_FIRMWARE_RESET_ID_USB,
+ RASPBERRYPI_FIRMWARE_RESET_NUM_IDS
+};
+
+static inline struct rpi_reset *to_rpi(struct reset_controller_dev *rcdev)
+{
+ return container_of(rcdev, struct rpi_reset, rcdev);
+}
+
+static int rpi_reset_reset(struct reset_controller_dev *rcdev, unsigned long id)
+{
+ struct rpi_reset *priv = to_rpi(rcdev);
+ u32 dev_addr;
+ int ret;
+
+ switch (id) {
+ case RASPBERRYPI_FIRMWARE_RESET_ID_USB:
+ /*
+ * The Raspberry Pi 4 gets its USB functionality from VL805, a
+ * PCIe chip that implements xHCI. After a PCI reset, VL805's
+ * firmware may either be loaded directly from an EEPROM or, if
+ * not present, by the SoC's co-processor, VideoCore. rpi's
+ * VideoCore OS contains both the non public firmware load
+ * logic and the VL805 firmware blob. This triggers the
+ * aforementioned process.
+ *
+ * The pci device address is expected is expected by the
+ * firmware encoded like this:
+ *
+ * PCI_BUS << 20 | PCI_SLOT << 15 | PCI_FUNC << 12
+ *
+ * But since rpi's PCIe is hardwired, we know the address in
+ * advance.
+ */
+ dev_addr = 0x100000;
+ ret = rpi_firmware_property(priv->fw, RPI_FIRMWARE_NOTIFY_XHCI_RESET,
+ &dev_addr, sizeof(dev_addr));
+ if (ret)
+ return ret;
+
+ /* Wait for vl805 to startup */
+ usleep_range(200, 1000);
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static const struct reset_control_ops rpi_reset_ops = {
+ .reset = rpi_reset_reset,
+};
+
+static int rpi_reset_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct device_node *fw_node;
+ struct rpi_firmware *fw;
+ struct rpi_reset *priv;
+
+ fw_node = of_get_parent(dev->of_node);
+ if (!fw_node) {
+ dev_err(dev, "Missing firmware node\n");
+ return -ENOENT;
+ }
+
+ fw = rpi_firmware_get(fw_node);
+ of_node_put(fw_node);
+ if (!fw)
+ return -EPROBE_DEFER;
+
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+
+ dev_set_drvdata(dev, priv);
+
+ priv->fw = fw;
+ priv->rcdev.owner = THIS_MODULE;
+ priv->rcdev.nr_resets = RASPBERRYPI_FIRMWARE_RESET_NUM_IDS;
+ priv->rcdev.ops = &rpi_reset_ops;
+ priv->rcdev.of_node = dev->of_node;
+
+ return devm_reset_controller_register(dev, &priv->rcdev);
+}
+
+static const struct of_device_id rpi_reset_of_match[] = {
+ { .compatible = "raspberrypi,firmware-reset" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, rpi_reset_of_match);
+
+static struct platform_driver rpi_reset_driver = {
+ .probe = rpi_reset_probe,
+ .driver = {
+ .name = "raspberrypi-reset",
+ .of_match_table = rpi_reset_of_match,
+ },
+};
+module_platform_driver(rpi_reset_driver);
+
+MODULE_AUTHOR("Nicolas Saenz Julienne <nsaenzjulienne@suse.de>");
+MODULE_DESCRIPTION("Raspberry Pi 4 firmware reset driver");
+MODULE_LICENSE("GPL");
--
2.26.2
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v2 2/9] reset: Add Raspberry Pi 4 firmware reset controller
2020-06-09 17:49 ` [PATCH v2 2/9] reset: Add Raspberry Pi 4 firmware " Nicolas Saenz Julienne
@ 2020-06-09 18:14 ` Florian Fainelli
2020-06-10 15:37 ` Nicolas Saenz Julienne
0 siblings, 1 reply; 23+ messages in thread
From: Florian Fainelli @ 2020-06-09 18:14 UTC (permalink / raw)
To: Nicolas Saenz Julienne, f.fainelli, gregkh, wahrenst, p.zabel,
linux-kernel
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel,
bcm-kernel-feedback-list, tim.gover, linux-pci, helgaas,
andy.shevchenko, mathias.nyman, lorenzo.pieralisi
On 6/9/2020 10:49 AM, Nicolas Saenz Julienne wrote:
> Raspberry Pi 4's co-processor controls some of the board's HW
> initialization process, but it's up to Linux to trigger it when
> relevant. Introduce a reset controller capable of interfacing with
> RPi4's co-processor that models these firmware initialization routines as
> reset lines.
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
>
> ---
>
> Changes since v1:
> - Make the whole driver less USB centric as per Florian's comments
>
> drivers/reset/Kconfig | 11 +++
> drivers/reset/Makefile | 1 +
> drivers/reset/reset-raspberrypi.c | 126 ++++++++++++++++++++++++++++++
> 3 files changed, 138 insertions(+)
> create mode 100644 drivers/reset/reset-raspberrypi.c
>
> diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
> index d9efbfd29646..97e848740e13 100644
> --- a/drivers/reset/Kconfig
> +++ b/drivers/reset/Kconfig
> @@ -140,6 +140,17 @@ config RESET_QCOM_PDC
> to control reset signals provided by PDC for Modem, Compute,
> Display, GPU, Debug, AOP, Sensors, Audio, SP and APPS.
>
> +config RESET_RASPBERRYPI
> + tristate "Raspberry Pi 4 Firmware Reset Driver"
> + depends on RASPBERRYPI_FIRMWARE || (RASPBERRYPI_FIRMWARE=n && COMPILE_TEST)
> + default USB_XHCI_PCI
> + help
> + Raspberry Pi 4's co-processor controls some of the board's HW
> + initialization process, but it's up to Linux to trigger it when
> + relevant. This driver provides a reset controller capable of
> + interfacing with RPi4's co-processor and model these firmware
> + initialization routines as reset lines.
> +
> config RESET_SCMI
> tristate "Reset driver controlled via ARM SCMI interface"
> depends on ARM_SCMI_PROTOCOL || COMPILE_TEST
> diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
> index 249ed357c997..16947610cc3b 100644
> --- a/drivers/reset/Makefile
> +++ b/drivers/reset/Makefile
> @@ -21,6 +21,7 @@ obj-$(CONFIG_RESET_OXNAS) += reset-oxnas.o
> obj-$(CONFIG_RESET_PISTACHIO) += reset-pistachio.o
> obj-$(CONFIG_RESET_QCOM_AOSS) += reset-qcom-aoss.o
> obj-$(CONFIG_RESET_QCOM_PDC) += reset-qcom-pdc.o
> +obj-$(CONFIG_RESET_RASPBERRYPI) += reset-raspberrypi.o
> obj-$(CONFIG_RESET_SCMI) += reset-scmi.o
> obj-$(CONFIG_RESET_SIMPLE) += reset-simple.o
> obj-$(CONFIG_RESET_STM32MP157) += reset-stm32mp1.o
> diff --git a/drivers/reset/reset-raspberrypi.c b/drivers/reset/reset-raspberrypi.c
> new file mode 100644
> index 000000000000..5fc8c6319a20
> --- /dev/null
> +++ b/drivers/reset/reset-raspberrypi.c
> @@ -0,0 +1,126 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Raspberry Pi 4 firmware reset driver
> + *
> + * Copyright (C) 2020 Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> + */
> +#include <linux/delay.h>
> +#include <linux/device.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/reset-controller.h>
> +#include <soc/bcm2835/raspberrypi-firmware.h>
> +
> +struct rpi_reset {
> + struct reset_controller_dev rcdev;
> + struct rpi_firmware *fw;
> +};
> +
> +enum rpi_reset_ids {
> + RASPBERRYPI_FIRMWARE_RESET_ID_USB,
You should probably move this to a header file under
include/dt-bindings/reset/ in order to ensure that what gets referenced
by the DTS is in sync with what the driver knows about.
With that:
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
--
Florian
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v2 2/9] reset: Add Raspberry Pi 4 firmware reset controller
2020-06-09 18:14 ` Florian Fainelli
@ 2020-06-10 15:37 ` Nicolas Saenz Julienne
0 siblings, 0 replies; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-10 15:37 UTC (permalink / raw)
To: Florian Fainelli, f.fainelli, gregkh, wahrenst, p.zabel, linux-kernel
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel,
bcm-kernel-feedback-list, tim.gover, linux-pci, helgaas,
andy.shevchenko, mathias.nyman, lorenzo.pieralisi
[-- Attachment #1: Type: text/plain, Size: 3806 bytes --]
On Tue, 2020-06-09 at 11:14 -0700, Florian Fainelli wrote:
>
> On 6/9/2020 10:49 AM, Nicolas Saenz Julienne wrote:
> > Raspberry Pi 4's co-processor controls some of the board's HW
> > initialization process, but it's up to Linux to trigger it when
> > relevant. Introduce a reset controller capable of interfacing with
> > RPi4's co-processor that models these firmware initialization routines as
> > reset lines.
> >
> > Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> >
> > ---
> >
> > Changes since v1:
> > - Make the whole driver less USB centric as per Florian's comments
> >
> > drivers/reset/Kconfig | 11 +++
> > drivers/reset/Makefile | 1 +
> > drivers/reset/reset-raspberrypi.c | 126 ++++++++++++++++++++++++++++++
> > 3 files changed, 138 insertions(+)
> > create mode 100644 drivers/reset/reset-raspberrypi.c
> >
> > diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
> > index d9efbfd29646..97e848740e13 100644
> > --- a/drivers/reset/Kconfig
> > +++ b/drivers/reset/Kconfig
> > @@ -140,6 +140,17 @@ config RESET_QCOM_PDC
> > to control reset signals provided by PDC for Modem, Compute,
> > Display, GPU, Debug, AOP, Sensors, Audio, SP and APPS.
> >
> > +config RESET_RASPBERRYPI
> > + tristate "Raspberry Pi 4 Firmware Reset Driver"
> > + depends on RASPBERRYPI_FIRMWARE || (RASPBERRYPI_FIRMWARE=n &&
> > COMPILE_TEST)
> > + default USB_XHCI_PCI
> > + help
> > + Raspberry Pi 4's co-processor controls some of the board's HW
> > + initialization process, but it's up to Linux to trigger it when
> > + relevant. This driver provides a reset controller capable of
> > + interfacing with RPi4's co-processor and model these firmware
> > + initialization routines as reset lines.
> > +
> > config RESET_SCMI
> > tristate "Reset driver controlled via ARM SCMI interface"
> > depends on ARM_SCMI_PROTOCOL || COMPILE_TEST
> > diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
> > index 249ed357c997..16947610cc3b 100644
> > --- a/drivers/reset/Makefile
> > +++ b/drivers/reset/Makefile
> > @@ -21,6 +21,7 @@ obj-$(CONFIG_RESET_OXNAS) += reset-oxnas.o
> > obj-$(CONFIG_RESET_PISTACHIO) += reset-pistachio.o
> > obj-$(CONFIG_RESET_QCOM_AOSS) += reset-qcom-aoss.o
> > obj-$(CONFIG_RESET_QCOM_PDC) += reset-qcom-pdc.o
> > +obj-$(CONFIG_RESET_RASPBERRYPI) += reset-raspberrypi.o
> > obj-$(CONFIG_RESET_SCMI) += reset-scmi.o
> > obj-$(CONFIG_RESET_SIMPLE) += reset-simple.o
> > obj-$(CONFIG_RESET_STM32MP157) += reset-stm32mp1.o
> > diff --git a/drivers/reset/reset-raspberrypi.c b/drivers/reset/reset-
> > raspberrypi.c
> > new file mode 100644
> > index 000000000000..5fc8c6319a20
> > --- /dev/null
> > +++ b/drivers/reset/reset-raspberrypi.c
> > @@ -0,0 +1,126 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * Raspberry Pi 4 firmware reset driver
> > + *
> > + * Copyright (C) 2020 Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> > + */
> > +#include <linux/delay.h>
> > +#include <linux/device.h>
> > +#include <linux/module.h>
> > +#include <linux/of.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/reset-controller.h>
> > +#include <soc/bcm2835/raspberrypi-firmware.h>
> > +
> > +struct rpi_reset {
> > + struct reset_controller_dev rcdev;
> > + struct rpi_firmware *fw;
> > +};
> > +
> > +enum rpi_reset_ids {
> > + RASPBERRYPI_FIRMWARE_RESET_ID_USB,
>
> You should probably move this to a header file under
> include/dt-bindings/reset/ in order to ensure that what gets referenced
> by the DTS is in sync with what the driver knows about.
>
> With that:
>
> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Thanks! Will fix that on v3.
Regards,
Nicolas
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v2 3/9] ARM: dts: bcm2711: Add firmware usb reset node
2020-06-09 17:49 [PATCH v2 0/9] Raspberry Pi 4 USB firmware initialization rework Nicolas Saenz Julienne
2020-06-09 17:49 ` [PATCH v2 1/9] dt-bindings: reset: Add a binding for the RPi Firmware reset controller Nicolas Saenz Julienne
2020-06-09 17:49 ` [PATCH v2 2/9] reset: Add Raspberry Pi 4 firmware " Nicolas Saenz Julienne
@ 2020-06-09 17:49 ` Nicolas Saenz Julienne
2020-06-09 18:16 ` Florian Fainelli
2020-06-09 17:49 ` [PATCH v2 4/9] ARM: dts: bcm2711: Add reset controller to xHCI node Nicolas Saenz Julienne
` (5 subsequent siblings)
8 siblings, 1 reply; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-09 17:49 UTC (permalink / raw)
To: f.fainelli, gregkh, wahrenst, p.zabel, linux-kernel, Rob Herring,
Nicolas Saenz Julienne
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel,
bcm-kernel-feedback-list, tim.gover, linux-pci, helgaas,
andy.shevchenko, mathias.nyman, lorenzo.pieralisi, devicetree
Now that the reset driver exposing Raspberry Pi 4's firmware based USB
reset routine is available, let's add the device tree node exposing it.
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
Changes since v1:
- Update cell nr to match new bindings
arch/arm/boot/dts/bcm2711-rpi-4-b.dts | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts
index c7f1d97e69bb..0cef95058fb0 100644
--- a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts
+++ b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts
@@ -83,6 +83,11 @@ expgpio: gpio {
"";
status = "okay";
};
+
+ reset: reset {
+ compatible = "raspberrypi,firmware-reset";
+ #reset-cells = <1>;
+ };
};
&gpio {
--
2.26.2
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v2 3/9] ARM: dts: bcm2711: Add firmware usb reset node
2020-06-09 17:49 ` [PATCH v2 3/9] ARM: dts: bcm2711: Add firmware usb reset node Nicolas Saenz Julienne
@ 2020-06-09 18:16 ` Florian Fainelli
0 siblings, 0 replies; 23+ messages in thread
From: Florian Fainelli @ 2020-06-09 18:16 UTC (permalink / raw)
To: Nicolas Saenz Julienne, f.fainelli, gregkh, wahrenst, p.zabel,
linux-kernel, Rob Herring
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel,
bcm-kernel-feedback-list, tim.gover, linux-pci, helgaas,
andy.shevchenko, mathias.nyman, lorenzo.pieralisi, devicetree
On 6/9/2020 10:49 AM, Nicolas Saenz Julienne wrote:
> Now that the reset driver exposing Raspberry Pi 4's firmware based USB
> reset routine is available, let's add the device tree node exposing it.
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
--
Florian
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v2 4/9] ARM: dts: bcm2711: Add reset controller to xHCI node
2020-06-09 17:49 [PATCH v2 0/9] Raspberry Pi 4 USB firmware initialization rework Nicolas Saenz Julienne
` (2 preceding siblings ...)
2020-06-09 17:49 ` [PATCH v2 3/9] ARM: dts: bcm2711: Add firmware usb reset node Nicolas Saenz Julienne
@ 2020-06-09 17:49 ` Nicolas Saenz Julienne
2020-06-09 18:16 ` Florian Fainelli
2020-06-09 17:49 ` [PATCH v2 5/9] usb: xhci-pci: Add support for reset controllers Nicolas Saenz Julienne
` (4 subsequent siblings)
8 siblings, 1 reply; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-09 17:49 UTC (permalink / raw)
To: f.fainelli, gregkh, wahrenst, p.zabel, linux-kernel, Rob Herring,
Nicolas Saenz Julienne
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel,
bcm-kernel-feedback-list, tim.gover, linux-pci, helgaas,
andy.shevchenko, mathias.nyman, lorenzo.pieralisi, devicetree
The chip is hardwired to the board's PCIe bus and needs to be properly
setup trough a firmware routine after a PCI fundamental reset. Pass the
reset controller phandle that takes care of triggering the
initialization to the relevant PCI device.
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
Changes since v1:
- Update to match new binding
arch/arm/boot/dts/bcm2711-rpi-4-b.dts | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts
index 0cef95058fb0..e74ca0c86137 100644
--- a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts
+++ b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts
@@ -207,6 +207,13 @@ phy1: ethernet-phy@1 {
};
};
+&pcie0 {
+ usb@1,0 {
+ reg = <0 0 0 0 0>;
+ resets = <&reset 0>;
+ };
+};
+
/* uart0 communicates with the BT module */
&uart0 {
pinctrl-names = "default";
--
2.26.2
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v2 4/9] ARM: dts: bcm2711: Add reset controller to xHCI node
2020-06-09 17:49 ` [PATCH v2 4/9] ARM: dts: bcm2711: Add reset controller to xHCI node Nicolas Saenz Julienne
@ 2020-06-09 18:16 ` Florian Fainelli
0 siblings, 0 replies; 23+ messages in thread
From: Florian Fainelli @ 2020-06-09 18:16 UTC (permalink / raw)
To: Nicolas Saenz Julienne, f.fainelli, gregkh, wahrenst, p.zabel,
linux-kernel, Rob Herring
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel,
bcm-kernel-feedback-list, tim.gover, linux-pci, helgaas,
andy.shevchenko, mathias.nyman, lorenzo.pieralisi, devicetree
On 6/9/2020 10:49 AM, Nicolas Saenz Julienne wrote:
> The chip is hardwired to the board's PCIe bus and needs to be properly
> setup trough a firmware routine after a PCI fundamental reset. Pass the
> reset controller phandle that takes care of triggering the
> initialization to the relevant PCI device.
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
With the comment from patch #2 to move the reset identifiers to a shared
header that can be referenced by this file:
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
--
Florian
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v2 5/9] usb: xhci-pci: Add support for reset controllers
2020-06-09 17:49 [PATCH v2 0/9] Raspberry Pi 4 USB firmware initialization rework Nicolas Saenz Julienne
` (3 preceding siblings ...)
2020-06-09 17:49 ` [PATCH v2 4/9] ARM: dts: bcm2711: Add reset controller to xHCI node Nicolas Saenz Julienne
@ 2020-06-09 17:49 ` Nicolas Saenz Julienne
2020-06-09 18:13 ` Florian Fainelli
2020-06-09 17:49 ` [PATCH v2 6/9] Revert "USB: pci-quirks: Add Raspberry Pi 4 quirk" Nicolas Saenz Julienne
` (3 subsequent siblings)
8 siblings, 1 reply; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-09 17:49 UTC (permalink / raw)
To: f.fainelli, gregkh, wahrenst, p.zabel, linux-kernel, Mathias Nyman
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel,
bcm-kernel-feedback-list, tim.gover, linux-pci, helgaas,
andy.shevchenko, mathias.nyman, lorenzo.pieralisi,
Nicolas Saenz Julienne
Some atypical users of xhci-pci might need to manually reset their xHCI
controller before starting the HCD setup. Check if a reset controller
device is available to the PCI bus and trigger a reset.
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
Changes since v1:
- Use proper reset API
- Make code simpler
drivers/usb/host/xhci-pci.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
index ef513c2fb843..6e96affa4ceb 100644
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
@@ -12,6 +12,7 @@
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/acpi.h>
+#include <linux/reset.h>
#include "xhci.h"
#include "xhci-trace.h"
@@ -339,6 +340,7 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
struct xhci_hcd *xhci;
struct usb_hcd *hcd;
struct xhci_driver_data *driver_data;
+ struct reset_control *reset;
driver_data = (struct xhci_driver_data *)id->driver_data;
if (driver_data && driver_data->quirks & XHCI_RENESAS_FW_QUIRK) {
@@ -347,6 +349,11 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
return retval;
}
+ reset = devm_reset_control_get_optional_exclusive(&dev->bus->dev, NULL);
+ if (IS_ERR(reset))
+ return PTR_ERR(reset);
+ reset_control_reset(reset);
+
/* Prevent runtime suspending between USB-2 and USB-3 initialization */
pm_runtime_get_noresume(&dev->dev);
--
2.26.2
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v2 5/9] usb: xhci-pci: Add support for reset controllers
2020-06-09 17:49 ` [PATCH v2 5/9] usb: xhci-pci: Add support for reset controllers Nicolas Saenz Julienne
@ 2020-06-09 18:13 ` Florian Fainelli
2020-06-10 15:49 ` Nicolas Saenz Julienne
0 siblings, 1 reply; 23+ messages in thread
From: Florian Fainelli @ 2020-06-09 18:13 UTC (permalink / raw)
To: Nicolas Saenz Julienne, f.fainelli, gregkh, wahrenst, p.zabel,
linux-kernel, Mathias Nyman
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel,
bcm-kernel-feedback-list, tim.gover, linux-pci, helgaas,
andy.shevchenko, mathias.nyman, lorenzo.pieralisi
On 6/9/2020 10:49 AM, Nicolas Saenz Julienne wrote:
> Some atypical users of xhci-pci might need to manually reset their xHCI
> controller before starting the HCD setup. Check if a reset controller
> device is available to the PCI bus and trigger a reset.
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
>
> ---
>
> Changes since v1:
> - Use proper reset API
> - Make code simpler
>
> drivers/usb/host/xhci-pci.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
> index ef513c2fb843..6e96affa4ceb 100644
> --- a/drivers/usb/host/xhci-pci.c
> +++ b/drivers/usb/host/xhci-pci.c
> @@ -12,6 +12,7 @@
> #include <linux/slab.h>
> #include <linux/module.h>
> #include <linux/acpi.h>
> +#include <linux/reset.h>
>
> #include "xhci.h"
> #include "xhci-trace.h"
> @@ -339,6 +340,7 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
> struct xhci_hcd *xhci;
> struct usb_hcd *hcd;
> struct xhci_driver_data *driver_data;
> + struct reset_control *reset;
>
> driver_data = (struct xhci_driver_data *)id->driver_data;
> if (driver_data && driver_data->quirks & XHCI_RENESAS_FW_QUIRK) {
> @@ -347,6 +349,11 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
> return retval;
> }
>
> + reset = devm_reset_control_get_optional_exclusive(&dev->bus->dev, NULL);
> + if (IS_ERR(reset))
> + return PTR_ERR(reset);
> + reset_control_reset(reset);
Sorry for not catching this earlier, since this is a generic integration
with the reset controller API, should not you also add a
reset_control_reset() to hcd_pci_resume() for symmetry?
> +
> /* Prevent runtime suspending between USB-2 and USB-3 initialization */
> pm_runtime_get_noresume(&dev->dev);
>
>
--
Florian
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v2 5/9] usb: xhci-pci: Add support for reset controllers
2020-06-09 18:13 ` Florian Fainelli
@ 2020-06-10 15:49 ` Nicolas Saenz Julienne
0 siblings, 0 replies; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-10 15:49 UTC (permalink / raw)
To: Florian Fainelli, gregkh, wahrenst, p.zabel, linux-kernel, Mathias Nyman
Cc: tim.gover, mathias.nyman, linux-pci, linux-usb, andy.shevchenko,
lorenzo.pieralisi, bcm-kernel-feedback-list, linux-rpi-kernel,
helgaas, linux-arm-kernel
[-- Attachment #1: Type: text/plain, Size: 2150 bytes --]
Hi Florian,
On Tue, 2020-06-09 at 11:13 -0700, Florian Fainelli wrote:
>
> On 6/9/2020 10:49 AM, Nicolas Saenz Julienne wrote:
> > Some atypical users of xhci-pci might need to manually reset their xHCI
> > controller before starting the HCD setup. Check if a reset controller
> > device is available to the PCI bus and trigger a reset.
> >
> > Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
> >
> > ---
> >
> > Changes since v1:
> > - Use proper reset API
> > - Make code simpler
> >
> > drivers/usb/host/xhci-pci.c | 7 +++++++
> > 1 file changed, 7 insertions(+)
> >
> > diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
> > index ef513c2fb843..6e96affa4ceb 100644
> > --- a/drivers/usb/host/xhci-pci.c
> > +++ b/drivers/usb/host/xhci-pci.c
> > @@ -12,6 +12,7 @@
> > #include <linux/slab.h>
> > #include <linux/module.h>
> > #include <linux/acpi.h>
> > +#include <linux/reset.h>
> >
> > #include "xhci.h"
> > #include "xhci-trace.h"
> > @@ -339,6 +340,7 @@ static int xhci_pci_probe(struct pci_dev *dev, const
> > struct pci_device_id *id)
> > struct xhci_hcd *xhci;
> > struct usb_hcd *hcd;
> > struct xhci_driver_data *driver_data;
> > + struct reset_control *reset;
> >
> > driver_data = (struct xhci_driver_data *)id->driver_data;
> > if (driver_data && driver_data->quirks & XHCI_RENESAS_FW_QUIRK) {
> > @@ -347,6 +349,11 @@ static int xhci_pci_probe(struct pci_dev *dev, const
> > struct pci_device_id *id)
> > return retval;
> > }
> >
> > + reset = devm_reset_control_get_optional_exclusive(&dev->bus->dev, NULL);
> > + if (IS_ERR(reset))
> > + return PTR_ERR(reset);
> > + reset_control_reset(reset);
>
> Sorry for not catching this earlier, since this is a generic integration
> with the reset controller API, should not you also add a
> reset_control_reset() to hcd_pci_resume() for symmetry?
Agreed, if the RPi4 supported suspend/resume, which AFAIK doesn't, an extra
reset would be needed as pcie-brcmstb performs a fundamental reset on resume
forcing us to reinitialize vl805.
Thanks!
Nicolas
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v2 6/9] Revert "USB: pci-quirks: Add Raspberry Pi 4 quirk"
2020-06-09 17:49 [PATCH v2 0/9] Raspberry Pi 4 USB firmware initialization rework Nicolas Saenz Julienne
` (4 preceding siblings ...)
2020-06-09 17:49 ` [PATCH v2 5/9] usb: xhci-pci: Add support for reset controllers Nicolas Saenz Julienne
@ 2020-06-09 17:49 ` Nicolas Saenz Julienne
2020-06-09 18:14 ` Florian Fainelli
2020-06-09 17:50 ` [PATCH v2 7/9] usb: host: pci-quirks: Bypass xHCI quirks for Raspberry Pi 4 Nicolas Saenz Julienne
` (2 subsequent siblings)
8 siblings, 1 reply; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-09 17:49 UTC (permalink / raw)
To: f.fainelli, gregkh, wahrenst, p.zabel, linux-kernel, Mathias Nyman
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel,
bcm-kernel-feedback-list, tim.gover, linux-pci, helgaas,
andy.shevchenko, mathias.nyman, lorenzo.pieralisi,
Nicolas Saenz Julienne
This reverts commit c65822fef4adc0ba40c37a47337376ce75f7a7bc.
The initialization of Raspberry Pi 4's USB chip is now handled through a
reset controller. No need to directly call the firmware routine trough a
pci quirk.
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
drivers/firmware/Kconfig | 3 +--
drivers/usb/host/pci-quirks.c | 16 ----------------
2 files changed, 1 insertion(+), 18 deletions(-)
diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig
index fbd785dd0513..4843e94713a4 100644
--- a/drivers/firmware/Kconfig
+++ b/drivers/firmware/Kconfig
@@ -178,9 +178,8 @@ config ISCSI_IBFT
Otherwise, say N.
config RASPBERRYPI_FIRMWARE
- bool "Raspberry Pi Firmware Driver"
+ tristate "Raspberry Pi Firmware Driver"
depends on BCM2835_MBOX
- default USB_PCI
help
This option enables support for communicating with the firmware on the
Raspberry Pi.
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c
index 0b949acfa258..92150ecdb036 100644
--- a/drivers/usb/host/pci-quirks.c
+++ b/drivers/usb/host/pci-quirks.c
@@ -16,9 +16,6 @@
#include <linux/export.h>
#include <linux/acpi.h>
#include <linux/dmi.h>
-
-#include <soc/bcm2835/raspberrypi-firmware.h>
-
#include "pci-quirks.h"
#include "xhci-ext-caps.h"
@@ -1246,24 +1243,11 @@ static void quirk_usb_handoff_xhci(struct pci_dev *pdev)
static void quirk_usb_early_handoff(struct pci_dev *pdev)
{
- int ret;
-
/* Skip Netlogic mips SoC's internal PCI USB controller.
* This device does not need/support EHCI/OHCI handoff
*/
if (pdev->vendor == 0x184e) /* vendor Netlogic */
return;
-
- if (pdev->vendor == PCI_VENDOR_ID_VIA && pdev->device == 0x3483) {
- ret = rpi_firmware_init_vl805(pdev);
- if (ret) {
- /* Firmware might be outdated, or something failed */
- dev_warn(&pdev->dev,
- "Failed to load VL805's firmware: %d. Will continue to attempt to work, but bad things might happen. You should fix this...\n",
- ret);
- }
- }
-
if (pdev->class != PCI_CLASS_SERIAL_USB_UHCI &&
pdev->class != PCI_CLASS_SERIAL_USB_OHCI &&
pdev->class != PCI_CLASS_SERIAL_USB_EHCI &&
--
2.26.2
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v2 6/9] Revert "USB: pci-quirks: Add Raspberry Pi 4 quirk"
2020-06-09 17:49 ` [PATCH v2 6/9] Revert "USB: pci-quirks: Add Raspberry Pi 4 quirk" Nicolas Saenz Julienne
@ 2020-06-09 18:14 ` Florian Fainelli
0 siblings, 0 replies; 23+ messages in thread
From: Florian Fainelli @ 2020-06-09 18:14 UTC (permalink / raw)
To: Nicolas Saenz Julienne, f.fainelli, gregkh, wahrenst, p.zabel,
linux-kernel, Mathias Nyman
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel,
bcm-kernel-feedback-list, tim.gover, linux-pci, helgaas,
andy.shevchenko, mathias.nyman, lorenzo.pieralisi
On 6/9/2020 10:49 AM, Nicolas Saenz Julienne wrote:
> This reverts commit c65822fef4adc0ba40c37a47337376ce75f7a7bc.
>
> The initialization of Raspberry Pi 4's USB chip is now handled through a
> reset controller. No need to directly call the firmware routine trough a
> pci quirk.
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
--
Florian
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v2 7/9] usb: host: pci-quirks: Bypass xHCI quirks for Raspberry Pi 4
2020-06-09 17:49 [PATCH v2 0/9] Raspberry Pi 4 USB firmware initialization rework Nicolas Saenz Julienne
` (5 preceding siblings ...)
2020-06-09 17:49 ` [PATCH v2 6/9] Revert "USB: pci-quirks: Add Raspberry Pi 4 quirk" Nicolas Saenz Julienne
@ 2020-06-09 17:50 ` Nicolas Saenz Julienne
2020-06-09 18:43 ` Andy Shevchenko
2020-06-09 17:50 ` [PATCH v2 8/9] Revert "firmware: raspberrypi: Introduce vl805 init routine" Nicolas Saenz Julienne
2020-06-09 17:50 ` [PATCH v2 9/9] Revert "PCI: brcmstb: Wait for Raspberry Pi's firmware when present" Nicolas Saenz Julienne
8 siblings, 1 reply; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-09 17:50 UTC (permalink / raw)
To: f.fainelli, gregkh, wahrenst, p.zabel, linux-kernel, Mathias Nyman
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel,
bcm-kernel-feedback-list, tim.gover, linux-pci, helgaas,
andy.shevchenko, mathias.nyman, lorenzo.pieralisi,
Nicolas Saenz Julienne
The board doesn't need the quirks to be run, and takes care of its own
initialization trough a reset controller device. So let's bypass them.
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
---
Changes since v1:
- Correct typos
drivers/usb/host/pci-quirks.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c
index 92150ecdb036..294412ebbd0b 100644
--- a/drivers/usb/host/pci-quirks.c
+++ b/drivers/usb/host/pci-quirks.c
@@ -16,6 +16,8 @@
#include <linux/export.h>
#include <linux/acpi.h>
#include <linux/dmi.h>
+#include <linux/of.h>
+
#include "pci-quirks.h"
#include "xhci-ext-caps.h"
@@ -1248,6 +1250,16 @@ static void quirk_usb_early_handoff(struct pci_dev *pdev)
*/
if (pdev->vendor == 0x184e) /* vendor Netlogic */
return;
+
+ /*
+ * Bypass the Raspberry Pi 4 controller xHCI controller, things are
+ * taken care of by the board's co-processor.
+ */
+ if (pdev->vendor == PCI_VENDOR_ID_VIA && pdev->device == 0x3483 &&
+ of_device_is_compatible(of_get_parent(pdev->bus->dev.of_node),
+ "brcm,bcm2711-pcie"))
+ return;
+
if (pdev->class != PCI_CLASS_SERIAL_USB_UHCI &&
pdev->class != PCI_CLASS_SERIAL_USB_OHCI &&
pdev->class != PCI_CLASS_SERIAL_USB_EHCI &&
--
2.26.2
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v2 7/9] usb: host: pci-quirks: Bypass xHCI quirks for Raspberry Pi 4
2020-06-09 17:50 ` [PATCH v2 7/9] usb: host: pci-quirks: Bypass xHCI quirks for Raspberry Pi 4 Nicolas Saenz Julienne
@ 2020-06-09 18:43 ` Andy Shevchenko
2020-06-10 15:57 ` Nicolas Saenz Julienne
0 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2020-06-09 18:43 UTC (permalink / raw)
To: Nicolas Saenz Julienne
Cc: Florian Fainelli, Greg Kroah-Hartman, Stefan Wahren,
Philipp Zabel, Linux Kernel Mailing List, Mathias Nyman, USB,
linux-rpi-kernel, linux-arm Mailing List,
bcm-kernel-feedback-list, tim.gover, linux-pci, Bjorn Helgaas,
Mathias Nyman, Lorenzo Pieralisi
On Tue, Jun 9, 2020 at 8:50 PM Nicolas Saenz Julienne
<nsaenzjulienne@suse.de> wrote:
>
> The board doesn't need the quirks to be run, and takes care of its own
> initialization trough a reset controller device. So let's bypass them.
through
...
> + if (pdev->vendor == PCI_VENDOR_ID_VIA && pdev->device == 0x3483 &&
> + of_device_is_compatible(of_get_parent(pdev->bus->dev.of_node),
> + "brcm,bcm2711-pcie"))
> + return;
No put?
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v2 7/9] usb: host: pci-quirks: Bypass xHCI quirks for Raspberry Pi 4
2020-06-09 18:43 ` Andy Shevchenko
@ 2020-06-10 15:57 ` Nicolas Saenz Julienne
0 siblings, 0 replies; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-10 15:57 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Florian Fainelli, Greg Kroah-Hartman, Stefan Wahren,
Philipp Zabel, Linux Kernel Mailing List, Mathias Nyman, USB,
linux-rpi-kernel, linux-arm Mailing List,
bcm-kernel-feedback-list, tim.gover, linux-pci, Bjorn Helgaas,
Mathias Nyman, Lorenzo Pieralisi
[-- Attachment #1: Type: text/plain, Size: 689 bytes --]
Hi Andy,
Thanks for the review.
On Tue, 2020-06-09 at 21:43 +0300, Andy Shevchenko wrote:
> On Tue, Jun 9, 2020 at 8:50 PM Nicolas Saenz Julienne
> <nsaenzjulienne@suse.de> wrote:
> > The board doesn't need the quirks to be run, and takes care of its own
> > initialization trough a reset controller device. So let's bypass them.
>
> through
Noted
> ...
>
> > + if (pdev->vendor == PCI_VENDOR_ID_VIA && pdev->device == 0x3483 &&
> > + of_device_is_compatible(of_get_parent(pdev->bus->dev.of_node),
> > + "brcm,bcm2711-pcie"))
> > + return;
>
> No put?
Missed that, sorry.
Regards,
Nicolas
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v2 8/9] Revert "firmware: raspberrypi: Introduce vl805 init routine"
2020-06-09 17:49 [PATCH v2 0/9] Raspberry Pi 4 USB firmware initialization rework Nicolas Saenz Julienne
` (6 preceding siblings ...)
2020-06-09 17:50 ` [PATCH v2 7/9] usb: host: pci-quirks: Bypass xHCI quirks for Raspberry Pi 4 Nicolas Saenz Julienne
@ 2020-06-09 17:50 ` Nicolas Saenz Julienne
2020-06-09 18:15 ` Florian Fainelli
2020-06-09 17:50 ` [PATCH v2 9/9] Revert "PCI: brcmstb: Wait for Raspberry Pi's firmware when present" Nicolas Saenz Julienne
8 siblings, 1 reply; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-09 17:50 UTC (permalink / raw)
To: f.fainelli, gregkh, wahrenst, p.zabel, linux-kernel, Ray Jui,
Scott Branden, bcm-kernel-feedback-list, Nicolas Saenz Julienne
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel, tim.gover,
linux-pci, helgaas, andy.shevchenko, mathias.nyman,
lorenzo.pieralisi
This reverts commit fbbc5ff3f7f9f4cad562e530ae2cf5d8964fe6d3.
The vl805 init routine has moved into drivers/reset/reset-raspberrypi.c
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
drivers/firmware/raspberrypi.c | 61 ----------------------
include/soc/bcm2835/raspberrypi-firmware.h | 7 ---
2 files changed, 68 deletions(-)
diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c
index ef8098856a47..a3e85186f8e6 100644
--- a/drivers/firmware/raspberrypi.c
+++ b/drivers/firmware/raspberrypi.c
@@ -12,8 +12,6 @@
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
-#include <linux/pci.h>
-#include <linux/delay.h>
#include <soc/bcm2835/raspberrypi-firmware.h>
#define MBOX_MSG(chan, data28) (((data28) & ~0xf) | ((chan) & 0xf))
@@ -21,8 +19,6 @@
#define MBOX_DATA28(msg) ((msg) & ~0xf)
#define MBOX_CHAN_PROPERTY 8
-#define VL805_PCI_CONFIG_VERSION_OFFSET 0x50
-
static struct platform_device *rpi_hwmon;
static struct platform_device *rpi_clk;
@@ -284,63 +280,6 @@ struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node)
}
EXPORT_SYMBOL_GPL(rpi_firmware_get);
-/*
- * The Raspberry Pi 4 gets its USB functionality from VL805, a PCIe chip that
- * implements xHCI. After a PCI reset, VL805's firmware may either be loaded
- * directly from an EEPROM or, if not present, by the SoC's co-processor,
- * VideoCore. RPi4's VideoCore OS contains both the non public firmware load
- * logic and the VL805 firmware blob. This function triggers the aforementioned
- * process.
- */
-int rpi_firmware_init_vl805(struct pci_dev *pdev)
-{
- struct device_node *fw_np;
- struct rpi_firmware *fw;
- u32 dev_addr, version;
- int ret;
-
- fw_np = of_find_compatible_node(NULL, NULL,
- "raspberrypi,bcm2835-firmware");
- if (!fw_np)
- return 0;
-
- fw = rpi_firmware_get(fw_np);
- of_node_put(fw_np);
- if (!fw)
- return -ENODEV;
-
- /*
- * Make sure we don't trigger a firmware load unnecessarily.
- *
- * If something went wrong with PCI, this whole exercise would be
- * futile as VideoCore expects from us a configured PCI bus. Just take
- * the faulty version (likely ~0) and let xHCI's registration fail
- * further down the line.
- */
- pci_read_config_dword(pdev, VL805_PCI_CONFIG_VERSION_OFFSET, &version);
- if (version)
- goto exit;
-
- dev_addr = pdev->bus->number << 20 | PCI_SLOT(pdev->devfn) << 15 |
- PCI_FUNC(pdev->devfn) << 12;
-
- ret = rpi_firmware_property(fw, RPI_FIRMWARE_NOTIFY_XHCI_RESET,
- &dev_addr, sizeof(dev_addr));
- if (ret)
- return ret;
-
- /* Wait for vl805 to startup */
- usleep_range(200, 1000);
-
- pci_read_config_dword(pdev, VL805_PCI_CONFIG_VERSION_OFFSET,
- &version);
-exit:
- pci_info(pdev, "VL805 firmware version %08x\n", version);
-
- return 0;
-}
-EXPORT_SYMBOL_GPL(rpi_firmware_init_vl805);
-
static const struct of_device_id rpi_firmware_of_match[] = {
{ .compatible = "raspberrypi,bcm2835-firmware", },
{},
diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
index 3025aca3c358..cc9cdbc66403 100644
--- a/include/soc/bcm2835/raspberrypi-firmware.h
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
@@ -10,7 +10,6 @@
#include <linux/of_device.h>
struct rpi_firmware;
-struct pci_dev;
enum rpi_firmware_property_status {
RPI_FIRMWARE_STATUS_REQUEST = 0,
@@ -142,7 +141,6 @@ int rpi_firmware_property(struct rpi_firmware *fw,
int rpi_firmware_property_list(struct rpi_firmware *fw,
void *data, size_t tag_size);
struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node);
-int rpi_firmware_init_vl805(struct pci_dev *pdev);
#else
static inline int rpi_firmware_property(struct rpi_firmware *fw, u32 tag,
void *data, size_t len)
@@ -160,11 +158,6 @@ static inline struct rpi_firmware *rpi_firmware_get(struct device_node *firmware
{
return NULL;
}
-
-static inline int rpi_firmware_init_vl805(struct pci_dev *pdev)
-{
- return 0;
-}
#endif
#endif /* __SOC_RASPBERRY_FIRMWARE_H__ */
--
2.26.2
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v2 8/9] Revert "firmware: raspberrypi: Introduce vl805 init routine"
2020-06-09 17:50 ` [PATCH v2 8/9] Revert "firmware: raspberrypi: Introduce vl805 init routine" Nicolas Saenz Julienne
@ 2020-06-09 18:15 ` Florian Fainelli
0 siblings, 0 replies; 23+ messages in thread
From: Florian Fainelli @ 2020-06-09 18:15 UTC (permalink / raw)
To: Nicolas Saenz Julienne, f.fainelli, gregkh, wahrenst, p.zabel,
linux-kernel, Ray Jui, Scott Branden, bcm-kernel-feedback-list
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel, tim.gover,
linux-pci, helgaas, andy.shevchenko, mathias.nyman,
lorenzo.pieralisi
On 6/9/2020 10:50 AM, Nicolas Saenz Julienne wrote:
> This reverts commit fbbc5ff3f7f9f4cad562e530ae2cf5d8964fe6d3.
>
> The vl805 init routine has moved into drivers/reset/reset-raspberrypi.c
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
--
Florian
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v2 9/9] Revert "PCI: brcmstb: Wait for Raspberry Pi's firmware when present"
2020-06-09 17:49 [PATCH v2 0/9] Raspberry Pi 4 USB firmware initialization rework Nicolas Saenz Julienne
` (7 preceding siblings ...)
2020-06-09 17:50 ` [PATCH v2 8/9] Revert "firmware: raspberrypi: Introduce vl805 init routine" Nicolas Saenz Julienne
@ 2020-06-09 17:50 ` Nicolas Saenz Julienne
2020-06-09 18:15 ` Florian Fainelli
8 siblings, 1 reply; 23+ messages in thread
From: Nicolas Saenz Julienne @ 2020-06-09 17:50 UTC (permalink / raw)
To: f.fainelli, gregkh, wahrenst, p.zabel, linux-kernel,
Nicolas Saenz Julienne, Lorenzo Pieralisi, Rob Herring,
bcm-kernel-feedback-list
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel, tim.gover,
linux-pci, helgaas, andy.shevchenko, mathias.nyman,
Bjorn Helgaas
This reverts commit 44331189f9082c7e659697bbac1747db3def73e7.
Now that the VL805 init routine is run through a reset controller driver
the device dependencies are being taken care of by the device core. No
need to do it manually here.
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
drivers/pci/controller/pcie-brcmstb.c | 17 -----------------
1 file changed, 17 deletions(-)
diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c
index 7730ea845ff2..752f5b331579 100644
--- a/drivers/pci/controller/pcie-brcmstb.c
+++ b/drivers/pci/controller/pcie-brcmstb.c
@@ -28,8 +28,6 @@
#include <linux/string.h>
#include <linux/types.h>
-#include <soc/bcm2835/raspberrypi-firmware.h>
-
#include "../pci.h"
/* BRCM_PCIE_CAP_REGS - Offset for the mandatory capability config regs */
@@ -931,26 +929,11 @@ static int brcm_pcie_probe(struct platform_device *pdev)
{
struct device_node *np = pdev->dev.of_node, *msi_np;
struct pci_host_bridge *bridge;
- struct device_node *fw_np;
struct brcm_pcie *pcie;
struct pci_bus *child;
struct resource *res;
int ret;
- /*
- * We have to wait for Raspberry Pi's firmware interface to be up as a
- * PCI fixup, rpi_firmware_init_vl805(), depends on it. This driver's
- * probe can race with the firmware interface's (see
- * drivers/firmware/raspberrypi.c) and potentially break the PCI fixup.
- */
- fw_np = of_find_compatible_node(NULL, NULL,
- "raspberrypi,bcm2835-firmware");
- if (fw_np && !rpi_firmware_get(fw_np)) {
- of_node_put(fw_np);
- return -EPROBE_DEFER;
- }
- of_node_put(fw_np);
-
bridge = devm_pci_alloc_host_bridge(&pdev->dev, sizeof(*pcie));
if (!bridge)
return -ENOMEM;
--
2.26.2
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v2 9/9] Revert "PCI: brcmstb: Wait for Raspberry Pi's firmware when present"
2020-06-09 17:50 ` [PATCH v2 9/9] Revert "PCI: brcmstb: Wait for Raspberry Pi's firmware when present" Nicolas Saenz Julienne
@ 2020-06-09 18:15 ` Florian Fainelli
0 siblings, 0 replies; 23+ messages in thread
From: Florian Fainelli @ 2020-06-09 18:15 UTC (permalink / raw)
To: Nicolas Saenz Julienne, f.fainelli, gregkh, wahrenst, p.zabel,
linux-kernel, Lorenzo Pieralisi, Rob Herring,
bcm-kernel-feedback-list
Cc: linux-usb, linux-rpi-kernel, linux-arm-kernel, tim.gover,
linux-pci, helgaas, andy.shevchenko, mathias.nyman,
Bjorn Helgaas
On 6/9/2020 10:50 AM, Nicolas Saenz Julienne wrote:
> This reverts commit 44331189f9082c7e659697bbac1747db3def73e7.
>
> Now that the VL805 init routine is run through a reset controller driver
> the device dependencies are being taken care of by the device core. No
> need to do it manually here.
>
> Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
--
Florian
^ permalink raw reply [flat|nested] 23+ messages in thread