#!/bin/bash
#
# nVidia legacy test script
#
# Copyright (c) 2007-2025 by Silvan Calarco <silvan.calarco@mambasoft.it>
# Released under the GNU GPL v.3 license
#
# Reference:
# https://download.nvidia.com/XFree86/Linux-x86_64/590.48.01/README/supportedchips.html
#
# Parsed with script provided in mambabase repository sources:
# nvidia-deviceid-parse.py

[ "$1" = "-i" ] && DO_INSTALL=1

[ "$1" = "-t" ] && DO_TEST=1

PCIID=`/usr/sbin/lspci -n | grep " 030.: 10de:" | awk '{ print $3 }'`

[ "$PCIID" ] || {
   echo "No NVIDIA PCI device found!" >&2
   exit 1
}

DEVID=`echo ${PCIID/*:/} | tr '[:lower:]' '[:upper:]'`

case $DEVID in
   066A|06A3|07C0|0802|0803|0825|0827|0876|087C|0885|\
   0886|0887|088B|08A1|08A2|09C1|1025|1028|102B|1031|\
   1032|103C|1043|1059|107A|10DE|114F|1173|1198|1199|\
   11C9|11DD|11E8|11E9|1217|1221|1225|1226|1227|1232|\
   123C|123E|123F|1244|1245|126C|126D|1284|1297|12EB|\
   1306|1307|1308|131D|1340|1341|1344|1346|1347|1348|\
   1349|134B|134D|134E|134F|1351|137A|137B|137D|1380|\
   1381|1382|1390|1391|1392|1393|1398|1399|139A|139B|\
   139C|139D|13B0|13B1|13B2|13B3|13B4|13B6|13B9|13BA|\
   13BB|13BC|13C0|13C2|13D7|13D8|13D9|13DA|13F0|13F1|\
   13F2|13F3|13F8|13F9|13FA|13FB|1401|1402|1406|1407|\
   1427|1430|1431|1436|1458|1462|1481|149F|14A1|152D|\
   1558|15F0|15F7|15F8|15F9|1617|1618|1619|161A|1651|\
   1653|1667|16F0|1707|174D|174E|179C|17AA|17C2|17C8|\
   17F0|17F1|17FD|18C1|19DA|1A58|1AFA|1B00|1B02|1B06|\
   1B30|1B31|1B38|1B5E|1B80|1B81|1B82|1B83|1B84|1B87|\
   1BA0|1BA1|1BA2|1BB0|1BB1|1BB3|1BB4|1BB5|1BB6|1BB7|\
   1BB8|1BB9|1BBB|1BC7|1BE0|1BE1|1BF0|1C02|1C03|1C04|\
   1C06|1C07|1C09|1C20|1C21|1C22|1C23|1C30|1C31|1C60|\
   1C61|1C62|1C81|1C82|1C83|1C8C|1C8D|1C8F|1C90|1C91|\
   1C92|1C94|1C96|1CB1|1CB2|1CB3|1CB6|1CBA|1CBB|1CBC|\
   1CBD|1CCE|1CFA|1CFB|1D01|1D02|1D05|1D10|1D11|1D12|\
   1D13|1D16|1D33|1D34|1D52|1D72|1D81|1DB1|1DB3|1DB4|\
   1DB5|1DB6|1DB7|1DB8|1DBA|1DF0|1DF2|1DF5|1DF6|2000|\
   2001|2009|2225|2232|225F|2262|2266|2267|2268|2269|\
   2600|2700|2B2B|2B4C|2B5C|30BA|3124|355B|362C|362F|\
   3636|363F|3640|3647|3649|364B|3697|3699|369C|36AF|\
   36B9|36BA|36BF|36C3|36D1|36D8|3842|39B9|39FF|505A|\
   8390|8467|8478|84DB|84E9|84EB|8519|856A|8581|861E|\
   86D9|86E3|8A75|9501|95E1|95E5|B282|B284|B286|C248|\
   D003) ALT_SUFFIX='580' ;;

   01C6|0595|05B2|0FC6|0FC8|0FC9|0FCD|0FCE|0FD1|0FD2|\
   0FD3|0FD4|0FD5|0FD8|0FD9|0FDF|0FE0|0FE1|0FE2|0FE3|\
   0FE4|0FE9|0FEA|0FEC|0FED|0FEE|0FF6|0FF8|0FF9|0FFA|\
   0FFB|0FFC|0FFD|0FFE|0FFF|1001|1004|1005|1007|1008|\
   100A|100C|1021|1022|1023|1024|1026|1027|1028|1029|\
   102A|102D|103A|103C|106F|1074|10DE|1180|1183|1184|\
   1185|1187|1188|1189|118A|118E|118F|1193|1194|1195|\
   1198|1199|119A|119D|119E|119F|11A0|11A1|11A2|11A3|\
   11A7|11B4|11B6|11B7|11B8|11BA|11BC|11BD|11BE|11C0|\
   11C2|11C3|11C4|11C5|11C6|11C8|11CB|11E0|11E1|11E2|\
   11E3|11FA|11FC|1280|1281|1282|1284|1286|1287|1288|\
   1289|128B|1290|1291|1292|1293|1295|1296|1298|1299|\
   129A|12B9|12BA|1458|17AA|1B0A|2AFA|2B0D|2B0F|2B16|\
   2B20|2B21|30BB|30DA|30DC|30DD|30DF|3117|361B|362D|\
   362E|3630|3637|3675|367A|367C|3683|3684|369B|36A7|\
   36AF|36F0|D001) ALT_SUFFIX='470' ;;

   0083|0106|0177|0180|0190|0192|01C0|0224|054D|054E|\
   0554|0557|0562|0565|0568|0590|0592|0594|0595|05A2|\
   05B1|05B3|05DA|05DE|05E0|05E8|05F4|0600|0606|060F|\
   0625|062F|064A|064C|064E|0652|0653|0655|065E|0662|\
   067A|0680|0686|0689|068B|068D|068E|0691|0692|0694|\
   06AD|06AE|06AF|06B0|06C0|06C1|06C4|06CA|06CD|06D1|\
   06D2|06D8|06D9|06DA|06DC|06DD|06DE|06DF|0702|0719|\
   0725|0728|072B|072E|0732|0753|0754|0763|0771|0772|\
   0773|0774|0776|077A|077B|077C|077D|077E|077F|0781|\
   0798|0799|079B|079C|0807|0821|0823|082F|0830|0833|\
   0837|083E|0840|0841|0842|0846|0853|0854|0855|0856|\
   0857|0858|0863|0866|0868|0869|0873|0878|087B|087F|\
   0881|0885|088A|088E|088F|0891|089B|0907|0911|0914|\
   091E|0921|0926|092E|092F|0932|093A|093C|093F|0941|\
   0945|0952|0953|0954|0965|0974|0982|0983|098D|0DAC|\
   0DAD|0DC0|0DC4|0DC5|0DC6|0DCD|0DCE|0DD1|0DD2|0DD3|\
   0DD6|0DD8|0DDA|0DE0|0DE1|0DE2|0DE3|0DE4|0DE5|0DE7|\
   0DE8|0DE9|0DEA|0DEB|0DEC|0DED|0DEE|0DEF|0DF0|0DF1|\
   0DF2|0DF3|0DF4|0DF5|0DF6|0DF7|0DF8|0DF9|0DFA|0DFC|\
   0E22|0E23|0E24|0E30|0E31|0E3A|0E3B|0EF3|0F00|0F01|\
   0F02|0F03|1005|1012|1013|1019|1025|1028|1030|103C|\
   1040|1042|1043|1048|1049|104A|104B|104C|1050|1051|\
   1052|1054|1055|1056|1057|1058|1059|105A|105B|1067|\
   107C|107D|1080|1081|1082|1084|1086|1087|1088|1089|\
   108B|1091|1092|1094|1096|109A|109B|10B8|10CC|10CF|\
   10DD|10DE|10E9|10ED|1116|1140|1179|11FD|1200|1201|\
   1203|1205|1206|1207|1208|1210|1211|1212|1213|1241|\
   1243|1244|1245|1246|1247|1248|1249|124B|124D|1251|\
   126D|131D|13FD|144D|1462|14C0|14C7|1507|152D|15AD|\
   15ED|160D|163D|165D|166D|16CD|16DD|170D|174B|176D|\
   178D|179D|17AA|17F5|1854|18EF|18F9|18FB|18FD|18FF|\
   1B0A|1B50|1B6C|1BAB|1D05|20DD|20DF|210E|212A|212B|\
   212C|2132|2136|218A|21BA|21BB|21BC|21FA|2200|2202|\
   220A|220E|2210|2212|2213|2214|2218|221A|2220|223A|\
   224A|225B|225D|226D|226F|227A|228A|22D2|22D9|22FA|\
   232A|2335|2337|233A|235A|236A|238A|2AEF|2AF1|2AF9|\
   2AFB|309C|30B1|30B4|30B7|30E4|30F3|361B|361C|361D|\
   3656|365A|365B|365E|3660|3661|366C|3682|3685|3686|\
   3687|3692|3695|3696|369B|369C|369D|369E|36A1|36A6|\
   36A7|36A8|36A9|36AC|36AD|36AF|36B0|36B6|3800|3801|\
   3802|3803|3804|3806|3808|380D|380E|380F|3811|3812|\
   3813|3816|3817|3818|381A|381C|381D|3901|3902|3903|\
   3904|3905|3907|3910|3912|3913|3915|3977|3983|5001|\
   5003|5005|500D|5014|5017|5019|501A|501F|5025|5027|\
   502A|502B|502D|502E|502F|5030|5031|5032|5033|503E|\
   503F|5040|5530|705A|844C|846B|8595|85EA|85EB|85EC|\
   85EE|85F3|860E|861A|861B|8628|8643|864C|8652|8660|\
   8661|90D7|90DD|999F|A625|AA33|AAA2|AAA3|ACB2|ACC1|\
   AE61|AE65|AE6A|AE71|B092|B590|C0D5|C0D7|C0E2|C0E3|\
   C0E4|C10D|C652|C709|C711|C736|C737|C745|C750|FA01|\
   FA02|FA03|FA05|FA11|FA13|FA18|FA19|FA21|FA23|FA2A|\
   FA32|FA33|FA36|FA38|FA42|FA43|FA45|FA47|FA49|FA58|\
   FA59|FA88|FA89) ALT_SUFFIX='390' ;;

   0FEF|0FF2|11BF) ALT_SUFFIX='367' ;;

   0003|00A7|00B1|0191|0193|0194|0197|019D|019E|0400|\
   0401|0402|0403|0404|0405|0406|0407|0408|0409|040A|\
   040B|040C|040D|040E|040F|0410|0420|0421|0422|0423|\
   0424|0425|0426|0427|0428|0429|042A|042B|042C|042D|\
   042E|042F|0595|05E0|05E1|05E2|05E3|05E6|05E7|05EA|\
   05EB|05ED|05F8|05F9|05FD|05FE|05FF|0600|0601|0602|\
   0603|0604|0605|0606|0607|0608|0609|060A|060B|060C|\
   060D|060F|0610|0611|0612|0613|0614|0615|0617|0618|\
   0619|061A|061B|061C|061D|061E|061F|0621|0622|0623|\
   0625|0626|0627|0628|062A|062B|062C|062D|062E|0630|\
   0631|0632|0633|0635|0637|0638|063A|0640|0641|0643|\
   0644|0645|0646|0647|0648|0649|064A|064B|064C|0651|\
   0652|0653|0654|0655|0656|0658|0659|065A|065B|065C|\
   068F|0693|0697|06E0|06E1|06E2|06E3|06E4|06E5|06E6|\
   06E7|06E8|06E9|06EA|06EB|06EC|06EF|06F1|06F8|06F9|\
   06FA|06FB|06FD|06FF|0711|0714|0743|0840|0844|0845|\
   0846|0847|0848|0849|084A|084B|084C|084D|084F|0850|\
   0860|0861|0862|0863|0864|0865|0866|0867|0868|0869|\
   086A|086C|086D|086E|086F|0870|0871|0872|0873|0874|\
   0876|087A|087D|087E|087F|08A0|08A2|08A3|08A4|08A5|\
   0A20|0A22|0A23|0A26|0A27|0A28|0A29|0A2A|0A2B|0A2C|\
   0A2D|0A32|0A34|0A35|0A38|0A3C|0A60|0A62|0A63|0A64|\
   0A65|0A66|0A67|0A68|0A69|0A6A|0A6C|0A6E|0A6F|0A70|\
   0A71|0A72|0A73|0A74|0A75|0A76|0A78|0A7A|0A7C|0CA0|\
   0CA2|0CA3|0CA4|0CA5|0CA7|0CA8|0CA9|0CAC|0CAF|0CB0|\
   0CB1|0CBC|103C|1043|106B|10C0|10C3|10C5|10D8|10DE|\
   1462|14A2|14D2|152D|1642|17AA|1B0A|1BFD|1C42|1C52|\
   202D|3605|3607|360B|3610|3617|3950|397D|3980|8006|\
   903A|90B4|AA51|AA58|AC71|AC82) ALT_SUFFIX='340' ;;

   0020|0028|0029|002C|002D|0040|0041|0042|0043|0044|\
   0045|0046|0047|0048|004E|0090|0091|0092|0093|0095|\
   0098|0099|009D|00A0|00C0|00C1|00C2|00C3|00C8|00C9|\
   00CC|00CD|00CE|00F1|00F2|00F3|00F4|00F5|00F6|00F8|\
   00F9|00FA|00FB|00FC|00FD|00FE|0100|0101|0103|0110|\
   0111|0112|0113|0140|0141|0142|0143|0144|0145|0146|\
   0147|0148|0149|014A|014C|014D|014E|014F|0150|0151|\
   0152|0153|0160|0161|0162|0163|0164|0165|0166|0167|\
   0168|0169|016A|0170|0171|0172|0173|0174|0175|0176|\
   0177|0178|0179|017A|017C|017D|0181|0182|0183|0185|\
   0188|018A|018B|018C|01A0|01D0|01D1|01D2|01D3|01D6|\
   01D7|01D8|01DA|01DB|01DC|01DD|01DE|01DF|01F0|0200|\
   0201|0202|0203|0211|0212|0215|0218|0221|0222|0240|\
   0241|0242|0244|0245|0247|0250|0251|0253|0258|0259|\
   025B|0280|0281|0282|0286|0288|0289|028C|0290|0291|\
   0292|0293|0294|0295|0297|0298|0299|029A|029B|029C|\
   029D|029E|029F|02E0|02E1|02E2|02E3|02E4|0301|0302|\
   0308|0309|0311|0312|0314|031A|031B|031C|0320|0321|\
   0322|0323|0324|0325|0326|0327|0328|032A|032B|032C|\
   032D|0330|0331|0332|0333|0334|0338|033F|0341|0342|\
   0343|0344|0347|0348|034C|034E|038B|0390|0391|0392|\
   0393|0394|0395|0397|0398|0399|039C|039E|03D0|03D1|\
   03D2|03D5|03D6|0531|0533|053A|053B|053E|07E0|07E1|\
   07E2|07E3|07E5) ALT_SUFFIX='304' ;;

   00FA|00FB|00FC|00FD|00FE|0301|0302|0308|0309|0311|\
   0312|0314|031A|031B|031C|0320|0321|0322|0323|0324|\
   0325|0326|0327|0328|032A|032B|032C|032D|0330|0331|\
   0332|0333|0334|0338|033F|0341|0342|0343|0344|0347|\
   0348|034C|034E) ALT_SUFFIX='173' ;;

   0110|0111|0112|0113|0170|0171|0172|0173|0174|0175|\
   0176|0177|0178|0179|017A|017C|017D|0181|0182|0183|\
   0185|0188|018A|018B|018C|01A0|01F0|0200|0201|0202|\
   0203|0250|0251|0253|0258|0259|025B|0280|0281|0282|\
   0286|0288|0289|028C) ALT_SUFFIX='96' ;;

   0020|0028|0029|002C|002D|00A0|0100|0101|0103|0150|\
   0151|0152|0153) ALT_SUFFIX='71' ;;

   *) ALT_SUFFIX='' ;;
esac

case $ALT_SUFFIX in
   580) REC_DRIVER='nvidia_580' ;;
   470) REC_DRIVER='nvidia_470' ;;
   390|340|304|173|96|71) REC_DRIVER='xf86-video-modesetting' ;;
   *) REC_DRIVER='nvidia' ;;
esac

echo "Recommended package for NVIDIA device is '$REC_DRIVER'" >&2

if [ "$DO_TEST" = "1" ]; then
   if [ "$REC_DRIVER" == "xf86-video-modesetting" ]; then
      exit 1
   fi
   exit 0
elif [ "$DO_INSTALL" = "1" ]; then
   rpm -q $REC_DRIVER || pkcon install -y $REC_DRIVER
fi
