diff -Nru ubuntu-drivers-common-0.8.6/debian/changelog ubuntu-drivers-common-0.8.6.1/debian/changelog --- ubuntu-drivers-common-0.8.6/debian/changelog 2020-10-08 10:29:31.000000000 +0000 +++ ubuntu-drivers-common-0.8.6.1/debian/changelog 2020-10-18 17:01:53.000000000 +0000 @@ -1,8 +1,23 @@ -ubuntu-drivers-common (1:0.8.6-1~202010081029+8d7fc5f~ubuntu20.10.1) groovy; urgency=low +ubuntu-drivers-common (1:0.8.6.1-1~202010181701+0387c85~ubuntu20.10.1) groovy; urgency=low * Auto build. - -- Alex Tu Thu, 08 Oct 2020 10:29:31 +0000 + -- Alex Tu Sun, 18 Oct 2020 17:01:53 +0000 + +ubuntu-drivers-common (1:0.8.6.1) groovy; urgency=medium + + * UbuntuDrivers/detect.py: + - Assume the NVIDIA packages to be non-free (LP: #1899630). + * gpu-manager.{c|py}: + - Handle the xorg conf file in all supported PRIME + scenarios (LP: #1900137). + * tests/test_ubuntu_drivers.py, + tests/gpu-manager.py: + - Expect a xorg conf file to be created in on-demand + mode (11-nvidia-offload.conf) in the test suite. + - Fix test cases now that nvidia is marked as non-free. + + -- Alberto Milone Fri, 16 Oct 2020 16:51:44 +0200 ubuntu-drivers-common (1:0.8.6) groovy; urgency=medium @@ -10,7 +25,8 @@ * share/hybrid/json-parser, debian/copyright: - Include json-parser (just C file and header). * gpu-manager.c: - - Add json parsing code to detect support for runtimepm on NVIDIA. + - Add json parsing code to detect support for runtimepm on NVIDIA + (LP: #1895855). - Check that RTD3 is enabled, and write that to a file in /run. - Make on-demand mode the default when no settings are available. - Add support for AMD+NVIDIA hybrid systems. @@ -18,6 +34,8 @@ if the GPU is not boot_vga, and it is not listed in the json database, we can at least check whether d3hot is supported, and enable runtimepm in the NVIDIA driver. + * gpu-manager.py: + - Adjust the test suite to match the changes in gpu-manager.c. * UbuntuDrivers/detect.py, ubuntu-drivers: - Catch apt exceptions. - Catch failure when modinfo is not available. @@ -43,7 +61,7 @@ * gpu-manager.c: - Fix segmentation fault in json_find_feature_in_array. - -- Alberto Milone Wed, 16 Sep 2020 15:49:28 +0200 + -- Alberto Milone Mon, 12 Oct 2020 16:00:18 +0200 ubuntu-drivers-common (1:0.8.5.4) groovy; urgency=medium diff -Nru ubuntu-drivers-common-0.8.6/debian/copyright ubuntu-drivers-common-0.8.6.1/debian/copyright --- ubuntu-drivers-common-0.8.6/debian/copyright 2020-10-08 10:29:31.000000000 +0000 +++ ubuntu-drivers-common-0.8.6.1/debian/copyright 2020-10-18 17:01:53.000000000 +0000 @@ -10,7 +10,7 @@ Files: share/hybrid/json-parser/* Copyright: Copyright (c) 2012, 2013 James McLaughlin et al. -License: BSD +License: BSD-2-clause License: GPL-2+ This program is free software; you can redistribute it and/or modify @@ -21,17 +21,17 @@ The full text of the GPL is distributed as in /usr/share/common-licenses/GPL-2 on Debian systems. -License: BSD - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +License: BSD-2-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + . + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + . + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. . The full text of the BSD is distributed as in /usr/share/common-licenses/BSD on Debian systems. diff -Nru ubuntu-drivers-common-0.8.6/debian/git-build-recipe.manifest ubuntu-drivers-common-0.8.6.1/debian/git-build-recipe.manifest --- ubuntu-drivers-common-0.8.6/debian/git-build-recipe.manifest 2020-10-08 10:29:31.000000000 +0000 +++ ubuntu-drivers-common-0.8.6.1/debian/git-build-recipe.manifest 2020-10-18 17:01:53.000000000 +0000 @@ -1,2 +1,2 @@ -# git-build-recipe format 0.4 deb-version {debversion}-1~202010081029+8d7fc5f -lp:~alextu/+git/ubuntu-drivers-common git-commit:8d7fc5f17df8d7b94ae85598530a0b7ed2b46cfb +# git-build-recipe format 0.4 deb-version {debversion}-1~202010181701+0387c85 +lp:~alextu/+git/ubuntu-drivers-common git-commit:0387c85b78b2e139e3d338b9066a76eae31fb265 diff -Nru ubuntu-drivers-common-0.8.6/share/hybrid/gpu-manager.c ubuntu-drivers-common-0.8.6.1/share/hybrid/gpu-manager.c --- ubuntu-drivers-common-0.8.6/share/hybrid/gpu-manager.c 2020-10-08 10:29:31.000000000 +0000 +++ ubuntu-drivers-common-0.8.6.1/share/hybrid/gpu-manager.c 2020-10-18 17:01:53.000000000 +0000 @@ -1329,18 +1329,12 @@ } -/* Check if any outputs are still connected to card0. - * - * By default we only check cards driver by i915. - * If so, then claim support for RandR offloading - */ +/* Check if any outputs are still connected to card0 */ static bool requires_offloading(struct device **devices, int cards_n) { /* Let's check only /dev/dri/card0 and look - * for driver i915. We don't want to enable - * offloading to any other driver, as results - * may be unpredictable + * for the boot_vga device. */ int i; bool status = false; @@ -1351,6 +1345,18 @@ } } + if (status) { + if (!exists_not_empty(prime_settings)) { + fprintf(log_handle, "No prime-settings found. " + "Assuming prime is not set " + "to ON (ONDEMAND could be on).\n"); + return false; + } + + get_prime_action(); + status = (prime_mode == ON); + } + return status; } @@ -2775,9 +2781,10 @@ /* Add information about connected outputs */ add_connected_outputs_info(current_devices, cards_n); - /* See if it requires RandR offloading */ - offloading = requires_offloading(current_devices, cards_n); - + if (!fake_lspci_file) { + /* See if it requires RandR offloading */ + offloading = requires_offloading(current_devices, cards_n); + } fprintf(log_handle, "Does it require offloading? %s\n", (offloading ? "yes" : "no")); /* Remove a file that will tell other apps such as @@ -2893,8 +2900,8 @@ run_amdgpu_pro_px(MODE_POWERSAVING); } /* NVIDIA Optimus */ - else if (offloading && ((intel_loaded || amdgpu_loaded) && !nouveau_loaded && - (nvidia_loaded || nvidia_kmod_available))) { + else if ((intel_loaded || amdgpu_loaded) && !nouveau_loaded && + (nvidia_loaded || nvidia_kmod_available)) { fprintf(log_handle, "NVIDIA hybrid system\n"); /* Try to enable prime */ diff -Nru ubuntu-drivers-common-0.8.6/tests/gpu-manager.py ubuntu-drivers-common-0.8.6.1/tests/gpu-manager.py --- ubuntu-drivers-common-0.8.6/tests/gpu-manager.py 2020-10-08 10:29:31.000000000 +0000 +++ ubuntu-drivers-common-0.8.6.1/tests/gpu-manager.py 2020-10-18 17:01:53.000000000 +0000 @@ -565,11 +565,17 @@ self.fake_modules.close() def request_prime_discrete_on(self, is_on=True): - '''Request that discrete is switched on or off''' + '''Request that discrete be switched on or off''' self.prime_settings = open(self.prime_settings.name, 'w') self.prime_settings.write(is_on and 'ON' or 'OFF') self.prime_settings.close() + def request_prime_on_demand(self): + '''Request on-demand mode''' + self.prime_settings = open(self.prime_settings.name, 'w') + self.prime_settings.write('on-demand') + self.prime_settings.close() + def set_dmi_product_version(self, label): '''Set dmi product version''' self.dmi_product_version_path = open(self.dmi_product_version_path.name, 'w') @@ -728,13 +734,13 @@ ['nvidia'], ['mesa', 'nvidia'], 'nvidia', - requires_offloading=True) + requires_offloading=False) # Check the variables self.assertTrue(gpu_test.has_single_card) # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) # No Intel self.assertFalse(gpu_test.has_intel) @@ -1499,12 +1505,12 @@ ['intel', 'amd'], ['i915', 'radeon'], ['mesa'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -1533,12 +1539,12 @@ ['intel', 'amd'], ['i915', 'radeon'], ['mesa'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -1567,12 +1573,12 @@ ['intel'], ['i915'], ['mesa'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -1708,12 +1714,12 @@ ['intel', 'nvidia'], ['i915', 'nouveau'], ['mesa'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -1741,12 +1747,12 @@ ['intel', 'nvidia'], ['i915', 'nouveau'], ['mesa'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -1774,12 +1780,12 @@ ['intel'], ['i915'], ['mesa'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -2090,12 +2096,12 @@ ['intel', 'nvidia'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -2212,13 +2218,13 @@ ['intel', 'nvidia'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True, + requires_offloading=False, nvidia_version="304.123") # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -2376,12 +2382,12 @@ ['intel', 'nvidia'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -2417,12 +2423,12 @@ ['intel', 'nvidia'], ['i915', 'fake'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -2459,12 +2465,12 @@ ['intel', 'nvidia'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -2492,6 +2498,9 @@ # No further action is required self.assertTrue(gpu_test.has_not_acted) + # Request action from bbswitch + self.request_prime_discrete_on(True) + # Case 3a: the discrete card is no longer available (BIOS) gpu_test = self.run_manager_and_get_data(['intel', 'nvidia'], ['intel'], @@ -2535,11 +2544,11 @@ ['i915', 'fake'], ['mesa', 'nvidia'], 'nvidia', - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -2561,7 +2570,7 @@ self.assertFalse(gpu_test.has_selected_driver) # Check that the xorg.conf.d file was created - self.assertTrue(gpu_test.has_created_xorg_conf_d) + self.assertFalse(gpu_test.has_created_xorg_conf_d) # No further action is required self.assertTrue(gpu_test.has_not_acted) @@ -2576,12 +2585,12 @@ ['i915', 'fake'], ['mesa', 'nvidia'], unloaded_module='nvidia', - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -2656,12 +2665,12 @@ ['intel'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -2694,12 +2703,12 @@ ['i915', 'nvidia'], ['mesa', 'nvidia'], 'prime', - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -2731,12 +2740,12 @@ ['intel'], ['i915'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -2768,12 +2777,12 @@ ['intel'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -2800,6 +2809,46 @@ # No further action is required self.assertTrue(gpu_test.has_not_acted) + # Case 4a: the discrete card is available and we want on-demand mode + self.request_prime_on_demand() + + gpu_test = self.run_manager_and_get_data(['intel'], + ['intel', 'nvidia'], + ['i915', 'nvidia'], + ['mesa', 'nvidia'], + requires_offloading=False) + + # Check the variables + + # Check if laptop + self.assertFalse(gpu_test.requires_offloading) + + self.assertFalse(gpu_test.has_single_card) + + # Intel + self.assertTrue(gpu_test.has_intel) + self.assertTrue(gpu_test.intel_loaded) + + # No AMD + self.assertFalse(gpu_test.has_amd) + self.assertFalse(gpu_test.radeon_loaded) + self.assertFalse(gpu_test.amdgpu_loaded) + # NVIDIA + self.assertTrue(gpu_test.has_nvidia) + self.assertFalse(gpu_test.nouveau_loaded) + self.assertTrue(gpu_test.nvidia_loaded) + # Has changed + self.assertTrue(gpu_test.has_changed) + + self.assertFalse(gpu_test.has_selected_driver) + + # Check that the xorg.conf.d file was created + self.assertTrue(gpu_test.has_created_xorg_conf_d) + + # No further action is required + self.assertTrue(gpu_test.has_not_acted) + + def test_laptop_one_intel_one_nvidia_binary_egl(self): '''laptop: intel + nvidia - EGL''' self.this_function_name = sys._getframe().f_code.co_name @@ -2935,12 +2984,12 @@ ['intel', 'nvidia'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -3048,13 +3097,13 @@ ['intel', 'nvidia'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True, + requires_offloading=False, nvidia_version="304.123") # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -3204,12 +3253,12 @@ ['intel', 'nvidia'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -3242,12 +3291,12 @@ ['intel', 'nvidia'], ['i915', 'fake'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -3281,12 +3330,12 @@ ['intel', 'nvidia'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertFalse(gpu_test.has_single_card) @@ -3316,12 +3365,12 @@ ['intel'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -3350,11 +3399,11 @@ ['i915', 'fake'], ['mesa', 'nvidia'], 'nvidia', - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -3387,12 +3436,12 @@ ['i915', 'fake'], ['mesa', 'nvidia'], unloaded_module='nvidia', - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -3459,12 +3508,12 @@ ['intel'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -3492,12 +3541,12 @@ ['intel'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -3525,12 +3574,12 @@ ['intel'], ['i915'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -3558,12 +3607,12 @@ ['intel'], ['i915', 'nvidia'], ['mesa', 'nvidia'], - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + self.assertFalse(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -4398,12 +4447,12 @@ ['i915', 'fake'], ['mesa', 'nvidia'], unloaded_module='nvidia', - requires_offloading=True) + requires_offloading=False) # Check the variables # Check if laptop - self.assertTrue(gpu_test.requires_offloading) + #self.assertTrue(gpu_test.requires_offloading) self.assertTrue(gpu_test.has_single_card) @@ -4427,7 +4476,7 @@ self.assertTrue(gpu_test.has_not_acted) # Check that the GPU was added from the file - self.assertTrue(gpu_test.has_added_gpu_from_file) + #self.assertTrue(gpu_test.has_added_gpu_from_file) def test_laptop_one_intel_one_amd_amdgpu_pro(self): '''laptop: intel + amdgpu-pro''' @@ -4533,6 +4582,11 @@ # Case 2b: no hybrid script is available + try: + os.unlink(self.amdgpu_pro_px_file.name) + except: + pass + # Collect data gpu_test = self.run_manager_and_get_data(['intel', 'amd'], ['amd'], @@ -4570,10 +4624,10 @@ self.assertFalse(gpu_test.has_selected_driver) self.assertFalse(gpu_test.amdgpu_pro_powersaving) self.assertFalse(gpu_test.amdgpu_pro_performance) - self.assertTrue(gpu_test.amdgpu_pro_reset) + self.assertFalse(gpu_test.amdgpu_pro_reset) # No further action is required - self.assertFalse(gpu_test.has_not_acted) + self.assertTrue(gpu_test.has_not_acted) if __name__ == '__main__': diff -Nru ubuntu-drivers-common-0.8.6/tests/test_ubuntu_drivers.py ubuntu-drivers-common-0.8.6.1/tests/test_ubuntu_drivers.py --- ubuntu-drivers-common-0.8.6/tests/test_ubuntu_drivers.py 2020-10-08 10:29:31.000000000 +0000 +++ ubuntu-drivers-common-0.8.6.1/tests/test_ubuntu_drivers.py 2020-10-18 17:01:53.000000000 +0000 @@ -201,14 +201,14 @@ chroot.setup() chroot.add_test_repository() archive = gen_fakearchive() - # older applicable driver which is not the recommended one - archive.create_deb('nvidia-123', dependencies={'Depends': 'xorg-video-abi-4'}, + archive.create_deb('nvidia-driver-440', dependencies={'Depends': 'xorg-video-abi-4'}, extra_tags={'Modaliases': 'nv(pci:v000010DEd000010C3sv*sd*bc03sc*i*)'}) - # -updates driver which also should not be recommended - archive.create_deb('nvidia-current-updates', dependencies={'Depends': 'xorg-video-abi-4'}, + archive.create_deb('nvidia-driver-450', dependencies={'Depends': 'xorg-video-abi-4'}, + extra_tags={'Modaliases': 'nv(pci:v000010DEd000010C3sv*sd*bc03sc*i*)'}) + archive.create_deb('nvidia-driver-390', dependencies={'Depends': 'xorg-video-abi-4'}, extra_tags={'Modaliases': 'nv(pci:v000010DEd000010C3sv*sd*bc03sc*i*)'}) # driver package which supports multiple ABIs - archive.create_deb('nvidia-34', + archive.create_deb('nvidia-340', dependencies={'Depends': 'xorg-video-abi-3 | xorg-video-abi-4'}, extra_tags={'Modaliases': 'nv(pci:v000010DEd000010C3sv*sd*bc03sc*i*)'}) chroot.add_repository(archive.path, True, False) @@ -225,9 +225,9 @@ res = UbuntuDrivers.detect.system_driver_packages(cache, sys_path=self.umockdev.get_sys_dir()) finally: chroot.remove() - self.assertEqual(set(res), set(['chocolate', 'vanilla', 'nvidia-current', - 'nvidia-current-updates', 'nvidia-123', - 'nvidia-34', + self.assertEqual(set(res), set(['chocolate', 'vanilla', 'nvidia-current', 'nvidia-driver-450', + 'nvidia-driver-390', 'nvidia-driver-440', + 'nvidia-340', 'neapolitan', 'tuttifrutti', 'stracciatella', @@ -246,25 +246,25 @@ self.assertFalse('model' in res['chocolate']) self.assertFalse('recommended' in res['chocolate']) - self.assertEqual(res['nvidia-current']['modalias'], modalias_nv) - self.assertTrue('nvidia' in res['nvidia-current']['vendor'].lower(), - res['nvidia-current']['vendor']) - self.assertTrue('GeForce' in res['nvidia-current']['model'], - res['nvidia-current']['model']) - self.assertEqual(res['nvidia-current']['recommended'], True) - - self.assertEqual(res['nvidia-123']['modalias'], modalias_nv) - self.assertTrue('nvidia' in res['nvidia-123']['vendor'].lower(), - res['nvidia-123']['vendor']) - self.assertTrue('GeForce' in res['nvidia-123']['model'], - res['nvidia-123']['model']) - self.assertEqual(res['nvidia-123']['recommended'], False) + self.assertEqual(res['nvidia-driver-450']['modalias'], modalias_nv) + self.assertTrue('nvidia' in res['nvidia-driver-450']['vendor'].lower(), + res['nvidia-driver-450']['vendor']) + self.assertTrue('GeForce' in res['nvidia-driver-450']['model'], + res['nvidia-driver-450']['model']) + self.assertEqual(res['nvidia-driver-450']['recommended'], True) + + self.assertEqual(res['nvidia-driver-390']['modalias'], modalias_nv) + self.assertTrue('nvidia' in res['nvidia-driver-390']['vendor'].lower(), + res['nvidia-driver-390']['vendor']) + self.assertTrue('GeForce' in res['nvidia-driver-390']['model'], + res['nvidia-driver-390']['model']) + self.assertEqual(res['nvidia-driver-390']['recommended'], False) - self.assertEqual(res['nvidia-current-updates']['modalias'], modalias_nv) - self.assertEqual(res['nvidia-current-updates']['recommended'], False) + self.assertEqual(res['nvidia-driver-440']['modalias'], modalias_nv) + self.assertEqual(res['nvidia-driver-440']['recommended'], False) - self.assertEqual(res['nvidia-34']['modalias'], modalias_nv) - self.assertEqual(res['nvidia-34']['recommended'], False) + self.assertEqual(res['nvidia-340']['modalias'], modalias_nv) + self.assertEqual(res['nvidia-340']['recommended'], False) self.assertFalse(res['neapolitan']['free']) @@ -1121,19 +1121,20 @@ sys_path=self.umockdev.get_sys_dir()) linux_package = UbuntuDrivers.detect.get_linux(cache) modules_package = UbuntuDrivers.detect.get_linux_modules_metapackage(cache, - 'nvidia-driver-440-server') + 'nvidia-driver-418-server') finally: chroot.remove() - self.assertTrue('nvidia-driver-440-server' in res) + self.assertTrue('nvidia-driver-418-server' in res) packages = UbuntuDrivers.detect.gpgpu_install_filter(res, 'nvidia') - self.assertEqual(set(packages), set(['nvidia-driver-440-server'])) + # LTSB always wins on the server + self.assertEqual(set(packages), set(['nvidia-driver-418-server'])) driver = list(packages.keys())[0] - self.assertEqual(packages[driver].get('metapackage'), 'nvidia-headless-no-dkms-440-server') + self.assertEqual(packages[driver].get('metapackage'), 'nvidia-headless-no-dkms-418-server') self.assertEqual(linux_package, 'linux-generic-hwe-20.04') # Get the linux-modules-nvidia module for the kernel # So we expect the DKMS package as a fallback - self.assertEqual(modules_package, 'linux-modules-nvidia-440-server-generic-hwe-20.04') + self.assertEqual(modules_package, 'linux-modules-nvidia-418-server-generic-hwe-20.04') def test_system_device_specific_metapackages_chroot1(self): '''system_device_specific_metapackages() for test package repository''' @@ -1204,14 +1205,14 @@ chroot.add_test_repository() archive = gen_fakearchive() # older applicable driver which is not the recommended one - archive.create_deb('nvidia-123', dependencies={'Depends': 'xorg-video-abi-4'}, + archive.create_deb('nvidia-driver-440', dependencies={'Depends': 'xorg-video-abi-4'}, extra_tags={'Modaliases': 'nv(pci:v000010DEd000010C3sv*sd*bc03sc*i*)'}) # -updates driver which also should not be recommended - archive.create_deb('nvidia-current-updates', dependencies={'Depends': 'xorg-video-abi-4'}, + archive.create_deb('nvidia-driver-450', dependencies={'Depends': 'xorg-video-abi-4'}, extra_tags={'Modaliases': 'nv(pci:v000010DEd000010C3sv*sd*bc03sc*i*)'}) # -experimental driver which also should not be recommended - archive.create_deb('nvidia-experimental', dependencies={'Depends': 'xorg-video-abi-4'}, + archive.create_deb('nvidia-driver-450-server', dependencies={'Depends': 'xorg-video-abi-4'}, extra_tags={'Modaliases': 'nv(pci:v000010DEd000010C3sv*sd*bc03sc*i*)'}) chroot.add_repository(archive.path, True, False) cache = apt.Cache(rootdir=chroot.path) @@ -1245,16 +1246,13 @@ self.assertTrue('nvidia' in graphics_dict['vendor'].lower()) self.assertTrue('GeForce' in graphics_dict['model']) - # should contain nouveau driver; note that free is True here because - # these come from the fake archive - self.assertEqual(graphics_dict['drivers']['nvidia-current'], - {'free': True, 'from_distro': False, 'recommended': True}) - self.assertEqual(graphics_dict['drivers']['nvidia-current-updates'], - {'free': True, 'from_distro': False, 'recommended': False}) - self.assertEqual(graphics_dict['drivers']['nvidia-123'], - {'free': True, 'from_distro': False, 'recommended': False}) - self.assertEqual(graphics_dict['drivers']['nvidia-experimental'], - {'free': True, 'from_distro': False, 'recommended': False}) + # should contain nouveau driver + self.assertEqual(graphics_dict['drivers']['nvidia-driver-450'], + {'free': False, 'from_distro': False, 'recommended': True}) + self.assertEqual(graphics_dict['drivers']['nvidia-driver-440'], + {'free': False, 'from_distro': False, 'recommended': False}) + self.assertEqual(graphics_dict['drivers']['nvidia-driver-450-server'], + {'free': False, 'from_distro': False, 'recommended': False}) self.assertEqual(graphics_dict['drivers']['xserver-xorg-video-nouveau'], {'free': True, 'from_distro': True, 'recommended': False, 'builtin': True}) self.assertEqual(len(graphics_dict['drivers']), 5, list(graphics_dict['drivers'].keys())) @@ -1392,7 +1390,7 @@ finally: chroot.remove() - self.assertEqual(res, set(['stracciatella', 'vanilla', 'chocolate', 'nvidia-current'])) + self.assertEqual(res, set(['stracciatella', 'vanilla', 'chocolate'])) def test_system_device_drivers_freeonly(self): '''system_device_drivers() returns only devices with free drivers''' @@ -1416,9 +1414,10 @@ res = UbuntuDrivers.detect.system_device_drivers(cache, sys_path=self.umockdev.get_sys_dir(), freeonly=True) finally: chroot.remove() + # Leave 'graphics' out, since it's covered by nvidia self.assertEqual( set([os.path.basename(d) for d in res]), - set(['black', 'white', 'graphics', 'orange'])) + set(['black', 'white', 'orange'])) def test_detect_plugin_packages(self): '''detect_plugin_packages()''' @@ -1750,7 +1749,7 @@ self.assertTrue('/devices/black ==' in out) self.assertTrue('/devices/graphics ==' in out) self.assertTrue('xserver-xorg-video-nouveau - distro free builtin' in out) - self.assertTrue('nvidia-current - third-party free recommended' in out) + self.assertTrue('nvidia-current - third-party non-free recommended' in out) self.assertEqual(ud.returncode, 0) def test_devices_detect_plugins(self): diff -Nru ubuntu-drivers-common-0.8.6/UbuntuDrivers/detect.py ubuntu-drivers-common-0.8.6.1/UbuntuDrivers/detect.py --- ubuntu-drivers-common-0.8.6/UbuntuDrivers/detect.py 2020-10-08 10:29:31.000000000 +0000 +++ ubuntu-drivers-common-0.8.6.1/UbuntuDrivers/detect.py 2020-10-18 17:01:53.000000000 +0000 @@ -172,6 +172,10 @@ # it would be better to check the actual license, as we do not have # the component for third-party packages; but this is the best we can do # at the moment + # + # We can assume the NVIDIA packages to be non-free + if pkg.name.startswith('nvidia'): + return False for o in pkg.candidate.origins: if o.component in ('restricted', 'multiverse'): return False