Last active
October 17, 2025 07:45
-
-
Save overcq/7e38a640a4f01fb7c558937aedc80e71 to your computer and use it in GitHub Desktop.
Patch to work old nvidia-drivers in newest Linux kernel
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| --- a/kernel/Kbuild | |
| +++ b/kernel/Kbuild | |
| @@ -76,6 +76,7 @@ | |
| EXTRA_CFLAGS += -DNV_CONFIG_X86_UV | |
| endif | |
| +KBUILD_CFLAGS_MODULE := $(EXTRA_CFLAGS) -I/usr/src/linux/include/linux -I/usr/src/linux/fs/proc --include internal.h | |
| # | |
| # The conftest.sh script tests various aspects of the target kernel. | |
| --- a/kernel/nvidia-modeset/nvidia-modeset-linux.c | |
| +++ b/kernel/nvidia-modeset/nvidia-modeset-linux.c | |
| @@ -495,7 +495,7 @@ | |
| * pending timers and than waiting for workqueue callbacks. | |
| */ | |
| if (timer->kernel_timer_created) { | |
| - del_timer_sync(&timer->kernel_timer); | |
| + timer_delete_sync(&timer->kernel_timer); | |
| } | |
| down(&nvkms_lock); | |
| @@ -1266,7 +1266,7 @@ | |
| * completion, and we wait for queue completion with | |
| * nv_kthread_q_stop below. | |
| */ | |
| - if (del_timer_sync(&timer->kernel_timer) == 1) { | |
| + if (timer_delete_sync(&timer->kernel_timer) == 1) { | |
| /* We've deactivated timer so we need to clean after it */ | |
| list_del(&timer->timers_list); | |
| --- a/kernel/nvidia-modeset/nvidia-modeset.Kbuild | |
| +++ b/kernel/nvidia-modeset/nvidia-modeset.Kbuild | |
| @@ -39,7 +39,7 @@ | |
| NVIDIA_MODESET_BINARY_OBJECT_O := nvidia-modeset/nv-modeset-kernel.o | |
| quiet_cmd_symlink = SYMLINK $@ | |
| -cmd_symlink = ln -sf $< $@ | |
| +cmd_symlink = ln -sfr $< $@ | |
| targets += $(NVIDIA_MODESET_BINARY_OBJECT_O) | |
| --- a/kernel/common/inc/nv-procfs.h | |
| +++ b/kernel/common/inc/nv-procfs.h | |
| @@ -113,7 +113,7 @@ | |
| }) | |
| #if defined(NV_PDE_DATA_PRESENT) | |
| -# define NV_PDE_DATA(inode) PDE_DATA(inode) | |
| +# define NV_PDE_DATA(inode) pde_data(inode) | |
| #else | |
| # define NV_PDE_DATA(inode) PDE(inode)->data | |
| #endif | |
| --- a/kernel/common/inc/nv-time.h | |
| +++ b/kernel/common/inc/nv-time.h | |
| @@ -38,9 +38,6 @@ | |
| static inline void nv_gettimeofday(nv_timeval *tv) | |
| { | |
| -#ifdef NV_DO_GETTIMEOFDAY_PRESENT | |
| - do_gettimeofday(tv); | |
| -#else | |
| struct timespec64 now; | |
| ktime_get_real_ts64(&now); | |
| @@ -49,7 +46,6 @@ | |
| .tv_sec = now.tv_sec, | |
| .tv_usec = now.tv_nsec/1000, | |
| }; | |
| -#endif // NV_DO_GETTIMEOFDAY_PRESENT | |
| } | |
| #endif // __NV_TIME_H__ | |
| --- a/kernel/common/inc/nv-mm.h | |
| +++ b/kernel/common/inc/nv-mm.h | |
| @@ -48,10 +48,10 @@ | |
| */ | |
| #if defined(NV_GET_USER_PAGES_HAS_TASK_STRUCT) | |
| - #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS) | |
| - #define NV_GET_USER_PAGES(start, nr_pages, write, force, pages, vmas) \ | |
| - get_user_pages(current, current->mm, start, nr_pages, write, force, pages, vmas) | |
| - #else | |
| +// #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS) | |
| +// #define NV_GET_USER_PAGES(start, nr_pages, write, force, pages, vmas) \ | |
| +// get_user_pages(start, nr_pages, write, pages) | |
| +// #else | |
| #include <linux/mm.h> | |
| #include <linux/sched.h> | |
| @@ -69,10 +69,10 @@ | |
| if (force) | |
| flags |= FOLL_FORCE; | |
| - return get_user_pages(current, current->mm, start, nr_pages, flags, | |
| - pages, vmas); | |
| + return get_user_pages(start, nr_pages, flags, | |
| + pages); | |
| } | |
| - #endif | |
| +// #endif | |
| #else | |
| #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS) | |
| #define NV_GET_USER_PAGES get_user_pages | |
| @@ -156,13 +156,13 @@ | |
| pages, vmas, NULL); | |
| #else | |
| return get_user_pages_remote(mm, start, nr_pages, flags, | |
| - pages, vmas, NULL); | |
| + pages, NULL); | |
| #endif | |
| #else | |
| - return get_user_pages_remote(tsk, mm, start, nr_pages, flags, | |
| - pages, vmas); | |
| + return get_user_pages_remote(mm, start, nr_pages, flags, | |
| + pages, NULL); | |
| #endif | |
| @@ -191,7 +191,7 @@ | |
| if (force) | |
| flags |= FOLL_FORCE; | |
| - return get_user_pages(tsk, mm, start, nr_pages, flags, pages, vmas); | |
| + return get_user_pages(start, nr_pages, flags, pages); | |
| } | |
| #endif | |
| #endif | |
| --- a/kernel/common/inc/nv-linux.h | |
| +++ b/kernel/common/inc/nv-linux.h | |
| @@ -132,6 +132,8 @@ | |
| #include <asm/page.h> /* PAGE_OFFSET */ | |
| #include <asm/pgtable.h> /* pte bit definitions */ | |
| +#include <linux/dma-direct.h> | |
| + | |
| #include "nv-list-helpers.h" | |
| /* | |
| @@ -195,9 +197,8 @@ | |
| #include <linux/workqueue.h> /* workqueue */ | |
| #include <nv-kthread-q.h> /* kthread based queue */ | |
| -#if defined(NV_LINUX_EFI_H_PRESENT) | |
| #include <linux/efi.h> /* efi_enabled */ | |
| -#endif | |
| + | |
| #if defined(NV_LINUX_SCREEN_INFO_H_PRESENT) | |
| #include <linux/screen_info.h> /* screen_info */ | |
| #else | |
| @@ -209,17 +210,7 @@ | |
| #include <asm-generic/pci-dma-compat.h> | |
| #endif | |
| -#if defined(NV_EFI_ENABLED_PRESENT) && defined(NV_EFI_ENABLED_ARGUMENT_COUNT) | |
| -#if (NV_EFI_ENABLED_ARGUMENT_COUNT == 1) | |
| #define NV_EFI_ENABLED() efi_enabled(EFI_BOOT) | |
| -#else | |
| -#error "NV_EFI_ENABLED_ARGUMENT_COUNT value unrecognized!" | |
| -#endif | |
| -#elif (defined(NV_EFI_ENABLED_PRESENT) || defined(efi_enabled)) | |
| -#define NV_EFI_ENABLED() efi_enabled | |
| -#else | |
| -#define NV_EFI_ENABLED() 0 | |
| -#endif | |
| #if defined(CONFIG_CRAY_XT) | |
| #include <cray/cray_nvidia.h> | |
| @@ -337,19 +328,8 @@ | |
| #include <linux/ipmi.h> | |
| #endif | |
| -#if defined(NV_PCI_DMA_MAPPING_ERROR_PRESENT) | |
| -#if (NV_PCI_DMA_MAPPING_ERROR_ARGUMENT_COUNT == 2) | |
| -#define NV_PCI_DMA_MAPPING_ERROR(dev, addr) \ | |
| - pci_dma_mapping_error(dev, addr) | |
| -#elif (NV_PCI_DMA_MAPPING_ERROR_ARGUMENT_COUNT == 1) | |
| -#define NV_PCI_DMA_MAPPING_ERROR(dev, addr) \ | |
| - pci_dma_mapping_error(addr) | |
| -#else | |
| -#error "NV_PCI_DMA_MAPPING_ERROR_ARGUMENT_COUNT value unrecognized!" | |
| -#endif | |
| -#elif defined(NV_VM_INSERT_PAGE_PRESENT) | |
| -#error "NV_PCI_DMA_MAPPING_ERROR() undefined!" | |
| -#endif | |
| +#define NV_DMA_MAPPING_ERROR(dev, addr) \ | |
| + dma_mapping_error(dev, addr) | |
| #if defined(NV_LINUX_ACPI_EVENTS_SUPPORTED) | |
| #if (NV_ACPI_WALK_NAMESPACE_ARGUMENT_COUNT == 6) | |
| @@ -558,18 +538,6 @@ | |
| return ptr; | |
| } | |
| -static inline void *nv_ioremap_nocache(NvU64 phys, NvU64 size) | |
| -{ | |
| -#if defined(NV_IOREMAP_NOCACHE_PRESENT) | |
| - void *ptr = ioremap_nocache(phys, size); | |
| -#else | |
| - void *ptr = ioremap(phys, size); | |
| -#endif | |
| - if (ptr) | |
| - NV_MEMDBG_ADD(ptr, size); | |
| - return ptr; | |
| -} | |
| - | |
| static inline void *nv_ioremap_cache(NvU64 phys, NvU64 size) | |
| { | |
| #if defined(NV_IOREMAP_CACHE_PRESENT) | |
| @@ -590,7 +558,7 @@ | |
| NV_MEMDBG_ADD(ptr, size); | |
| return ptr; | |
| #else | |
| - return nv_ioremap_nocache(phys, size); | |
| + return nv_ioremap(phys, size); | |
| #endif | |
| } | |
| @@ -989,15 +957,8 @@ | |
| * Early 2.6 kernels have acquire_console_sem, but from 2.6.38+ it was | |
| * renamed to console_lock. | |
| */ | |
| -#if defined(NV_ACQUIRE_CONSOLE_SEM_PRESENT) | |
| -#define NV_ACQUIRE_CONSOLE_SEM() acquire_console_sem() | |
| -#define NV_RELEASE_CONSOLE_SEM() release_console_sem() | |
| -#elif defined(NV_CONSOLE_LOCK_PRESENT) | |
| #define NV_ACQUIRE_CONSOLE_SEM() console_lock() | |
| #define NV_RELEASE_CONSOLE_SEM() console_unlock() | |
| -#else | |
| -#error "console lock api unrecognized!." | |
| -#endif | |
| /* | |
| * If the host OS has page sizes larger than 4KB, we may have a security | |
| @@ -1289,11 +1250,6 @@ | |
| { | |
| NvBool is_direct = NV_FALSE; | |
| -#if defined(NV_DMA_IS_DIRECT_PRESENT) | |
| - if (dma_is_direct(get_dma_ops(dev))) | |
| - is_direct = NV_TRUE; | |
| -#endif | |
| - | |
| return is_direct; | |
| } | |
| --- a/kernel/nvidia-uvm/uvm8_va_space.c | |
| +++ b/kernel/nvidia-uvm/uvm8_va_space.c | |
| @@ -56,41 +56,11 @@ | |
| static NV_STATUS init_npu_context(uvm_va_space_t *va_space, uvm_gpu_va_space_t *gpu_va_space) | |
| { | |
| -#if defined(NV_PNV_NPU2_INIT_CONTEXT_PRESENT) | |
| - if (uvm8_ats_mode) { | |
| - struct npu_context *npu_context; | |
| - | |
| - // TODO: Bug 1896767: Add a callback here. See the comments on unsafe_mm | |
| - // in uvm8_va_space.h. | |
| - UVM_ASSERT(current->mm == va_space->unsafe_mm); | |
| - uvm_assert_mmap_lock_locked_write(current->mm); | |
| - | |
| - npu_context = pnv_npu2_init_context(gpu_va_space->gpu->pci_dev, (MSR_DR | MSR_PR | MSR_HV), NULL, NULL); | |
| - if (IS_ERR(npu_context)) { | |
| - NV_STATUS status = errno_to_nv_status(PTR_ERR(npu_context)); | |
| - UVM_ERR_PRINT("pnv_npu2_init_context failed: %s (%d), GPU %s\n", | |
| - nvstatusToString(status), | |
| - (int)PTR_ERR(npu_context), | |
| - gpu_va_space->gpu->name); | |
| - return status; | |
| - } | |
| - | |
| - gpu_va_space->npu_context = npu_context; | |
| - } | |
| -#endif | |
| - | |
| return NV_OK; | |
| } | |
| static void destroy_npu_context(uvm_gpu_va_space_t *gpu_va_space) | |
| { | |
| -#if defined(NV_PNV_NPU2_INIT_CONTEXT_PRESENT) | |
| - if (uvm8_ats_mode && gpu_va_space->npu_context) { | |
| - // TODO: Bug 1896767: See the comments on unsafe_mm in uvm8_va_space.h | |
| - pnv_npu2_destroy_context(gpu_va_space->npu_context, gpu_va_space->gpu->pci_dev); | |
| - gpu_va_space->npu_context = NULL; | |
| - } | |
| -#endif | |
| } | |
| static NV_STATUS register_gpu_nvlink_peers(uvm_va_space_t *va_space, uvm_gpu_t *gpu) | |
| @@ -171,15 +141,6 @@ | |
| uvm_processor_mask_set(&va_space->system_wide_atomics_enabled_processors, UVM_CPU_ID); | |
| uvm_processor_mask_set(&va_space->faultable_processors, UVM_CPU_ID); | |
| -#if defined(NV_PNV_NPU2_INIT_CONTEXT_PRESENT) | |
| - if (uvm8_ats_mode) { | |
| - // TODO: Bug 1896767: Be as retrictive as possible when using | |
| - // unsafe_mm. See the comments on unsafe_mm in | |
| - // uvm8_va_space.h. | |
| - va_space->unsafe_mm = current->mm; | |
| - } | |
| -#endif | |
| - | |
| filp->private_data = va_space; | |
| filp->f_mapping = &va_space->mapping; | |
| --- a/kernel/nvidia-uvm/uvm8.c | |
| +++ b/kernel/nvidia-uvm/uvm8.c | |
| @@ -658,7 +658,7 @@ | |
| // Using VM_DONTCOPY would be nice, but madvise(MADV_DOFORK) can reset that | |
| // so we have to handle vm_open on fork anyway. We could disable MADV_DOFORK | |
| // with VM_IO, but that causes other mapping issues. | |
| - vma->vm_flags |= VM_MIXEDMAP | VM_DONTEXPAND; | |
| + vm_flags_set( vma, VM_MIXEDMAP | VM_DONTEXPAND ); | |
| vma->vm_ops = &uvm_vm_ops_managed; | |
| --- a/kernel/nvidia-uvm/uvm8_gpu.c | |
| +++ b/kernel/nvidia-uvm/uvm8_gpu.c | |
| @@ -2214,15 +2214,15 @@ | |
| NV_STATUS uvm_gpu_map_cpu_pages(uvm_gpu_t *gpu, struct page *page, size_t size, NvU64 *dma_addr_out) | |
| { | |
| - NvU64 dma_addr = pci_map_page(gpu->pci_dev, page, 0, size, PCI_DMA_BIDIRECTIONAL); | |
| + NvU64 dma_addr = dma_map_page(&((struct pci_dev *)gpu->pci_dev)->dev, page, 0, size, DMA_BIDIRECTIONAL); | |
| UVM_ASSERT(PAGE_ALIGNED(size)); | |
| - if (NV_PCI_DMA_MAPPING_ERROR(gpu->pci_dev, dma_addr)) | |
| + if (NV_DMA_MAPPING_ERROR(&((struct pci_dev *)gpu->pci_dev)->dev, dma_addr)) | |
| return NV_ERR_OPERATING_SYSTEM; | |
| if (dma_addr < gpu->dma_addressable_start || dma_addr + size - 1 > gpu->dma_addressable_limit) { | |
| - pci_unmap_page(gpu->pci_dev, dma_addr, size, PCI_DMA_BIDIRECTIONAL); | |
| + dma_unmap_page(&((struct pci_dev *)gpu->pci_dev)->dev, dma_addr, size, DMA_BIDIRECTIONAL); | |
| UVM_ERR_PRINT_RL("PCI mapped range [0x%llx, 0x%llx) not in the addressable range [0x%llx, 0x%llx), GPU %s\n", | |
| dma_addr, | |
| dma_addr + (NvU64)size, | |
| @@ -2256,7 +2256,7 @@ | |
| if (gpu->npu_dev) | |
| dma_address = nv_expand_nvlink_addr(dma_address); | |
| dma_address += gpu->dma_addressable_start; | |
| - pci_unmap_page(gpu->pci_dev, dma_address, size, PCI_DMA_BIDIRECTIONAL); | |
| + dma_unmap_page(&((struct pci_dev *)gpu->pci_dev)->dev, dma_address, size, DMA_BIDIRECTIONAL); | |
| atomic64_sub(size, &gpu->mapped_cpu_pages_size); | |
| } | |
| --- a/kernel/nvidia-uvm/uvm8_global.c | |
| +++ b/kernel/nvidia-uvm/uvm8_global.c | |
| @@ -70,14 +70,8 @@ | |
| NV_STATUS status = NV_ERR_GENERIC; | |
| if (uvm8_ats_mode) { | |
| - #if defined(NV_PNV_NPU2_INIT_CONTEXT_PRESENT) | |
| - pr_info("UVM ATS is enabled but not yet fully supported. " | |
| - "All GPU applications even if they don't use ATS must cleanly stop GPU work before exiting (no ctrl-c) " | |
| - "or risk crashing the system."); | |
| - #else | |
| pr_info("This platform does not support ATS. Ignoring uvm8_ats_mode.\n"); | |
| uvm8_ats_mode = 0; | |
| - #endif | |
| } | |
| status = uvm_kvmalloc_init(); | |
| --- a/kernel/nvidia-uvm/uvm_linux.h | |
| +++ b/kernel/nvidia-uvm/uvm_linux.h | |
| @@ -66,10 +66,6 @@ | |
| #include <linux/ratelimit.h> | |
| #endif | |
| -#if defined(NV_PNV_NPU2_INIT_CONTEXT_PRESENT) | |
| -#include <asm/powernv.h> | |
| -#endif | |
| - | |
| #if defined(NV_LINUX_SCHED_TASK_STACK_H_PRESENT) | |
| #include <linux/sched/task_stack.h> | |
| #endif | |
| @@ -90,6 +86,8 @@ | |
| #define UVM_IS_CONFIG_HMM() 0 | |
| #endif | |
| +#include <linux/types.h> | |
| + | |
| // See bug 1707453 for further details about setting the minimum kernel version. | |
| #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32) | |
| # error This driver does not support kernels older than 2.6.32! | |
| @@ -267,18 +265,10 @@ | |
| #define nv_copy_from_user copy_from_user | |
| #endif | |
| -#if defined(NV_ATOMIC64_PRESENT) | |
| typedef atomic64_t NV_ATOMIC64; | |
| #define NV_ATOMIC64_INC(data) atomic64_inc(&(data)) | |
| #define NV_ATOMIC64_SET(data,val) atomic64_set(&(data), (val)) | |
| #define NV_ATOMIC64_READ(data) atomic64_read(&(data)) | |
| -#else | |
| -#warning "atomic64_t unavailable, demoting to atomic_t!" | |
| -typedef atomic_t NV_ATOMIC64; | |
| -#define NV_ATOMIC64_INC(data) atomic_inc(&(data)) | |
| -#define NV_ATOMIC64_SET(data,val) atomic_set(&(data), (val)) | |
| -#define NV_ATOMIC64_READ(data) atomic_read(&(data)) | |
| -#endif | |
| #ifndef NV_ALIGN_DOWN | |
| #define NV_ALIGN_DOWN(v,g) ((v) & ~((g) - 1)) | |
| --- a/kernel/nvidia-uvm/uvm8_va_space.h | |
| +++ b/kernel/nvidia-uvm/uvm8_va_space.h | |
| @@ -116,11 +116,6 @@ | |
| // accessed across dropping and re-acquiring the VA space lock. | |
| nv_kref_t kref; | |
| -#if defined(NV_PNV_NPU2_INIT_CONTEXT_PRESENT) | |
| - // IBM NPU contexts | |
| - struct npu_context *npu_context; | |
| -#endif // NV_PNV_NPU2_INIT_CONTEXT_PRESENT | |
| - | |
| // Each GPU VA space can have ATS enabled or disabled in its hardware state. | |
| // This is controlled by user space when it allocates that GPU VA space | |
| // object from RM. This flag indicates the mode user space requested when | |
| @@ -275,25 +270,6 @@ | |
| bool test_page_prefetch_enabled; | |
| -#if defined(NV_PNV_NPU2_INIT_CONTEXT_PRESENT) | |
| - // TODO: Bug 1896767: This is an unsafe temporary ATS bringup hack to | |
| - // unblock testing while we get the proper fix in place. | |
| - // | |
| - // This field tracks the mm used to create the uvm_va_space_t. It | |
| - // is used by the GPU ATS fault handler to service faults. | |
| - // However, we aren't yet registering a callback with | |
| - // pnv_npu2_init_context, which means that the GPU may continue | |
| - // this mm's PASID for ATS translations, and that the GPU fault | |
| - // handler may attempt to use this mm_struct after it has been | |
| - // torn down. Either of these issues may lead to a system crash. | |
| - // | |
| - // Until we can handle this properly, if uvm8_ats_mode is enabled | |
| - // we require that all tests exit cleanly after all their GPU work | |
| - // has completed (no ctrl-c for example). This is true even for | |
| - // tests which do not use ATS. | |
| - struct mm_struct *unsafe_mm; | |
| -#endif | |
| - | |
| #if UVM_IS_CONFIG_HMM() | |
| // HMM information about this VA space. | |
| uvm_hmm_va_space_t hmm_va_space; | |
| --- a/kernel/nvidia-uvm/uvm8_gpu_replayable_faults.c | |
| +++ b/kernel/nvidia-uvm/uvm8_gpu_replayable_faults.c | |
| @@ -1288,159 +1288,19 @@ | |
| FAULT_SERVICE_MODE_CANCEL, | |
| } fault_service_mode_t; | |
| -#if defined(NV_PNV_NPU2_INIT_CONTEXT_PRESENT) | |
| -static NV_STATUS uvm_ats_service_fault_entry(uvm_gpu_t *gpu, | |
| - NvU32 entry_index, | |
| - uvm_fault_service_batch_context_t *batch_context) | |
| -{ | |
| - uvm_gpu_va_space_t *gpu_va_space; | |
| - uvm_fault_buffer_entry_t *previous_entry = NULL; | |
| - uvm_fault_buffer_entry_t *current_entry = batch_context->ordered_fault_cache[entry_index]; | |
| - uvm_fault_utlb_info_t *utlb = &batch_context->utlbs[current_entry->fault_source.utlb_id]; | |
| - unsigned long flags; | |
| - uintptr_t addr; | |
| - unsigned long fault_status = 0; | |
| - NV_STATUS status = NV_OK; | |
| - bool is_duplicate = false; | |
| - uvm_fault_access_type_t service_access_type; | |
| - | |
| - UVM_ASSERT(current_entry->fault_access_type == | |
| - uvm_fault_access_type_mask_highest(current_entry->access_type_mask)); | |
| - | |
| - if (entry_index > 0) | |
| - previous_entry = batch_context->ordered_fault_cache[entry_index - 1]; | |
| - | |
| - // This is a bringup driver, so do some verbose printing: | |
| - uvm_hal_print_fault_entry(current_entry); | |
| - | |
| - // Service the most intrusive fault per page, only. Waive the rest. | |
| - if ((entry_index > 0) && (current_entry->va_space == previous_entry->va_space) && | |
| - (current_entry->fault_address == previous_entry->fault_address)) { | |
| - // Propagate the is_invalid_prefetch flag across all prefetch faults on the page | |
| - if (previous_entry->is_invalid_prefetch) | |
| - current_entry->is_invalid_prefetch = true; | |
| - | |
| - // If a page is throttled, all faults on the page must be skipped | |
| - if (previous_entry->is_throttled) | |
| - current_entry->is_throttled = true; | |
| - | |
| - is_duplicate = true; | |
| - } | |
| - | |
| - // Generate fault events for all fault packets | |
| - uvm_perf_event_notify_gpu_fault(¤t_entry->va_space->perf_events, | |
| - NULL, | |
| - gpu->id, | |
| - current_entry, | |
| - 0, | |
| - is_duplicate); | |
| - | |
| - // The previous fault was non-fatal so the page has been already serviced | |
| - if (is_duplicate && !previous_entry->is_fatal) | |
| - goto skip_fault; | |
| - | |
| - // TODO: Bug 1896767: Combine ATS and non-ATS fault servicing so we can | |
| - // handle both types of faults in the same GPU VA space. | |
| - gpu_va_space = uvm_gpu_va_space_get(current_entry->va_space, gpu); | |
| - | |
| - service_access_type = current_entry->fault_access_type; | |
| - | |
| - // TODO: Bug 1896767: Service more than a single fault at a time | |
| - flags = (unsigned long)((service_access_type >= UVM_FAULT_ACCESS_TYPE_WRITE) ? NPU2_WRITE : 0); | |
| - addr = (uintptr_t)current_entry->fault_address; | |
| - if (gpu_va_space->ats_enabled) { | |
| - status = errno_to_nv_status(pnv_npu2_handle_fault(gpu_va_space->npu_context, &addr, &flags, &fault_status, 1)); | |
| - } | |
| - else { | |
| - pr_info_ratelimited("Support is not yet implemented for faults in non-ATS GPU VA spaces " | |
| - "when loading with uvm8_ats_mode=1, cancelling.\n"); | |
| - status = NV_ERR_INVALID_ADDRESS; | |
| - } | |
| - | |
| - // Do not flag prefetch faults as fatal unless something fatal happened | |
| - if (status == NV_ERR_INVALID_ADDRESS) { | |
| - if (current_entry->fault_access_type != UVM_FAULT_ACCESS_TYPE_PREFETCH) { | |
| - current_entry->is_fatal = true; | |
| - current_entry->fatal_reason = uvm_tools_status_to_fatal_fault_reason(status); | |
| - | |
| - if (service_access_type == UVM_FAULT_ACCESS_TYPE_READ) | |
| - current_entry->cancel_va_mode = UVM_FAULT_CANCEL_VA_MODE_ALL; | |
| - else | |
| - current_entry->cancel_va_mode = UVM_FAULT_CANCEL_VA_MODE_WRITE_AND_ATOMIC; | |
| - | |
| - // If there are pending read accesses on the same page, we have to | |
| - // service them before we can cancel the write/atomic faults. So we | |
| - // retry with read fault access type. | |
| - if (gpu_va_space->ats_enabled && | |
| - current_entry->fault_access_type > UVM_FAULT_ACCESS_TYPE_READ && | |
| - uvm_fault_access_type_mask_test(current_entry->access_type_mask, UVM_FAULT_ACCESS_TYPE_READ)) { | |
| - flags = 0; | |
| - status = errno_to_nv_status(pnv_npu2_handle_fault(gpu_va_space->npu_context, | |
| - &addr, | |
| - &flags, | |
| - &fault_status, | |
| - 1)); | |
| - // If read accesses also fail, | |
| - if (status != NV_OK) | |
| - current_entry->cancel_va_mode = UVM_FAULT_CANCEL_VA_MODE_ALL; | |
| - } | |
| - } | |
| - else { | |
| - current_entry->is_invalid_prefetch = true; | |
| - } | |
| - | |
| - // Do not fail overall fault servicing due to logical errors | |
| - status = NV_OK; | |
| - } | |
| - | |
| -skip_fault: | |
| - if (current_entry->is_invalid_prefetch) | |
| - batch_context->num_invalid_prefetch_faults += current_entry->num_instances; | |
| - | |
| - batch_context->num_duplicate_faults += current_entry->num_instances - 1; | |
| - | |
| - if (current_entry->is_throttled) | |
| - batch_context->has_throttled_faults = true; | |
| - | |
| - if (current_entry->is_fatal) { | |
| - utlb->has_fatal_faults = true; | |
| - batch_context->has_fatal_faults = true; | |
| - } | |
| - | |
| - return status; | |
| -} | |
| -#endif | |
| - | |
| static void uvm_down_read_mmap_lock_unsafe(uvm_va_space_t *va_space) | |
| { | |
| -#if defined(NV_PNV_NPU2_INIT_CONTEXT_PRESENT) | |
| - // TODO: Bug 1896767: See the comments on unsafe_mm in uvm8_va_space.h. | |
| - // We can only get here when loaded in ATS mode (uvm8_ats_mode=1). | |
| - if (va_space->unsafe_mm) | |
| - uvm_down_read_mmap_lock(va_space->unsafe_mm); | |
| -#endif | |
| } | |
| static void uvm_up_read_mmap_lock_unsafe(uvm_va_space_t *va_space) | |
| { | |
| -#if defined(NV_PNV_NPU2_INIT_CONTEXT_PRESENT) | |
| - // TODO: Bug 1896767: See the comments on unsafe_mm in uvm8_va_space.h. | |
| - // We can only get here when loaded in ATS mode (uvm8_ats_mode=1). | |
| - if (va_space->unsafe_mm) | |
| - uvm_up_read_mmap_lock(va_space->unsafe_mm); | |
| -#endif | |
| } | |
| static NV_STATUS service_ats_fault_entry(uvm_gpu_t *gpu, | |
| NvU32 entry_index, | |
| uvm_fault_service_batch_context_t *batch_context) | |
| { | |
| -#if defined(NV_PNV_NPU2_INIT_CONTEXT_PRESENT) | |
| - if (uvm8_ats_mode) | |
| - return uvm_ats_service_fault_entry(gpu, entry_index, batch_context); | |
| -#else | |
| UVM_ASSERT(!uvm8_ats_mode); | |
| -#endif | |
| return NV_ERR_NOT_SUPPORTED; | |
| } | |
| --- a/kernel/conftest.sh | |
| +++ b/kernel/conftest.sh | |
| @@ -582,6 +582,9 @@ | |
| # The explicit buffer argument is only present on 2.6.9. Assume the | |
| # interface is always present. | |
| # | |
| + echo "#define NV_PCI_SAVE_STATE_ARGUMENT_COUNT 1" | append_conftest "functions" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <linux/pci.h> | |
| void conftest_pci_save_state(void) { | |
| @@ -681,6 +684,10 @@ | |
| # Determine if the 'pm_message_t' data type is present | |
| # and if it as an 'event' member. | |
| # | |
| + echo "#define NV_PM_MESSAGE_T_PRESENT" | append_conftest "types" | |
| + echo "#define NV_PM_MESSAGE_T_HAS_EVENT" | append_conftest "types" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <linux/pm.h> | |
| void conftest_pm_message_t(pm_message_t state) { | |
| @@ -751,6 +758,10 @@ | |
| # Determine if the 'irq_handler_t' type is present and | |
| # if it takes a 'struct ptregs *' argument. | |
| # | |
| + echo "#define NV_IRQ_HANDLER_T_PRESENT" | append_conftest "types" | |
| + echo "#define NV_IRQ_HANDLER_T_ARGUMENT_COUNT 2" | append_conftest "types" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <linux/interrupt.h> | |
| irq_handler_t conftest_isr; | |
| @@ -874,6 +885,9 @@ | |
| # Determine if the 'acpi_device_id' structure has | |
| # a 'driver_data' member. | |
| # | |
| + echo "#define NV_ACPI_DEVICE_ID_HAS_DRIVER_DATA" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/acpi.h> | |
| int conftest_acpi_device_id(void) { | |
| @@ -915,6 +929,10 @@ | |
| # Determine if the kmem_cache_create() function is | |
| # present and how many arguments it takes. | |
| # | |
| + echo "#define NV_KMEM_CACHE_CREATE_PRESENT" | append_conftest "functions" | |
| + echo "#define NV_KMEM_CACHE_CREATE_ARGUMENT_COUNT 5" | append_conftest "functions" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <linux/slab.h> | |
| void conftest_kmem_cache_create(void) { | |
| @@ -970,6 +988,10 @@ | |
| # Determine if the smp_call_function() function is | |
| # present and how many arguments it takes. | |
| # | |
| + echo "#define NV_SMP_CALL_FUNCTION_PRESENT" | append_conftest "functions" | |
| + echo "#define NV_SMP_CALL_FUNCTION_ARGUMENT_COUNT 3" | append_conftest "functions" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <linux/smp.h> | |
| void conftest_smp_call_function(void) { | |
| @@ -1027,6 +1049,10 @@ | |
| # Determine if the on_each_cpu() function is present | |
| # and how many arguments it takes. | |
| # | |
| + echo "#define NV_ON_EACH_CPU_PRESENT" | append_conftest "functions" | |
| + echo "#define NV_ON_EACH_CPU_ARGUMENT_COUNT 3" | append_conftest "functions" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <linux/smp.h> | |
| void conftest_on_each_cpu(void) { | |
| @@ -1115,6 +1141,9 @@ | |
| # Determine if the acpi_evaluate_integer() function is | |
| # present and the type of its 'data' argument. | |
| # | |
| + echo "#define NV_ACPI_EVALUATE_INTEGER_PRESENT" | append_conftest "functions" | |
| + echo "typedef unsigned long long nv_acpi_integer_t;" | append_conftest "functions" | |
| + return | |
| echo "$CONFTEST_PREAMBLE | |
| #include <linux/acpi.h> | |
| @@ -1166,6 +1195,10 @@ | |
| # Determine if the acpi_walk_namespace() function is present | |
| # and how many arguments it takes. | |
| # | |
| + echo "#define NV_ACPI_WALK_NAMESPACE_PRESENT" | append_conftest "functions" | |
| + echo "#define NV_ACPI_WALK_NAMESPACE_ARGUMENT_COUNT 7" | append_conftest "functions" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <linux/acpi.h> | |
| void conftest_acpi_walk_namespace(void) { | |
| @@ -1274,6 +1307,10 @@ | |
| # Determine how many arguments the INIT_WORK() macro | |
| # takes. | |
| # | |
| + echo "#define NV_INIT_WORK_PRESENT" | append_conftest "macros" | |
| + echo "#define NV_INIT_WORK_ARGUMENT_COUNT 2" | append_conftest "macros" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <linux/workqueue.h> | |
| void conftest_INIT_WORK(void) { | |
| @@ -1330,10 +1367,14 @@ | |
| # Determine how many arguments pci_dma_mapping_error() | |
| # takes. | |
| # | |
| + echo "#define NV_PCI_DMA_MAPPING_ERROR_PRESENT" | append_conftest "functions" | |
| + echo "#define NV_PCI_DMA_MAPPING_ERROR_ARGUMENT_COUNT 2" | append_conftest "functions" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <linux/pci.h> | |
| int conftest_pci_dma_mapping_error(void) { | |
| - return pci_dma_mapping_error(NULL, 0); | |
| + return dma_mapping_error(NULL, 0); | |
| }" > conftest$$.c | |
| $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1 | |
| @@ -1371,6 +1412,9 @@ | |
| # Determine if the 'scatterlist' structure has | |
| # a 'page_link' member. | |
| # | |
| + echo "#define NV_SCATTERLIST_HAS_PAGE_LINK" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/types.h> | |
| #include <linux/scatterlist.h> | |
| @@ -1400,6 +1444,10 @@ | |
| # Determine if the 'file_operations' structure has | |
| # 'ioctl', 'unlocked_ioctl' and 'compat_ioctl' fields. | |
| # | |
| + echo "#define NV_FILE_OPERATIONS_HAS_UNLOCKED_IOCTL" | append_conftest "types" | |
| + echo "#define NV_FILE_OPERATIONS_HAS_COMPAT_IOCTL" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/fs.h> | |
| int conftest_file_operations(void) { | |
| @@ -1429,6 +1477,9 @@ | |
| # | |
| # Determine if the struct sg_table type is present. | |
| # | |
| + echo "#define NV_SG_TABLE_PRESENT" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/scatterlist.h> | |
| struct sg_table conftest_sg_table; | |
| @@ -1442,6 +1493,10 @@ | |
| # Determine if include/linux/scatterlist.h exists and which table | |
| # allocation functions are present if so. | |
| # | |
| + echo "#define NV_SG_ALLOC_TABLE_PRESENT" | append_conftest "types" | |
| + echo "#define NV_SG_ALLOC_TABLE_FROM_PAGES_PRESENT" | append_conftest "types" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <linux/scatterlist.h> | |
| void conftest_sg_alloc_table(void) { | |
| @@ -1602,6 +1657,9 @@ | |
| # | |
| # 2007-07-19 d0217ac04ca6591841e5665f518e38064f4e65bd | |
| # | |
| + echo "#define NV_VM_FAULT_PRESENT" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/mm.h> | |
| int conftest_vm_fault_present(void) { | |
| @@ -1623,6 +1681,9 @@ | |
| # struct vm_fault: .virtual_address was removed by: | |
| # 2016-12-14 1a29d85eb0f19b7d8271923d8917d7b4f5540b3e | |
| # | |
| + echo "#define NV_VM_FAULT_HAS_ADDRESS" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/mm.h> | |
| int conftest_vm_fault_has_address(void) { | |
| @@ -1837,6 +1898,10 @@ | |
| # Determine if the 'vm_operations_struct' structure has | |
| # 'fault' and 'access' fields. | |
| # | |
| + echo "#define NV_VM_OPERATIONS_STRUCT_HAS_FAULT" | append_conftest "types" | |
| + echo "#define NV_VM_OPERATIONS_STRUCT_HAS_ACCESS" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/mm.h> | |
| int conftest_vm_operations_struct(void) { | |
| @@ -1856,6 +1921,9 @@ | |
| fault_flags) | |
| # Determine if the FAULT_FLAG_WRITE is defined | |
| + echo "#define NV_FAULT_FLAG_PRESENT" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/mm.h> | |
| void conftest_fault_flags(void) { | |
| @@ -1868,6 +1936,9 @@ | |
| atomic_long_type) | |
| # Determine if atomic_long_t and associated functions are defined | |
| # Added in 2.6.16 2006-01-06 d3cb487149bd706aa6aeb02042332a450978dc1c | |
| + echo "#define NV_ATOMIC_LONG_PRESENT" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <asm/atomic.h> | |
| void conftest_atomic_long(void) { | |
| @@ -1882,6 +1953,9 @@ | |
| atomic64_type) | |
| # Determine if atomic64_t and associated functions are defined | |
| + echo "#define NV_ATOMIC64_PRESENT" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <asm/atomic.h> | |
| void conftest_atomic64(void) { | |
| @@ -1899,6 +1973,9 @@ | |
| # Determine if the 'task_struct' structure has | |
| # a 'cred' field. | |
| # | |
| + echo "#define NV_TASK_STRUCT_HAS_CRED" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/sched.h> | |
| int conftest_task_struct(void) { | |
| @@ -1985,6 +2062,9 @@ | |
| # | |
| # Determine if the 'kuid_t' type is present. | |
| # | |
| + echo "#define NV_KUID_T_PRESENT" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/sched.h> | |
| kuid_t conftest_kuid_t; | |
| @@ -2024,6 +2104,9 @@ | |
| # Determine if the 'file' structure has | |
| # a 'f_inode' field. | |
| # | |
| + echo "#define NV_FILE_HAS_INODE" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/fs.h> | |
| int conftest_file_inode(void) { | |
| @@ -2068,6 +2151,9 @@ | |
| # | |
| # Determine if the 'dma_ops' structure is present. | |
| # | |
| + echo "#define NV_DMA_OPS_PRESENT" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/dma-mapping.h> | |
| void conftest_dma_ops(void) { | |
| @@ -2099,6 +2185,9 @@ | |
| # in v5.10-rc1 (2020-09-22), moved 'struct dma_map_ops' | |
| # type from <linux/dma-mapping.h> to <linux/dma-map-ops.h>. | |
| # | |
| + echo "#define NV_DMA_MAP_OPS_PRESENT" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #if defined(NV_LINUX_DMA_MAP_OPS_H_PRESENT) | |
| #include <linux/dma-map-ops.h> | |
| @@ -2537,6 +2626,12 @@ | |
| # 'format_modifiers' argument, which was added by: | |
| # 2017-07-23 e6fc3b68558e4c6d8d160b5daf2511b99afa8814 | |
| # | |
| + echo "#define NV_DRM_CRTC_INIT_WITH_PLANES_HAS_NAME_ARG" | append_conftest "types" | |
| + echo "#define NV_DRM_ENCODER_INIT_HAS_NAME_ARG" | append_conftest "types" | |
| + echo "#define NV_DRM_UNIVERSAL_PLANE_INIT_HAS_FORMAT_MODIFIERS_ARG" | append_conftest "types" | |
| + echo "#define NV_DRM_UNIVERSAL_PLANE_INIT_HAS_NAME_ARG" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #if defined(NV_DRM_DRMP_H_PRESENT) | |
| #include <drm/drmP.h> | |
| @@ -2730,6 +2825,9 @@ | |
| # drm_crtc_state::connectors_changed was added by: | |
| # 2015-07-21 fc596660dd4e83f7f84e3cd7b25dc5e8e83000ef | |
| # | |
| + echo "#define NV_DRM_CRTC_STATE_HAS_CONNECTORS_CHANGED" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <drm/drm_crtc.h> | |
| void conftest_drm_crtc_state_has_connectors_changed(void) { | |
| @@ -2768,10 +2866,13 @@ | |
| # wait_on_bit_lock changed by | |
| # 2014-07-07 743162013d40ca612b4cb53d3a200dff2d9ab26e | |
| # | |
| + echo "#define NV_WAIT_ON_BIT_LOCK_ARGUMENT_COUNT 3" | append_conftest "functions" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| - #include <linux/wait.h> | |
| + #include <linux/wait_bit.h> | |
| void conftest_wait_on_bit_lock(void) { | |
| - wait_on_bit_lock(NULL, 0, 0); | |
| + wait_on_bit(NULL, 0, 0); | |
| }" > conftest$$.c | |
| $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1 | |
| @@ -2891,6 +2992,10 @@ | |
| # take 'dev' parameter by: | |
| # 2016-12-14 a3f913ca98925d7e5bae725e9b2b38408215a695 | |
| # | |
| + echo "#define NV_DRM_HELPER_MODE_FILL_FB_STRUCT_HAS_DEV_ARG" | append_conftest "function" | |
| + echo "#define NV_DRM_HELPER_MODE_FILL_FB_STRUCT_HAS_CONST_MODE_CMD_ARG" | append_conftest "function" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <drm/drm_crtc_helper.h> | |
| void drm_helper_mode_fill_fb_struct(struct drm_device *dev, | |
| @@ -3086,6 +3191,9 @@ | |
| # conftest #1: check if get_user_pages_remote() is available | |
| # return if not available. | |
| # Fall through to conftest #2 if it is present | |
| + echo "#define NV_GET_USER_PAGES_REMOTE_PRESENT" | append_conftest "types" | |
| + echo "#define NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "types" | |
| + return | |
| echo "$CONFTEST_PREAMBLE | |
| #include <linux/mm.h> | |
| @@ -3363,6 +3471,9 @@ | |
| # | |
| # 2017-02-24 11bac80004499ea59f361ef2a5516c84b6eab675 | |
| # | |
| + echo "#define NV_VM_OPS_FAULT_REMOVED_VMA_ARG" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/mm.h> | |
| void conftest_vm_ops_fault_removed_vma_arg(void) { | |
| @@ -3411,6 +3522,9 @@ | |
| ;; | |
| kref_has_refcount_of_type_refcount_t) | |
| + echo "#define NV_KREF_HAS_REFCOUNT_OF_TYPE_REFCOUNT_T" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/kref.h> | |
| @@ -3564,6 +3678,9 @@ | |
| # Determine if the backlight_properties structure has a 'type' field | |
| # and whether BACKLIGHT_RAW is defined. | |
| # | |
| + echo "#define NV_BACKLIGHT_PROPERTIES_TYPE_PRESENT" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/backlight.h> | |
| void conftest_backlight_props_type(void) { | |
| @@ -3618,6 +3735,9 @@ | |
| # radix_tree_replace_slot symbol export was introduced in 4.11 | |
| # 2017-10-11 10257d719686706aa669b348309cfd9fd9783ad9 | |
| # | |
| + echo "#define NV_RADIX_TREE_REPLACE_SLOT_ARGUMENT_COUNT 3" | append_conftest "functions" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/bug.h> | |
| #include <linux/version.h> | |
| @@ -3695,6 +3815,9 @@ | |
| # and it is updated to take 'file_priv' argument by: | |
| # 2017-03-14 418da17214aca5ef5f0b6f7588905ee7df92f98f | |
| # | |
| + echo "#define NV_DRM_MODE_OBJECT_FIND_HAS_FILE_PRIV_ARG" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <drm/drm_mode_object.h> | |
| void conftest_drm_mode_object_find_has_file_priv_arg( | |
| @@ -3747,6 +3870,9 @@ | |
| # Added by commit 1c8f422059ae5da07db7406ab916203f9417e396 ("mm: | |
| # change return type to vm_fault_t") in v4.17 (2018-04-05) | |
| # | |
| + echo "#define NV_VM_FAULT_T_IS_PRESENT" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/mm.h> | |
| vm_fault_t conftest_vm_fault_t; | |
| @@ -3873,6 +3999,10 @@ | |
| # Added by commit 613051dac40da1751ab269572766d3348d45a197 ("drm: | |
| # locking&new iterators for connector_list") in v4.11 (2016-12-14). | |
| # | |
| + echo "#define NV_DRM_CONNECTOR_LIST_ITER_PRESENT" | append_conftest "types" | |
| + echo "#define NV_DRM_CONNECTOR_LIST_ITER_BEGIN_PRESENT" | append_conftest "functions" | |
| + return | |
| + | |
| CODE=" | |
| #include <drm/drm_connector.h> | |
| int conftest_drm_connector_list_iter(void) { | |
| @@ -3909,6 +4039,9 @@ | |
| # Massage swap_state signature somewhat) | |
| # in v4.8 (2016-06-10). | |
| # | |
| + echo "#define NV_DRM_ATOMIC_HELPER_SWAP_STATE_HAS_STALL_ARG" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <drm/drm_atomic_helper.h> | |
| void conftest_drm_atomic_helper_swap_state_has_stall_arg( | |
| @@ -3928,6 +4061,9 @@ | |
| # drm_atomic_helper_swap_state to return an error.) in v4.14 | |
| # (2017-07-11). | |
| # | |
| + echo "#define NV_DRM_ATOMIC_HELPER_SWAP_STATE_RETURN_INT" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <drm/drm_atomic_helper.h> | |
| int conftest_drm_atomic_helper_swap_state_return_int( | |
| @@ -4068,6 +4204,9 @@ | |
| # commit 1ba627148ef5 (drm: Add reservation_object to | |
| # drm_gem_object) in v5.2. | |
| # | |
| + echo "#define NV_DRM_GEM_OBJECT_HAS_RESV" | append_conftest "types" | |
| + return | |
| + | |
| CODE="$CONFTEST_PREAMBLE | |
| #if defined(NV_DRM_DRM_GEM_H_PRESENT) | |
| #include <drm/drm_gem.h> | |
| @@ -4087,6 +4226,9 @@ | |
| # Added by commit d56c0d45f0e2 ("proc: decouple proc from VFS with | |
| # "struct proc_ops"") in 5.6-rc1 | |
| # | |
| + echo "#define NV_PROC_OPS_PRESENT" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/proc_fs.h> | |
| @@ -4150,6 +4292,9 @@ | |
| # Kernel commit da1c55f1b272 ("mmap locking API: rename mmap_sem | |
| # to mmap_lock") replaced the field 'mmap_sem' by 'mmap_lock' | |
| # in v5.8-rc1 (2020-06-08). | |
| + echo "#define NV_MM_HAS_MMAP_LOCK" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/mm_types.h> | |
| @@ -4172,6 +4317,9 @@ | |
| # Added by commit d491f2b75237 ("PCI: PM: Avoid possible | |
| # suspend-to-idle issue") in 5.2-rc3 (2019-06-13) | |
| # | |
| + echo "#define NV_PCI_DEV_HAS_SKIP_BUS_PM" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <linux/pci.h> | |
| void conftest_pci_dev_has_skip_bus_pm(void) { | |
| @@ -4336,6 +4484,9 @@ | |
| # drm_prime_pages_to_sg() is updated to take 'dev' argument by commit | |
| # 707d561f77b5 ("drm: allow limiting the scatter list size."). | |
| # | |
| + echo "#define NV_DRM_PRIME_PAGES_TO_SG_HAS_DRM_DEVICE_ARG" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #if defined(NV_DRM_DRMP_H_PRESENT) | |
| #include <drm/drmP.h> | |
| @@ -4402,6 +4553,9 @@ | |
| # pointer check into error") has turned incompatible-pointer-types | |
| # check into error from v4.6. | |
| # | |
| + echo "#define NV_DRM_CRTC_ATOMIC_CHECK_HAS_ATOMIC_STATE_ARG" | append_conftest "types" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <drm/drm_modeset_helper_vtables.h> | |
| int conftest_drm_crtc_atomic_check_has_atomic_state_arg( | |
| @@ -4430,6 +4584,9 @@ | |
| # vmap ops and convert GEM backends") update | |
| # drm_gem_object_funcs::vmap to take 'map' argument. | |
| # | |
| + echo "#define NV_DRM_GEM_OBJECT_VMAP_HAS_MAP_ARG" | append_conftest "types" | |
| + return | |
| + | |
| CODE=" | |
| #include <drm/drm_gem.h> | |
| int conftest_drm_gem_object_vmap_has_map_arg( | |
| @@ -4474,6 +4631,9 @@ | |
| # pointer check into error") has turned incompatible-pointer-types | |
| # check into error from v4.6. | |
| # | |
| + echo "#define NV_DRM_PLANE_ATOMIC_CHECK_HAS_ATOMIC_STATE_ARG" | append_conftest "types" | |
| + return | |
| + | |
| echo "$CONFTEST_PREAMBLE | |
| #include <drm/drm_modeset_helper_vtables.h> | |
| int conftest_drm_plane_atomic_check_has_atomic_state_arg( | |
| --- a/kernel/nvidia-drm/nvidia-drm-connector.c | |
| +++ b/kernel/nvidia-drm/nvidia-drm-connector.c | |
| @@ -98,7 +98,7 @@ | |
| break; | |
| } | |
| - if (connector->override_edid) { | |
| + if (connector->edid_override) { | |
| const struct drm_property_blob *edid = connector->edid_blob_ptr; | |
| if (edid->length <= sizeof(pDetectParams->edid.buffer)) { | |
| @@ -212,9 +212,7 @@ | |
| } | |
| static struct drm_connector_funcs nv_connector_funcs = { | |
| -#if defined NV_DRM_ATOMIC_HELPER_CONNECTOR_DPMS_PRESENT | |
| - .dpms = drm_atomic_helper_connector_dpms, | |
| -#endif | |
| + .dpms = drm_helper_connector_dpms, | |
| .destroy = nv_drm_connector_destroy, | |
| .reset = drm_atomic_helper_connector_reset, | |
| .force = __nv_drm_connector_force, | |
| @@ -291,8 +289,7 @@ | |
| return count; | |
| } | |
| -static int nv_drm_connector_mode_valid(struct drm_connector *connector, | |
| - struct drm_display_mode *mode) | |
| +static enum drm_mode_status nv_drm_connector_mode_valid( struct drm_connector *connector, const struct drm_display_mode *mode ) | |
| { | |
| struct drm_device *dev = connector->dev; | |
| struct nv_drm_device *nv_dev = to_nv_device(dev); | |
| --- a/kernel/nvidia-drm/nvidia-drm-encoder.c | |
| +++ b/kernel/nvidia-drm/nvidia-drm-encoder.c | |
| @@ -341,9 +341,6 @@ | |
| * On kernels where DRM has a primary group, we need to reinitialize | |
| * after adding encoders and connectors. | |
| */ | |
| -#if defined(NV_DRM_REINIT_PRIMARY_MODE_GROUP_PRESENT) | |
| - drm_reinit_primary_mode_group(dev); | |
| -#endif | |
| drm_kms_helper_hotplug_event(dev); | |
| } | |
| --- a/kernel/nvidia-drm/nvidia-drm-fb.c | |
| +++ b/kernel/nvidia-drm/nvidia-drm-fb.c | |
| @@ -31,6 +31,7 @@ | |
| #include "nvidia-drm-gem.h" | |
| #include <drm/drm_crtc_helper.h> | |
| +#include <drm/drm_modeset_helper.h> | |
| static void nv_drm_framebuffer_destroy(struct drm_framebuffer *fb) | |
| { | |
| @@ -177,11 +178,13 @@ | |
| /* Fill out framebuffer metadata from the userspace fb creation request */ | |
| + struct drm_format_info format; | |
| drm_helper_mode_fill_fb_struct( | |
| #if defined(NV_DRM_HELPER_MODE_FILL_FB_STRUCT_HAS_DEV_ARG) | |
| dev, | |
| #endif | |
| &nv_fb->base, | |
| + &format, | |
| cmd); | |
| /* | |
| --- a/kernel/nvidia-drm/nvidia-drm-gem.h | |
| +++ b/kernel/nvidia-drm/nvidia-drm-gem.h | |
| @@ -86,27 +86,13 @@ | |
| static inline void | |
| nv_drm_gem_object_unreference_unlocked(struct nv_drm_gem_object *nv_gem) | |
| { | |
| -#if defined(NV_DRM_GEM_OBJECT_GET_PRESENT) | |
| - | |
| -#if defined(NV_DRM_GEM_OBJECT_PUT_UNLOCK_PRESENT) | |
| - drm_gem_object_put_unlocked(&nv_gem->base); | |
| -#else | |
| drm_gem_object_put(&nv_gem->base); | |
| -#endif | |
| - | |
| -#else | |
| - drm_gem_object_unreference_unlocked(&nv_gem->base); | |
| -#endif | |
| } | |
| static inline void | |
| nv_drm_gem_object_unreference(struct nv_drm_gem_object *nv_gem) | |
| { | |
| -#if defined(NV_DRM_GEM_OBJECT_GET_PRESENT) | |
| drm_gem_object_put(&nv_gem->base); | |
| -#else | |
| - drm_gem_object_unreference(&nv_gem->base); | |
| -#endif | |
| } | |
| static inline int nv_drm_gem_handle_create_drop_reference( | |
| --- a/kernel/nvidia-drm/nvidia-drm-gem.c | |
| +++ b/kernel/nvidia-drm/nvidia-drm-gem.c | |
| @@ -51,10 +51,8 @@ | |
| nv_gem->ops->free(nv_gem); | |
| } | |
| -#if !defined(NV_DRM_DRIVER_HAS_GEM_PRIME_CALLBACKS) && \ | |
| - defined(NV_DRM_GEM_OBJECT_VMAP_HAS_MAP_ARG) | |
| static int nv_drm_gem_vmap(struct drm_gem_object *gem, | |
| - struct dma_buf_map *map) | |
| + struct iosys_map *map) | |
| { | |
| map->vaddr = nv_drm_gem_prime_vmap(gem); | |
| if (map->vaddr == NULL) { | |
| @@ -65,12 +63,11 @@ | |
| } | |
| static void nv_drm_gem_vunmap(struct drm_gem_object *gem, | |
| - struct dma_buf_map *map) | |
| + struct iosys_map *map) | |
| { | |
| nv_drm_gem_prime_vunmap(gem, map->vaddr); | |
| map->vaddr = NULL; | |
| } | |
| -#endif | |
| #if !defined(NV_DRM_DRIVER_HAS_GEM_FREE_OBJECT) || \ | |
| !defined(NV_DRM_DRIVER_HAS_GEM_PRIME_CALLBACKS) | |
| @@ -80,13 +77,8 @@ | |
| #if !defined(NV_DRM_DRIVER_HAS_GEM_PRIME_CALLBACKS) | |
| .export = nv_drm_gem_prime_export, | |
| -#if defined(NV_DRM_GEM_OBJECT_VMAP_HAS_MAP_ARG) | |
| .vmap = nv_drm_gem_vmap, | |
| .vunmap = nv_drm_gem_vunmap, | |
| -#else | |
| - .vmap = nv_drm_gem_prime_vmap, | |
| - .vunmap = nv_drm_gem_prime_vunmap, | |
| -#endif | |
| #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) | |
| .vm_ops = &nv_drm_gem_vma_ops, | |
| --- a/kernel/nvidia-drm/nvidia-drm-drv.c | |
| +++ b/kernel/nvidia-drm/nvidia-drm-drv.c | |
| @@ -134,6 +134,7 @@ | |
| static struct drm_framebuffer *nv_drm_framebuffer_create( | |
| struct drm_device *dev, | |
| struct drm_file *file, | |
| + const struct drm_format_info *format, | |
| #if defined(NV_DRM_HELPER_MODE_FILL_FB_STRUCT_HAS_CONST_MODE_CMD_ARG) | |
| const struct drm_mode_fb_cmd2 *cmd | |
| #else | |
| @@ -166,8 +167,6 @@ | |
| .atomic_state_free = nv_drm_atomic_state_free, | |
| .atomic_check = nv_drm_atomic_check, | |
| .atomic_commit = nv_drm_atomic_commit, | |
| - | |
| - .output_poll_changed = nv_drm_output_poll_changed, | |
| }; | |
| static void nv_drm_event_callback(const struct NvKmsKapiEvent *event) | |
| @@ -241,7 +240,7 @@ | |
| /* Currently unused. Update when needed. */ | |
| - dev->mode_config.fb_base = 0; | |
| + //dev->mode_config.fb_base = 0; | |
| dev->mode_config.async_page_flip = false; | |
| @@ -652,26 +651,26 @@ | |
| #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) | |
| DRM_IOCTL_DEF_DRV(NVIDIA_GEM_IMPORT_NVKMS_MEMORY, | |
| nv_drm_gem_import_nvkms_memory_ioctl, | |
| - DRM_UNLOCKED), | |
| + 0), | |
| #endif /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ | |
| DRM_IOCTL_DEF_DRV(NVIDIA_GEM_IMPORT_USERSPACE_MEMORY, | |
| nv_drm_gem_import_userspace_memory_ioctl, | |
| - DRM_RENDER_ALLOW|DRM_UNLOCKED), | |
| + DRM_RENDER_ALLOW), | |
| DRM_IOCTL_DEF_DRV(NVIDIA_GET_DEV_INFO, | |
| nv_drm_get_dev_info_ioctl, | |
| - DRM_RENDER_ALLOW|DRM_UNLOCKED), | |
| + DRM_RENDER_ALLOW), | |
| #if defined(NV_DRM_FENCE_AVAILABLE) | |
| DRM_IOCTL_DEF_DRV(NVIDIA_FENCE_SUPPORTED, | |
| nv_drm_fence_supported_ioctl, | |
| - DRM_RENDER_ALLOW|DRM_UNLOCKED), | |
| + DRM_RENDER_ALLOW), | |
| DRM_IOCTL_DEF_DRV(NVIDIA_FENCE_CONTEXT_CREATE, | |
| nv_drm_fence_context_create_ioctl, | |
| - DRM_RENDER_ALLOW|DRM_UNLOCKED), | |
| + DRM_RENDER_ALLOW), | |
| DRM_IOCTL_DEF_DRV(NVIDIA_GEM_FENCE_ATTACH, | |
| nv_drm_gem_fence_attach_ioctl, | |
| - DRM_RENDER_ALLOW|DRM_UNLOCKED), | |
| + DRM_RENDER_ALLOW), | |
| #endif | |
| DRM_IOCTL_DEF_DRV(NVIDIA_GET_CLIENT_CAPABILITY, | |
| @@ -680,7 +679,7 @@ | |
| #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) | |
| DRM_IOCTL_DEF_DRV(NVIDIA_GET_CRTC_CRC32, | |
| nv_drm_get_crtc_crc32_ioctl, | |
| - DRM_RENDER_ALLOW|DRM_UNLOCKED), | |
| + DRM_RENDER_ALLOW), | |
| #endif /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ | |
| }; | |
| @@ -699,7 +698,7 @@ | |
| .ioctls = nv_drm_ioctls, | |
| .num_ioctls = ARRAY_SIZE(nv_drm_ioctls), | |
| - .prime_handle_to_fd = drm_gem_prime_handle_to_fd, | |
| + .prime_handle_to_fd = NULL, | |
| #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_CALLBACKS) | |
| .gem_prime_export = nv_drm_gem_prime_export, | |
| @@ -728,7 +727,6 @@ | |
| .name = "nvidia-drm", | |
| .desc = "NVIDIA DRM driver", | |
| - .date = "20160202", | |
| #if defined(NV_DRM_DRIVER_HAS_DEVICE_LIST) | |
| .device_list = LIST_HEAD_INIT(nv_drm_driver.device_list), | |
| @@ -760,7 +758,7 @@ | |
| nv_drm_driver.dumb_create = nv_drm_dumb_create; | |
| nv_drm_driver.dumb_map_offset = nv_drm_dumb_map_offset; | |
| - nv_drm_driver.dumb_destroy = nv_drm_dumb_destroy; | |
| + //nv_drm_driver.dumb_destroy = nv_drm_dumb_destroy; | |
| #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_CALLBACKS) | |
| nv_drm_driver.gem_vm_ops = &nv_drm_gem_vma_ops; | |
| --- a/kernel/nvidia-drm/nvidia-dma-resv-helper.h | |
| +++ b/kernel/nvidia-drm/nvidia-dma-resv-helper.h | |
| @@ -69,7 +69,7 @@ | |
| nv_dma_fence_t *fence) | |
| { | |
| #if defined(NV_LINUX_DMA_RESV_H_PRESENT) | |
| - dma_resv_add_excl_fence(obj, fence); | |
| + dma_resv_add_fence(obj, fence, DMA_RESV_USAGE_WRITE); | |
| #else | |
| reservation_object_add_excl_fence(obj, fence); | |
| #endif | |
| --- a/kernel/nvidia-drm/nvidia-drm-helper.c | |
| +++ b/kernel/nvidia-drm/nvidia-drm-helper.c | |
| @@ -39,6 +39,8 @@ | |
| #include <drm/drm_atomic_uapi.h> | |
| #endif | |
| +#include <drm/drm_framebuffer.h> | |
| + | |
| static void __nv_drm_framebuffer_put(struct drm_framebuffer *fb) | |
| { | |
| #if defined(NV_DRM_FRAMEBUFFER_GET_PRESENT) | |
| --- a/kernel/nvidia-drm/nvidia-drm-helper.h | |
| +++ b/kernel/nvidia-drm/nvidia-drm-helper.h | |
| @@ -391,22 +391,14 @@ | |
| nv_drm_connector_attach_encoder(struct drm_connector *connector, | |
| struct drm_encoder *encoder) | |
| { | |
| -#if defined(NV_DRM_CONNECTOR_FUNCS_HAVE_MODE_IN_NAME) | |
| - return drm_mode_connector_attach_encoder(connector, encoder); | |
| -#else | |
| return drm_connector_attach_encoder(connector, encoder); | |
| -#endif | |
| } | |
| static inline int | |
| nv_drm_connector_update_edid_property(struct drm_connector *connector, | |
| const struct edid *edid) | |
| { | |
| -#if defined(NV_DRM_CONNECTOR_FUNCS_HAVE_MODE_IN_NAME) | |
| - return drm_mode_connector_update_edid_property(connector, edid); | |
| -#else | |
| return drm_connector_update_edid_property(connector, edid); | |
| -#endif | |
| } | |
| #if defined(NV_DRM_CONNECTOR_LIST_ITER_PRESENT) | |
| --- a/kernel/nvidia/os-interface.c | |
| +++ b/kernel/nvidia/os-interface.c | |
| @@ -444,13 +444,8 @@ | |
| void NV_API_CALL os_get_current_tick(NvU64 *nseconds) | |
| { | |
| -#if defined(NV_JIFFIES_TO_TIMESPEC_PRESENT) | |
| - struct timespec ts; | |
| - jiffies_to_timespec(jiffies, &ts); | |
| -#else | |
| struct timespec64 ts; | |
| jiffies_to_timespec64(jiffies, &ts); | |
| -#endif | |
| *nseconds = ((NvU64)ts.tv_sec * NSEC_PER_SEC + (NvU64)ts.tv_nsec); | |
| } | |
| @@ -845,7 +840,7 @@ | |
| break; | |
| case NV_MEMORY_UNCACHED: | |
| case NV_MEMORY_DEFAULT: | |
| - vaddr = nv_ioremap_nocache(start, size_bytes); | |
| + vaddr = nv_ioremap(start, size_bytes); | |
| break; | |
| default: | |
| nv_printf(NV_DBG_ERRORS, | |
| --- a/kernel/nvidia/os-mlock.c | |
| +++ b/kernel/nvidia/os-mlock.c | |
| @@ -18,11 +18,22 @@ | |
| unsigned long address, | |
| unsigned long *pfn) | |
| { | |
| -#if defined(NV_UNSAFE_FOLLOW_PFN_PRESENT) | |
| - return unsafe_follow_pfn(vma, address, pfn); | |
| -#else | |
| - return follow_pfn(vma, address, pfn); | |
| -#endif | |
| + int status = 0; | |
| + spinlock_t *ptl; | |
| + pte_t *ptep; | |
| + | |
| + if (!(vma->vm_flags & (VM_IO | VM_PFNMAP))) | |
| + return status; | |
| + | |
| + struct follow_pfnmap_args args; | |
| + args.vma = vma; | |
| + args.address = address; | |
| + status = follow_pfnmap_start( &args ); | |
| + if(status) | |
| + return status; | |
| + *pfn = args.pfn; | |
| + follow_pfnmap_end( &args ); | |
| + return 0; | |
| } | |
| NV_STATUS NV_API_CALL os_lookup_user_io_memory( | |
| --- a/kernel/nvidia/nv-acpi.c | |
| +++ b/kernel/nvidia/nv-acpi.c | |
| @@ -24,7 +24,7 @@ | |
| static int nv_acpi_add (struct acpi_device *); | |
| #if !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2) | |
| -static int nv_acpi_remove_two_args(struct acpi_device *device, int type); | |
| +static void nv_acpi_remove_two_args(struct acpi_device *device); | |
| #else | |
| static int nv_acpi_remove_one_arg(struct acpi_device *device); | |
| #endif | |
| @@ -215,6 +215,24 @@ | |
| return 0; | |
| } | |
| +LIST_HEAD( acpi_children ); | |
| + | |
| +struct acpi_child | |
| +{ struct list_head node; | |
| + struct acpi_device data; | |
| +}; | |
| + | |
| +static | |
| +int | |
| +acpi_add_child( struct acpi_device *dev | |
| +, void *data | |
| +){ struct acpi_child *node = kmalloc( sizeof( struct acpi_child ), GFP_KERNEL ); | |
| + node->data = *dev; | |
| + INIT_LIST_HEAD( &node->node ); | |
| + list_add_tail( &node->node, &acpi_children ); | |
| + return 0; | |
| +} | |
| + | |
| static int nv_acpi_add(struct acpi_device *device) | |
| { | |
| /* | |
| @@ -230,6 +248,7 @@ | |
| struct list_head *node, *next; | |
| nv_acpi_integer_t device_id = 0; | |
| int device_counter = 0; | |
| + struct acpi_child *entry, *temp; | |
| status = nv_kmem_cache_alloc_stack(&sp); | |
| if (status != 0) | |
| @@ -256,10 +275,11 @@ | |
| // grab handles to all the important nodes representing devices | |
| - list_for_each_safe(node, next, &device->children) | |
| + acpi_dev_for_each_child( device, acpi_add_child, 0 ); | |
| + list_for_each_safe(node, next, &acpi_children) | |
| { | |
| struct acpi_device *dev = | |
| - list_entry(node, struct acpi_device, node); | |
| + &list_entry(node, struct acpi_child, node)->data; | |
| if (!dev) | |
| continue; | |
| @@ -297,6 +317,11 @@ | |
| device_counter++; | |
| } | |
| + list_for_each_entry_safe( entry, temp, &acpi_children, node ) | |
| + { list_del( &entry->node ); | |
| + kfree(entry); | |
| + } | |
| + | |
| // arg 0, bits 1:0, 0 = enable events | |
| control_argument_0.integer.type = ACPI_TYPE_INTEGER; | |
| @@ -333,7 +358,7 @@ | |
| } | |
| #if !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2) | |
| -static int nv_acpi_remove_two_args(struct acpi_device *device, int type) | |
| +static void nv_acpi_remove_two_args(struct acpi_device *device) | |
| #else | |
| static int nv_acpi_remove_one_arg(struct acpi_device *device) | |
| #endif | |
| @@ -385,8 +410,6 @@ | |
| module_put(THIS_MODULE); | |
| device->driver_data = NULL; | |
| } | |
| - | |
| - return status; | |
| } | |
| static void nv_acpi_event(acpi_handle handle, u32 event_type, void *data) | |
| @@ -590,7 +613,6 @@ | |
| { | |
| struct acpi_device *device = NULL; | |
| NV_STATUS rmStatus; | |
| - int retVal = -1; | |
| if (!handlesPresent) // Caller passed us invalid pointer. | |
| @@ -610,9 +632,9 @@ | |
| if (!nvif_parent_gpu_handle) /* unknown error */ | |
| break; | |
| - retVal = acpi_bus_get_device(nvif_parent_gpu_handle, &device); | |
| + device = acpi_get_acpi_dev(nvif_parent_gpu_handle); | |
| - if (ACPI_FAILURE(retVal) || !device) | |
| + if (!device) | |
| break; | |
| if (device->driver_data) | |
| @@ -684,7 +706,7 @@ | |
| if (nvif_parent_gpu_handle == NULL) | |
| return; | |
| - acpi_bus_get_device(nvif_parent_gpu_handle, &device); | |
| + device = acpi_get_acpi_dev(nvif_parent_gpu_handle); | |
| nv_uninstall_notifier(device, nv_acpi_event); | |
| nvif_parent_gpu_handle = NULL; | |
| @@ -1237,6 +1259,7 @@ | |
| NvU32 i; | |
| acpi_handle dev_handle = NULL; | |
| acpi_handle lcd_dev_handle = NULL; | |
| + struct acpi_child *entry, *temp; | |
| if (!nv_acpi_get_device_handle(nv, &dev_handle)) | |
| return NV_ERR_NOT_SUPPORTED; | |
| @@ -1244,9 +1267,9 @@ | |
| if (!dev_handle) | |
| return NV_ERR_INVALID_ARGUMENT; | |
| - status = acpi_bus_get_device(dev_handle, &device); | |
| + device = acpi_get_acpi_dev(dev_handle); | |
| - if (ACPI_FAILURE(status) || !device) | |
| + if (!device) | |
| return NV_ERR_INVALID_ARGUMENT; | |
| if (!NV_MAY_SLEEP()) | |
| @@ -1259,10 +1282,11 @@ | |
| return NV_ERR_NOT_SUPPORTED; | |
| } | |
| - list_for_each_safe(node, next, &device->children) | |
| + acpi_dev_for_each_child( device, acpi_add_child, 0 ); | |
| + list_for_each_safe(node, next, &acpi_children) | |
| { | |
| struct acpi_device *dev = | |
| - list_entry(node, struct acpi_device, node); | |
| + &list_entry(node, struct acpi_child, node)->data; | |
| if (!dev) | |
| continue; | |
| @@ -1282,6 +1306,10 @@ | |
| } | |
| } | |
| + list_for_each_entry_safe( entry, temp, &acpi_children, node ) | |
| + { list_del( &entry->node ); | |
| + kfree(entry); | |
| + } | |
| if (lcd_dev_handle == NULL) | |
| { | |
| --- a/kernel/nvidia/nv-mmap.c | |
| +++ b/kernel/nvidia/nv-mmap.c | |
| @@ -433,7 +433,7 @@ | |
| addr = mmap_start; | |
| // Needed for the linux kernel for mapping compound pages | |
| - vma->vm_flags |= VM_MIXEDMAP; | |
| + vm_flags_set( vma, VM_MIXEDMAP ); | |
| for (j = 0; j < pages; j++) | |
| { | |
| @@ -457,7 +457,7 @@ | |
| } | |
| } | |
| - vma->vm_flags |= VM_IO; | |
| + vm_flags_set( vma, VM_IO ); | |
| } | |
| else | |
| { | |
| @@ -519,15 +519,15 @@ | |
| NV_PRINT_AT(NV_DBG_MEMINFO, at); | |
| - vma->vm_flags |= (VM_IO | VM_LOCKED | VM_RESERVED); | |
| - vma->vm_flags |= (VM_DONTEXPAND | VM_DONTDUMP); | |
| + vm_flags_set( vma, VM_IO | VM_LOCKED | VM_RESERVED ); | |
| + vm_flags_set( vma, VM_DONTEXPAND | VM_DONTDUMP ); | |
| } | |
| if ((prot & NV_PROTECT_WRITEABLE) == 0) | |
| { | |
| vma->vm_page_prot = NV_PGPROT_READ_ONLY(vma->vm_page_prot); | |
| - vma->vm_flags &= ~VM_WRITE; | |
| - vma->vm_flags &= ~VM_MAYWRITE; | |
| + vm_flags_clear( vma, VM_WRITE ); | |
| + vm_flags_clear( vma, VM_MAYWRITE ); | |
| } | |
| vma->vm_ops = &nv_vm_ops; | |
| --- a/kernel/nvidia/nv-vm.c | |
| +++ b/kernel/nvidia/nv-vm.c | |
| @@ -81,14 +81,12 @@ | |
| { | |
| switch (type) | |
| { | |
| -#if defined(NV_SET_MEMORY_ARRAY_UC_PRESENT) | |
| case NV_MEMORY_UNCACHED: | |
| - set_memory_array_uc(pages, num_pages); | |
| + set_memory_uc(( unsigned long )pages, num_pages); | |
| break; | |
| case NV_MEMORY_WRITEBACK: | |
| - set_memory_array_wb(pages, num_pages); | |
| + set_memory_wb(( unsigned long )pages, num_pages); | |
| break; | |
| -#endif | |
| default: | |
| nv_printf(NV_DBG_ERRORS, | |
| "NVRM: %s(): type %d unimplemented\n", | |
| --- a/kernel/nvidia/nv-dma.c | |
| +++ b/kernel/nvidia/nv-dma.c | |
| @@ -27,9 +27,9 @@ | |
| NvU64 *va | |
| ) | |
| { | |
| - *va = pci_map_page(dma_map->dev, dma_map->pages[0], 0, | |
| - dma_map->page_count * PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); | |
| - if (NV_PCI_DMA_MAPPING_ERROR(dma_map->dev, *va)) | |
| + *va = dma_map_page(&((struct pci_dev *)dma_map->dev)->dev, dma_map->pages[0], 0, | |
| + dma_map->page_count * PAGE_SIZE, DMA_BIDIRECTIONAL); | |
| + if (NV_DMA_MAPPING_ERROR(&((struct pci_dev *)dma_map->dev)->dev, *va)) | |
| { | |
| return NV_ERR_OPERATING_SYSTEM; | |
| } | |
| @@ -57,8 +57,8 @@ | |
| static void nv_dma_unmap_contig(nv_dma_map_t *dma_map) | |
| { | |
| - pci_unmap_page(dma_map->dev, dma_map->mapping.contig.dma_addr, | |
| - dma_map->page_count * PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); | |
| + dma_unmap_page(&((struct pci_dev *)dma_map->dev)->dev, dma_map->mapping.contig.dma_addr, | |
| + dma_map->page_count * PAGE_SIZE, DMA_BIDIRECTIONAL); | |
| } | |
| static void nv_fill_scatterlist | |
| @@ -166,10 +166,10 @@ | |
| NV_FOR_EACH_DMA_SUBMAP(dma_map, submap, i) | |
| { | |
| - submap->sg_map_count = pci_map_sg(dma_map->dev, | |
| + submap->sg_map_count = dma_map_sg(&((struct pci_dev *)dma_map->dev)->dev, | |
| NV_DMA_SUBMAP_SCATTERLIST(submap), | |
| NV_DMA_SUBMAP_SCATTERLIST_LENGTH(submap), | |
| - PCI_DMA_BIDIRECTIONAL); | |
| + DMA_BIDIRECTIONAL); | |
| if (submap->sg_map_count == 0) | |
| { | |
| status = NV_ERR_OPERATING_SYSTEM; | |
| @@ -197,9 +197,9 @@ | |
| break; | |
| } | |
| - pci_unmap_sg(dma_map->dev, NV_DMA_SUBMAP_SCATTERLIST(submap), | |
| + dma_unmap_sg(&((struct pci_dev *)dma_map->dev)->dev, NV_DMA_SUBMAP_SCATTERLIST(submap), | |
| NV_DMA_SUBMAP_SCATTERLIST_LENGTH(submap), | |
| - PCI_DMA_BIDIRECTIONAL); | |
| + DMA_BIDIRECTIONAL); | |
| } | |
| } | |
| --- a/kernel/nvidia/nvidia.Kbuild | |
| +++ b/kernel/nvidia/nvidia.Kbuild | |
| @@ -41,7 +41,7 @@ | |
| NVIDIA_BINARY_OBJECT_O := nvidia/nv-kernel.o | |
| quiet_cmd_symlink = SYMLINK $@ | |
| - cmd_symlink = ln -sf $< $@ | |
| + cmd_symlink = ln -sfr $< $@ | |
| targets += $(NVIDIA_BINARY_OBJECT_O) | |
| --- a/kernel/nvidia/nv.c | |
| +++ b/kernel/nvidia/nv.c | |
| @@ -2742,7 +2742,7 @@ | |
| if (!nvl->tce_bypass_enabled) | |
| { | |
| NvU64 new_mask = (((NvU64)1) << phys_addr_bits) - 1; | |
| - pci_set_dma_mask(nvl->dev, new_mask); | |
| + dma_set_mask(&((struct pci_dev *)nvl->dev)->dev, new_mask); | |
| } | |
| } | |
| @@ -3509,7 +3509,7 @@ | |
| nv_printf(NV_DBG_INFO, "NVRM: stopping rc timer\n"); | |
| nv->rc_timer_enabled = 0; | |
| - del_timer_sync(&nvl->rc_timer.kernel_timer); | |
| + timer_delete_sync(&nvl->rc_timer.kernel_timer); | |
| nv_printf(NV_DBG_INFO, "NVRM: rc timer stopped\n"); | |
| return 0; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment