From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Vasut Date: Wed, 29 Apr 2020 14:37:59 +0200 Subject: [PATCH 2/2] usb: xhci: Load Raspberry Pi 4 VL805's firmware In-Reply-To: <7566301d93cdb1cf47065d522b5370ec451ba1f4.camel@suse.de> References: <20200428174449.27953-1-nsaenzjulienne@suse.de> <20200428174449.27953-3-nsaenzjulienne@suse.de> <44226fe2-feff-307d-a78b-a89b0765332f@denx.de> <7566301d93cdb1cf47065d522b5370ec451ba1f4.camel@suse.de> Message-ID: <32309b72-9fd3-f32d-4bf8-a0c8b666940d@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 >>>>> --- >>>>> 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 >>>>> #include >>>>> >>>>> +#include >>>>> + >>>>> 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 ?