├── .gitignore ├── vgpu_unlock-rs.conf ├── nvidia-vgpu.conf ├── clean.sh ├── nvidia-merged-utils.install ├── nvidia-smi ├── nvidia-drm-outputclass.conf ├── LICENSE ├── README.md ├── twelve.patch ├── fourteen.patch └── PKGBUILD /.gitignore: -------------------------------------------------------------------------------- 1 | *.run 2 | *.tar.zst 3 | pkg/ 4 | src/ 5 | out/ 6 | vgpu_unlock-rs/ 7 | cvgpu.c 8 | -------------------------------------------------------------------------------- /vgpu_unlock-rs.conf: -------------------------------------------------------------------------------- 1 | [Service] 2 | Environment=LD_PRELOAD=/usr/lib/nvidia/libvgpu_unlock_rs.so 3 | -------------------------------------------------------------------------------- /nvidia-vgpu.conf: -------------------------------------------------------------------------------- 1 | [Unit] 2 | After=nvidia-vgpud.service 3 | After=nvidia-vgpu-mgr.service 4 | Wants=nvidia-vgpud.service 5 | Wants=nvidia-vgpu-mgr.service -------------------------------------------------------------------------------- /clean.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P) 6 | 7 | rm -r -f -v out/ pkg/ src/ vgpu_unlock-rs/ 8 | -------------------------------------------------------------------------------- /nvidia-merged-utils.install: -------------------------------------------------------------------------------- 1 | post_upgrade() { 2 | echo "If you run into trouble with CUDA not being available, run nvidia-modprobe first." 3 | } 4 | 5 | post_install() { 6 | post_upgrade 7 | } 8 | -------------------------------------------------------------------------------- /nvidia-smi: -------------------------------------------------------------------------------- 1 | #!/usr/bin/bash 2 | 3 | for a in $* 4 | do 5 | case $a in 6 | vgpu) 7 | export LD_PRELOAD="/usr/lib/nvidia/libvgpu_unlock_rs.so" 8 | ;; 9 | esac 10 | done 11 | 12 | exec /usr/lib/nvidia/nvidia-smi.orig $@ 13 | 14 | -------------------------------------------------------------------------------- /nvidia-drm-outputclass.conf: -------------------------------------------------------------------------------- 1 | Section "OutputClass" 2 | Identifier "nvidia" 3 | MatchDriver "nvidia-drm" 4 | Driver "nvidia" 5 | Option "AllowEmptyInitialConfiguration" 6 | ModulePath "/usr/lib/nvidia/xorg" 7 | ModulePath "/usr/lib/xorg/modules" 8 | EndSection 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Jonathan Johansson 4 | Copyright (c) 2021 Matt Bilker 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## This repository is deprecated in favor of https://github.com/erin-allison/aur-packages/tree/master/nvidia-merged 2 | 3 | # Nvidia vGPU-Merged Packages for Arch Linux 4 | Use Nvidia vGPU _and_ GeForce functions of consumer-grade NVIDIA GPUs. 5 | 6 | This repository contains scripts for building all components of the "merged" driver package into drop-in replacements for the Arch Linux NVIDIA packages. It adds the following additional functions by means of scripts/drop-ins: 7 | - Wrapper for `nvidia-smi` to support recognizing consumer GPUs as vGPU-capable 8 | - Dependency re-ordering to ensure `libvirtd`, if installed, will start _after_ the NVIDIA vGPU services. 9 | 10 | Compatible Linux Versions: 11 | - Various 5.11 or older releases 12 | - 5.12 13 | - 5.14 except for some of the earlier 5.14 releases 14 | - 5.15 15 | 16 | ## Important 17 | These packages are not guaranteed to work out of the box (or at all), so use it at your own risk. Backups should be taken before attempting to replace stock NVIDIA drivers on any system. 18 | 19 | ## Installation 20 | 1. Run the `build.sh` script and then install packages from `./out/` as desired. 21 | 2. Edit `/etc/vgpu_unlock/profile_override.toml` and set desired overrides. 22 | 3. Enable `nvidia-vgpu-mgr.service` and `nvidia-vgpud.service` 23 | 4. Reboot. 24 | 25 | It is recommended to at least install `nvidia-merged` and `nvidia-merged-settings`, which will include the required services/kernel module sources by dependency. 26 | 27 | ## Credits 28 | This project would not be possible without all those who came before me that wrote the software and figured out how to implement it: 29 | - [DualCoder - vgpu_unlock](https://github.com/DualCoder/vgpu_unlock) 30 | - [rupansh - twelve.patch](https://github.com/rupansh/vgpu_unlock_5.12) 31 | - [HiFiPhile - cvgpu.c](https://gist.github.com/HiFiPhile/b3267ce1e93f15642ce3943db6e60776/) 32 | - [Krutav Shah - vGPU_Unlock Wiki](https://docs.google.com/document/d/1pzrWJ9h-zANCtyqRgS7Vzla0Y8Ea2-5z2HEi4X75d2Q) 33 | - [tuh8888 - libvirt_win10_vm](https://github.com/tuh8888/libvirt_win10_vm) 34 | - [mbilker - vgpu_unlock-rs](https://github.com/mbilker/vgpu_unlock-rs) 35 | -------------------------------------------------------------------------------- /twelve.patch: -------------------------------------------------------------------------------- 1 | --- ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.c 2 | +++ ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.c 3 | @@ -24,6 +24,7 @@ 4 | #include 5 | #include 6 | #include 7 | +#include 8 | #include "nvstatus.h" 9 | #include "nv-misc.h" 10 | #include "nv-linux.h" 11 | @@ -2666,19 +2667,18 @@ 12 | 13 | static int vgpu_save_fd(vgpu_dev_t *vgpu_dev, int fd, NvU32 index) 14 | { 15 | - struct fd irqfd; 16 | + struct eventfd_ctx *evt; 17 | 18 | - irqfd = fdget(fd); 19 | - if (!irqfd.file) 20 | - return -EBADF; 21 | + evt = eventfd_ctx_fdget(fd); 22 | + if (IS_ERR(evt)) 23 | + return PTR_ERR(evt); 24 | 25 | if (index == VFIO_PCI_INTX_IRQ_INDEX) 26 | - vgpu_dev->intr_info.intx_file = irqfd.file; 27 | - else if (index == VFIO_PCI_MSI_IRQ_INDEX) 28 | - vgpu_dev->intr_info.msi_file = irqfd.file; 29 | + vgpu_dev->intr_info.intx_evtfd = evt; 30 | + else if (index == VFIO_PCI_MSI_IRQ_INDEX) 31 | + vgpu_dev->intr_info.msi_evtfd = evt; 32 | 33 | vgpu_dev->intr_info.index = index; 34 | - fdput(irqfd); 35 | 36 | return 0; 37 | } 38 | @@ -2687,11 +2687,8 @@ 39 | static irqreturn_t vgpu_msix_handler(int irq, void *arg) 40 | { 41 | vgpu_dev_t *vgpu_dev = (vgpu_dev_t *)arg; 42 | - struct file *pfile = NULL; 43 | - mm_segment_t old_fs; 44 | - NvU64 val = 1; 45 | + struct eventfd_ctx *evt = NULL; 46 | int ret = 0; 47 | - loff_t offset = 0; 48 | int i; 49 | unsigned long eflags; 50 | 51 | @@ -2699,21 +2696,16 @@ 52 | { 53 | if (vgpu_dev->intr_info.allocated_irq[i] == irq) 54 | { 55 | - pfile = vgpu_dev->intr_info.msix_fd[i].file; 56 | + evt = vgpu_dev->intr_info.msix_evtfd[i]; 57 | break; 58 | } 59 | } 60 | 61 | - if (pfile && pfile->f_op && pfile->f_op->write) 62 | + if (evt) 63 | { 64 | - old_fs = get_fs(); 65 | - set_fs(KERNEL_DS); 66 | - 67 | NV_SAVE_FLAGS(eflags); 68 | - ret = pfile->f_op->write(pfile, (char *)&val, sizeof(val), &offset); 69 | + ret = eventfd_signal(evt, 1); 70 | NV_RESTORE_FLAGS(eflags); 71 | - 72 | - set_fs(old_fs); 73 | } 74 | 75 | return IRQ_HANDLED; 76 | @@ -2724,23 +2716,24 @@ 77 | { 78 | struct pci_dev *pdev; 79 | int irq = INVALID_IRQ, ret; 80 | - struct fd irqfd; 81 | + struct eventfd_ctx *evt; 82 | 83 | pdev = to_pci_dev(NV_GET_MDEV_PARENT(vgpu_dev->mdev)); 84 | 85 | - if (vgpu_dev->intr_info.msix_fd[vector].file) 86 | + if (vgpu_dev->intr_info.msix_evtfd[vector]) 87 | { 88 | free_irq(vgpu_dev->intr_info.allocated_irq[vector], vgpu_dev); 89 | - vgpu_dev->intr_info.msix_fd[vector].file = NULL; 90 | + eventfd_ctx_put(vgpu_dev->intr_info.msix_evtfd[vector]); 91 | + vgpu_dev->intr_info.msix_evtfd[vector] = NULL; 92 | vgpu_dev->intr_info.allocated_irq[vector] = INVALID_IRQ; 93 | } 94 | 95 | if (fd < 0) 96 | return 0; 97 | 98 | - irqfd = fdget(fd); 99 | - if (!irqfd.file) 100 | - return -EBADF; 101 | + evt = eventfd_ctx_fdget(fd); 102 | + if (IS_ERR(evt)) 103 | + return PTR_ERR(evt); 104 | 105 | if (vector < 0 || vector >= vgpu_dev->intr_info.num_ctx) 106 | return -EINVAL; 107 | @@ -2756,7 +2749,7 @@ 108 | 109 | vgpu_dev->intr_info.allocated_irq[vector] = irq; 110 | 111 | - vgpu_dev->intr_info.msix_fd[vector]= irqfd; 112 | + vgpu_dev->intr_info.msix_evtfd[vector]= evt; 113 | 114 | return 0; 115 | } 116 | @@ -2773,7 +2766,12 @@ 117 | if (vgpu_dev->intr_info.allocated_irq[i] != INVALID_IRQ) 118 | { 119 | free_irq(vgpu_dev->intr_info.allocated_irq[i], vgpu_dev); 120 | - vgpu_dev->intr_info.msix_fd[i].file = NULL; 121 | + 122 | + if (vgpu_dev->intr_info.msix_evtfd[i]) { 123 | + eventfd_ctx_put(vgpu_dev->intr_info.msix_evtfd[i]); 124 | + vgpu_dev->intr_info.msix_evtfd[i] = NULL; 125 | + } 126 | + 127 | vgpu_dev->intr_info.allocated_irq[i] = INVALID_IRQ; 128 | } 129 | } 130 | @@ -2862,7 +2860,10 @@ 131 | { 132 | if (flags & VFIO_IRQ_SET_DATA_NONE) 133 | { 134 | - vgpu_dev->intr_info.intx_file = NULL; 135 | + if (vgpu_dev->intr_info.intx_evtfd) { 136 | + eventfd_ctx_put(vgpu_dev->intr_info.intx_evtfd); 137 | + vgpu_dev->intr_info.intx_evtfd = NULL; 138 | + } 139 | break; 140 | } 141 | 142 | @@ -2887,7 +2888,10 @@ 143 | { 144 | if (flags & VFIO_IRQ_SET_DATA_NONE) 145 | { 146 | - vgpu_dev->intr_info.msi_file = NULL; 147 | + if (vgpu_dev->intr_info.msi_evtfd) { 148 | + eventfd_ctx_put(vgpu_dev->intr_info.msi_evtfd); 149 | + vgpu_dev->intr_info.msi_evtfd = NULL; 150 | + } 151 | vgpu_dev->intr_info.index = VFIO_PCI_INTX_IRQ_INDEX; 152 | break; 153 | } 154 | @@ -2895,10 +2899,9 @@ 155 | if (flags & VFIO_IRQ_SET_DATA_EVENTFD) 156 | { 157 | int fd = *(int *)data; 158 | - if (fd > 0) 159 | + if (fd > 0 && !vgpu_dev->intr_info.msi_evtfd) 160 | { 161 | - if (vgpu_dev->intr_info.msi_file == NULL) 162 | - ret = vgpu_save_fd(vgpu_dev, fd, index); 163 | + ret = vgpu_save_fd(vgpu_dev, fd, index); 164 | } 165 | } 166 | break; 167 | @@ -2953,12 +2956,9 @@ 168 | 169 | NV_STATUS nv_vgpu_inject_interrupt(void *vgpuRef) 170 | { 171 | - mm_segment_t old_fs; 172 | - NvU64 val = 1; 173 | int ret = 0; 174 | - loff_t offset = 0; 175 | NV_STATUS status = NV_OK; 176 | - struct file *pfile = NULL; 177 | + struct eventfd_ctx *evt = NULL; 178 | vgpu_dev_t *vgpu_dev = vgpuRef; 179 | unsigned long eflags; 180 | 181 | @@ -2967,12 +2967,12 @@ 182 | 183 | NV_SPIN_LOCK_IRQSAVE(&vgpu_dev->intr_info_lock, eflags); 184 | 185 | - if ((vgpu_dev->intr_info.index == VFIO_PCI_MSI_IRQ_INDEX) && (vgpu_dev->intr_info.msi_file == NULL)) 186 | + if ((vgpu_dev->intr_info.index == VFIO_PCI_MSI_IRQ_INDEX) && (!vgpu_dev->intr_info.msi_evtfd)) 187 | { 188 | NV_SPIN_UNLOCK_IRQRESTORE(&vgpu_dev->intr_info_lock, eflags); 189 | return NV_ERR_INVALID_REQUEST; 190 | } 191 | - else if ((vgpu_dev->intr_info.index == VFIO_PCI_INTX_IRQ_INDEX) && (vgpu_dev->intr_info.intx_file == NULL)) 192 | + else if ((vgpu_dev->intr_info.index == VFIO_PCI_INTX_IRQ_INDEX) && (!vgpu_dev->intr_info.intx_evtfd)) 193 | { 194 | NV_SPIN_UNLOCK_IRQRESTORE(&vgpu_dev->intr_info_lock, eflags); 195 | return NV_ERR_INVALID_REQUEST; 196 | @@ -2984,9 +2984,9 @@ 197 | } 198 | 199 | if (vgpu_dev->intr_info.index == VFIO_PCI_MSI_IRQ_INDEX) 200 | - pfile = vgpu_dev->intr_info.msi_file; 201 | + evt = vgpu_dev->intr_info.msi_evtfd; 202 | else 203 | - pfile = vgpu_dev->intr_info.intx_file; 204 | + evt = vgpu_dev->intr_info.intx_evtfd; 205 | 206 | // QEMU has exited. So, safe to ignore interrupts. 207 | if (vgpu_dev->intr_info.ignore_interrupts == NV_TRUE) 208 | @@ -2996,19 +2996,14 @@ 209 | } 210 | NV_SPIN_UNLOCK_IRQRESTORE(&vgpu_dev->intr_info_lock, eflags); 211 | 212 | - old_fs = get_fs(); 213 | - set_fs(KERNEL_DS); 214 | - 215 | - if (pfile->f_op && pfile->f_op->write) 216 | - ret = pfile->f_op->write(pfile, (char *)&val, sizeof(val), &offset); 217 | - else 218 | - status = NV_ERR_INVALID_REQUEST; 219 | + if (evt) 220 | + ret = eventfd_signal(evt, 1); 221 | + else 222 | + status = NV_ERR_INVALID_REQUEST; 223 | 224 | if (ret < 0) 225 | status = NV_ERR_INVALID_STATE; 226 | 227 | - set_fs(old_fs); 228 | - 229 | return status; 230 | } 231 | 232 | --- ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.h 233 | +++ ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.h 234 | @@ -37,6 +37,7 @@ 235 | #include 236 | #include 237 | #include 238 | +#include 239 | 240 | struct vgpu_dev_s; 241 | struct mapping_node_s; 242 | @@ -293,15 +294,15 @@ 243 | 244 | typedef struct 245 | { 246 | - struct file *intx_file; 247 | - struct file *msi_file; 248 | + struct eventfd_ctx *intx_evtfd; 249 | + struct eventfd_ctx *msi_evtfd; 250 | int index; 251 | NvBool ignore_interrupts; 252 | 253 | NvU32 allocated_irq[MAX_NUM_VECTORS]; 254 | NvU32 num_ctx; 255 | #if defined(NV_VGPU_KVM_BUILD) 256 | - struct fd msix_fd[MAX_NUM_VECTORS]; 257 | + struct eventfd_ctx *msix_evtfd[MAX_NUM_VECTORS]; 258 | #endif 259 | 260 | } intr_info_t; 261 | -------------------------------------------------------------------------------- /fourteen.patch: -------------------------------------------------------------------------------- 1 | --- ./common/inc/nv-time.h 2 | +++ ./common/inc/nv-time.h 3 | @@ -205,7 +205,7 @@ 4 | // the requested timeout has expired, loop until less 5 | // than a jiffie of the desired delay remains. 6 | // 7 | - current->state = TASK_INTERRUPTIBLE; 8 | + current->__state = TASK_INTERRUPTIBLE; 9 | do 10 | { 11 | schedule_timeout(jiffies); 12 | 13 | --- ./conftest.sh 14 | +++ ./conftest.sh 15 | @@ -4736,17 +4736,47 @@ 16 | # 17 | VERBOSE=$6 18 | iommu=CONFIG_VFIO_IOMMU_TYPE1 19 | - mdev=CONFIG_VFIO_MDEV_DEVICE 20 | + mdev=CONFIG_VFIO_MDEV 21 | kvm=CONFIG_KVM_VFIO 22 | + VFIO_IOMMU_PRESENT=0 23 | + VFIO_MDEV_DEVICE_PRESENT=0 24 | + KVM_PRESENT=0 25 | 26 | if [ -n "$VGX_KVM_BUILD" ]; then 27 | - if (test_configuration_option ${iommu} || test_configuration_option ${iommu}_MODULE) && 28 | - (test_configuration_option ${mdev} || test_configuration_option ${mdev}_MODULE) && 29 | - (test_configuration_option ${kvm} || test_configuration_option ${kvm}_MODULE); then 30 | + if (test_configuration_option ${iommu} || test_configuration_option ${iommu}_MODULE); then 31 | + VFIO_IOMMU_PRESENT=1 32 | + fi 33 | + 34 | + if (test_configuration_option ${mdev} || test_configuration_option ${mdev}_MODULE); then 35 | + VFIO_MDEV_DEVICE_PRESENT=1 36 | + fi 37 | + 38 | + if (test_configuration_option ${kvm} || test_configuration_option ${kvm}_MODULE); then 39 | + KVM_PRESENT=1 40 | + fi 41 | + 42 | + if [ "$VFIO_IOMMU_PRESENT" != "0" ] && 43 | + [ "$VFIO_MDEV_DEVICE_PRESENT" != "0" ] && 44 | + [ "$KVM_PRESENT" != "0" ] ; then 45 | exit 0 46 | else 47 | - echo "The kernel is not running a vGPU on KVM host."; 48 | + echo "Below CONFIG options are missing on the kernel for installing"; 49 | + echo "NVIDIA vGPU driver on KVM host"; 50 | + if [ "$VFIO_IOMMU_PRESENT" = "0" ]; then 51 | + echo "CONFIG_VFIO_IOMMU_TYPE1"; 52 | + fi 53 | + 54 | + if [ "$VFIO_MDEV_DEVICE_PRESENT" = "0" ]; then 55 | + echo "CONFIG_VFIO_MDEV_DEVICE"; 56 | + fi 57 | + 58 | + if [ "$KVM_PRESENT" = "0" ]; then 59 | + echo "CONFIG_KVM"; 60 | + fi 61 | + echo "Please install the kernel with above CONFIG options set, then"; 62 | + echo "try installing again"; 63 | echo ""; 64 | + 65 | if [ "$VERBOSE" = "full_output" ]; then 66 | echo "*** Failed vGPU on KVM sanity check. Bailing out! ***"; 67 | echo ""; 68 | 69 | --- ./Kbuild 70 | +++ ./Kbuild 71 | @@ -75,7 +75,7 @@ 72 | EXTRA_CFLAGS += -D__KERNEL__ -DMODULE -DNVRM -DNV_VERSION_STRING=\"460.73.01\" -Wno-unused-function -Wuninitialized -fno-strict-aliasing -mno-red-zone -mcmodel=kernel -DNV_UVM_ENABLE 73 | EXTRA_CFLAGS += $(call cc-option,-Werror=undef,) 74 | EXTRA_CFLAGS += -DNV_SPECTRE_V2=$(NV_SPECTRE_V2) 75 | -EXTRA_CFLAGS += -DNV_KERNEL_INTERFACE_LAYER 76 | +EXTRA_CFLAGS += -DNV_KERNEL_INTERFACE_LAYER -Wfatal-errors 77 | 78 | # 79 | # Detect SGI UV systems and apply system-specific optimizations. 80 | 81 | --- ./nvidia-drm/nvidia-drm-crtc.c 82 | +++ ./nvidia-drm/nvidia-drm-crtc.c 83 | @@ -227,7 +227,7 @@ 84 | } 85 | 86 | static int nv_drm_plane_atomic_check(struct drm_plane *plane, 87 | - struct drm_plane_state *plane_state) 88 | + struct drm_atomic_state *plane_state) 89 | { 90 | int i; 91 | struct drm_crtc *crtc; 92 | @@ -238,7 +238,7 @@ 93 | goto done; 94 | } 95 | 96 | - nv_drm_for_each_crtc_in_state(plane_state->state, crtc, crtc_state, i) { 97 | + nv_drm_for_each_crtc_in_state(plane_state, crtc, crtc_state, i) { 98 | struct nv_drm_crtc_state *nv_crtc_state = to_nv_crtc_state(crtc_state); 99 | struct NvKmsKapiHeadRequestedConfig *head_req_config = 100 | &nv_crtc_state->req_config; 101 | @@ -246,14 +246,14 @@ 102 | &head_req_config->layerRequestedConfig[type]; 103 | 104 | if (plane->state->crtc == crtc && 105 | - plane->state->crtc != plane_state->crtc) { 106 | + plane->state->crtc != plane_state->crtcs->ptr) { 107 | plane_req_config_disable(plane_requested_config); 108 | continue; 109 | } 110 | 111 | - if (plane_state->crtc == crtc) { 112 | + if (plane_state->crtcs->ptr == crtc) { 113 | plane_req_config_update(plane, 114 | - plane_state, 115 | + plane_state->planes->state, 116 | plane_requested_config); 117 | 118 | if (__is_async_flip_requested(plane, crtc_state)) { 119 | @@ -276,12 +276,12 @@ 120 | } 121 | 122 | static void nv_drm_plane_atomic_update(struct drm_plane *plane, 123 | - struct drm_plane_state *old_state) 124 | + struct drm_atomic_state *old_state) 125 | { 126 | } 127 | 128 | static void nv_drm_plane_atomic_disable(struct drm_plane *plane, 129 | - struct drm_plane_state *old_state) 130 | + struct drm_atomic_state *old_state) 131 | { 132 | } 133 | 134 | --- ./nvidia-drm/nvidia-drm-drv.c 135 | +++ ./nvidia-drm/nvidia-drm-drv.c 136 | @@ -866,7 +866,7 @@ 137 | dev->dev_private = nv_dev; 138 | nv_dev->dev = dev; 139 | if (device->bus == &pci_bus_type) { 140 | - dev->pdev = to_pci_dev(device); 141 | + //dev->pdev = to_pci_dev(device); 142 | } 143 | 144 | /* Register DRM device to DRM sub-system */ 145 | 146 | --- ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.c 147 | +++ ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.c 148 | @@ -25,6 +25,9 @@ 149 | #include 150 | #include 151 | #include 152 | +#include 153 | +#include 154 | +#include 155 | #include "nvstatus.h" 156 | #include "nv-misc.h" 157 | #include "nv-linux.h" 158 | @@ -38,6 +41,25 @@ 159 | struct vgpu_devs vgpu_devices; 160 | struct phys_devs phys_devices; 161 | 162 | +struct mdev_parent { 163 | + struct device *dev; 164 | + const struct mdev_parent_ops *ops; 165 | + struct kref ref; 166 | + struct list_head next; 167 | + struct kset *mdev_types_kset; 168 | + struct list_head type_list; 169 | + /* Synchronize device creation/removal with parent unregistration */ 170 | + struct rw_semaphore unreg_sem; 171 | +}; 172 | + 173 | +struct mdev_type { 174 | + struct kobject kobj; 175 | + struct kobject *devices_kobj; 176 | + struct mdev_parent *parent; 177 | + struct list_head next; 178 | + unsigned int type_group_id; 179 | +}; 180 | + 181 | #define SLEEP_TIME_MILLISECONDS 20 182 | #define VGPU_EXIT_TIMEOUT_MILLISECONDS 5000 183 | #define WAITQUEUE_TIMEOUT_SECONDS 25000 184 | @@ -203,8 +225,8 @@ 185 | .remove = nv_vgpu_vfio_destroy, 186 | .read = nv_vgpu_vfio_read, 187 | .write = nv_vgpu_vfio_write, 188 | - .open = nv_vgpu_vfio_open, 189 | - .release = nv_vgpu_vfio_close, 190 | + .open_device = nv_vgpu_vfio_open, 191 | + .close_device = nv_vgpu_vfio_close, 192 | .ioctl = nv_vgpu_vfio_ioctl, 193 | .mmap = nv_vgpu_vfio_mmap, 194 | }; 195 | @@ -412,9 +434,9 @@ 196 | return NV_OK; 197 | } 198 | 199 | -static ssize_t name_show(struct kobject *kobj, struct device *dev, char *buf) 200 | +static ssize_t name_show(struct mdev_type *mtype, struct mdev_type_attribute *attr, char *buf) 201 | { 202 | - struct pci_dev *pdev = to_pci_dev(dev); 203 | + struct pci_dev *pdev = to_pci_dev(mtype->parent->dev); 204 | struct pci_dev *parent_device; 205 | NvU32 vgpu_type_id; 206 | NV_STATUS status; 207 | @@ -425,7 +447,7 @@ 208 | 209 | parent_device = pdev; 210 | 211 | - if (nv_get_vgpu_type_id(kobj->name, dev, &vgpu_type_id) 212 | + if (nv_get_vgpu_type_id(mtype->kobj.name, mtype->parent->dev, &vgpu_type_id) 213 | == NV_OK) 214 | status = rm_vgpu_vfio_ops.get_name(parent_device, vgpu_type_id, buf); 215 | else 216 | @@ -438,9 +460,9 @@ 217 | } 218 | MDEV_TYPE_ATTR_RO(name); 219 | 220 | -static ssize_t description_show(struct kobject *kobj, struct device *dev, char *buf) 221 | +static ssize_t description_show(struct mdev_type *mtype, struct mdev_type_attribute *attr, char *buf) 222 | { 223 | - struct pci_dev *pdev = to_pci_dev(dev); 224 | + struct pci_dev *pdev = to_pci_dev(mtype->parent->dev); 225 | struct pci_dev *parent_device; 226 | NvU32 vgpu_type_id; 227 | NV_STATUS status; 228 | @@ -451,7 +473,7 @@ 229 | 230 | parent_device = pdev; 231 | 232 | - if (nv_get_vgpu_type_id(kobj->name, dev, &vgpu_type_id) 233 | + if (nv_get_vgpu_type_id(mtype->kobj.name, mtype->parent->dev, &vgpu_type_id) 234 | == NV_OK) 235 | status = rm_vgpu_vfio_ops.get_description(parent_device, vgpu_type_id, buf); 236 | else 237 | @@ -464,13 +486,13 @@ 238 | } 239 | MDEV_TYPE_ATTR_RO(description); 240 | 241 | -static ssize_t available_instances_show(struct kobject *kobj, struct device *dev, char *buf) 242 | +static ssize_t available_instances_show(struct mdev_type *t, struct mdev_type_attribute *ta, char *buf) 243 | { 244 | - struct pci_dev *pdev = to_pci_dev(dev); 245 | + struct pci_dev *pdev = to_pci_dev(t->parent->dev); 246 | NvU32 vgpu_type_id; 247 | NV_STATUS status; 248 | 249 | - if ((nv_get_vgpu_type_id(kobj->name, dev, &vgpu_type_id)) == NV_OK) 250 | + if ((nv_get_vgpu_type_id(t->kobj.name, t->parent->dev, &vgpu_type_id)) == NV_OK) 251 | status = rm_vgpu_vfio_ops.get_instances(pdev, vgpu_type_id, buf); 252 | else 253 | return -EINVAL; 254 | @@ -482,8 +504,7 @@ 255 | } 256 | MDEV_TYPE_ATTR_RO(available_instances); 257 | 258 | -static ssize_t device_api_show(struct kobject *kobj, struct device *dev, 259 | - char *buf) 260 | +static ssize_t device_api_show(struct mdev_type *t, struct mdev_type_attribute *ta, char *buf) 261 | { 262 | return sprintf(buf, "%s\n", 263 | VFIO_DEVICE_API_PCI_STRING); 264 | @@ -578,7 +599,7 @@ 265 | return ret; 266 | } 267 | 268 | -static int nv_vgpu_vfio_create(struct kobject *kobj, struct mdev_device *mdev) 269 | +static int nv_vgpu_vfio_create(struct mdev_device *mdev) 270 | { 271 | NV_STATUS status = NV_OK; 272 | vgpu_dev_t *vgpu_dev = NULL; 273 | @@ -600,7 +621,7 @@ 274 | if (!pdev) 275 | return -EINVAL; 276 | 277 | - if (nv_get_vgpu_type_id(kobj->name, NV_GET_MDEV_PARENT(mdev), &vgpu_type_id) 278 | + if (nv_get_vgpu_type_id(mdev->type->kobj.name, NV_GET_MDEV_PARENT(mdev), &vgpu_type_id) 279 | != NV_OK) 280 | { 281 | ret = -EINVAL; 282 | @@ -676,12 +697,7 @@ 283 | if (pdev->is_virtfn) 284 | { 285 | #if defined(NV_MDEV_SET_IOMMU_DEVICE_PRESENT) 286 | - ret = mdev_set_iommu_device(NV_GET_MDEV_DEV(mdev), NV_GET_MDEV_PARENT(mdev)); 287 | - if (ret != 0) 288 | - { 289 | - NV_VGPU_DEV_LOG(VGPU_ERR, mdev, "Failed to set IOMMU device. ret: %d \n", ret); 290 | - goto remove_vgpu; 291 | - } 292 | + mdev_set_iommu_device(mdev, NV_GET_MDEV_PARENT(mdev)); 293 | #endif 294 | } 295 | 296 | --- ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.h 297 | +++ ./nvidia-vgpu-vfio/nvidia-vgpu-vfio.h 298 | @@ -37,7 +37,6 @@ 299 | #include 300 | #include 301 | #include 302 | -#include 303 | 304 | struct vgpu_dev_s; 305 | struct mapping_node_s; 306 | @@ -52,7 +51,7 @@ 307 | static NV_STATUS nv_vgpu_vfio_validate_map_request(struct mdev_device *, loff_t, NvU64 *, 308 | NvU64 *, NvU64 *, pgprot_t *, NvBool *); 309 | static void nv_vgpu_remove(struct pci_dev *); 310 | -static int nv_vgpu_vfio_create(struct kobject *, struct mdev_device *); 311 | +static int nv_vgpu_vfio_create(struct mdev_device *); 312 | static int nv_vgpu_vfio_destroy(struct mdev_device *mdev); 313 | static int nv_vgpu_vfio_open(struct mdev_device *); 314 | static void nv_vgpu_vfio_close(struct mdev_device *); 315 | @@ -307,6 +306,7 @@ 316 | 317 | } intr_info_t; 318 | 319 | + 320 | typedef struct 321 | { 322 | NvU64 pending; 323 | -------------------------------------------------------------------------------- /PKGBUILD: -------------------------------------------------------------------------------- 1 | # Maintainer: Erin Allison 2 | 3 | pkgbase='nvidia-merged' 4 | pkgname=('nvidia-merged' 'lib32-nvidia-merged-utils' 'lib32-opencl-nvidia-merged' 'nvidia-merged-dkms' 'nvidia-merged-settings' 'nvidia-merged-utils' 'opencl-nvidia-merged') 5 | pkgver=460.73.01 6 | pkgrel=9 7 | arch=('x86_64') 8 | makedepends=('gcc' 'rust') 9 | url='https://krutavshah.github.io/GPU_Virtualization-Wiki/' 10 | license=('custom') 11 | options=('!strip') 12 | groups=('nvidia-merged') 13 | _pkg="NVIDIA-Linux-${CARCH}-${pkgver}-grid-vgpu-kvm-v5" 14 | _vgpuver=460.73.02 15 | source=('nvidia-drm-outputclass.conf' 'nvidia-smi' 'nvidia-vgpu.conf' 'vgpu_unlock-rs.conf' 'twelve.patch' 'fourteen.patch' 16 | "${_pkg}.run::gdrive://1dCyUteA2MqJaemRKqqTu5oed5mINu9Bw" 17 | 'git+https://github.com/mbilker/vgpu_unlock-rs.git#commit=3ca0999') 18 | sha256sums=( 19 | 'be99ff3def641bb900c2486cce96530394c5dc60548fc4642f19d3a4c784134d' 20 | '88111af630865f9321c5eebf1b87550bd47f819eb0179854c2fa0c74c8880950' 21 | '5ea0d9edfcf282cea9b204291716a9a4d6d522ba3a6bc28d78edf505b6dc7949' 22 | 'c85ae100a6c87c12906fd0057b77c0c4190f68434de4bc3bc89348ffc19aed61' 23 | '8c374e9e6053c20b0bcf71faf33adfa2659c1020ce1f38d469b42dd2bbda9749' 24 | 'affb0b2fde720ee7963746bc7a4eda459b1dd1a8a5650b4ae2de64c9e6cf54f1' 25 | '0bc28cf13c1a4d8845c7f8987974e04bd52734321bb8db526c6938530ad12c71' 26 | 'SKIP') 27 | 28 | DLAGENTS=("gdrive::/usr/bin/bash -c cookie=\$(mktemp);id=\$(echo\ %u\ |cut\ -f3\ -d'/');curl\ -qgb\ \"\$cookie\"\ -c\ \"\$cookie\"\ -fLC\ -\ --retry\ 3\ --retry-delay\ 3\ https://drive.google.com/uc?export=download\\\&id=\$id\ -o\ /dev/null;curl\ -qgb\ \"\$cookie\"\ -c\ \"\$cookie\"\ -fLC\ -\ --retry\ 3\ --retry-delay\ 3\ https://drive.google.com/uc?export=download\\\&confirm=\`egrep\ download.+\$id\ \"\$cookie\"|cut\ -f7\`\\\&id=\$id\ -o\ %o") 29 | 30 | create_links() { 31 | # create soname links 32 | find "$pkgdir" -type f -name '*.so*' ! -path '*xorg/*' -print0 | while read -d $'\0' _lib; do 33 | _soname=$(dirname "${_lib}")/$(readelf -d "${_lib}" | grep -Po 'SONAME.*: \[\K[^]]*' || true) 34 | _base=$(echo ${_soname} | sed -r 's/(.*).so.*/\1.so/') 35 | [[ -e "${_soname}" ]] || ln -s $(basename "${_lib}") "${_soname}" 36 | [[ -e "${_base}" ]] || ln -s $(basename "${_soname}") "${_base}" 37 | done 38 | } 39 | 40 | prepare() { 41 | sh "${_pkg}.run" -x 42 | 43 | cd "${_pkg}" 44 | 45 | sed -i '/Environment=LD_PRELOAD.*/D' init-scripts/systemd/nvidia-vgpud.service 46 | sed -i '/Environment=LD_PRELOAD.*/D' init-scripts/systemd/nvidia-vgpu-mgr.service 47 | 48 | sed -i 's|/usr/bin/vgpu_unlock ||' init-scripts/systemd/nvidia-vgpud.service 49 | sed -i 's|/usr/bin/vgpu_unlock ||' init-scripts/systemd/nvidia-vgpu-mgr.service 50 | 51 | sed -i 's|__UTILS_PATH__|/usr/bin|' nvidia-settings.desktop 52 | sed -i 's|__PIXMAP_PATH__|/usr/share/pixmaps|' nvidia-settings.desktop 53 | 54 | gunzip nvidia-{cuda-mps-control,modprobe,settings,smi,xconfig}.1.gz 55 | 56 | cd kernel 57 | 58 | mkdir patches 59 | 60 | cp "${srcdir}/twelve.patch" patches/ 61 | cp "${srcdir}/fourteen.patch" patches/ 62 | 63 | patch -R -p1 < patches/twelve.patch 64 | 65 | sed -i "s/__VERSION_STRING/${pkgver}/" dkms.conf 66 | sed -i 's/__JOBS/`nproc`/' dkms.conf 67 | sed -i 's/__DKMS_MODULES//' dkms.conf 68 | sed -i '$iBUILT_MODULE_NAME[0]="nvidia"\ 69 | DEST_MODULE_LOCATION[0]="/kernel/drivers/video"\ 70 | BUILT_MODULE_NAME[1]="nvidia-uvm"\ 71 | DEST_MODULE_LOCATION[1]="/kernel/drivers/video"\ 72 | BUILT_MODULE_NAME[2]="nvidia-modeset"\ 73 | DEST_MODULE_LOCATION[2]="/kernel/drivers/video"\ 74 | BUILT_MODULE_NAME[3]="nvidia-drm"\ 75 | DEST_MODULE_LOCATION[3]="/kernel/drivers/video"\ 76 | BUILT_MODULE_NAME[4]="nvidia-vgpu-vfio"\ 77 | DEST_MODULE_LOCATION[4]="/kernel/drivers/video"\ 78 | \ 79 | PATCH[0]="twelve.patch"\ 80 | PATCH_MATCH[0]="^5.1[012345].*$"\ 81 | PATCH[1]="fourteen.patch"\ 82 | PATCH_MATCH[1]="^5\.1[45].*$"' dkms.conf 83 | } 84 | 85 | build() { 86 | cd "${srcdir}/vgpu_unlock-rs" 87 | 88 | cargo build --release 89 | } 90 | 91 | package_opencl-nvidia-merged() { 92 | pkgdesc="OpenCL implemention for NVIDIA" 93 | depends=('zlib') 94 | optdepends=('opencl-headers: headers necessary for OpenCL development') 95 | provides=('opencl-driver' 'opencl-nvidia') 96 | 97 | cd "${_pkg}" 98 | 99 | # OpenCL 100 | install -D -m644 nvidia.icd "${pkgdir}/etc/OpenCL/vendors/nvidia.icd" 101 | install -D -m755 "libnvidia-compiler.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-compiler.so.${pkgver}" 102 | install -D -m755 "libnvidia-opencl.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-opencl.so.${pkgver}" 103 | 104 | create_links 105 | 106 | install -D -m644 "${srcdir}/${_pkg}/LICENSE" "${pkgdir}/usr/share/licenses/opencl-nvidia" 107 | } 108 | 109 | package_nvidia-merged-dkms() { 110 | pkgdesc="NVIDIA drivers - module sources; patched for vGPU support w/ Rust unlock" 111 | depends=('dkms' "nvidia-merged-utils=${pkgver}" 'libglvnd') 112 | provides=('NVIDIA-MODULE' 'nvidia-dkms') 113 | 114 | cd "${_pkg}" 115 | 116 | install -dm 755 "${pkgdir}"/usr/src 117 | cp -dr --no-preserve='ownership' kernel "${pkgdir}/usr/src/nvidia-${pkgver}" 118 | 119 | echo "blacklist nouveau" | 120 | install -Dm644 /dev/stdin "${pkgdir}/usr/lib/modprobe.d/nvidia-dkms.conf" 121 | 122 | install -D -m644 "${srcdir}/${_pkg}/LICENSE" "${pkgdir}/usr/share/licenses/nvidia-dkms" 123 | } 124 | 125 | package_nvidia-merged-settings() { 126 | pkgdesc='Tool for configuring the NVIDIA graphics driver' 127 | depends=('jansson' 'gtk3' 'libxv' 'libvdpau' "nvidia-merged-utils=${pkgver}") 128 | provides=('nvidia-settings') 129 | 130 | cd "${_pkg}" 131 | 132 | 133 | install -D -m755 nvidia-settings "${pkgdir}/usr/bin/nvidia-settings" 134 | install -D -m644 "libnvidia-gtk3.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-gtk3.so.${pkgver}" 135 | install -D -m644 nvidia-settings.1 "${pkgdir}/usr/share/man/man1/nvidia-settings.1" 136 | install -D -m644 nvidia-settings.png "${pkgdir}/usr/share/pixmaps/nvidia-settings.png" 137 | install -D -m644 nvidia-settings.desktop "${pkgdir}/usr/share/applications/nvidia-settings.desktop" 138 | 139 | create_links 140 | 141 | mkdir -p "${pkgdir}/usr/share/licenses" 142 | ln -s nvidia-utils "${pkgdir}/usr/share/licenses/nvidia-settings" 143 | } 144 | 145 | package_nvidia-merged() { 146 | pkgdesc='NVIDIA drivers for linux; patched for vGPU support w/ Rust unlock' 147 | depends=("nvidia-merged-dkms=${pkgver}" "nvidia-merged-utils=${pkgver}") 148 | optdepends=("lib32-nvidia-merged-utils=${pkgver}" "lib32-opencl-nvidia-merged=${pkgver}") 149 | provides=('nvidia') 150 | 151 | mkdir -p "${pkgdir}/usr/share/licenses" 152 | ln -s nvidia-utils "${pkgdir}/usr/share/licenses/nvidia" 153 | } 154 | 155 | package_nvidia-merged-utils() { 156 | pkgdesc="NVIDIA drivers utilities; patched for vGPU support w/ Rust unlock" 157 | depends=('xorg-server' 'libglvnd' 'egl-wayland') 158 | optdepends=("nvidia-merged-settings=${pkgver}: configuration tool" 159 | 'xorg-server-devel: nvidia-xconfig' 160 | "opencl-nvidia-merged=${pkgver}: OpenCL support" 161 | 'mdevctl: mediated device contfiguration tool' 162 | 'libvirt: virtualization engine control interface') 163 | conflicts=('nvidia-libgl') 164 | provides=('vulkan-driver' 'opengl-driver' 'nvidia-libgl' 'nvidia-merged' 'vgpu_unlock') 165 | replaces=('nvidia-libgl' 'vgpu_unlock') 166 | install="${pkgname}.install" 167 | backup=('etc/vgpu_unlock/profile_override.toml') 168 | 169 | cd "${_pkg}" 170 | 171 | # X driver 172 | install -D -m755 nvidia_drv.so "${pkgdir}/usr/lib/xorg/modules/drivers/nvidia_drv.so" 173 | 174 | # GLX extension module for X 175 | install -D -m755 "libglxserver_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/nvidia/xorg/libglxserver_nvidia.so.${pkgver}" 176 | # Ensure that X finds glx 177 | ln -s "libglxserver_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/nvidia/xorg/libglxserver_nvidia.so.1" 178 | ln -s "libglxserver_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/nvidia/xorg/libglxserver_nvidia.so" 179 | 180 | install -D -m755 "libGLX_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/libGLX_nvidia.so.${pkgver}" 181 | 182 | # OpenGL libraries 183 | install -D -m755 "libEGL_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/libEGL_nvidia.so.${pkgver}" 184 | install -D -m755 "libGLESv1_CM_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/libGLESv1_CM_nvidia.so.${pkgver}" 185 | install -D -m755 "libGLESv2_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/libGLESv2_nvidia.so.${pkgver}" 186 | install -D -m644 "10_nvidia.json" "${pkgdir}/usr/share/glvnd/egl_vendor.d/10_nvidia.json" 187 | 188 | # OpenGL core library 189 | install -D -m755 "libnvidia-glcore.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-glcore.so.${pkgver}" 190 | install -D -m755 "libnvidia-eglcore.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-eglcore.so.${pkgver}" 191 | install -D -m755 "libnvidia-glsi.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-glsi.so.${pkgver}" 192 | 193 | # misc 194 | install -D -m755 "libnvidia-ifr.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-ifr.so.${pkgver}" 195 | install -D -m755 "libnvidia-fbc.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-fbc.so.${pkgver}" 196 | install -D -m755 "libnvidia-encode.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-encode.so.${pkgver}" 197 | install -D -m755 "libnvidia-cfg.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-cfg.so.${pkgver}" 198 | install -D -m755 "libnvidia-ml.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-ml.so.${pkgver}" 199 | install -D -m755 "libnvidia-ngx.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-ngx.so.${pkgver}" 200 | install -D -m755 "libnvidia-glvkspirv.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-glvkspirv.so.${pkgver}" 201 | install -D -m755 "libnvidia-allocator.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-allocator.so.${pkgver}" 202 | 203 | # Vulkan ICD 204 | install -D -m644 "nvidia_icd.json" "${pkgdir}/usr/share/vulkan/icd.d/nvidia_icd.json" 205 | install -D -m644 "nvidia_layers.json" "${pkgdir}/usr/share/vulkan/implicit_layer.d/nvidia_layers.json" 206 | 207 | # VDPAU 208 | install -D -m755 "libvdpau_nvidia.so.${pkgver}" "${pkgdir}/usr/lib/vdpau/libvdpau_nvidia.so.${pkgver}" 209 | 210 | # nvidia-tls library 211 | install -D -m755 "libnvidia-tls.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-tls.so.${pkgver}" 212 | 213 | # CUDA 214 | install -D -m755 "libcuda.so.${pkgver}" "${pkgdir}/usr/lib/libcuda.so.${pkgver}" 215 | install -D -m755 "libnvcuvid.so.${pkgver}" "${pkgdir}/usr/lib/libnvcuvid.so.${pkgver}" 216 | 217 | # PTX JIT Compiler (Parallel Thread Execution (PTX) is a pseudo-assembly language for CUDA) 218 | install -D -m755 "libnvidia-ptxjitcompiler.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-ptxjitcompiler.so.${pkgver}" 219 | 220 | # raytracing 221 | install -D -m755 "libnvoptix.so.${pkgver}" "${pkgdir}/usr/lib/libnvoptix.so.${pkgver}" 222 | install -D -m755 "libnvidia-rtcore.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-rtcore.so.${pkgver}" 223 | install -D -m755 "libnvidia-cbl.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-cbl.so.${pkgver}" 224 | 225 | # Optical flow 226 | install -D -m755 "libnvidia-opticalflow.so.${pkgver}" "${pkgdir}/usr/lib/libnvidia-opticalflow.so.${pkgver}" 227 | 228 | # vGPU 229 | install -D -m755 "libnvidia-vgpu.so.${_vgpuver}" "${pkgdir}/usr/lib/libnvidia-vgpu.so.${_vgpuver}" 230 | install -D -m755 "libnvidia-vgxcfg.so.${_vgpuver}" "${pkgdir}/usr/lib/libnvidia-vgxcfg.so.${_vgpuver}" 231 | 232 | # DEBUG 233 | install -D -m755 nvidia-debugdump "${pkgdir}/usr/bin/nvidia-debugdump" 234 | 235 | # nvidia-xconfig 236 | install -D -m755 nvidia-xconfig "${pkgdir}/usr/bin/nvidia-xconfig" 237 | install -D -m644 nvidia-xconfig.1 "${pkgdir}/usr/share/man/man1/nvidia-xconfig.1" 238 | 239 | # nvidia-bug-report 240 | install -D -m755 nvidia-bug-report.sh "${pkgdir}/usr/bin/nvidia-bug-report.sh" 241 | 242 | # nvidia-smi 243 | install -D -m755 nvidia-smi "${pkgdir}/usr/lib/nvidia/nvidia-smi.orig" 244 | install -D -m644 nvidia-smi.1 "${pkgdir}/usr/share/man/man1/nvidia-smi.1" 245 | install -D -m755 "${srcdir}/nvidia-smi" "${pkgdir}/usr/bin/nvidia-smi" 246 | 247 | # nvidia-vgpu 248 | install -D -m755 nvidia-vgpud "${pkgdir}/usr/bin/nvidia-vgpud" 249 | install -D -m755 nvidia-vgpu-mgr "${pkgdir}/usr/bin/nvidia-vgpu-mgr" 250 | install -D -m644 vgpuConfig.xml "${pkgdir}/usr/share/nvidia/vgpu/vgpuConfig.xml" 251 | install -D -m644 init-scripts/systemd/nvidia-vgpud.service "${pkgdir}/usr/lib/systemd/system/nvidia-vgpud.service" 252 | install -D -m644 init-scripts/systemd/nvidia-vgpu-mgr.service "${pkgdir}/usr/lib/systemd/system/nvidia-vgpu-mgr.service" 253 | install -D -m644 "${srcdir}/vgpu_unlock-rs.conf" "${pkgdir}/usr/lib/systemd/system/nvidia-vgpud.service.d/30-vgpu_unlock-rs.conf" 254 | install -D -m644 "${srcdir}/vgpu_unlock-rs.conf" "${pkgdir}/usr/lib/systemd/system/nvidia-vgpu-mgr.service.d/30-vgpu_unlock-rs.conf" 255 | install -D -m644 "${srcdir}/nvidia-vgpu.conf" "${pkgdir}/usr/lib/systemd/system/libvirtd.service.d/20-nvidia-vgpu.conf" 256 | 257 | # nvidia-cuda-mps 258 | install -D -m755 nvidia-cuda-mps-server "${pkgdir}/usr/bin/nvidia-cuda-mps-server" 259 | install -D -m755 nvidia-cuda-mps-control "${pkgdir}/usr/bin/nvidia-cuda-mps-control" 260 | install -D -m644 nvidia-cuda-mps-control.1 "${pkgdir}/usr/share/man/man1/nvidia-cuda-mps-control.1" 261 | 262 | # nvidia-modprobe 263 | # This should be removed if nvidia fixed their uvm module! 264 | install -D -m4755 nvidia-modprobe "${pkgdir}/usr/bin/nvidia-modprobe" 265 | install -D -m644 nvidia-modprobe.1 "${pkgdir}/usr/share/man/man1/nvidia-modprobe.1" 266 | 267 | # application profiles 268 | install -D -m644 nvidia-application-profiles-${pkgver}-rc "${pkgdir}/usr/share/nvidia/nvidia-application-profiles-${pkgver}-rc" 269 | install -D -m644 nvidia-application-profiles-${pkgver}-key-documentation "${pkgdir}/usr/share/nvidia/nvidia-application-profiles-${pkgver}-key-documentation" 270 | 271 | install -D -m644 LICENSE "${pkgdir}/usr/share/licenses/nvidia-utils/LICENSE" 272 | install -D -m644 README.txt "${pkgdir}/usr/share/doc/nvidia/README" 273 | install -D -m644 NVIDIA_Changelog "${pkgdir}/usr/share/doc/nvidia/NVIDIA_Changelog" 274 | cp -r html "${pkgdir}/usr/share/doc/nvidia/" 275 | ln -s nvidia "${pkgdir}/usr/share/doc/nvidia-utils" 276 | 277 | # distro specific files must be installed in /usr/share/X11/xorg.conf.d 278 | install -D -m644 "${srcdir}/nvidia-drm-outputclass.conf" "${pkgdir}/usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf" 279 | 280 | create_links 281 | 282 | # vgpu_unlock-rs 283 | install -D -m755 "${srcdir}/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" "${pkgdir}/usr/lib/nvidia/libvgpu_unlock_rs.so" 284 | install -D -m644 /dev/null "${pkgdir}/etc/vgpu_unlock/profile_override.toml" 285 | } 286 | 287 | package_lib32-nvidia-merged-utils() { 288 | pkgdesc="NVIDIA drivers utilities; patched for vGPU support w/ Rust unlock (32-bit)" 289 | depends=('lib32-zlib' 'lib32-gcc-libs' 'lib32-libglvnd' "nvidia-merged-utils=${pkgver}") 290 | optdepends=("lib32-opencl-nvidia=${pkgver}") 291 | provides=('lib32-vulkan-driver' 'lib32-opengl-driver' 'lib32-nvidia-libgl' 'lib32-nvidia-utils') 292 | replaces=('lib32-nvidia-libgl') 293 | 294 | cd "${_pkg}/32" 295 | 296 | install -D -m755 "libGLX_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/libGLX_nvidia.so.${pkgver}" 297 | 298 | # OpenGL libraries 299 | install -D -m755 "libEGL_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/libEGL_nvidia.so.${pkgver}" 300 | install -D -m755 "libGLESv1_CM_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/libGLESv1_CM_nvidia.so.${pkgver}" 301 | install -D -m755 "libGLESv2_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/libGLESv2_nvidia.so.${pkgver}" 302 | 303 | # OpenGL core library 304 | install -D -m755 "libnvidia-glcore.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-glcore.so.${pkgver}" 305 | install -D -m755 "libnvidia-eglcore.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-eglcore.so.${pkgver}" 306 | install -D -m755 "libnvidia-glsi.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-glsi.so.${pkgver}" 307 | 308 | # misc 309 | install -D -m755 "libnvidia-fbc.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-fbc.so.${pkgver}" 310 | install -D -m755 "libnvidia-ifr.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-ifr.so.${pkgver}" 311 | install -D -m755 "libnvidia-encode.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-encode.so.${pkgver}" 312 | install -D -m755 "libnvidia-ml.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-ml.so.${pkgver}" 313 | install -D -m755 "libnvidia-glvkspirv.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-glvkspirv.so.${pkgver}" 314 | install -D -m755 "libnvidia-allocator.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-allocator.so.${pkgver}" 315 | 316 | # VDPAU 317 | install -D -m755 "libvdpau_nvidia.so.${pkgver}" "${pkgdir}/usr/lib32/vdpau/libvdpau_nvidia.so.${pkgver}" 318 | 319 | # nvidia-tls library 320 | install -D -m755 "libnvidia-tls.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-tls.so.${pkgver}" 321 | 322 | # CUDA 323 | install -D -m755 "libcuda.so.${pkgver}" "${pkgdir}/usr/lib32/libcuda.so.${pkgver}" 324 | install -D -m755 "libnvcuvid.so.${pkgver}" "${pkgdir}/usr/lib32/libnvcuvid.so.${pkgver}" 325 | 326 | # PTX JIT Compiler (Parallel Thread Execution (PTX) is a pseudo-assembly language for CUDA) 327 | install -D -m755 "libnvidia-ptxjitcompiler.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-ptxjitcompiler.so.${pkgver}" 328 | 329 | # Optical flow 330 | install -D -m755 "libnvidia-opticalflow.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-opticalflow.so.${pkgver}" 331 | 332 | create_links 333 | 334 | rm -rf "${pkgdir}"/usr/{include,share,bin} 335 | mkdir -p "${pkgdir}/usr/share/licenses" 336 | ln -s nvidia-utils "${pkgdir}/usr/share/licenses/lib32-nvidia-utils" 337 | } 338 | 339 | package_lib32-opencl-nvidia-merged() { 340 | pkgdesc="OpenCL implemention for NVIDIA (32-bit)" 341 | depends=('lib32-zlib' 'lib32-gcc-libs') 342 | optdepends=('opencl-headers: headers necessary for OpenCL development') 343 | provides=('lib32-opencl-driver' 'lib32-opencl-nvidia') 344 | 345 | cd "${_pkg}/32" 346 | 347 | # OpenCL 348 | install -D -m755 "libnvidia-compiler.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-compiler.so.${pkgver}" 349 | install -D -m755 "libnvidia-opencl.so.${pkgver}" "${pkgdir}/usr/lib32/libnvidia-opencl.so.${pkgver}" 350 | 351 | create_links 352 | 353 | mkdir -p "${pkgdir}/usr/share/licenses" 354 | install -D -m644 "${srcdir}/${_pkg}/LICENSE" "${pkgdir}/usr/share/licenses/lib32-opencl-nvidia" 355 | } 356 | --------------------------------------------------------------------------------