diff --git a/kernel-open/conftest.sh b/kernel-open/conftest.sh index 7ecfa4f6f..ea3c3583d 100755 --- a/kernel-open/conftest.sh +++ b/kernel-open/conftest.sh @@ -4450,7 +4450,11 @@ compile_test() { # in v6.11. # CODE=" + #if defined(NV_DRM_CLIENTS_DRM_FBDEV_HELPER_H_PRESENT) + #include + #else #include + #endif #if defined(NV_DRM_DRM_FBDEV_GENERIC_H_PRESENT) #include #endif @@ -4470,7 +4474,11 @@ compile_test() { # 1000634477d8 ("drm/fbdev-ttm:Convert to client-setup") in v6.13. # CODE=" + #if defined(NV_DRM_CLIENTS_DRM_FBDEV_HELPER_H_PRESENT) + #include + #else #include + #endif #if defined(NV_DRM_DRM_FBDEV_TTM_H_PRESENT) #include #endif @@ -4492,7 +4500,11 @@ compile_test() { # in linux-next b86711c6d6e2. # CODE=" + #if defined(NV_DRM_CLIENTS_DRM_FBDEV_HELPER_H_PRESENT) + #include + #else #include + #endif #if defined(NV_DRM_DRM_CLIENT_SETUP_H_PRESENT) #include #elif defined(NV_DRM_CLIENTS_DRM_CLIENT_SETUP_H_PRESENT) @@ -5337,6 +5349,32 @@ compile_test() { compile_check_conftest "$CODE" "NV_MEMORY_DEVICE_COHERENT_PRESENT" "" "types" ;; + drm_plane_funcs_has_atomic_create_state) + # + # Determine if drm_plane_funcs has an atomic_create_state callback. + # + CODE=" + #include + int conftest_drm_plane_funcs_has_atomic_create_state(void) { + return offsetof(struct drm_plane_funcs, atomic_create_state); + }" + + compile_check_conftest "$CODE" "NV_DRM_PLANE_FUNCS_HAS_ATOMIC_CREATE_STATE" "" "types" + ;; + + drm_crtc_funcs_has_atomic_create_state) + # + # Determine if drm_crtc_funcs has an atomic_create_state callback. + # + CODE=" + #include + int conftest_drm_crtc_funcs_has_atomic_create_state(void) { + return offsetof(struct drm_crtc_funcs, atomic_create_state); + }" + + compile_check_conftest "$CODE" "NV_DRM_CRTC_FUNCS_HAS_ATOMIC_CREATE_STATE" "" "types" + ;; + drm_crtc_funcs_has_get_vblank_timestamp) # # Determine if the 'drm_crtc_funcs' structure has a @@ -5387,6 +5425,37 @@ compile_test() { compile_check_conftest "$CODE" "NV_DMEM_CGROUP_PRESENT" "" "types" ;; + dmem_cgroup_register_region_has_init_arg) + # + # Determine if dmem_cgroup_register_region takes an initializer + # instead of the region size as its first argument. + # + CODE=" + #include + struct dmem_cgroup_init; + typeof(dmem_cgroup_register_region) conftest_dmem_cgroup_register_region_has_init_arg; + struct dmem_cgroup_region *conftest_dmem_cgroup_register_region_has_init_arg( + const struct dmem_cgroup_init *init, const char *fmt, ...) { + return NULL; + }" + + compile_check_conftest "$CODE" "NV_DMEM_CGROUP_REGISTER_REGION_HAS_INIT_ARG" "" "types" + ;; + + vma_is_hugetlb) + # + # Determine if the renamed hugetlb VMA helper is present. + # typeof requires a declaration even when implicit function + # declaration warnings are disabled for other conftests. + # + CODE=" + #include + typeof(vma_is_hugetlb) conftest_vma_is_hugetlb; + " + + compile_check_conftest "$CODE" "NV_VMA_IS_HUGETLB_PRESENT" "" "types" + ;; + misc_cgrp_id) # # Check to see if the misc cgroup type is available diff --git a/kernel-open/header-presence-tests.mk b/kernel-open/header-presence-tests.mk index 462b0387c..1459d0f83 100644 --- a/kernel-open/header-presence-tests.mk +++ b/kernel-open/header-presence-tests.mk @@ -14,6 +14,7 @@ NV_HEADER_PRESENCE_TESTS = \ drm/drm_client_setup.h \ drm/drm_probe_helper.h \ drm/clients/drm_client_setup.h \ + drm/clients/drm_fbdev_helper.h \ dt-bindings/interconnect/tegra_icc_id.h \ generated/autoconf.h \ generated/compile.h \ diff --git a/kernel-open/nvidia-drm/nvidia-drm-crtc.c b/kernel-open/nvidia-drm/nvidia-drm-crtc.c index 67f856f11..d4a2dc228 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-crtc.c +++ b/kernel-open/nvidia-drm/nvidia-drm-crtc.c @@ -2193,6 +2193,27 @@ static inline struct nv_drm_plane_state *nv_drm_plane_state_alloc(void) return nv_plane_state; } +#if defined(NV_DRM_PLANE_FUNCS_HAS_ATOMIC_CREATE_STATE) +/** + * nv_drm_plane_atomic_create_state - plane state creation hook + * @plane: DRM plane + * + * Allocate an empty DRM plane state. + */ +static struct drm_plane_state * +nv_drm_plane_atomic_create_state(struct drm_plane *plane) +{ + struct nv_drm_plane_state *nv_plane_state = + nv_drm_plane_state_alloc(); + + if (!nv_plane_state) { + return ERR_PTR(-ENOMEM); + } + + __drm_atomic_helper_plane_state_init(&nv_plane_state->base, plane); + return &nv_plane_state->base; +} +#else /** * nv_drm_plane_atomic_reset - plane state reset hook * @plane: DRM plane @@ -2223,6 +2244,7 @@ static void nv_drm_plane_atomic_reset(struct drm_plane *plane) kfree(nv_plane_state); } } +#endif static struct drm_plane_state * @@ -2344,7 +2366,11 @@ static const struct drm_plane_funcs nv_plane_funcs = { .update_plane = drm_atomic_helper_update_plane, .disable_plane = drm_atomic_helper_disable_plane, .destroy = nv_drm_plane_destroy, +#if defined(NV_DRM_PLANE_FUNCS_HAS_ATOMIC_CREATE_STATE) + .atomic_create_state = nv_drm_plane_atomic_create_state, +#else .reset = nv_drm_plane_atomic_reset, +#endif .atomic_get_property = nv_drm_plane_atomic_get_property, .atomic_set_property = nv_drm_plane_atomic_set_property, .atomic_duplicate_state = nv_drm_plane_atomic_duplicate_state, @@ -2409,6 +2435,26 @@ static inline struct nv_drm_crtc_state *nv_drm_crtc_state_alloc(void) } +#if defined(NV_DRM_CRTC_FUNCS_HAS_ATOMIC_CREATE_STATE) +/** + * nv_drm_atomic_crtc_create_state - crtc state creation hook + * @crtc: DRM crtc + * + * Allocate an empty DRM crtc state. + */ +static struct drm_crtc_state * +nv_drm_atomic_crtc_create_state(struct drm_crtc *crtc) +{ + struct nv_drm_crtc_state *nv_state = nv_drm_crtc_state_alloc(); + + if (!nv_state) { + return ERR_PTR(-ENOMEM); + } + + __drm_atomic_helper_crtc_state_init(&nv_state->base, crtc); + return &nv_state->base; +} +#else /** * nv_drm_atomic_crtc_reset - crtc state reset hook * @crtc: DRM crtc @@ -2438,6 +2484,7 @@ static void nv_drm_atomic_crtc_reset(struct drm_crtc *crtc) kfree(nv_state); } } +#endif /** * nv_drm_atomic_crtc_duplicate_state - crtc state duplicate hook @@ -2585,7 +2632,11 @@ static bool nv_drm_crtc_get_vblank_timestamp( static struct drm_crtc_funcs nv_crtc_funcs = { .set_config = drm_atomic_helper_set_config, .page_flip = drm_atomic_helper_page_flip, +#if defined(NV_DRM_CRTC_FUNCS_HAS_ATOMIC_CREATE_STATE) + .atomic_create_state = nv_drm_atomic_crtc_create_state, +#else .reset = nv_drm_atomic_crtc_reset, +#endif .destroy = nv_drm_crtc_destroy, .atomic_get_property = nv_drm_atomic_crtc_get_property, .atomic_set_property = nv_drm_atomic_crtc_set_property, diff --git a/kernel-open/nvidia-drm/nvidia-drm-drv.c b/kernel-open/nvidia-drm/nvidia-drm-drv.c index 64df8c04e..8d25e215f 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-drv.c +++ b/kernel-open/nvidia-drm/nvidia-drm-drv.c @@ -64,8 +64,12 @@ #endif #if defined(NV_DRM_FBDEV_AVAILABLE) +#if defined(NV_DRM_CLIENTS_DRM_FBDEV_HELPER_H_PRESENT) +#include +#else #include #endif +#endif #if defined(NV_DRM_DRM_CLIENT_SETUP_H_PRESENT) #include diff --git a/kernel-open/nvidia-drm/nvidia-drm-sources.mk b/kernel-open/nvidia-drm/nvidia-drm-sources.mk index d911cd593..2c3aee13f 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-sources.mk +++ b/kernel-open/nvidia-drm/nvidia-drm-sources.mk @@ -77,6 +77,8 @@ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_prime_flag_present NV_CONFTEST_TYPE_COMPILE_TESTS += vm_fault_t NV_CONFTEST_TYPE_COMPILE_TESTS += drm_gem_object_has_resv NV_CONFTEST_TYPE_COMPILE_TESTS += drm_crtc_state_has_async_flip +NV_CONFTEST_TYPE_COMPILE_TESTS += drm_crtc_funcs_has_atomic_create_state +NV_CONFTEST_TYPE_COMPILE_TESTS += drm_plane_funcs_has_atomic_create_state NV_CONFTEST_TYPE_COMPILE_TESTS += drm_crtc_state_has_pageflip_flags NV_CONFTEST_TYPE_COMPILE_TESTS += drm_crtc_state_has_vrr_enabled NV_CONFTEST_TYPE_COMPILE_TESTS += mm_has_mmap_lock diff --git a/kernel-open/nvidia-uvm/nvidia-uvm.Kbuild b/kernel-open/nvidia-uvm/nvidia-uvm.Kbuild index 6883f7002..d7fd5379b 100644 --- a/kernel-open/nvidia-uvm/nvidia-uvm.Kbuild +++ b/kernel-open/nvidia-uvm/nvidia-uvm.Kbuild @@ -70,6 +70,7 @@ NV_CONFTEST_TYPE_COMPILE_TESTS += mmu_interval_notifier NV_CONFTEST_TYPE_COMPILE_TESTS += sg_dma_page_iter NV_CONFTEST_TYPE_COMPILE_TESTS += struct_page_has_zone_device_data NV_CONFTEST_TYPE_COMPILE_TESTS += memory_device_coherent_present +NV_CONFTEST_TYPE_COMPILE_TESTS += vma_is_hugetlb NV_CONFTEST_TYPE_COMPILE_TESTS += dma_buf_supports_dynamic_importer NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_int_active_memcg diff --git a/kernel-open/nvidia-uvm/uvm_hmm.c b/kernel-open/nvidia-uvm/uvm_hmm.c index 0efafef1d..786db83d2 100644 --- a/kernel-open/nvidia-uvm/uvm_hmm.c +++ b/kernel-open/nvidia-uvm/uvm_hmm.c @@ -4032,14 +4032,18 @@ bool uvm_hmm_must_use_sysmem(uvm_va_block_t *va_block, if (vma_has_cow_sharing(vma)) return true; - // migrate_vma_setup() can't migrate VM_SPECIAL so we have to force GPU + // migrate_vma_setup() can't migrate special mappings so we have to force GPU // remote mapping. // TODO: Bug 3660968: add support for file-backed migrations. // TODO: Bug 3368756: add support for transparent huge page migrations. return !vma_is_anonymous(vma) || - (vma->vm_flags & VM_SPECIAL) || + (vma->vm_flags & (VM_IO | VM_DONTEXPAND | VM_PFNMAP | VM_MIXEDMAP)) || vma_is_dax(vma) || +#if defined(NV_VMA_IS_HUGETLB_PRESENT) + vma_is_hugetlb(vma); +#else is_vm_hugetlb_page(vma); +#endif } #endif // UVM_IS_CONFIG_HMM() diff --git a/kernel-open/nvidia/nvidia.Kbuild b/kernel-open/nvidia/nvidia.Kbuild index 99d739a58..d604b8659 100644 --- a/kernel-open/nvidia/nvidia.Kbuild +++ b/kernel-open/nvidia/nvidia.Kbuild @@ -264,6 +264,7 @@ NV_CONFTEST_TYPE_COMPILE_TESTS += register_shrinker_has_format_arg NV_CONFTEST_TYPE_COMPILE_TESTS += nr_kernel_misc_reclaimable NV_CONFTEST_TYPE_COMPILE_TESTS += pci_resize_resource_has_exclude_bars_arg NV_CONFTEST_TYPE_COMPILE_TESTS += dmem_cgrp_id +NV_CONFTEST_TYPE_COMPILE_TESTS += dmem_cgroup_register_region_has_init_arg NV_CONFTEST_TYPE_COMPILE_TESTS += misc_cgrp_id NV_CONFTEST_TYPE_COMPILE_TESTS += is_vma_write_locked_has_mm_lock_seq_arg NV_CONFTEST_TYPE_COMPILE_TESTS += percpu_mm_counter diff --git a/kernel-open/nvidia/os-interface.c b/kernel-open/nvidia/os-interface.c index f4f92f6e7..d141f1d3c 100644 --- a/kernel-open/nvidia/os-interface.c +++ b/kernel-open/nvidia/os-interface.c @@ -3028,7 +3028,12 @@ void* NV_API_CALL os_cgroup_parent(void *cgroup) { return NULL; } #if defined(NV_DMEM_CGROUP_PRESENT) void* NV_API_CALL os_dmem_cgroup_register_region(const char *name, NvU64 size, NvU64 precharge, void **prechargePool) { +#if defined(NV_DMEM_CGROUP_REGISTER_REGION_HAS_INIT_ARG) + const struct dmem_cgroup_init init = { .size = size }; + void *region = dmem_cgroup_register_region(&init, name); +#else void *region = dmem_cgroup_register_region(size, name); +#endif if (IS_ERR(region)) { return NULL;