diff -Nru ubuntu-drivers-common-0.9.6.2~0.22.04.4/debian/changelog ubuntu-drivers-common-0.9.6.2~0.22.04.6/debian/changelog --- ubuntu-drivers-common-0.9.6.2~0.22.04.4/debian/changelog 2023-06-16 09:49:53.000000000 +0000 +++ ubuntu-drivers-common-0.9.6.2~0.22.04.6/debian/changelog 2023-09-15 08:59:17.000000000 +0000 @@ -1,3 +1,26 @@ +ubuntu-drivers-common (1:0.9.6.2~0.22.04.6) jammy; urgency=medium + + * UbuntuDrivers/detect.py: + - Skip modalias checking if id in force install list + + -- Dirk Su Fri, 15 Sep 2023 16:59:17 +0800 + +ubuntu-drivers-common (1:0.9.6.2~0.22.04.5) jammy; urgency=medium + + [ Jeremy Szu ] + * README, README.md, + UbuntuDrivers/detect.py, + tests/test_ubuntu_drivers.py: + - Let OEM images locally extend the NVIDIA driver + supported PCI IDs for cutting edge silicons by specifying + related information in /etc/custom_supported_gpus.json file. + (LP: #1990341) + - Fix pkg.candidate.record retired from apt_pkg library + - Support autopkgtest for force install Nvidia and update + related section in README. + + -- Dirk Su Wed, 28 Jun 2023 10:16:13 +0800 + ubuntu-drivers-common (1:0.9.6.2~0.22.04.4) jammy; urgency=medium * ubuntu-drivers: diff -Nru ubuntu-drivers-common-0.9.6.2~0.22.04.4/README ubuntu-drivers-common-0.9.6.2~0.22.04.6/README --- ubuntu-drivers-common-0.9.6.2~0.22.04.4/README 2023-06-16 09:49:53.000000000 +0000 +++ ubuntu-drivers-common-0.9.6.2~0.22.04.6/README 2023-06-28 02:16:13.000000000 +0000 @@ -89,3 +89,14 @@ packages that apply to the current system. Please note that this cannot rely on having root privileges. + +Autopkgtest +----------- +For the autopkgtest of ubuntu-drivers, a useful command can be used when +developing test cases: + + $ PYTHONPATH=. tests/run test_ubuntu_drivers + +Once the new test case is completed but the others failed, suggest to use a +clean environment to verify, such as: pbuilder, sbuild or dput it to PPA to +build. diff -Nru ubuntu-drivers-common-0.9.6.2~0.22.04.4/README.md ubuntu-drivers-common-0.9.6.2~0.22.04.6/README.md --- ubuntu-drivers-common-0.9.6.2~0.22.04.4/README.md 2023-06-16 09:49:53.000000000 +0000 +++ ubuntu-drivers-common-0.9.6.2~0.22.04.6/README.md 2023-06-28 02:16:13.000000000 +0000 @@ -93,3 +93,15 @@ packages that apply to the current system. Please note that this cannot rely on having root privileges. +## Autopkgtest + +For the autopkgtest of ubuntu-drivers, a useful command can be used when +developing test cases: + +```shell +$ PYTHONPATH=. tests/run test_ubuntu_drivers +``` + +Once the new test case is completed but the others failed, suggest to use a +clean environment to verify, such as: pbuilder, sbuild or dput it to PPA to +build. diff -Nru ubuntu-drivers-common-0.9.6.2~0.22.04.4/tests/test_ubuntu_drivers.py ubuntu-drivers-common-0.9.6.2~0.22.04.6/tests/test_ubuntu_drivers.py --- ubuntu-drivers-common-0.9.6.2~0.22.04.4/tests/test_ubuntu_drivers.py 2023-06-16 09:49:53.000000000 +0000 +++ ubuntu-drivers-common-0.9.6.2~0.22.04.6/tests/test_ubuntu_drivers.py 2023-09-15 08:59:17.000000000 +0000 @@ -19,6 +19,7 @@ # from gi.repository import GLib from gi.repository import UMockdev +from unittest.mock import patch import apt_pkg import aptdaemon.test @@ -40,6 +41,7 @@ # modalias of an nvidia card covered by our nvidia-* packages modalias_nv = 'pci:v000010DEd000010C3sv00003842sd00002670bc03sc03i00' +modalias_nv_2 = 'pci:v000010DEd00002777sv00003842sd00002670bc03sc03i00' def gen_fakehw(): @@ -52,6 +54,7 @@ t.add_device('usb', 'black', None, ['modalias', 'usb:v9876dABCDsv01sd02bc00sc01i05'], []) # covered by nvidia-*.deb t.add_device('pci', 'graphics', None, ['modalias', modalias_nv], []) + t.add_device('pci', 'graphics_2', None, ['modalias', modalias_nv_2], []) # not covered by any driver package t.add_device('pci', 'grey', None, ['modalias', 'pci:vDEADBEEFd00'], []) t.add_device('ssb', 'yellow', None, [], ['MODALIAS', 'pci:vDEADBEEFd00']) @@ -171,7 +174,8 @@ 'pci:v98761234d00sv00000001sd00bc00sc00i00', 'pci:v67891234d00sv00000001sd00bc00sc00i00', 'dmi:aaapnXPS137390:a', - modalias_nv])) + modalias_nv, + modalias_nv_2])) self.assertTrue(res['pci:vDEADBEEFd00'].endswith('/sys/devices/grey')) def test_system_driver_packages_performance(self): @@ -1078,6 +1082,422 @@ # So we expect the DKMS package as a fallback self.assertEqual(modules_package, 'linux-modules-nvidia-520-generic-hwe-20.04') + @patch('UbuntuDrivers.detect.path_get_custom_supported_gpus') + def test_system_driver_packages_force_install_nvidia(self, mocked_pgcsg): + '''system_driver_packages() force install config points to an older version.''' + + chroot = aptdaemon.test.Chroot() + try: + chroot.setup() + chroot.add_test_repository() + archive = gen_fakearchive() + # older applicable driver which is not the recommended one + archive.create_deb('nvidia-driver-390', dependencies={'Depends': 'xorg-video-abi-4'}, + extra_tags={'Modaliases': 'nv(pci:v000010DEd000025BAsv*sd*bc03sc*i*)'}) + # -updates driver which also should not be recommended + + archive.create_deb('nvidia-driver-418-server', dependencies={'Depends': 'xorg-video-abi-4'}, + extra_tags={'Modaliases': 'nv(pci:v000010DEd000025BAsv*sd*bc03sc*i*)', + 'Support': 'LTSB'}) + + archive.create_deb('nvidia-driver-450-server', dependencies={'Depends': 'xorg-video-abi-4'}, + extra_tags={'Modaliases': 'nv(pci:v000010DEd000025BAsv*sd*bc03sc*i*)', + 'Support': 'LTSB'}) + + archive.create_deb('nvidia-driver-470', dependencies={'Depends': 'xorg-video-abi-4'}, + extra_tags={'Modaliases': 'nv(pci:v000010DEd000010C3sv*sd*bc03sc*i*)', + 'Support': 'LTSB'}) + + archive.create_deb('nvidia-driver-510', dependencies={'Depends': 'xorg-video-abi-4'}, + extra_tags={'Modaliases': 'nv(pci:v000010DEd000025BAsv*sd*bc03sc*i*)', + 'Support': 'PB'}) + + archive.create_deb('nvidia-driver-520', dependencies={'Depends': 'xorg-video-abi-4'}, + extra_tags={'Modaliases': 'nv(pci:v000010DEd000025BAsv*sd*bc03sc*i*)', + 'Support': 'LTSB'}) + + # driver package which supports multiple ABIs + archive.create_deb('nvidia-headless-no-dkms-450-server', + dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, + extra_tags={}) + + archive.create_deb('nvidia-headless-no-dkms-418-server', + dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, + extra_tags={}) + + archive.create_deb('nvidia-headless-no-dkms-390', + dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, + extra_tags={}) + + archive.create_deb('nvidia-headless-no-dkms-470', + dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, + extra_tags={}) + + archive.create_deb('nvidia-headless-no-dkms-510', + dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, + extra_tags={}) + + archive.create_deb('nvidia-headless-no-dkms-520', + dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, + extra_tags={}) + + archive.create_deb('nvidia-dkms-450-server', + dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, + extra_tags={}) + + archive.create_deb('nvidia-dkms-418-server', + dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, + extra_tags={}) + + archive.create_deb('nvidia-dkms-390', + dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, + extra_tags={}) + + archive.create_deb('nvidia-dkms-470', + dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, + extra_tags={}) + + archive.create_deb('nvidia-dkms-510', + dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, + extra_tags={}) + + archive.create_deb('nvidia-dkms-520', + dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, + extra_tags={}) + + # Linux nvidia modules + archive.create_deb('linux-modules-nvidia-450-server-generic', + dependencies={'Depends': 'linux-modules-nvidia-450-server-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-450-server-5.4.0-25-generic', + dependencies={'Depends': 'linux-image-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-418-server-generic', + dependencies={'Depends': 'linux-modules-nvidia-418-server-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-418-server-5.4.0-25-generic', + dependencies={'Depends': 'linux-image-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-390-generic', + dependencies={'Depends': 'linux-modules-nvidia-390-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-390-5.4.0-25-generic', + dependencies={'Depends': 'linux-image-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-470-generic', + dependencies={'Depends': 'linux-modules-nvidia-470-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-470-5.4.0-25-generic', + dependencies={'Depends': 'linux-image-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-510-generic', + dependencies={'Depends': 'linux-modules-nvidia-510-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-510-5.4.0-25-generic', + dependencies={'Depends': 'linux-image-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-520-generic', + dependencies={'Depends': 'linux-modules-nvidia-520-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-520-5.4.0-25-generic', + dependencies={'Depends': 'linux-image-5.4.0-25-generic'}, + extra_tags={}) + + # Linux nvidia modules hwe-20.04 flavours + archive.create_deb('linux-modules-nvidia-450-server-generic-hwe-20.04', + dependencies={'Depends': 'linux-modules-nvidia-450-server-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-418-server-generic-hwe-20.04', + dependencies={'Depends': 'linux-modules-nvidia-418-server-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-390-generic-hwe-20.04', + dependencies={'Depends': 'linux-modules-nvidia-390-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-470-generic-hwe-20.04', + dependencies={'Depends': 'linux-modules-nvidia-470-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-510-generic-hwe-20.04', + dependencies={'Depends': 'linux-modules-nvidia-510-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-modules-nvidia-520-generic-hwe-20.04', + dependencies={'Depends': 'linux-modules-nvidia-520-5.4.0-25-generic'}, + extra_tags={}) + + # Image packages + archive.create_deb('linux-image-5.4.0-25-generic', + extra_tags={'Source': 'linux-signed'}) + + archive.create_deb('linux-image-5.3.0-29-generic', + extra_tags={'Source': 'linux-signed'}) + + archive.create_deb('linux-image-5.4.0-24-generic', + extra_tags={'Source': 'linux-signed'}) + + archive.create_deb('linux-headers-5.4.0-24-generic', + extra_tags={'Source': 'linux-signed'}) + + archive.create_deb('linux-headers-5.4.0-25-generic', + extra_tags={'Source': 'linux-signed'}) + + archive.create_deb('linux-image-generic', + dependencies={'Depends': 'linux-image-5.4.0-25-generic, ' + 'linux-headers-5.4.0-25-generic'}, + extra_tags={'Source': 'linux-meta'}) + + archive.create_deb('linux-image-generic-hwe-18.04', + dependencies={'Depends': 'linux-image-generic'}, + extra_tags={'Source': 'linux-meta'}) + + archive.create_deb('linux-image-generic-hwe-18.04-edge', + dependencies={'Depends': 'linux-image-generic'}, + extra_tags={'Source': 'linux-meta'}) + + archive.create_deb('linux-image-generic-hwe-20.04', + dependencies={'Depends': 'linux-image-5.4.0-25-generic'}, + extra_tags={'Source': 'linux-meta'}) + + archive.create_deb('linux-generic-hwe-20.04', + dependencies={'Depends': 'linux-image-generic-hwe-20.04, ' + 'linux-headers-generic-hwe-20.04'}, + extra_tags={'Source': 'linux-meta'}) + + archive.create_deb('linux-headers-generic-hwe-20.04', + dependencies={'Depends': 'linux-headers-5.4.0-25-generic'}, + extra_tags={}) + + archive.create_deb('linux-generic-hwe-18.04', + dependencies={'Depends': 'linux-generic'}, + extra_tags={'Source': + 'linux-meta'}) + archive.create_deb('linux-generic-hwe-18.04-edge', + dependencies={'Depends': 'linux-generic'}, + extra_tags={'Source': + 'linux-meta'}) + archive.create_deb('linux-headers-generic-hwe-18.04', + dependencies={'Depends': 'linux-headers-generic'}, + extra_tags={}) + archive.create_deb('linux-headers-generic-hwe-18.04-edge', + dependencies={'Depends': 'linux-headers-generic'}, + extra_tags={}) + + chroot.add_repository(archive.path, True, False) + apt_pkg.init_config() + dpkg_status = os.path.abspath(os.path.join(chroot.path, "var", "lib", "dpkg", "status")) + apt_pkg.config.set("Dir::State::status", dpkg_status) + apt_pkg.init_system() + cache = apt_pkg.Cache(None) + depcache = apt_pkg.DepCache(cache) + + # Install kernel packages + for pkg in ('linux-image-5.4.0-25-generic', + 'linux-image-5.4.0-24-generic', + 'linux-image-5.3.0-29-generic', + 'linux-headers-5.4.0-24-generic', + 'linux-headers-5.4.0-25-generic', + 'linux-image-generic-hwe-18.04', + 'linux-image-generic-hwe-18.04-edge', + 'linux-image-generic-hwe-20.04', + 'linux-headers-generic-hwe-18.04', + 'linux-headers-generic-hwe-18.04-edge', + 'linux-headers-generic-hwe-20.04', + 'linux-generic-hwe-18.04', + 'linux-generic-hwe-18.04-edge', + 'linux-generic-hwe-20.04', + 'linux-image-generic'): + package = cache.__getitem__(pkg) + depcache.mark_install(package) + + # Generate /etc/custom_supported_gpus.json + csg_file = os.path.abspath(os.path.join(chroot.path, "etc", "custom_supported_gpus.json")) + mocked_pgcsg.return_value = csg_file + + # Force install a nvidia driver, normal case + with open(csg_file, 'w') as csg: + csg.write('''{ + "chips": [ + { + "devid": "0x10C3", + "name": "TEST 10C3", + "branch": "510", + "features": [ + "runtimepm" + ] + }, + { + "devid": "0x25BA", + "name": "TEST 25BA", + "branch": "580.1234", + "features": [ + "runtimepm" + ] + } + ] +}''') + res_install_510 = UbuntuDrivers.detect.system_driver_packages(cache, + sys_path=self.umockdev.get_sys_dir()) + + # Extra a + with open(csg_file, 'w') as csg: + csg.write('''{ + "chips": [ + { + "devida": "0x10C3", # tried 'devida' an extra 'a' + "name": "TEST 10C3", + "branch": "510", + "features": [ + "runtimepm" + ] + }, + { + "devid": "0x25BA", + "name": "TEST 25BA", + "branch": "580.1234", + "features": [ + "runtimepm" + ] + } + ] +}''') + res_wrong_json = UbuntuDrivers.detect.system_driver_packages(cache, + sys_path=self.umockdev.get_sys_dir()) + + # point to the older version than candidate. + with open(csg_file, 'w') as csg: + csg.write('''{ + "chips": [ + { + "devid": "0x10C3", + "name": "TEST 10C3", + "branch": "390", + "features": [ + "runtimepm" + ] + }, + { + "devid": "0x25BA", + "name": "TEST 25BA", + "branch": "580.1234", + "features": [ + "runtimepm" + ] + } + ] +}''') + res_470_no_390 = UbuntuDrivers.detect.system_driver_packages(cache, + sys_path=self.umockdev.get_sys_dir()) + + # point to the same version as candidate. + with open(csg_file, 'w') as csg: + csg.write('''{ + "chips": [ + { + "devid": "0x10C3", + "name": "TEST 10C3", + "branch": "470", + "features": [ + "runtimepm" + ] + }, + { + "devid": "0x25BA", + "name": "TEST 25BA", + "branch": "580.1234", + "features": [ + "runtimepm" + ] + } + ] +}''') + res_same_470 = UbuntuDrivers.detect.system_driver_packages(cache, + sys_path=self.umockdev.get_sys_dir()) + + # point to a non-exist version of ubuntu-archive (source list). + with open(csg_file, 'w') as csg: + csg.write('''{ + "chips": [ + { + "devid": "0x10C3", + "name": "TEST 10C3", + "branch": "490.1234", + "features": [ + "runtimepm" + ] + }, + { + "devid": "0x25BA", + "name": "TEST 25BA", + "branch": "580.1234", + "features": [ + "runtimepm" + ] + } + ] +}''') + res_470_no_490 = UbuntuDrivers.detect.system_driver_packages(cache, + sys_path=self.umockdev.get_sys_dir()) + + # point to a specific version from ubuntu-archive (source list) which ID + # doesn't exist in any other old version + with open(csg_file, 'w') as csg: + csg.write('''{ + "chips": [ + { + "devid": "0x2777", + "name": "TEST 2777", + "branch": "520", + "features": [ + "runtimepm" + ] + } + ] +}''') + res_520_only = UbuntuDrivers.detect.system_driver_packages(cache, sys_path=self.umockdev.get_sys_dir()) + finally: + chroot.remove() + + self.assertTrue('nvidia-driver-510' in res_install_510) + packages = UbuntuDrivers.detect.gpgpu_install_filter(res_install_510, 'nvidia') + self.assertEqual(set(packages), set(['nvidia-driver-510'])) + + self.assertTrue('nvidia-driver-470' in res_wrong_json) + self.assertFalse('nvidia-driver-510' in res_wrong_json) + packages = UbuntuDrivers.detect.gpgpu_install_filter(res_wrong_json, 'nvidia') + self.assertEqual(set(packages), set(['nvidia-driver-470'])) + + self.assertTrue('nvidia-driver-470' in res_470_no_390) + self.assertTrue('nvidia-driver-390' in res_470_no_390) + packages = UbuntuDrivers.detect.gpgpu_install_filter(res_470_no_390, 'nvidia') + self.assertEqual(set(packages), set(['nvidia-driver-470'])) + + self.assertTrue('nvidia-driver-470' in res_same_470) + packages = UbuntuDrivers.detect.gpgpu_install_filter(res_same_470, 'nvidia') + self.assertEqual(set(packages), set(['nvidia-driver-470'])) + + self.assertTrue('nvidia-driver-470' in res_470_no_490) + self.assertFalse('nvidia-driver-490' in res_470_no_490) + packages = UbuntuDrivers.detect.gpgpu_install_filter(res_470_no_490, 'nvidia') + self.assertEqual(set(packages), set(['nvidia-driver-470'])) + + self.assertTrue('nvidia-driver-520' in res_520_only) + packages = UbuntuDrivers.detect.gpgpu_install_filter(res_520_only, 'nvidia') + self.assertEqual(set(packages), set(['nvidia-driver-520'])) + def test_system_gpgpu_driver_packages_chroot1(self): '''system_gpgpu_driver_packages() for test package repository''' diff -Nru ubuntu-drivers-common-0.9.6.2~0.22.04.4/UbuntuDrivers/detect.py ubuntu-drivers-common-0.9.6.2~0.22.04.6/UbuntuDrivers/detect.py --- ubuntu-drivers-common-0.9.6.2~0.22.04.4/UbuntuDrivers/detect.py 2023-06-16 09:49:53.000000000 +0000 +++ ubuntu-drivers-common-0.9.6.2~0.22.04.6/UbuntuDrivers/detect.py 2023-09-15 08:59:17.000000000 +0000 @@ -14,6 +14,7 @@ import subprocess import functools import re +import json import apt_pkg @@ -21,6 +22,7 @@ system_architecture = '' lookup_cache = {} +custom_supported_gpus_json = '/etc/custom_supported_gpus.json' class NvidiaPkgNameInfo(object): @@ -246,6 +248,37 @@ return result2 +def path_get_custom_supported_gpus(): + return custom_supported_gpus_json + + +def package_get_nv_allowing_driver(did): + '''Get nvidia allowing driver for specific devices. + + did: 0x1234 + Return the situable nvidia driver version for it. + ''' + path = path_get_custom_supported_gpus() + version = None + try: + with open(path, "r") as stream: + try: + gpus = list(json.load(stream)['chips']) + for gpu in gpus: + if gpu['devid'] == did: + version = gpu['branch'].split('.')[0] + logging.info("Found a specific nv driver version %s for %s(%s)" % + (version, gpu['name'], did)) + break + except Exception: + logging.debug('package_get_nv_allowing_driver(): unexpected json detected.') + pass + except Exception: + logging.debug('package_get_nv_allowing_driver(): unable to read %s' % path) + pass + return version + + def packages_for_modalias(apt_cache, modalias): '''Search packages which match the given modalias. @@ -261,8 +294,24 @@ packages_for_modalias.cache_maps[apt_cache_hash] = cache_map pat, bus_map = cache_map.get(modalias.split(':', 1)[0], (None, {})) - if pat is None or not pat.match(modalias): - return [] + vid, did = _get_vendor_model_from_alias(modalias) + nvamd = None + found = 0 + if vid == "10DE": + nvamd = package_get_nv_allowing_driver("0x" + did) + nvamdn = "nvidia-driver-%s" % nvamd + nvamda = "pci:v000010DEd0000%s*" % did + for p in apt_cache.packages: + if p.get_fullname().split(':')[0] == nvamdn: + bus_map[nvamda] = set([nvamdn]) + found = 1 + if nvamd is not None and not found: + logging.debug('%s is not in the package pool.' % nvamdn) + + if not found: + if pat is None or not pat.match(modalias): + return [] + for alias in bus_map: if fnmatch.fnmatchcase(modalias.lower(), alias.lower()): for p in bus_map[alias]: @@ -359,10 +408,46 @@ return support -def _is_runtimepm_supported(pkg, alias): +def _is_nv_allowing_runtimepm_supported(alias, ver): + '''alias: e.g. pci:v000010DEd000024BAsv0000103Csd000089C6bc03sc00i00''' + result = re.search('pci:v0000(.*)d0000(.*)sv(.*)', alias) + vid = result.group(1) + did = result.group(2) + if vid != "10DE": + return False + did = "0x%s" % did + path = path_get_custom_supported_gpus() + try: + with open(path, "r") as stream: + try: + gpus = list(json.load(stream)['chips']) + for gpu in gpus: + if gpu['devid'] == did and 'runtimepm' in gpu['features']: + if gpu['branch'].split('.')[0] != ver: + logging.debug('Candidate version does not match %s != %s' % + (gpu['branch'].split('.')[0], ver)) + return False + logging.info("Found runtimepm supports on %s." % did) + return True + except Exception: + logging.debug('_is_nv_allowing_runtimepm_supported(): unexpected json detected') + pass + except Exception: + logging.debug('_is_nv_allowing_runtimepm_supported(): unable to read %s' % path) + pass + return False + + +def _is_runtimepm_supported(apt_cache, pkg, alias): '''Check if the package supports runtimepm for the given modalias''' try: - m = pkg.candidate.record['PmAliases'] + depcache = apt_pkg.DepCache(apt_cache) + candidate = depcache.get_candidate_ver(pkg) + records = apt_pkg.PackageRecords(apt_cache) + records.lookup(candidate.file_list[0]) + section = apt_pkg.TagSection(records.record) + ver = candidate.ver_str.split('.')[0] + m = section['PmAliases'] except (KeyError, AttributeError, UnicodeDecodeError): return False else: @@ -371,6 +456,8 @@ n = m[m.find('(')+1: m.find(')')] modaliases = n.split(', ') + if _is_nv_allowing_runtimepm_supported(alias, ver): + return True return any(fnmatch.fnmatch(alias.lower(), regex.lower()) for regex in modaliases) @@ -512,7 +599,7 @@ 'free': _is_package_free(apt_cache, p), 'from_distro': _is_package_from_distro(apt_cache, p), 'support': _pkg_get_support(apt_cache, p), - 'runtimepm': _is_runtimepm_supported(p, alias) + 'runtimepm': _is_runtimepm_supported(apt_cache, p, alias) } (vendor, model) = _get_db_name(syspath, alias) if vendor is not None: