You worked it out already, but as reference for others:
Always start with
\_SB
as base ('\': absolute root; leading '_': name reserved by ACPI specification) for
External
and
Scope
.
Then every second item is an ACPI entity (4 character name, beginning with a letter from 'A' to 'Z') with a PCI address (after '@'); pick them in order to make the path: PCI0, GPP8, X161 (this one sounds like it comes from an AMD motherboard but these names are just arbitrary). The next object after that, 'pci-bridge@0' has an address but no proper ACPI name, and that what is to be fixed.
\_SB.PCI0.GPP8.X161
is our well-formed ACPI path.
First acknowledge it already exists so it can be used:
External(_SB.PCI0.GPP8.X161, DeviceObj)
Then, let's put us within the context of this object :
Scope(\_SB.PCI0.GPP8.X161)
and define that the child
Device
at PCI sub-address 0 (
Name (_ADR, Zero)
) is called
BRG0
(or whatever arbitrary name we fancy…) and has child
GFX0
at address 0.
Pay attention to addresses! Adjust accordingly if the unnamed bridge, or the GPU behind it, is not at address 0 but at another value
@1:
Name (_ADR, One)
@2:
Name (_ADR, 0x2)
etc.
If there are multiple unnamed bridges (pci-bridge@0/IOPP/pci-bridge@0/IOPP/GFX0@0, as seen
a few posts before), declare multiple nested devices (as in SSDT-BRG from the
above post).