resolve_dev() {
    local dev="$1"
    local segment="0000"
    local bridge bus bus_offset

    case "$dev" in
        # device path to resolve
        [0-9a-f][0-9a-f][0-9a-f][0-9a-f]_*_*.*) segment=${dev%%_*}; dev="${dev#*_}" ;;
        *_*.*) ;;
        # (S)BDF directly
        *:*:*.*) echo "$dev"; return ;;
        *:*.*) echo "0000:$dev"; return;;
        *) echo "Invalid device format: $dev" >&2; return ;;
    esac

    while [[ "$dev" = *-* ]]; do
        bridge="${dev%%-*}"
        bridge="${bridge//_/:}"
        dev="${dev#*-}"
        # this is in hex
        bus="${dev%%_*}"
        # this is in dec
        bus_offset=$(<"./sys/bus/pci/devices/$segment:$bridge/secondary_bus_number") || return
        bus=$(printf "%02x" $(( "0x$bus" + bus_offset )) )
        dev="${bus}_${dev#*_}"
    done
    echo "$segment:${dev//_/:}"
}

