Hello, Sorry about the radio silence from me -- I've been trying to get this working on my end as well. I was able to get my passed-through USB device on a qemu system to have a firmware_node by using the "Upgrading ACPI tables via initrd" kernel feature [1]. In case this provides helpful information, the below describes what I did. This was using the default yocto core-image-minimal image and qemu-system-x86_64. I invoke qemu with the convenience "runqemu" script, as follows: runqemu nographic qemuparams=" -initrd ../acpi-overlay/instrumented_initrd -device 'usb-host,vendorid=0x10c4,productid=0xea90' -pflash ./build/tmp/work/core2-64-poky-linux/ovmf/edk2-stable202211-r0/ovmf/ovmf.fd " Which invokes qemu with something like the following (sorry about the long lines..): qemu-system-x86_64 \ -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 \ -netdev tap,id=net0,ifname=tap0,script=no,downscript=no \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-pci,rng=rng0 \ -drive file=/home/kaehnd/src/local/x86/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20230306143252.rootfs.ext4,if=virtio,format=raw \ -usb -device usb-tablet -usb -device usb-kbd -cpu IvyBridge \ -machine q35,i8042=off -smp 4 -m 256 \ -device 'usb-host,vendorid=0x10c4,productid=0xea90' \ -serial mon:stdio -serial null -nographic \ -kernel /home/kaehnd/src/local/x86/build/tmp/deploy/images/qemux86-64/bzImage \ -append 'root=/dev/vda rw ip=192.168.7.2::192.168.7.1:255.255.255.0::eth0:off:8.8.8.8 console=ttyS0 console=ttyS1 oprofile.timer=1 tsc=reliable no_timer_check rcupdate.rcu_expedited=1 ' The sysfs path tree for the CP2112 was as follows: #> ls -l /sys/bus/hid/devices/0003:10C4:EA90.0003 lrwxrwxrwx 1 root root 0 Mar 6 19:24 /sys/bus/hid/devices/0003:10C4:EA90.0003 -> ../../../devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/0003:10C4:EA90.0003 Out of the box, firmware_node files existed only through what I assume is the PCI bus: /sys/devices/pci0000:00 It's ACPI path: #> cat /sys/devices/pci0000:00/firmware_node/path \_SB_.PCI0 Using the instructions at [1], I grabbed the dsdt table, and modified it as follows. Underneath the PCI0 node, I added the following ASL ``` Device (SE9) { Name (_ADR, 0x001D0001) // _ADR: Address Device (RHUB) { Name (_ADR, Zero) Device (CP2) // the USB-hid & CP2112 shared node { Name (_ADR, One) } } } ``` If I'm understanding correctly, this adds the SE9 device as function 1 of PCI device 0x1d, then RHUB as the USB controller it provides, and finally, CP2 as the USB device attached to port 1 of the controller. With this as the loaded dsdt table, the USB device now has a firmware_node :) #> cat /sys/bus/usb/devices/3-1:1.0/firmware_node/path \_SB_.PCI0.SE9_.RHUB.CP2_ After applying my patches, the HID device also references this node: #> cat /sys/bus/hid/devices/0003:10C4:EA90.0003/firmware_node/path \_SB_.PCI0.SE9_.RHUB.CP2_ With this all said -- I noticed iasl prints this statement when trying to create a node with a lowercase name: "At least one lower case letter found in NameSeg, ASL is case insensitive - converting to upper case (GPIO)" I wonder if this suggests that adding a call to toupper() to acpi_fwnode_get_named_child_node would be an appropriate solution for the node name casing issue.... [1] https://www.kernel.org/doc/html/latest/admin-guide/acpi/initrd_table_override.html