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 ...


Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to