On 4/29/20 2:36 PM, Nicolas Saenz Julienne wrote: > On Wed, 2020-04-29 at 14:05 +0200, Marek Vasut wrote: >> On 4/29/20 12:10 PM, Nicolas Saenz Julienne wrote: >>> On Tue, 2020-04-28 at 19:59 +0200, Marek Vasut wrote: >>>> On 4/28/20 7:44 PM, Nicolas Saenz Julienne wrote: >>>>> When needed, RPi4's co-processor (called VideoCore) has to be instructed >>>>> to load VL805's firmware (the chip providing xHCI support). VideCore's >>>>> firmware expects the board's PCIe bus to be already configured in order >>>>> for it to load the xHCI chip firmware. So we have to make sure this >>>>> happens in between the PCIe configuration and xHCI startup. >>>>> >>>>> Signed-off-by: Nicolas Saenz Julienne <[email protected]> >>>>> --- >>>>> drivers/usb/host/xhci-pci.c | 6 ++++++ >>>>> 1 file changed, 6 insertions(+) >>>>> >>>>> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c >>>>> index c1f60da541..5c17ea6932 100644 >>>>> --- a/drivers/usb/host/xhci-pci.c >>>>> +++ b/drivers/usb/host/xhci-pci.c >>>>> @@ -11,6 +11,8 @@ >>>>> #include <usb.h> >>>>> #include <usb/xhci.h> >>>>> >>>>> +#include <asm/arch/msg.h> >>>>> + >>>>> static void xhci_pci_init(struct udevice *dev, struct xhci_hccr >>>>> **ret_hccr, >>>>> struct xhci_hcor **ret_hcor) >>>>> { >>>>> @@ -18,6 +20,10 @@ static void xhci_pci_init(struct udevice *dev, struct >>>>> xhci_hccr **ret_hccr, >>>>> struct xhci_hcor *hcor; >>>>> u32 cmd; >>>>> >>>>> +#ifdef CONFIG_BCM2711 >>>>> + bcm2711_load_vl805_firmware(); >>>>> +#endif >>>>> + >>>>> hccr = (struct xhci_hccr *)dm_pci_map_bar(dev, >>>>> PCI_BASE_ADDRESS_0, PCI_REGION_MEM); >>>>> hcor = (struct xhci_hcor *)((uintptr_t) hccr + >>>> >>>> I think socfpga arria10 has some firmware loader implementation that is >>>> generic, so can't we use that ? >>> >>> I don't think so. I've been told the firmware upgrade protocol is private >>> and >>> specific to the VL80X family of devices. The Raspberry Pi foundation decided >>> to >>> implement it in their closed source VideoCore firmware. >> >> What I meant was that U-Boot has a way to load files from various >> storage roughly the same way Linux firmware loader API does. > > As far as generic APIs are concerned I've had a look at > request_firmware_into_buf() which socfpga uses in its spl_board_init(). But > sadly it doesn't help here. > > What bcm2711_load_vl805_firmware() does here is just informing the > co-processor > that it's free to start the VL805 firmware load operation. I'm by no means > providing anything, think of it as a doorbell if you will. I'll try to find an > alternative to 'load' in the function name so the distinction with regular > firmware loading is more explicit.
Oh, that's how it is, I see. > Also bare in mind we have to time this operation in between PCIe configuration > and xHCI init. Which, IIUC, blocks us from using board_init() and the likes of > it (which would be way nicer IMO). Maybe you need some callback there ?

