#!/bin/sh -e
# Install linux-restricted-modules and binutils, start the script, and put its
# output to modalias_override/nvidia.
# This is a nasty kluge, but it seems to work. Better check the output when
# upgrading to a new release of the nvidia driver, though.
# Whenever a PCI ID is supported by both nvidia and nvidia_legacy, it is only
# listed for nvidia.
echo "# Listing generated by nvidia_supported. Do not edit manually."
device_ids() {
local filename="$1"
# Find the first symbol of the .rodata section...
objdump --section=.rodata --syms "$filename" |
sed -n '/SYMBOL TABLE/,+2 {
s/^\([0-9a-f]\+\)\s\+l\s\+O\s\+\S\+\s\+\([0-9a-f]\+\)\s\+\(\S\+\).*/\1 \2 \3/p
}' |
while read start stop symname; do
# ...and grab the IDs from its hex dump.
objdump --section=.rodata --full-contents \
--start-address="0x$start" --stop-address="0x$stop" "$filename" |
sed -n 's/^ [0-9a-f]\+ \([0-9a-f]\{2\}\)\([0-9a-f]\{2\}\).*/\2\1/p' |
sort | uniq
done
}
set -- "/lib/modules/$(uname -r)/kernel/drivers/video/nvidia.ko" nvidia \
"/lib/modules/$(uname -r)/kernel/drivers/video/nvidia_96xx.ko" nvidia_96xx \
"/lib/modules/$(uname -r)/kernel/drivers/video/nvidia_71xx.ko" nvidia_71xx \
seen_ids=' '
while [ -n "$1" ]; do
filename="$1"; shift
modname="$1"; shift
orig_ids="$(device_ids "$filename")"
ids=''
for id in $orig_ids; do
case "$seen_ids" in
*" $id "*)
# Already seen the ID.
;;
*)
# Not seen it yet.
seen_ids="${seen_ids}${id} "
ids="$ids $id"
;;
esac
done
for id in $ids; do
printf "alias pci:v%08Xd%08Xsv*sd*bc03sc*i* %s\n" \
0x10de "0x$id" "$modname"
done
done | sort