x11/nvidia-driver: Remove port

Desktop-focused software not aligned with server objectives
This commit is contained in:
2025-05-24 22:51:13 +02:00
parent 2cc6e3d5cc
commit 8ce3548db8
26 changed files with 1 additions and 1458 deletions
+1
View File
@@ -9246,6 +9246,7 @@ x11/mate-terminal
x11/menu-cache
x11/metalock
x11/mlterm
x11/nvidia-driver
x11/nvidia-driver-304
x11/nvidia-driver-340
x11/nvidia-driver-390
-1
View File
@@ -118,7 +118,6 @@
SUBDIR += nezd
SUBDIR += nfy
SUBDIR += numlockx
SUBDIR += nvidia-driver
SUBDIR += nvidia-xconfig
SUBDIR += nxcomp
SUBDIR += p5-Clipboard
-426
View File
@@ -1,426 +0,0 @@
# For those wondering why this port is not under `x11-drivers' category,
# have a look at https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=121930.
#
# Starting with version 1.0-7667, NVidia has dropped support for numerous
# "legacy" GPUs. Consult NVidia README (the Appendix) to find out whether
# you need to use legacy driver version and install one of corresponding
# slave ports instead (`x11/nvidia-driver-470', `x11/nvidia-driver-390',
# `x11/nvidia-driver-340', or `x11/nvidia-driver-304').
#
# To simplify testing of new feature branches and beta driver versions,
# the port aims to support building against arbitrary DISTVERSION, i.e.
# ``make DISTVERSION=xxx.yy.zz -DNO_CHECKSUM'' should typically work.
PORTNAME?= nvidia-driver
DISTVERSION?= ${NVIDIA_DISTVERSION}
# Always try to set PORTREVISION as it can be overridden by the slave ports
PORTREVISION?= 0
CATEGORIES= x11
MASTER_SITES= NVIDIA/XFree86/FreeBSD-${ARCH_SUFX}/${DISTVERSION}
DISTNAME= NVIDIA-FreeBSD-${ARCH_SUFX}-${DISTVERSION}
DISTFILES= ${DISTNAME}${EXTRACT_SUFX}
MAINTAINER?= x11@FreeBSD.org
COMMENT?= NVidia graphics card binary drivers for hardware OpenGL rendering
WWW= https://www.nvidia.com/object/unix.html
LICENSE_FILE= ${WRKSRC}/doc/license.txt
.include "${.CURDIR}/../nvidia-driver/Makefile.version"
.include "${.CURDIR}/../nvidia-driver/Makefile.common"
# the package provides lib32 versions of the libraries, which then depends
# themselves in non existing lib32 libraries, so we don't want the package
# to end up depending on non existing libraries
NO_SHLIB_REQUIRES_GLOB=*:32
# Choose proper distinfo file using PKGNAMESUFFIX for slave ports.
# Kept for switching to centralized distinfo with suffixes.
.ifdef PKGNAMESUFFIX
DISTINFO_FILE= ${.CURDIR}/distinfo
.endif
# Pull GNU sed(1) for "binary" patching of obj/libglvnd/libEGL.so.1 and
# obj/libEGL_nvidia.so.0 (see below)
.if ${NVVERSION} >= 410.057
PATCH_DEPENDS= gsed:textproc/gsed
BUILD_DEPENDS= pkg-config:devel/pkgconf
LIB_DEPENDS= libOpenGL.so:graphics/libglvnd
.endif
.if ${NVVERSION} >= 415.013
LIB_DEPENDS+= libnvidia-egl-wayland.so:graphics/egl-wayland
.endif
USES= kmod uidfix xorg
.if ${NVVERSION} >= 470.04201
USES+= tar:xz
.endif
USE_XORG= x11 xorg-server xext
USE_LDCONFIG= yes
PIE_UNSAFE= yes
EGL_JSON_PATH= ${PREFIX}/share/egl/egl_external_platform.d
GLVND_JSON_PATH= ${PREFIX}/share/glvnd/egl_vendor.d
VKICD_PATH= ${PREFIX}/share/vulkan/icd.d
VKLAYERS_PATH= ${PREFIX}/share/vulkan/implicit_layer.d
MAKE_ENV= DEBUG_FLAGS=${DEBUG_FLAGS} \
EGL_GLVND_JSON_PATH=${STAGEDIR}${GLVND_JSON_PATH} \
VKICD_PATH=${STAGEDIR}${VKICD_PATH} \
VKLAYERS_PATH=${STAGEDIR}${VKLAYERS_PATH}
.if ${NVVERSION} < 495.02905
MAKE_ENV+= EGL_WAYLAND_JSON_PATH=${STAGEDIR}${EGL_JSON_PATH}
.else
MAKE_ENV+= EGL_EXTERNAL_PLATFORM_JSON_PATH=${STAGEDIR}${EGL_JSON_PATH}
.endif
SUB_FILES= pkg-message
.if !defined(LIBGLDIR)
SUB_FILES+= nvidia.conf
.endif
SUB_PATCHES= extra-patch-src-Makefile \
extra-patch-src-nv-freebsd.h
.if ${NVVERSION} < 510.03901
SUB_PATCHES+= extra-patch-src-nvidia_dev.c \
extra-patch-src-nvidia_pci.c
.endif
.if ${NVVERSION} < 470.25602 || ${NVVERSION} >= 480.00000 && ${NVVERSION} < 530.03002
SUB_PATCHES+= extra-patch-src-nvidia_subr.c
.endif
# Temporarily disable GSP firmware as it is known to cause
# issues with suspend/resume
.if ${NVVERSION} >= 565.00000
SUB_PATCHES+= extra-gsp-patch-src-common-inc-nv_firmware_registry.h
.endif
DOCSDIR= ${PREFIX}/share/doc/NVIDIA_GLX-1.0
MODULESDIR= lib/xorg/modules
EXTENSIONSDIR= ${MODULESDIR}/extensions/.nvidia
PORTDOCS= *
.if ${NVVERSION} >= 331.013
SUB_LIST+= NVGL=""
.else
SUB_LIST+= NVGL="\# "
.endif
.if ${NVVERSION} < 355.006
NVSRC= .
.else
NVSRC= nvidia
.endif
.if ${NVVERSION} < 358.009
SUB_LIST+= KLDNAME=nvidia
.else
SUB_LIST+= KLDNAME=nvidia-modeset
.endif
.if ${NVVERSION} >= 530.03002 && ${NVVERSION} < 545.00
SUB_PATCHES += extra-patch-src_nvidia-modeset_nvidia-modeset-freebsd.c
.endif
.if ${NVVERSION} < 460.039
. if ${NVVERSION} >= 358.009
EXTRA_PATCHES+= ${FILESDIR}/extra-patch-src_nvidia-modeset_nvidia-modeset-freebsd.c
. endif
SUB_PATCHES+= extra-patch-src-nvidia_ctl.c \
extra-patch-src-nvidia_linux.c
.elif ${NVVERSION} < 510.03901
EXTRA_PATCHES+= ${FILESDIR}/460-patch-src-nvidia-nvidia_ctl.c \
${FILESDIR}/460-patch-src-nvidia-nvidia_linux.c \
${FILESDIR}/460-patch-src_nvidia-modeset_nvidia-modeset-freebsd.c
.endif
.if ${NVVERSION} < 470.04201
SUB_PATCHES+= extra-patch-src-nv-misc.h
.endif
OPTIONS_DEFINE= ACPI_PM LINUX WBINVD DOCS
OPTIONS_DEFINE_i386= PAE
OPTIONS_DEFAULT= ACPI_PM LINUX
ACPI_PM_DESC= ACPI Power Management support
LINUX_DESC= Linux compatibility support
PAE_DESC= Physical Address Extensions support
WBINVD_DESC= Flush CPU caches directly with WBINVD
.if ${NVVERSION} < 310.014
OPTIONS_DEFINE+= FREEBSD_AGP
FREEBSD_AGP_DESC= Use FreeBSD AGP GART driver
.endif
PLIST_SUB+= MODULESDIR=${MODULESDIR}
.if ${NVVERSION} < 410.057
PLIST_SUB+= EXTENSIONSDIR=${EXTENSIONSDIR}
.else
PLIST_SUB+= EXTENSIONSDIR="@comment "
.endif
# Not part of the pkg-plist because DISTVERSION is not on PLIST_SUB
.if ${NVVERSION} >= 515.04304
PLIST_FILES+= lib/libnvidia-wayland-client.so.${DISTVERSION}
.endif
CONFLICTS_INSTALL+= nvidia-driver nvidia-driver-*
.if ${PORTNAME} != nvidia-secondary-driver
CONFLICTS_INSTALL+= nvidia-secondary-driver
.endif
.include <bsd.port.pre.mk>
pre-patch:
.for p in ${SUB_PATCHES}
@${SED} 's/%%NVSRC%%/${NVSRC}/g' ${PATCHDIR}/${p}.in > ${WRKDIR}/${p}
.endfor
.for p in ${SUB_PATCHES}
EXTRA_PATCHES+= ${WRKDIR}/${p}
.endfor
post-patch: .SILENT
.if ${NVVERSION} >= 390
${REINPLACE_CMD} -e 's|/man/man1|/share/man/man1|' ${WRKSRC}/nvml/man/Makefile
.endif
# We should support -CURRENT: kill the check (first #if __FreeBSD_version)
linenum=$$(${SED} -ne '/^#if __FreeBSD_version/ { = ; q ; }' \
${WRKSRC}/src/${NVSRC}/nv-freebsd.h) ; ${REINPLACE_CMD} \
-e "$$linenum,+2d" ${WRKSRC}/src/${NVSRC}/nv-freebsd.h
# Adjust Linux headers #include's after FreeBSD src r246085
${REINPLACE_CMD} -E '/#include "machine\/\.\.\/linux(32)?\/linux.h"/ \
{ x ; s/.*/#include "machine\/..\/..\/compat\/linux\/linux_ioctl.h"/ ; H ; x ; }' \
${WRKSRC}/src/${NVSRC}/nvidia_linux.c
# Fix bogus memset() call
${REINPLACE_CMD} -e '/memset/s/sizeof(ci/sizeof(*ci/' \
${WRKSRC}/src/${NVSRC}/nvidia_subr.c
# Chase `sys/capability.h' rename to `sys/capsicum.h' in FreeBSD src r263232
${REINPLACE_CMD} -e 's:sys/capability\.h:sys/capsicum.h:' \
${WRKSRC}/src/${NVSRC}/nv-freebsd.h
.if ${NVVERSION} >= 358.009
${REINPLACE_CMD} -e 's:sys/capability\.h:sys/capsicum.h:' \
${WRKSRC}/src/nvidia-modeset/nvidia-modeset-freebsd.c
.endif
# KPI of kmem_alloc_contig(),kmem_free() changed in FreeBSD src r338143,r338318
.if ${NVVERSION} < 530.03002
${REINPLACE_CMD} \
-e 's/kmem_alloc_contig(kmem_arena, /kmem_alloc_contig(/' \
-e 's/kmem_free(kmem_arena, /kmem_free(/' \
${WRKSRC}/src/${NVSRC}/nvidia_subr.c
.endif
# Pull the right header after FreeBSD src r347984
.if ${NVVERSION} >= 358.009
${REINPLACE_CMD} -e '/^#include/s:lock\.h:mutex.h:' \
${WRKSRC}/src/nvidia-modeset/nvidia-modeset-freebsd.c
.endif
# After src df38ada2931f, `sys/module.h' must be included after `sys/param.h'
.if ${NVVERSION} >= 358.009
@${REINPLACE_CMD} -e '/^#include <sys\/param\.h>/d; \
/^#include <sys\/module\.h>/ { x; \
s:^:#include <sys/param.h>:; G; }' \
${WRKSRC}/src/nvidia-modeset/nvidia-modeset-freebsd.c
.endif
# Disable installation of Linux libraries (provided by the corresponding
# `x11/linux-nvidia-libs' port or its slaves)
${REINPLACE_CMD} -e 's/exists(\/.*/& \&\& 0/' \
${WRKSRC}/lib/Makefile
# Do not install VDPAU libraries which are provided by `multimedia/libvdpau'
# port for a while now
${REINPLACE_CMD} -e '/libvdpau[[:blank:]_][^n]/d ; \
s/name libvdpau/&_nvidia/' ${WRKSRC}/lib/Makefile
# Do not build any binaries (native nvidia-settings and nvidia-xconfig are
# provided by their corresponding ports) and manual pages
${REINPLACE_CMD} -E 's/(extension).*/\1/' ${WRKSRC}/x11/Makefile
${REINPLACE_CMD} -e '/bin/d ; /man/d' ${WRKSRC}/x11/Makefile
# Also do not install libnvidia-gtk* libraries which are for nvidia-settings
.if ${NVVERSION} >= 346.016
${REINPLACE_CMD} -e '/libnvidia-gtk/d' ${WRKSRC}/lib/Makefile
.endif
# Adjust installation path of a conflicting file (shared between
# nvidia-driver and xorg-server) to ease package manager work
.if ${NVVERSION} < 410.057
${REINPLACE_CMD} -e '/LIBDIR/s:xorg/modules/extensions:&/.nvidia:' \
${WRKSRC}/x11/extension/Makefile
.endif
# Do not execute afterinstall target (prevent automatic module registration
# and "smart" installation of conflicting files heuristics)
${REINPLACE_CMD} -e 's/afterinstall/&_dontexecute/' ${WRKSRC}/Makefile
${REINPLACE_CMD} -e 's/beforeinstall/&_dontexecute/' \
${WRKSRC}/lib/Makefile ${WRKSRC}/src/${NVSRC}/Makefile
# /usr/share/nvidia path is hardcoded in libGL and nvidia-settings, but we
# won't adhere to this stupidity and install nvidia-application-profiles-*
# files as part of documentation
.if ${NVVERSION} >= 410.057
${REINPLACE_CMD} -e 's,/usr/share/nvidia,$${DESTDIR}${DOCSDIR},' \
${WRKSRC}/lib/libGLX_nvidia/Makefile ${WRKSRC}/doc/Makefile
${REINPLACE_CMD} -e '/AUXLINK_LINK/s,\$${DESTDIR},,' \
${WRKSRC}/lib/libGLX_nvidia/Makefile
prefix="${PREFIX}" ; padding=$$(($${#prefix}+3)) ; \
gsed ${REINPLACE_ARGS} -E "s,/etc/glvnd/egl_vendor\.d.{$$padding},${GLVND_JSON_PATH}\x00," \
${WRKSRC}/obj/libglvnd/libEGL.so.1
.elif ${NVVERSION} >= 334.016
${REINPLACE_CMD} -e 's,/usr/share/nvidia,$${DESTDIR}${DOCSDIR},' \
${WRKSRC}/lib/libGL/Makefile ${WRKSRC}/doc/Makefile
.endif
.if ${NVVERSION} >= 415.013
prefix="${PREFIX}" ; padding=$$(($${#prefix}+3)) ; \
gsed ${REINPLACE_ARGS} -E "s,/etc/egl/egl_external_platform\.d.{$$padding},${EGL_JSON_PATH}\x00," \
${WRKSRC}/obj/libEGL_nvidia.so.0
.endif
# Unbreak the build against -Werror,-Wunused-but-set-variable CFLAGS
.if ${NVVERSION} < 450.51
${REINPLACE_CMD} -e '/void nvidia_dev_dtor/,+8s,.*status.*,,' \
${WRKSRC}/src/${NVSRC}/nvidia_dev.c
.endif
# Move symlinks under PREFIX
.if ${NVVERSION} >= 525.08902
${REINPLACE_CMD} -e '/ln/s/$${LOCALBASE}\/lib/../' \
-e '/LIBDIR/!s/$${LOCALBASE}/$${DESTDIR}$${PREFIX}/' \
${WRKSRC}/lib/libnvidia-allocator/Makefile
.endif
# After src 2a99dd30dfaa, DRIVER_MODULE should not include nvidia_devclass
.if ${OSVERSION} >= 1400058
${REINPLACE_CMD} -e '/^DRIVER_MODULE/s/, nvidia_devclass//' \
${WRKSRC}/src/${NVSRC}/nvidia_pci.c
.endif
# Catch up with pmap_unmapdev() and kmem_*() changes in 14-CURRENT
.if ${OSVERSION} >= 1400070 && (${NVVERSION} < 470.25602 || ${NVVERSION} >= 480.00000 && ${NVVERSION} < 530.03002)
${REINPLACE_CMD} -e '/pmap_unmapdev/s,(vm_offset_t),,' \
${WRKSRC}/src/${NVSRC}/nvidia_os.c
${REINPLACE_CMD} -e '/vm_offset_t virtual_address/s,vm_offset_t ,char *,' \
${WRKSRC}/src/${NVSRC}/nv-freebsd.h
${REINPLACE_CMD} -e '/vm_offset_t address;/s,vm_offset_t ,void *,' \
${WRKSRC}/src/${NVSRC}/nvidia_subr.c
.endif
# Fix a K&R prototype
.if ${NVVERSION:R} >= 390
${REINPLACE_CMD} -e '/nvlink_allocLock/s,(),(void),' \
${WRKSRC}/src/${NVSRC}/nvlink_freebsd.c
.endif
# Finally, process OPTIONS
.if ${PORT_OPTIONS:MFREEBSD_AGP}
${REINPLACE_CMD} -E 's/undef (NV_SUPPORT_OS_AGP)/define \1/' \
${WRKSRC}/src/${NVSRC}/nv-freebsd.h
.endif
.if ${PORT_OPTIONS:MACPI_PM}
${REINPLACE_CMD} -E 's/undef (NV_SUPPORT_ACPI_PM)/define \1/' \
${WRKSRC}/src/${NVSRC}/nv-freebsd.h
.endif
.if ! ${PORT_OPTIONS:MLINUX}
${REINPLACE_CMD} -E 's/define (NV_SUPPORT_LINUX_COMPAT)/undef \1/' \
${WRKSRC}/src/${NVSRC}/nv-freebsd.h
. if ${NVVERSION} >= 358.009
${REINPLACE_CMD} -E 's/define (NVKMS_SUPPORT_LINUX_COMPAT)/undef \1/' \
${WRKSRC}/src/nvidia-modeset/nvidia-modeset-freebsd.c
. endif
.endif
.if ${PORT_OPTIONS:MPAE}
${REINPLACE_CMD} -E 's/undef (NV_SUPPORT_PAE)/define \1/' \
${WRKSRC}/src/${NVSRC}/nv-freebsd.h
.endif
.if ${PORT_OPTIONS:MWBINVD}
${REINPLACE_CMD} -E 's/undef (NV_USE_WBINVD)/define \1/' \
${WRKSRC}/src/${NVSRC}/nv-freebsd.h
.endif
# Conditionally install documentation (but you generally want it)
.if ! ${PORT_OPTIONS:MDOCS}
${REINPLACE_CMD} -E 's/(x11).*/\1/ ; /doc/d' ${WRKSRC}/Makefile
.endif
pre-install:
@${MKDIR} ${STAGEDIR}${PREFIX}/${MODULESDIR}/drivers \
${STAGEDIR}${PREFIX}/${MODULESDIR}/extensions
post-install: .SILENT
${INSTALL_SCRIPT} ${WRKSRC}/obj/nvidia-bug-report.sh \
${STAGEDIR}${PREFIX}/bin
# pkg-plist is already overbloated, so use these hacks instead of PLIST_SUB's
.if ${NVVERSION:R} < 460
${REINPLACE_CMD} -e '/libnvidia-glvkspirv\.so/d ; \
/nvidia_icd\.json/d ; /nvidia_layers\.json/d' ${TMPPLIST}
.endif
.if ${NVVERSION} >= 304.128 && ${NVVERSION} < 310.019 || ${NVVERSION} >= 361.016
${REINPLACE_CMD} -E '/libvdpau(_trace)?\.so/d' ${TMPPLIST}
.endif
.if ${NVVERSION} >= 310.019
${REINPLACE_CMD} -e '/libXvMCNVIDIA/d' ${TMPPLIST}
.else # some applications need this symlink (see PR ports/72877)
${LN} -sf libXvMCNVIDIA.so.1 \
${STAGEDIR}${PREFIX}/lib/libXvMCNVIDIA_dynamic.so.1
.endif
.if ${NVVERSION} < 331.013 || ${ARCH} == amd64 && ${NVVERSION} < 334.016
${REINPLACE_CMD} -E '/lib(nvidia-)?(EGL|eglcore|GLESv|glsi)/d' \
${TMPPLIST}
.endif
.if ${NVVERSION} < 352.009
${REINPLACE_CMD} -E '/(lib)?nvidia-(debugdump|smi|ml)/d' ${TMPPLIST}
.endif
.if ${NVVERSION} < 358.009
${REINPLACE_CMD} -e '/nvidia-modeset\.ko/d' ${TMPPLIST}
.endif
.if ${NVVERSION} < 410.057
${REINPLACE_CMD} -E '/lib(EGL|GLESv[12].*)_nvidia/d ; \
/lib(GLX|GLdispatch|OpenGL)/d ; \
/extensions\/libglxserver_nvidia\.so/d ; \
/10_nvidia\.json/d' ${TMPPLIST}
.else
${REINPLACE_CMD} -e '/extensions\/\.nvidia\/libglx/d' ${TMPPLIST}
.endif
.if ${NVVERSION} < 415.013
${REINPLACE_CMD} -e '/libnvidia-egl-wayland\.so/d ; \
/10_nvidia_wayland\.json/d' ${TMPPLIST}
.endif
.if ${NVVERSION} < 440.036
${REINPLACE_CMD} -e '/lib32\//d' ${TMPPLIST}
.elif ${NVVERSION} < 465.01901
${REINPLACE_CMD} -e '/lib32\/libnvidia-glvkspirv\.so/d' ${TMPPLIST}
.endif
.if ${NVVERSION} < 470.074 || ${NVVERSION} >= 545.000
${REINPLACE_CMD} -e '/libnvidia-vulkan-producer\.so/d' ${TMPPLIST}
.endif
.if ${NVVERSION} < 495.02905
${REINPLACE_CMD} -e '/libnvidia-egl-gbm\.so/d ; \
/15_nvidia_gbm\.json/d' ${TMPPLIST}
.endif
.if ${NVVERSION} < 525.08902
${REINPLACE_CMD} -e '/libnvidia-allocator\.so/d ; \
/nvidia-drm_gbm\.so/d' ${TMPPLIST}
.endif
.if ${NVVERSION} < 545.000
${REINPLACE_CMD} -e '/libnvidia-gpucomp\.so/d' ${TMPPLIST}
.endif
.if ${NVVERSION} < 560.02803
${REINPLACE_CMD} -e '/nvidia_gsp_ga10x_fw\.ko/d' ${TMPPLIST}
${REINPLACE_CMD} -e '/nvidia_gsp_tu10x_fw\.ko/d' ${TMPPLIST}
.endif
.if ${NVVERSION} < 410.057
# Rename some libraries and install a libmap file to resolve conflict with
# Mesa libraries.
${LN} -sf libGL-NVIDIA.so.1 \
${STAGEDIR}${PREFIX}/lib/libGL-NVIDIA.so
${MV} -f ${STAGEDIR}${PREFIX}/lib/libGL.so.1 \
${STAGEDIR}${PREFIX}/lib/libGL-NVIDIA.so.1
${RM} ${STAGEDIR}${PREFIX}/lib/libGL.so
. if ${NVVERSION} >= 331.013
${LN} -sf libEGL-NVIDIA.so.1 \
${STAGEDIR}${PREFIX}/lib/libEGL-NVIDIA.so
${MV} -f ${STAGEDIR}${PREFIX}/lib/libEGL.so.1 \
${STAGEDIR}${PREFIX}/lib/libEGL-NVIDIA.so.1
${RM} ${STAGEDIR}${PREFIX}/lib/libEGL.so
${RM} ${STAGEDIR}${PREFIX}/lib/libGLESv1_CM.so
${RM} ${STAGEDIR}${PREFIX}/lib/libGLESv1_CM.so.1
${LN} -sf libGLESv2-NVIDIA.so.2 \
${STAGEDIR}${PREFIX}/lib/libGLESv2-NVIDIA.so
${MV} -f ${STAGEDIR}${PREFIX}/lib/libGLESv2.so.2 \
${STAGEDIR}${PREFIX}/lib/libGLESv2-NVIDIA.so.2
${RM} ${STAGEDIR}${PREFIX}/lib/libGLESv2.so
. endif
@${MKDIR} ${STAGEDIR}${PREFIX}/etc/libmap.d/
${INSTALL_DATA} ${WRKDIR}/nvidia.conf \
${STAGEDIR}${PREFIX}/etc/libmap.d/
.else
${REINPLACE_CMD} -E '/-NVIDIA/d ; \
/lib(Open)?E?GLX?(ESv[12](_CM)?|dispatch)?\.so/d' \
${TMPPLIST}
# Override mesa.conf if GLX_EXT_libglvnd is missing
@${ECHO_CMD} "libGLX_indirect.so.0 libGLX_nvidia.so.0" \
>${STAGEDIR}${PREFIX}/etc/libmap.d/nvidia.conf
.endif
.include <bsd.port.post.mk>
-28
View File
@@ -1,28 +0,0 @@
# LICENSE_FILE is set in the consumer ports because its location varies
LICENSE= NVIDIA
LICENSE_NAME= License For Customer Use of NVIDIA Software
LICENSE_PERMS= dist-mirror no-dist-sell pkg-mirror no-pkg-sell auto-accept
.if ${DISTVERSION:R} > 390
ONLY_FOR_ARCHS= amd64
.else
ONLY_FOR_ARCHS= i386 amd64
.endif
ARCH_SUFX= x86${ARCH:S/i386//:S/amd/_/}
# NVVERSION is float since r372065 (integer values become less readable
# after minor version could occupy three digits)
.if ${DISTVERSION:C/[0-9]+//g} == ".." # major.minor.update
. if ${DISTVERSION:C/[0-9]+\.([0-9]+)\.[0-9]+/\1/} < 100
NVVERSION= ${DISTVERSION:S/./.0/:R}${DISTVERSION:E} # allow minor > 99
. else
NVVERSION= ${DISTVERSION:R}${DISTVERSION:E}
. endif
.else # major.minor
. if ${DISTVERSION:E} < 100
NVVERSION= ${DISTVERSION:S/./.0/} # allow minor > 99
. else
NVVERSION= ${DISTVERSION}
. endif
.endif
-4
View File
@@ -1,4 +0,0 @@
# NVIDIA Distversion
#
# This will be included from x11/nvidia-driver and the nvidia-drm port
NVIDIA_DISTVERSION?= 570.144
-3
View File
@@ -1,3 +0,0 @@
TIMESTAMP = 1745330770
SHA256 (NVIDIA-FreeBSD-x86_64-570.144.tar.xz) = 7912c9f101b29fec10c434b1389b1403489fa3008fae67d1b76ef3d9f4b5388f
SIZE (NVIDIA-FreeBSD-x86_64-570.144.tar.xz) = 260506500
@@ -1,72 +0,0 @@
--- src/nvidia/nvidia_ctl.c.orig 2021-01-21 21:50:34 UTC
+++ src/nvidia/nvidia_ctl.c
@@ -13,6 +13,12 @@
#include "nv.h"
#include "nv-freebsd.h"
+#ifdef NV_SUPPORT_LINUX_COMPAT /* (COMPAT_LINUX || COMPAT_LINUX32) */
+#include <compat/linux/linux_util.h>
+
+const char nvidia_driver_name[] = "nvidia";
+#endif
+
static d_open_t nvidia_ctl_open;
static void nvidia_ctl_dtor(void *arg);
static d_ioctl_t nvidia_ctl_ioctl;
@@ -138,6 +144,18 @@ static int nvidia_ctl_poll(
int nvidia_ctl_attach(void)
{
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ struct linux_device_handler nvidia_ctl_linux_handler = {
+ .bsd_driver_name = __DECONST(char *, nvidia_driver_name),
+ .linux_driver_name = __DECONST(char *, nvidia_driver_name),
+ .bsd_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name),
+ .linux_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name),
+ .linux_major = NV_MAJOR_DEVICE_NUMBER,
+ .linux_minor = 255,
+ .linux_char_device = 1
+ };
+#endif
+
if (nvidia_count == 0) {
nvidia_ctl_cdev = make_dev(&nvidia_ctl_cdevsw,
CDEV_CTL_MINOR,
@@ -145,6 +163,10 @@ int nvidia_ctl_attach(void)
"%s", nvidia_ctl_cdevsw.d_name);
if (nvidia_ctl_cdev == NULL)
return ENOMEM;
+
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ (void)linux_device_register_handler(&nvidia_ctl_linux_handler);
+#endif
}
nvidia_count++;
@@ -153,10 +175,25 @@ int nvidia_ctl_attach(void)
int nvidia_ctl_detach(void)
{
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ struct linux_device_handler nvidia_ctl_linux_handler = {
+ .bsd_driver_name = __DECONST(char *, nvidia_driver_name),
+ .linux_driver_name = __DECONST(char *, nvidia_driver_name),
+ .bsd_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name),
+ .linux_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name),
+ .linux_major = NV_MAJOR_DEVICE_NUMBER,
+ .linux_minor = 255,
+ .linux_char_device = 1
+ };
+#endif
nvidia_count--;
- if (nvidia_count == 0)
+ if (nvidia_count == 0) {
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ (void)linux_device_unregister_handler(&nvidia_ctl_linux_handler);
+#endif
destroy_dev(nvidia_ctl_cdev);
+ }
return 0;
}
@@ -1,33 +0,0 @@
--- src/nvidia/nvidia_linux.c.orig 2021-01-21 21:50:34 UTC
+++ src/nvidia/nvidia_linux.c
@@ -35,21 +35,16 @@ int linux_ioctl_nvidia(
struct linux_ioctl_args *args
)
{
- struct file *fp;
- int error;
- cap_rights_t rights;
- u_long cmd;
+ static const uint32_t dir[4] = { IOC_VOID, IOC_IN, IOC_OUT, IOC_INOUT };
- error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), &fp);
- if (error != 0)
- return error;
-
- cmd = args->cmd;
-
- error = fo_ioctl(fp, cmd, (caddr_t)args->arg, td->td_ucred, td);
- fdrop(fp, td);
-
- return error;
+ if ((args->cmd & (1<<29)) != 0) {
+ /* FreeBSD has only 13 bits to encode the size. */
+ printf("nvidia: pid %d (%s): ioctl cmd=0x%x size too large\n",
+ (int)td->td_proc->p_pid, td->td_proc->p_comm, args->cmd);
+ return (EINVAL);
+ }
+ args->cmd = (args->cmd & ~IOC_DIRMASK) | dir[args->cmd >> 30];
+ return (sys_ioctl(td, (struct ioctl_args *)args));
}
struct linux_ioctl_handler nvidia_handler = {
@@ -1,189 +0,0 @@
--- src/nvidia-modeset/nvidia-modeset-freebsd.c.orig 2024-03-11 15:49:45 UTC
+++ src/nvidia-modeset/nvidia-modeset-freebsd.c
@@ -27,6 +27,7 @@
#include <sys/file.h>
#include <sys/proc.h>
#include <sys/stack.h>
+#include <sys/sysproto.h>
#include "nvkms-ioctl.h"
#include "nvidia-modeset-os-interface.h"
@@ -52,6 +53,7 @@
#include "machine/../linux32/linux32_proto.h"
#endif
#include <compat/linux/linux_ioctl.h>
+ #include <compat/linux/linux_util.h>
#endif
@@ -280,7 +282,12 @@ struct nvkms_ref_ptr* nvkms_alloc_ref_ptr(void *ptr)
struct nvkms_ref_ptr* nvkms_alloc_ref_ptr(void *ptr)
{
- struct nvkms_ref_ptr *ref_ptr = nvkms_alloc(sizeof(*ref_ptr), NV_FALSE);
+ /*
+ * Initialize memory to avoid spurious "lock re-initialization" errors.
+ * A little more detail can be found in the PR 201340 starting around
+ * comment #50.
+ */
+ struct nvkms_ref_ptr *ref_ptr = nvkms_alloc(sizeof(*ref_ptr), NV_TRUE);
if (ref_ptr) {
mtx_init(&ref_ptr->lock, "nvkms-ref-ptr-lock", NULL, MTX_SPIN);
// The ref_ptr owner counts as a reference on the ref_ptr itself.
@@ -371,7 +378,7 @@ static struct {
* Global list with pending timers, any change requires acquiring lock
*/
static struct {
- struct sx lock;
+ struct mtx lock;
LIST_HEAD(nvkms_timers_head, nvkms_timer_t) list;
} nvkms_timers;
@@ -384,9 +391,9 @@ static void nvkms_taskqueue_callback(void *arg, int pe
* We can delete this timer from pending timers list - it's being
* processed now.
*/
- sx_xlock(&nvkms_timers.lock);
+ mtx_lock_spin(&nvkms_timers.lock);
LIST_REMOVE(timer, timers_list);
- sx_xunlock(&nvkms_timers.lock);
+ mtx_unlock_spin(&nvkms_timers.lock);
/*
* After taskqueue_callback we want to be sure that callout_callback
@@ -454,7 +461,7 @@ nvkms_init_timer(struct nvkms_timer_t *timer, nvkms_ti
* run in parallel with this, it could race against nvkms_init_timer()
* and free the timer before its initialization is complete.
*/
- sx_xlock(&nvkms_timers.lock);
+ mtx_lock_spin(&nvkms_timers.lock);
LIST_INSERT_HEAD(&nvkms_timers.list, timer, timers_list);
if (usec == 0) {
@@ -468,7 +475,7 @@ nvkms_init_timer(struct nvkms_timer_t *timer, nvkms_ti
NVKMS_USECS_TO_TICKS(usec),
nvkms_callout_callback, (void *) timer);
}
- sx_xunlock(&nvkms_timers.lock);
+ mtx_unlock_spin(&nvkms_timers.lock);
}
nvkms_timer_handle_t*
@@ -916,29 +923,31 @@ static int nvkms_poll(
*************************************************************************/
#if defined(NVKMS_SUPPORT_LINUX_COMPAT)
+static struct linux_device_handler nvkms_linux_device_handler = {
+ .bsd_driver_name = "nvidia-modeset",
+ .linux_driver_name = "nvidia-modeset",
+ .bsd_device_name = "nvidia-modeset",
+ .linux_device_name = "nvidia-modeset",
+ .linux_major = 195,
+ .linux_minor = 254,
+ .linux_char_device = 1
+};
static int nvkms_linux_ioctl_function(
struct thread *td,
struct linux_ioctl_args *args
)
{
- struct file *fp;
- int status;
- u_long cmd;
+ static const uint32_t dir[4] = { IOC_VOID, IOC_IN, IOC_OUT, IOC_INOUT };
- cap_rights_t rights;
- status = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), &fp);
-
- if (status != 0) {
- return status;
+ if ((args->cmd & (1<<29)) != 0) {
+ /* FreeBSD has only 13 bits to encode the size. */
+ printf("nvidia: pid %d (%s): ioctl cmd=0x%x size too large\n",
+ (int)td->td_proc->p_pid, td->td_proc->p_comm, args->cmd);
+ return (EINVAL);
}
-
- cmd = args->cmd;
-
- status = fo_ioctl(fp, cmd, (caddr_t)args->arg, td->td_ucred, td);
- fdrop(fp, td);
-
- return status;
+ args->cmd = (args->cmd & ~IOC_DIRMASK) | dir[args->cmd >> 30];
+ return (sys_ioctl(td, (struct ioctl_args *)args));
}
#define NVKMS_LINUX_IOCTL_MIN _IOC(0, NVKMS_IOCTL_MAGIC, NVKMS_IOCTL_CMD, 0)
@@ -954,6 +963,7 @@ static void nvkms_linux_compat_load(void)
static void nvkms_linux_compat_load(void)
{
#if defined(NVKMS_SUPPORT_LINUX_COMPAT)
+ linux_device_register_handler(&nvkms_linux_device_handler);
linux_ioctl_register_handler(&nvkms_linux_ioctl_handler);
#endif
}
@@ -962,6 +972,7 @@ static void nvkms_linux_compat_unload(void)
{
#if defined(NVKMS_SUPPORT_LINUX_COMPAT)
linux_ioctl_unregister_handler(&nvkms_linux_ioctl_handler);
+ linux_device_unregister_handler(&nvkms_linux_device_handler);
#endif
}
@@ -1011,7 +1022,7 @@ nvidia_modeset_loader(struct module *m, int what, void
nvkms_module.is_unloading = NV_FALSE;
LIST_INIT(&nvkms_timers.list);
- sx_init(&nvkms_timers.lock, "nvidia-modeset timer lock");
+ mtx_init(&nvkms_timers.lock, "nvidia-modeset timer lock", NULL, MTX_SPIN);
nvkms_dev = make_dev(&nvkms_cdevsw,
NVKMS_CDEV_MINOR,
@@ -1020,7 +1031,7 @@ nvidia_modeset_loader(struct module *m, int what, void
if (nvkms_dev == NULL) {
sx_destroy(&nvkms_module.lock);
- sx_destroy(&nvkms_timers.lock);
+ mtx_destroy(&nvkms_timers.lock);
sx_destroy(&nvkms_lock);
nvkms_free_rm();
@@ -1089,7 +1100,7 @@ nvidia_modeset_loader(struct module *m, int what, void
* nvkms_taskqueue_callback() doesn't get called after the
* module is unloaded.
*/
- sx_xlock(&nvkms_timers.lock);
+ mtx_lock_spin(&nvkms_timers.lock);
LIST_FOREACH_SAFE(timer, &nvkms_timers.list, timers_list, tmp) {
if (timer->callout_created) {
@@ -1111,7 +1122,7 @@ nvidia_modeset_loader(struct module *m, int what, void
}
}
- sx_xunlock(&nvkms_timers.lock);
+ mtx_unlock_spin(&nvkms_timers.lock);
taskqueue_run(taskqueue_nvkms);
@@ -1119,7 +1130,7 @@ nvidia_modeset_loader(struct module *m, int what, void
nvkms_dev = NULL;
sx_destroy(&nvkms_module.lock);
- sx_destroy(&nvkms_timers.lock);
+ mtx_destroy(&nvkms_timers.lock);
sx_destroy(&nvkms_lock);
nvkms_free_rm();
@@ -1151,4 +1162,9 @@ MODULE_DEPEND(nvidia_modeset, /* module
MODULE_DEPEND(nvidia_modeset, /* module name */
linux, /* prerequisite module */
1, 1, 1); /* vmin, vpref, vmax */
+#if defined(NVCPU_X86_64)
+MODULE_DEPEND(nvidia_modeset, /* module name */
+ linux_common, /* prerequisite module */
+ 1, 1, 1); /* vmin, vpref, vmax */
+#endif
#endif
@@ -1,11 +0,0 @@
--- src/common/inc/nv-firmware-registry.h.orig
+++ src/common/inc/nv-firmware-registry.h
@@ -62,7 +62,7 @@
#define NV_REG_ENABLE_GPU_FIRMWARE_POLICY_MASK 0x000000F0
#define NV_REG_ENABLE_GPU_FIRMWARE_POLICY_ALLOW_FALLBACK 0x00000010
-#define NV_REG_ENABLE_GPU_FIRMWARE_DEFAULT_VALUE 0x00000012
+#define NV_REG_ENABLE_GPU_FIRMWARE_DEFAULT_VALUE 0x00000000
//
// Registry key that when enabled, will send GPU firmware logs
@@ -1,18 +0,0 @@
--- src/%%NVSRC%%/Makefile.orig 2017-09-14 20:46:30 UTC
+++ src/%%NVSRC%%/Makefile
@@ -30,6 +30,15 @@ NOOBJ= true
stdarg.h:
@ln -s machine/stdarg.h stdarg.h
+SRCS+= opt_global.h
+.if ${MACHINE_ARCH} == "i386" && !defined(KERNBUILDDIR)
+PAE!= sed -n '/define NV_SUPPORT_PAE/p' nv-freebsd.h
+.if !empty(PAE)
+opt_global.h:
+ echo "#define PAE 1" > ${.TARGET}
+.endif
+.endif
+
*.c: stdarg.h
beforeinstall: ${KMOD}.ko
@@ -1,14 +0,0 @@
--- src/%%NVSRC%%/nv-freebsd.h.orig 2017-09-14 20:46:30 UTC
+++ src/%%NVSRC%%/nv-freebsd.h
@@ -157,6 +157,11 @@ MALLOC_DECLARE(M_NVIDIA);
#define NV_SUPPORT_ACPI_PM
/*
+ * Enable/Disable support for PAE on i386.
+ */
+#undef NV_SUPPORT_PAE
+
+/*
* Enable/Disable heavy-weight cache-flush logic. By default, the driver
* relies on the kernel to perform cache flushes using optimized
* routines.
@@ -1,11 +0,0 @@
--- src/%%NVSRC%%/nv-misc.h.orig 2017-09-14 20:46:30 UTC
+++ src/%%NVSRC%%/nv-misc.h
@@ -11,6 +11,8 @@
#ifndef _NV_MISC_H_
#define _NV_MISC_H_
+#include "opt_global.h"
+
#include "nvtypes.h"
#include "rmretval.h"
@@ -1,90 +0,0 @@
--- src/%%NVSRC%%/nvidia_ctl.c.orig 2017-09-14 20:46:30 UTC
+++ src/%%NVSRC%%/nvidia_ctl.c
@@ -13,6 +13,12 @@
#include "nv.h"
#include "nv-freebsd.h"
+#ifdef NV_SUPPORT_LINUX_COMPAT /* (COMPAT_LINUX || COMPAT_LINUX32) */
+#include <compat/linux/linux_util.h>
+
+const char nvidia_driver_name[] = "nvidia";
+#endif
+
static d_open_t nvidia_ctl_open;
static void nvidia_ctl_dtor(void *arg);
static d_ioctl_t nvidia_ctl_ioctl;
@@ -65,13 +71,12 @@ static int nvidia_ctl_open(
void nvidia_ctl_dtor(void *arg)
{
- int status;
struct nvidia_filep *filep = arg;
struct nvidia_event *et;
nv_state_t *nv = filep->nv;
nv_lock_api(nv);
- status = nvidia_close_ctl(nv, filep);
+ nvidia_close_ctl(nv, filep);
nv_unlock_api(nv);
while ((et = STAILQ_FIRST(&filep->event_queue))) {
@@ -138,6 +144,18 @@ static int nvidia_ctl_poll(
int nvidia_ctl_attach(void)
{
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ struct linux_device_handler nvidia_ctl_linux_handler = {
+ .bsd_driver_name = __DECONST(char *, nvidia_driver_name),
+ .linux_driver_name = __DECONST(char *, nvidia_driver_name),
+ .bsd_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name),
+ .linux_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name),
+ .linux_major = NV_MAJOR_DEVICE_NUMBER,
+ .linux_minor = 255,
+ .linux_char_device = 1
+ };
+#endif
+
if (nvidia_count == 0) {
nvidia_ctl_cdev = make_dev(&nvidia_ctl_cdevsw,
CDEV_CTL_MINOR,
@@ -145,6 +163,10 @@ int nvidia_ctl_attach(void)
"%s", nvidia_ctl_cdevsw.d_name);
if (nvidia_ctl_cdev == NULL)
return ENOMEM;
+
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ (void)linux_device_register_handler(&nvidia_ctl_linux_handler);
+#endif
}
nvidia_count++;
@@ -153,13 +175,25 @@ int nvidia_ctl_attach(void)
int nvidia_ctl_detach(void)
{
- struct nvidia_softc *sc;
-
- sc = &nvidia_ctl_sc;
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ struct linux_device_handler nvidia_ctl_linux_handler = {
+ .bsd_driver_name = __DECONST(char *, nvidia_driver_name),
+ .linux_driver_name = __DECONST(char *, nvidia_driver_name),
+ .bsd_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name),
+ .linux_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name),
+ .linux_major = NV_MAJOR_DEVICE_NUMBER,
+ .linux_minor = 255,
+ .linux_char_device = 1
+ };
+#endif
nvidia_count--;
- if (nvidia_count == 0)
+ if (nvidia_count == 0) {
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ (void)linux_device_unregister_handler(&nvidia_ctl_linux_handler);
+#endif
destroy_dev(nvidia_ctl_cdev);
+ }
return 0;
}
@@ -1,66 +0,0 @@
--- src/%%NVSRC%%/nvidia_dev.c.orig 2017-09-14 20:46:30 UTC
+++ src/%%NVSRC%%/nvidia_dev.c
@@ -13,6 +13,12 @@
#include "nv.h"
#include "nv-freebsd.h"
+#ifdef NV_SUPPORT_LINUX_COMPAT /* (COMPAT_LINUX || COMPAT_LINUX32) */
+#include <compat/linux/linux_util.h>
+
+extern const char nvidia_driver_name[];
+#endif
+
static d_open_t nvidia_dev_open;
static void nvidia_dev_dtor(void *arg);
static d_ioctl_t nvidia_dev_ioctl;
@@ -162,6 +168,18 @@ static int nvidia_dev_mmap_single(
int nvidia_dev_attach(struct nvidia_softc *sc)
{
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ struct linux_device_handler nvidia_dev_linux_handler = {
+ .bsd_driver_name = __DECONST(char *, nvidia_driver_name),
+ .linux_driver_name = __DECONST(char *, nvidia_driver_name),
+ .bsd_device_name = NULL,
+ .linux_device_name = NULL,
+ .linux_major = NV_MAJOR_DEVICE_NUMBER,
+ .linux_minor = device_get_unit(sc->dev),
+ .linux_char_device = 1
+ };
+#endif
+
sc->cdev = make_dev(&nvidia_dev_cdevsw,
device_get_unit(sc->dev),
UID_ROOT, GID_WHEEL, 0666,
@@ -172,11 +190,31 @@ int nvidia_dev_attach(struct nvidia_softc *sc)
sc->cdev->si_drv1 = sc;
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ nvidia_dev_linux_handler.bsd_device_name = sc->cdev->si_name;
+ nvidia_dev_linux_handler.linux_device_name = sc->cdev->si_name;
+ (void)linux_device_register_handler(&nvidia_dev_linux_handler);
+#endif
+
return 0;
}
int nvidia_dev_detach(struct nvidia_softc *sc)
{
+#ifdef NV_SUPPORT_LINUX_COMPAT
+ struct linux_device_handler nvidia_dev_linux_handler = {
+ .bsd_driver_name = __DECONST(char *, nvidia_driver_name),
+ .linux_driver_name = __DECONST(char *, nvidia_driver_name),
+ .bsd_device_name = sc->cdev->si_name,
+ .linux_device_name = sc->cdev->si_name,
+ .linux_major = NV_MAJOR_DEVICE_NUMBER,
+ .linux_minor = device_get_unit(sc->dev),
+ .linux_char_device = 1
+ };
+
+ (void)linux_device_unregister_handler(&nvidia_dev_linux_handler);
+#endif
+
destroy_dev(sc->cdev);
return 0;
}
@@ -1,35 +0,0 @@
--- src/%%NVSRC%%/nvidia_linux.c.orig 2017-09-14 20:46:30 UTC
+++ src/%%NVSRC%%/nvidia_linux.c
@@ -35,23 +35,16 @@ int linux_ioctl_nvidia(
struct linux_ioctl_args *args
)
{
- struct file *fp;
- int error;
-#if __FreeBSD_version >= 1000053
- cap_rights_t rights;
-#endif
- u_long cmd;
+ static const uint32_t dir[4] = { IOC_VOID, IOC_IN, IOC_OUT, IOC_INOUT };
- error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), &fp);
- if (error != 0)
- return error;
-
- cmd = args->cmd;
-
- error = fo_ioctl(fp, cmd, (caddr_t)args->arg, td->td_ucred, td);
- fdrop(fp, td);
-
- return error;
+ if ((args->cmd & (1<<29)) != 0) {
+ /* FreeBSD has only 13 bits to encode the size. */
+ printf("nvidia: pid %d (%s): ioctl cmd=0x%x size too large\n",
+ (int)td->td_proc->p_pid, td->td_proc->p_comm, args->cmd);
+ return (EINVAL);
+ }
+ args->cmd = (args->cmd & ~IOC_DIRMASK) | dir[args->cmd >> 30];
+ return (sys_ioctl(td, (struct ioctl_args *)args));
}
struct linux_ioctl_handler nvidia_handler = {
@@ -1,10 +0,0 @@
--- src/%%NVSRC%%/nvidia_pci.c.orig 2017-09-14 20:46:30 UTC
+++ src/%%NVSRC%%/nvidia_pci.c
@@ -405,4 +405,7 @@ MODULE_DEPEND(nvidia, agp, 1, 1, 1);
#ifdef NV_SUPPORT_LINUX_COMPAT /* (COMPAT_LINUX || COMPAT_LINUX32) */
MODULE_DEPEND(nvidia, linux, 1, 1, 1);
+#if defined(NVCPU_X86_64)
+MODULE_DEPEND(nvidia, linux_common, 1, 1, 1);
+#endif
#endif
@@ -1,12 +0,0 @@
--- src/%%NVSRC%%/nvidia_subr.c.orig 2022-03-16 11:18:11 UTC
+++ src/%%NVSRC%%/nvidia_subr.c
@@ -727,6 +727,9 @@ int nvidia_modevent(
* time.
*/
sc = &nvidia_ctl_sc;
+#if __FreeBSD_version >= 1400058
+ nvidia_devclass = devclass_create("nvidia");
+#endif
nvidia_stack_t_zone = uma_zcreate("nvidia_stack_t", sizeof(nvidia_stack_t),
NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
@@ -1,109 +0,0 @@
--- src/nvidia-modeset/nvidia-modeset-freebsd.c.orig 2018-08-21 23:09:28 UTC
+++ src/nvidia-modeset/nvidia-modeset-freebsd.c
@@ -25,6 +25,7 @@
#include <sys/poll.h>
#include <sys/file.h>
#include <sys/proc.h>
+#include <sys/sysproto.h>
#include "nvkms-ioctl.h"
#include "nvidia-modeset-os-interface.h"
@@ -48,6 +49,7 @@
#include "machine/../linux32/linux32_proto.h"
#endif
#include <compat/linux/linux_ioctl.h>
+ #include <compat/linux/linux_util.h>
#endif
@@ -252,7 +254,12 @@ struct nvkms_ref_ptr {
struct nvkms_ref_ptr* NVKMS_API_CALL nvkms_alloc_ref_ptr(void *ptr)
{
- struct nvkms_ref_ptr *ref_ptr = nvkms_alloc(sizeof(*ref_ptr), NV_FALSE);
+ /*
+ * Initialize memory to avoid spurious "lock re-initialization" errors.
+ * A little more detail can be found in the PR 201340 starting around
+ * comment #50.
+ */
+ struct nvkms_ref_ptr *ref_ptr = nvkms_alloc(sizeof(*ref_ptr), NV_TRUE);
if (ref_ptr) {
mtx_init(&ref_ptr->lock, "nvkms-ref-ptr-lock", NULL, MTX_SPIN);
// The ref_ptr owner counts as a reference on the ref_ptr itself.
@@ -867,33 +869,31 @@ static int nvkms_poll(
*************************************************************************/
#if defined(NVKMS_SUPPORT_LINUX_COMPAT)
+static struct linux_device_handler nvkms_linux_device_handler = {
+ .bsd_driver_name = "nvidia-modeset",
+ .linux_driver_name = "nvidia-modeset",
+ .bsd_device_name = "nvidia-modeset",
+ .linux_device_name = "nvidia-modeset",
+ .linux_major = 195,
+ .linux_minor = 254,
+ .linux_char_device = 1
+};
static int nvkms_linux_ioctl_function(
struct thread *td,
struct linux_ioctl_args *args
)
{
- struct file *fp;
- int status;
- u_long cmd;
+ static const uint32_t dir[4] = { IOC_VOID, IOC_IN, IOC_OUT, IOC_INOUT };
-#if NV_FGET_HAS_CAP_RIGHTS_T_ARG
- cap_rights_t rights;
- status = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), &fp);
-#else
- status = fget(td, args->fd, &fp);
-#endif
-
- if (status != 0) {
- return status;
+ if ((args->cmd & (1<<29)) != 0) {
+ /* FreeBSD has only 13 bits to encode the size. */
+ printf("nvidia: pid %d (%s): ioctl cmd=0x%x size too large\n",
+ (int)td->td_proc->p_pid, td->td_proc->p_comm, args->cmd);
+ return (EINVAL);
}
-
- cmd = args->cmd;
-
- status = fo_ioctl(fp, cmd, (caddr_t)args->arg, td->td_ucred, td);
- fdrop(fp, td);
-
- return status;
+ args->cmd = (args->cmd & ~IOC_DIRMASK) | dir[args->cmd >> 30];
+ return (sys_ioctl(td, (struct ioctl_args *)args));
}
#define NVKMS_LINUX_IOCTL_MIN _IOC(0, NVKMS_IOCTL_MAGIC, NVKMS_IOCTL_CMD, 0)
@@ -909,6 +909,7 @@ static struct linux_ioctl_handler nvkms_linux_ioctl_ha
static void nvkms_linux_compat_load(void)
{
#if defined(NVKMS_SUPPORT_LINUX_COMPAT)
+ linux_device_register_handler(&nvkms_linux_device_handler);
linux_ioctl_register_handler(&nvkms_linux_ioctl_handler);
#endif
}
@@ -917,6 +918,7 @@ static void nvkms_linux_compat_unload(void)
{
#if defined(NVKMS_SUPPORT_LINUX_COMPAT)
linux_ioctl_unregister_handler(&nvkms_linux_ioctl_handler);
+ linux_device_unregister_handler(&nvkms_linux_device_handler);
#endif
}
@@ -1100,4 +1102,9 @@ MODULE_DEPEND(nvidia_modeset, /* module
MODULE_DEPEND(nvidia_modeset, /* module name */
linux, /* prerequisite module */
1, 1, 1); /* vmin, vpref, vmax */
+#if defined(NVCPU_X86_64)
+MODULE_DEPEND(nvidia_modeset, /* module name */
+ linux_common, /* prerequisite module */
+ 1, 1, 1); /* vmin, vpref, vmax */
+#endif
#endif
@@ -1,131 +0,0 @@
--- src/nvidia-modeset/nvidia-modeset-freebsd.c.orig 2023-03-28 22:14:28 UTC
+++ src/nvidia-modeset/nvidia-modeset-freebsd.c
@@ -368,6 +368,7 @@ struct nvkms_timer_t {
NvBool cancel;
NvBool complete;
NvBool isRefPtr;
+ NvBool needsNvkmsLock;
NvBool callout_created;
nvkms_timer_proc_t *proc;
void *dataPtr;
@@ -406,7 +407,14 @@ static void nvkms_taskqueue_callback(void *arg, int pe
callout_drain(&timer->callout);
}
- sx_xlock(&nvkms_lock);
+ /*
+ * Only lock if this timer requests it. DRM's callback nv_drm_event_callback
+ * will not need this, since it may reenter nvkms through the kapi and lock
+ * nvkms_lock then.
+ */
+ if (timer->needsNvkmsLock) {
+ sx_xlock(&nvkms_lock);
+ }
if (timer->isRefPtr) {
// If the object this timer refers to was destroyed, treat the timer as
@@ -424,11 +432,13 @@ static void nvkms_taskqueue_callback(void *arg, int pe
timer->complete = NV_TRUE;
}
+ if (timer->needsNvkmsLock) {
+ sx_xunlock(&nvkms_lock);
+ }
+
if (timer->cancel || timer->isRefPtr) {
nvkms_free(timer, sizeof(*timer));
}
-
- sx_xunlock(&nvkms_lock);
}
static void nvkms_callout_callback(void *arg)
@@ -441,11 +451,13 @@ nvkms_init_timer(struct nvkms_timer_t *timer, nvkms_ti
static void
nvkms_init_timer(struct nvkms_timer_t *timer, nvkms_timer_proc_t *proc,
- void *dataPtr, NvU32 dataU32, NvBool isRefPtr, NvU64 usec)
+ void *dataPtr, NvU32 dataU32, NvBool isRefPtr, NvU64 usec,
+ NvBool needsNvkmsLock)
{
timer->cancel = NV_FALSE;
timer->complete = NV_FALSE;
timer->isRefPtr = isRefPtr;
+ timer->needsNvkmsLock = needsNvkmsLock;
timer->proc = proc;
timer->dataPtr = dataPtr;
@@ -479,19 +491,27 @@ nvkms_init_timer(struct nvkms_timer_t *timer, nvkms_ti
mtx_unlock_spin(&nvkms_timers.lock);
}
-nvkms_timer_handle_t*
-nvkms_alloc_timer(nvkms_timer_proc_t *proc,
- void *dataPtr, NvU32 dataU32,
- NvU64 usec)
+static nvkms_timer_handle_t*
+nvkms_alloc_timer_locked(nvkms_timer_proc_t *proc,
+ void *dataPtr, NvU32 dataU32,
+ NvU64 usec, NvBool needsNvkmsLock)
{
// nvkms_alloc_timer cannot be called from an interrupt context.
struct nvkms_timer_t *timer = nvkms_alloc(sizeof(*timer), NV_TRUE);
if (timer) {
- nvkms_init_timer(timer, proc, dataPtr, dataU32, NV_FALSE, usec);
+ nvkms_init_timer(timer, proc, dataPtr, dataU32, NV_FALSE, usec, needsNvkmsLock);
}
return timer;
}
+nvkms_timer_handle_t*
+nvkms_alloc_timer(nvkms_timer_proc_t *proc,
+ void *dataPtr, NvU32 dataU32,
+ NvU64 usec)
+{
+ return nvkms_alloc_timer_locked(proc, dataPtr, dataU32, usec, NV_TRUE);
+}
+
NvBool
nvkms_alloc_timer_with_ref_ptr(nvkms_timer_proc_t *proc,
struct nvkms_ref_ptr *ref_ptr,
@@ -506,7 +526,7 @@ nvkms_alloc_timer_with_ref_ptr(nvkms_timer_proc_t *pro
// Reference the ref_ptr to make sure that it doesn't get freed before
// the timer fires.
nvkms_inc_ref(ref_ptr);
- nvkms_init_timer(timer, proc, ref_ptr, dataU32, NV_TRUE, usec);
+ nvkms_init_timer(timer, proc, ref_ptr, dataU32, NV_TRUE, usec, NV_TRUE);
}
return timer != NULL;
@@ -570,10 +590,11 @@ nvkms_event_queue_changed(nvkms_per_open_handle_t *pOp
break;
case NVKMS_CLIENT_KERNEL_SPACE:
if (!popen->kernel.task) {
- popen->kernel.task = nvkms_alloc_timer(nvkms_kapi_task_callback,
- popen,
- 0, /* dataU32 */
- 0 /* callout delay */);
+ popen->kernel.task = nvkms_alloc_timer_locked(nvkms_kapi_task_callback,
+ popen,
+ 0, /* dataU32 */
+ 0, /* callout delay */
+ NV_FALSE);
}
break;
}
@@ -828,10 +849,11 @@ static struct nvkms_per_open *nvkms_open_common(enum N
case NVKMS_CLIENT_KERNEL_SPACE:
/* enqueue our new task */
popen->kernel.device = device;
- popen->kernel.task = nvkms_alloc_timer(nvkms_kapi_task_callback,
- popen,
- 0, /* dataU32 */
- 0 /* callout delay */);
+ popen->kernel.task = nvkms_alloc_timer_locked(nvkms_kapi_task_callback,
+ popen,
+ 0, /* dataU32 */
+ 0, /* callout delay */
+ NV_FALSE);
break;
}
@@ -1,11 +0,0 @@
--- x11/driver/Makefile.orig 2013-08-16 10:53:30.000000000 +0200
+++ x11/driver/Makefile 2014-01-27 18:25:14.000000000 +0100
@@ -5,7 +5,7 @@
.endif
DRIVERS= nvidia_drv.o nvidia_drv.so
-.if exists(${LOCALBASE}/lib/xorg/modules/drivers)
+.if exists(${DESTDIR}${LOCALBASE}/lib/xorg/modules/drivers)
DRIVERDIR= ${LOCALBASE}/lib/xorg/modules/drivers
.else
DRIVERDIR= ${LOCALBASE}/lib/modules/drivers
-16
View File
@@ -1,16 +0,0 @@
# libmap.conf file for nvidia provide libraries
libGL.so libGL-NVIDIA.so
libGL.so.1 libGL-NVIDIA.so.1
%%PREFIX%%/lib/xorg/modules/extensions/libglx.so %%PREFIX%%/lib/xorg/modules/extensions/.nvidia/libglx.so
%%NVGL%%libEGL.so libEGL-NVIDIA.so
%%NVGL%%libEGL.so.1 libEGL-NVIDIA.so.1
%%NVGL%%libGLESv1_CM.so libGLESv1_CM_nvidia.so
%%NVGL%%libGLESv1_CM.so.1 libGLESv1_CM_nvidia.so.1
%%NVGL%%libGLESv2.so libGLESv2-NVIDIA.so
%%NVGL%%libGLESv2.so.2 libGLESv2-NVIDIA.so.2
@@ -1,13 +0,0 @@
--- mk/nvidia.lib.mk.orig 2013-08-16 10:53:30.000000000 +0200
+++ mk/nvidia.lib.mk 2014-01-27 16:55:39.000000000 +0100
@@ -46,8 +46,8 @@
.endif
.endif
.if defined(AUXLINK_TGT)
- @rm -f ${AUXLINK_LINK}
- @ln -fs ${AUXLINK_TGT} ${AUXLINK_LINK}
+ @rm -f ${DESTDIR}${AUXLINK_LINK}
+ @ln -fs ${AUXLINK_TGT} ${DESTDIR}${AUXLINK_LINK}
.endif
.if defined(STATICLIB_NAME)
@rm -f ${DESTDIR}${LIBDIR}/${STATICLIB_NAME}
-47
View File
@@ -1,47 +0,0 @@
[
{ type: install
message: <<EOM
To use these drivers, make sure that you have loaded the NVidia kernel
module, by running
# kldload %%KLDNAME%%
on the command line, or by putting ``%%KLDNAME%%'' on the ``kld_list''
variable in /etc/rc.conf, either manually or by running
# sysrc kld_list+=%%KLDNAME%%
If you build this port with FreeBSD AGP GART driver, make sure you have
agp.ko kernel module installed and loaded, since nvidia.ko will depend
on it, or have your kernel compiled with "device agp". Otherwise, the
NVidia kernel module will not load. Also, please set correct value for
``Option "NvAGP"'' in ``Device'' section of your X11 configuration file.
When building with Linux compatibility support, make sure that linux.ko
module is available as well (or have it compiled in kernel). It can be
loaded via /boot/loader.conf, or later in the boot process if you add
linux_enable="YES"
to your /etc/rc.conf.
If X.org cannot start and reports
(EE) NVIDIA(0): Failed to obtain a shared memory identifier.
in /var/log/Xorg.0.log while actually you have ``options SYSVSHM''
enabled in kernel, the sysctl ``kern.ipc.shmall'' should be increased.
Because in certain 570 versions GSP firmware is known to cause issues
with suspend/resume, thus, disabled by default for now.
On the other hand, some GPUs are known NOT to work without GSP
firmware support.
To enable GSP firmware add hw.nvidia.registry.EnableGpuFirmware=1
to your loader.conf.
https://download.nvidia.com/XFree86/FreeBSD-x86_64/560.31.02/README/gsp.html
See %%DOCSDIR%%/README for more information.
EOM
}
]
-2
View File
@@ -1,2 +0,0 @@
These are the official NVidia binary drivers for hardware OpenGL rendering
in X11, using the GLX extensions.
-106
View File
@@ -1,106 +0,0 @@
bin/nvidia-bug-report.sh
bin/nvidia-debugdump
bin/nvidia-smi
etc/libmap.d/nvidia.conf
lib/libEGL-NVIDIA.so
lib/libEGL-NVIDIA.so.1
lib/libEGL_nvidia.so
lib/libEGL_nvidia.so.0
lib/libGL-NVIDIA.so
lib/libGL-NVIDIA.so.1
lib/libGLESv1_CM_nvidia.so
lib/libGLESv1_CM_nvidia.so.1
lib/libGLESv2-NVIDIA.so
lib/libGLESv2-NVIDIA.so.2
lib/libGLESv2_nvidia.so
lib/libGLESv2_nvidia.so.2
@comment lib/libGLX_indirect.so.0
lib/libGLX_nvidia.so
lib/libGLX_nvidia.so.0
lib/libGLdispatch.so
lib/libGLdispatch.so.0
lib/libOpenGL.so
lib/libOpenGL.so.0
lib/libXvMCNVIDIA.a
lib/libXvMCNVIDIA.so
lib/libXvMCNVIDIA.so.1
lib/libXvMCNVIDIA_dynamic.so.1
lib/libnvidia-cfg.so
lib/libnvidia-cfg.so.1
lib/libnvidia-egl-gbm.so
lib/libnvidia-egl-gbm.so.1
@comment lib/libnvidia-egl-wayland.so
@comment lib/libnvidia-egl-wayland.so.1
lib/libnvidia-allocator.so
lib/libnvidia-allocator.so.1
lib/gbm/nvidia-drm_gbm.so
lib/libnvidia-eglcore.so
lib/libnvidia-eglcore.so.1
lib/libnvidia-glcore.so
lib/libnvidia-glcore.so.1
lib/libnvidia-glsi.so
lib/libnvidia-glsi.so.1
lib/libnvidia-glvkspirv.so
lib/libnvidia-glvkspirv.so.1
lib/libnvidia-gpucomp.so
lib/libnvidia-gpucomp.so.1
lib/libnvidia-ml.so
lib/libnvidia-ml.so.1
lib/libnvidia-tls.so
lib/libnvidia-tls.so.1
lib/libnvidia-vulkan-producer.so
lib/libnvidia-vulkan-producer.so.1
lib/libvdpau_nvidia.so
lib/vdpau/libvdpau_nvidia.so.1
lib32/libEGL.so
lib32/libEGL.so.1
lib32/libEGL_nvidia.so
lib32/libEGL_nvidia.so.0
lib32/libGL.so
lib32/libGL.so.1
lib32/libGLESv1_CM.so
lib32/libGLESv1_CM.so.1
lib32/libGLESv1_CM_nvidia.so
lib32/libGLESv1_CM_nvidia.so.1
lib32/libGLESv2.so
lib32/libGLESv2.so.2
lib32/libGLESv2_nvidia.so
lib32/libGLESv2_nvidia.so.2
lib32/libGLX.so
lib32/libGLX.so.0
lib32/libGLX_nvidia.so
lib32/libGLX_nvidia.so.0
lib32/libGLdispatch.so
lib32/libGLdispatch.so.0
lib32/libOpenGL.so
lib32/libOpenGL.so.0
lib32/libnvidia-cfg.so
lib32/libnvidia-cfg.so.1
lib32/libnvidia-eglcore.so
lib32/libnvidia-eglcore.so.1
lib32/libnvidia-glcore.so
lib32/libnvidia-glcore.so.1
lib32/libnvidia-glsi.so
lib32/libnvidia-glsi.so.1
lib32/libnvidia-glvkspirv.so
lib32/libnvidia-glvkspirv.so.1
lib32/libnvidia-gpucomp.so
lib32/libnvidia-gpucomp.so.1
lib32/libnvidia-tls.so
lib32/libnvidia-tls.so.1
lib32/vdpau/libvdpau_nvidia.so.1
@comment share/egl/egl_external_platform.d/10_nvidia_wayland.json
share/egl/egl_external_platform.d/15_nvidia_gbm.json
share/glvnd/egl_vendor.d/10_nvidia.json
share/man/man1/nvidia-smi.1.gz
share/vulkan/icd.d/nvidia_icd.json
share/vulkan/implicit_layer.d/nvidia_layers.json
%%MODULESDIR%%/drivers/nvidia_drv.so
%%EXTENSIONSDIR%%/libglx.so
%%EXTENSIONSDIR%%/libglx.so.1
%%MODULESDIR%%/extensions/libglxserver_nvidia.so
%%MODULESDIR%%/extensions/libglxserver_nvidia.so.1
/%%KMODDIR%%/nvidia.ko
/%%KMODDIR%%/nvidia-modeset.ko
/%%KMODDIR%%/nvidia_gsp_ga10x_fw.ko
/%%KMODDIR%%/nvidia_gsp_tu10x_fw.ko