Linux 5.1 и Nvidia Drivers 418.56

Обновился на днях до ядра 5.1, но драйвера Nvidia 418.56 не собираются с ядром 5.1, а версия 430.09 не работает, выбрасывает при загрузке граф. режима обратно в консоль, что в 5.0.12, что в 5.1.

Поэтому решил допилить 418.56 для работы с новым ядром. На просторах интернета нашёл такую статью, чел расписывает, как заставить 418.43 работать на 5.1-rc1, практически мой случай.

Перевод на русский 🙂

В файлы nvidia-drm-connector.c nvidia-drm-drv.c nvidia-drm-encoder.c nvidia-drm-gem-nvkms-memory.c в самый верх добавляем строчку #include <linux/version.h>

В файл /kernel/nvidia-drm/nvidia-drm-connector.c, примерно в 203 строчку добавляем:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
/* Add header constants missing after 5.1-rc1 */
int drm_helper_probe_single_connector_modes(struct drm_connector
*connector, uint32_t maxX,
uint32_t maxY);
#endif

В файл kernel/nvidia-drm/nvidia-drm-drv.c, примерно в 37 строчку добавляем:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
/* Add header constants missing after 5.1-rc1 */
void drm_kms_helper_poll_init(struct drm_device *dev);
void drm_kms_helper_poll_fini(struct drm_device *dev);
bool drm_helper_hpd_irq_event(struct drm_device *dev);
void drm_kms_helper_poll_disable(struct drm_device *dev);
#endif

В файл kernel/nvidia-drm/nvidia-drm-encoder.c, примерно в 33 строчку добавляем:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
/* Add header constants missing after 5.1-rc1 */
void drm_kms_helper_hotplug_event(struct drm_device *dev);
#endif

и в строчку 161:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
/* Add header constants missing after 5.1-rc1 */
int drm_helper_probe_single_connector_modes(struct drm_connector
*connector, uint32_t maxX,
uint32_t maxY);
#endif

В файле kernel/nvidia-drm/nvidia-drm-gem-nvkms-memory.c (примерно 77 строчка) заменяем

static int nv_drm_vma_fault(struct vm_fault *vmf)

на

#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
static int nv_drm_vma_fault(struct vm_fault *vmf)
#else
static vm_fault_t nv_drm_vma_fault(struct vm_fault *vmf)
#endif

В файле kernel/nvidia-uvm/uvm8.c (примерно 176 строка) заменяем

static int uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf)

на

#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
static int uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf)
#else
static vm_fault_t uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf)
#endif

и (примерно 515 строчка)

static int uvm_vm_fault_wrapper(struct vm_fault *vmf)

на

#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
static int uvm_vm_fault_wrapper(struct vm_fault *vmf)
#else
static vm_fault_t uvm_vm_fault_wrapper(struct vm_fault *vmf)
#endif

Вот и всё, модуль должен собраться. И да, по ссылке еще 2 файла были изменены - в kernel/common/inc/nv-list-helpers.h нужно поменять строку

static inline int list_is_first(const struct list_head *list,

на

static inline int nv_list_is_first(const struct list_head *list,

и файл kernel/nvidia-uvm/uvm8_range_tree.c, нужно поменять строку

if (list_is_first(&node->list, &tree->head))

на

if (nv_list_is_first(&node->list, &tree->head))

Но, это всё нужно делать для драйвера версии 418.43. Я лично это всё поменял, как было написано, компилятор начал ругаться на файл kernel/nvidia-uvm/uvm8_range_tree.c

error: implicit declaration of function ‘nv_list_is_first’; did you mean ‘list_is_first’? [-Werror=implicit-function-declaration]
if (nv_list_is_first(&node->list, &tree->head))
^~~~~~~~~~~~~~~~
list_is_first

Ну я и добавил в самый верх этого файла

#include "../common/inc/nv-list-helpers.h"

и всё прекрасно собралось. Но! После всего этого, я опять полез на сайт того чела и дальше вижу в Recent Post такое - фикс для драйвера версии 418.56. И там английским по белому написано, что для данной версии трогать файлы uvm8_range_tree.c и nv-list-helpers.h на предмет замен строк вообще не нужно. Такие дела 🙂

 

Добавить комментарий

Ваш e-mail не будет опубликован.