On 1/28/25 11:19 AM, Jerome Forissier wrote:
Use the coroutines framework to scan USB buses in parallel for better
performance. Tested on arm64 QEMU on a somewhat contrived example
(4 USB buses, each with one audio device, one keyboard, one mouse and
one tablet).

$ make qemu_arm64_defconfig
$ make -j$(nproc) CROSS_COMPILE="ccache aarch64-linux-gnu-"
$ qemu-system-aarch64 -M virt -nographic -cpu max -bios u-boot.bin \
     $(for i in {1..4}; do echo -device qemu-xhci,id=xhci$i \
         -device\ usb-{audio,kbd,mouse,tablet},bus=xhci$i.0; \
     done)

The time spent in usb_init() is reported on the console and shows a
significant improvement with COROUTINES enabled.
Have you considered using the cyclic framework ( cyclic_register() and co. ) to fully offload USB operations away from the main thread, i.e. to make the U-Boot shell and e.g. 'usb start' run fully in parallel ? That could then be extended to block transfers, which could run in background, and ... we would also get a concept of shell pipes to move data around like we do in Linux.

Reply via email to