Hi All, I'm working on enabling the VIA805 XCHI controller found on the new Raspberry Pi 4. The controller sits behind a PCIe bus, which I've already implemented[1] and will submit once the XCHI issues are resolved, as it's worthless otherwise.
The XHCI initialization gets stuck after issuing the fist 'enable slot' command. I've been reviewing the whole init process and comparing it to Linux's for days without finding anything fishy. DMA constraints, which are important on the RPi are mantained, and on top of that, I can confirm DMA trough PCIe works fine as I see two 'port status change' events available in the ring before completly stalling. Also note that, unsurprisingly, the CRR bit in the CRCR register (which marks the running state of the Command Ring state machine) is never set after ringing the relevant doorbell. I'm clueless at this point, I figure the VIA805 is sensitive to the ordering of some of the operations we perform in u-boot, or worse, the timing. For example, I tried replicanting Linux's behaviour with regard to 'port status change' events, processing them before calling the 'enable slot' command. I also tried to mimic Linux by enabling port-0's power (the USB3 port) before starting the HC. Again, no luck. I attached the usb/xhci debug output, any ideas on where to look will be apreciated. Regards, Nicolas [1] https://github.com/vianpl/u-boot/commits/brcm-pcie
U-Boot 2020.04-rc4-00037-gfcf9b64659-dirty (Apr 01 2020 - 18:49:34 +0200) DRAM: 3.9 GiB RPI 4 Model B (0xc03111) MMC: mmcnr@7e300000: 1, emmc2@7e340000: 0 Loading Environment from FAT... *** Warning - bad CRC, using default environment In: serial Out: vidconsole Err: vidconsole Net: eth0: ethernet@7d580000 starting USB... No working controllers found Hit any key to stop autoboot: 0 U-Boot> pci start Scanning PCI devices on bus 0 BusDevFun VendorId DeviceId Device Class Sub-Class _____________________________________________________________ 00.00.00 0x14e4 0x2711 Bridge device 0x04 U-Boot> usb start starting USB... Bus xhci_pci: XHCI-PCI init hccr 0000000600000000 and hcor 0000000600000020 hc_length 32 xhci_register: dev='xhci_pci', ctrl=000000003db41600, hccr=0000000600000000, hcor=0000000600000020 // Halt the HC: 0000000600000020 // Reset the HC Register 5000420 NbrPorts 5 Starting the controller USB XHCI 1.00 scanning bus xhci_pci for devices... xhci_alloc_device: dev='xhci_pci', udev=000000003db230c0 set address 1 usb_control_msg: request: 0x5, requesttype: 0x0, value 0x1 index 0x0 length 0x0 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db230c0, udev->dev='xhci_pci', portnr=0 USB_REQ_SET_ADDRESS scrlen = 0 req->length = 0 Len is 0 usb_control_msg: request: 0x6, requesttype: 0x80, value 0x100 index 0x0 length 0x12 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db230c0, udev->dev='xhci_pci', portnr=0 USB_DT_DEVICE request scrlen = 18 req->length = 18 usb_control_msg: request: 0x6, requesttype: 0x80, value 0x200 index 0x0 length 0x9 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db230c0, udev->dev='xhci_pci', portnr=0 USB_DT_CONFIG config scrlen = 25 req->length = 9 usb_control_msg: request: 0x6, requesttype: 0x80, value 0x200 index 0x0 length 0x1F xhci_submit_control_msg: dev='xhci_pci', udev=000000003db230c0, udev->dev='xhci_pci', portnr=0 USB_DT_CONFIG config scrlen = 25 req->length = 31 get_conf_no 0 Result 25, wLength 31 if 0, ep 0 ##EP epmaxpacketin[1] = 8 set configuration 1 usb_control_msg: request: 0x9, requesttype: 0x0, value 0x1 index 0x0 length 0x0 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db230c0, udev->dev='xhci_pci', portnr=0 scrlen = 0 req->length = 0 Len is 0 new device strings: Mfr=1, Product=2, SerialNumber=0 usb_control_msg: request: 0x6, requesttype: 0x80, value 0x300 index 0x0 length 0xFF xhci_submit_control_msg: dev='xhci_pci', udev=000000003db230c0, udev->dev='xhci_pci', portnr=0 USB_DT_STRING config scrlen = 4 req->length = 255 USB device number 1 default language ID 0x409 usb_control_msg: request: 0x6, requesttype: 0x80, value 0x301 index 0x409 length 0xFF xhci_submit_control_msg: dev='xhci_pci', udev=000000003db230c0, udev->dev='xhci_pci', portnr=0 USB_DT_STRING config scrlen = 14 req->length = 255 usb_control_msg: request: 0x6, requesttype: 0x80, value 0x302 index 0x409 length 0xFF xhci_submit_control_msg: dev='xhci_pci', udev=000000003db230c0, udev->dev='xhci_pci', portnr=0 USB_DT_STRING config scrlen = 42 req->length = 255 Manufacturer U-Boot Product XHCI Host Controller SerialNumber usb_hub_post_probe usb_control_msg: request: 0x6, requesttype: 0xA0, value 0x2A00 index 0x0 length 0x4 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 USB_DT_HUB config scrlen = 8 req->length = 4 usb_control_msg: request: 0x6, requesttype: 0xA0, value 0x2A00 index 0x0 length 0xC xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 USB_DT_HUB config scrlen = 8 req->length = 12 5 ports detected individual port power switching standalone hub individual port over-current protection TT requires at most 8 FS bit times (666 ns) power on to power good time: 20ms hub controller current requirement: 0mA port 1 is removable port 2 is removable port 3 is removable port 4 is removable port 5 is removable usb_control_msg: request: 0x0, requesttype: 0xA0, value 0x0 index 0x0 length 0x4 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 scrlen = 2 req->length = 4 get_hub_status returned status 1, change 905 local power source is lost (inactive) no over-current condition exists xhci_update_hub_device: dev='xhci_pci', udev=000000003db43300 enabling power on all ports usb_control_msg: request: 0x3, requesttype: 0x23, value 0x8 index 0x1 length 0x0 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 scrlen = 0 req->length = 0 Len is 0 port 1 returns 0 usb_control_msg: request: 0x3, requesttype: 0x23, value 0x8 index 0x2 length 0x0 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 scrlen = 0 req->length = 0 Len is 0 port 2 returns 0 usb_control_msg: request: 0x3, requesttype: 0x23, value 0x8 index 0x3 length 0x0 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 scrlen = 0 req->length = 0 Len is 0 port 3 returns 0 usb_control_msg: request: 0x3, requesttype: 0x23, value 0x8 index 0x4 length 0x0 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 scrlen = 0 req->length = 0 Len is 0 port 4 returns 0 usb_control_msg: request: 0x3, requesttype: 0x23, value 0x8 index 0x5 length 0x0 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 scrlen = 0 req->length = 0 Len is 0 port 5 returns 0 pgood_delay=20ms devnum=1 poweron: query_delay=100 connect_timeout=1100 usb_control_msg: request: 0x0, requesttype: 0xA3, value 0x0 index 0x3 length 0x4 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 scrlen = 4 req->length = 4 Port 3 Status 100 Change 0 usb_control_msg: request: 0x0, requesttype: 0xA3, value 0x0 index 0x4 length 0x4 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 scrlen = 4 req->length = 4 Port 4 Status 100 Change 0 usb_control_msg: request: 0x0, requesttype: 0xA3, value 0x0 index 0x5 length 0x4 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 scrlen = 4 req->length = 4 Port 5 Status 100 Change 0 usb_control_msg: request: 0x0, requesttype: 0xA3, value 0x0 index 0x1 length 0x4 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 scrlen = 4 req->length = 4 Port 1 Status 101 Change 1 devnum=1 port=1: USB dev found usb_control_msg: request: 0x0, requesttype: 0xA3, value 0x0 index 0x1 length 0x4 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 scrlen = 4 req->length = 4 portstatus 101, change 1, 12 Mb/s usb_control_msg: request: 0x1, requesttype: 0x23, value 0x10 index 0x1 length 0x0 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 clear port connect change, actual port 1 status = 0x400002e1 scrlen = 0 req->length = 0 Len is 0 usb_hub_port_reset: resetting 'usb_hub' port 1... usb_control_msg: request: 0x3, requesttype: 0x23, value 0x4 index 0x1 length 0x0 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 scrlen = 0 req->length = 0 Len is 0 usb_control_msg: request: 0x0, requesttype: 0xA3, value 0x0 index 0x1 length 0x4 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 SPEED = HIGHSPEED scrlen = 4 req->length = 4 portstatus 503, change 10, 480 Mb/s STAT_C_CONNECTION = 0 STAT_CONNECTION = 1 USB_PORT_STAT_ENABLE 1 usb_control_msg: request: 0x1, requesttype: 0x23, value 0x14 index 0x1 length 0x0 xhci_submit_control_msg: dev='xhci_pci', udev=000000003db43300, udev->dev='usb_hub', portnr=0 clear port reset change, actual port 1 status = 0x40000e03 scrlen = 0 req->length = 0 Len is 0 xhci_alloc_device: dev='xhci_pci', udev=000000003db221c0 EP STATE RUNNING. XHCI timeout on event type 33... cannot recover. BUG at drivers/usb/host/xhci-ring.c:474/xhci_wait_for_event()! BUG! resetting ...
signature.asc
Description: This is a digitally signed message part