1*ff53edf6SMax Gurtovoy // SPDX-License-Identifier: GPL-2.0-only 2*ff53edf6SMax Gurtovoy /* 3*ff53edf6SMax Gurtovoy * Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved 4*ff53edf6SMax Gurtovoy * 5*ff53edf6SMax Gurtovoy * Copyright (C) 2012 Red Hat, Inc. All rights reserved. 6*ff53edf6SMax Gurtovoy * Author: Alex Williamson <alex.williamson@redhat.com> 7*ff53edf6SMax Gurtovoy * 8*ff53edf6SMax Gurtovoy * Derived from original vfio: 9*ff53edf6SMax Gurtovoy * Copyright 2010 Cisco Systems, Inc. All rights reserved. 10*ff53edf6SMax Gurtovoy * Author: Tom Lyon, pugs@cisco.com 11*ff53edf6SMax Gurtovoy */ 12*ff53edf6SMax Gurtovoy 13*ff53edf6SMax Gurtovoy #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 14*ff53edf6SMax Gurtovoy 15*ff53edf6SMax Gurtovoy #include <linux/device.h> 16*ff53edf6SMax Gurtovoy #include <linux/eventfd.h> 17*ff53edf6SMax Gurtovoy #include <linux/file.h> 18*ff53edf6SMax Gurtovoy #include <linux/interrupt.h> 19*ff53edf6SMax Gurtovoy #include <linux/iommu.h> 20*ff53edf6SMax Gurtovoy #include <linux/module.h> 21*ff53edf6SMax Gurtovoy #include <linux/mutex.h> 22*ff53edf6SMax Gurtovoy #include <linux/notifier.h> 23*ff53edf6SMax Gurtovoy #include <linux/pm_runtime.h> 24*ff53edf6SMax Gurtovoy #include <linux/slab.h> 25*ff53edf6SMax Gurtovoy #include <linux/types.h> 26*ff53edf6SMax Gurtovoy #include <linux/uaccess.h> 27*ff53edf6SMax Gurtovoy 28*ff53edf6SMax Gurtovoy #include "vfio_pci_core.h" 29*ff53edf6SMax Gurtovoy 30*ff53edf6SMax Gurtovoy #define DRIVER_AUTHOR "Alex Williamson <alex.williamson@redhat.com>" 31*ff53edf6SMax Gurtovoy #define DRIVER_DESC "VFIO PCI - User Level meta-driver" 32*ff53edf6SMax Gurtovoy 33*ff53edf6SMax Gurtovoy static char ids[1024] __initdata; 34*ff53edf6SMax Gurtovoy module_param_string(ids, ids, sizeof(ids), 0); 35*ff53edf6SMax Gurtovoy MODULE_PARM_DESC(ids, "Initial PCI IDs to add to the vfio driver, format is \"vendor:device[:subvendor[:subdevice[:class[:class_mask]]]]\" and multiple comma separated entries can be specified"); 36*ff53edf6SMax Gurtovoy 37*ff53edf6SMax Gurtovoy static bool enable_sriov; 38*ff53edf6SMax Gurtovoy #ifdef CONFIG_PCI_IOV 39*ff53edf6SMax Gurtovoy module_param(enable_sriov, bool, 0644); 40*ff53edf6SMax Gurtovoy MODULE_PARM_DESC(enable_sriov, "Enable support for SR-IOV configuration. Enabling SR-IOV on a PF typically requires support of the userspace PF driver, enabling VFs without such support may result in non-functional VFs or PF."); 41*ff53edf6SMax Gurtovoy #endif 42*ff53edf6SMax Gurtovoy 43*ff53edf6SMax Gurtovoy static bool disable_denylist; 44*ff53edf6SMax Gurtovoy module_param(disable_denylist, bool, 0444); 45*ff53edf6SMax Gurtovoy MODULE_PARM_DESC(disable_denylist, "Disable use of device denylist. Disabling the denylist allows binding to devices with known errata that may lead to exploitable stability or security issues when accessed by untrusted users."); 46*ff53edf6SMax Gurtovoy 47*ff53edf6SMax Gurtovoy static bool vfio_pci_dev_in_denylist(struct pci_dev *pdev) 48*ff53edf6SMax Gurtovoy { 49*ff53edf6SMax Gurtovoy switch (pdev->vendor) { 50*ff53edf6SMax Gurtovoy case PCI_VENDOR_ID_INTEL: 51*ff53edf6SMax Gurtovoy switch (pdev->device) { 52*ff53edf6SMax Gurtovoy case PCI_DEVICE_ID_INTEL_QAT_C3XXX: 53*ff53edf6SMax Gurtovoy case PCI_DEVICE_ID_INTEL_QAT_C3XXX_VF: 54*ff53edf6SMax Gurtovoy case PCI_DEVICE_ID_INTEL_QAT_C62X: 55*ff53edf6SMax Gurtovoy case PCI_DEVICE_ID_INTEL_QAT_C62X_VF: 56*ff53edf6SMax Gurtovoy case PCI_DEVICE_ID_INTEL_QAT_DH895XCC: 57*ff53edf6SMax Gurtovoy case PCI_DEVICE_ID_INTEL_QAT_DH895XCC_VF: 58*ff53edf6SMax Gurtovoy return true; 59*ff53edf6SMax Gurtovoy default: 60*ff53edf6SMax Gurtovoy return false; 61*ff53edf6SMax Gurtovoy } 62*ff53edf6SMax Gurtovoy } 63*ff53edf6SMax Gurtovoy 64*ff53edf6SMax Gurtovoy return false; 65*ff53edf6SMax Gurtovoy } 66*ff53edf6SMax Gurtovoy 67*ff53edf6SMax Gurtovoy static bool vfio_pci_is_denylisted(struct pci_dev *pdev) 68*ff53edf6SMax Gurtovoy { 69*ff53edf6SMax Gurtovoy if (!vfio_pci_dev_in_denylist(pdev)) 70*ff53edf6SMax Gurtovoy return false; 71*ff53edf6SMax Gurtovoy 72*ff53edf6SMax Gurtovoy if (disable_denylist) { 73*ff53edf6SMax Gurtovoy pci_warn(pdev, 74*ff53edf6SMax Gurtovoy "device denylist disabled - allowing device %04x:%04x.\n", 75*ff53edf6SMax Gurtovoy pdev->vendor, pdev->device); 76*ff53edf6SMax Gurtovoy return false; 77*ff53edf6SMax Gurtovoy } 78*ff53edf6SMax Gurtovoy 79*ff53edf6SMax Gurtovoy pci_warn(pdev, "%04x:%04x exists in vfio-pci device denylist, driver probing disallowed.\n", 80*ff53edf6SMax Gurtovoy pdev->vendor, pdev->device); 81*ff53edf6SMax Gurtovoy 82*ff53edf6SMax Gurtovoy return true; 83*ff53edf6SMax Gurtovoy } 84*ff53edf6SMax Gurtovoy 85*ff53edf6SMax Gurtovoy static const struct vfio_device_ops vfio_pci_ops = { 86*ff53edf6SMax Gurtovoy .name = "vfio-pci", 87*ff53edf6SMax Gurtovoy .open_device = vfio_pci_core_open_device, 88*ff53edf6SMax Gurtovoy .close_device = vfio_pci_core_close_device, 89*ff53edf6SMax Gurtovoy .ioctl = vfio_pci_core_ioctl, 90*ff53edf6SMax Gurtovoy .read = vfio_pci_core_read, 91*ff53edf6SMax Gurtovoy .write = vfio_pci_core_write, 92*ff53edf6SMax Gurtovoy .mmap = vfio_pci_core_mmap, 93*ff53edf6SMax Gurtovoy .request = vfio_pci_core_request, 94*ff53edf6SMax Gurtovoy .match = vfio_pci_core_match, 95*ff53edf6SMax Gurtovoy }; 96*ff53edf6SMax Gurtovoy 97*ff53edf6SMax Gurtovoy static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) 98*ff53edf6SMax Gurtovoy { 99*ff53edf6SMax Gurtovoy struct vfio_pci_core_device *vdev; 100*ff53edf6SMax Gurtovoy int ret; 101*ff53edf6SMax Gurtovoy 102*ff53edf6SMax Gurtovoy if (vfio_pci_is_denylisted(pdev)) 103*ff53edf6SMax Gurtovoy return -EINVAL; 104*ff53edf6SMax Gurtovoy 105*ff53edf6SMax Gurtovoy vdev = kzalloc(sizeof(*vdev), GFP_KERNEL); 106*ff53edf6SMax Gurtovoy if (!vdev) 107*ff53edf6SMax Gurtovoy return -ENOMEM; 108*ff53edf6SMax Gurtovoy vfio_pci_core_init_device(vdev, pdev, &vfio_pci_ops); 109*ff53edf6SMax Gurtovoy 110*ff53edf6SMax Gurtovoy ret = vfio_pci_core_register_device(vdev); 111*ff53edf6SMax Gurtovoy if (ret) 112*ff53edf6SMax Gurtovoy goto out_free; 113*ff53edf6SMax Gurtovoy return 0; 114*ff53edf6SMax Gurtovoy 115*ff53edf6SMax Gurtovoy out_free: 116*ff53edf6SMax Gurtovoy vfio_pci_core_uninit_device(vdev); 117*ff53edf6SMax Gurtovoy kfree(vdev); 118*ff53edf6SMax Gurtovoy return ret; 119*ff53edf6SMax Gurtovoy } 120*ff53edf6SMax Gurtovoy 121*ff53edf6SMax Gurtovoy static void vfio_pci_remove(struct pci_dev *pdev) 122*ff53edf6SMax Gurtovoy { 123*ff53edf6SMax Gurtovoy struct vfio_pci_core_device *vdev = dev_get_drvdata(&pdev->dev); 124*ff53edf6SMax Gurtovoy 125*ff53edf6SMax Gurtovoy vfio_pci_core_unregister_device(vdev); 126*ff53edf6SMax Gurtovoy vfio_pci_core_uninit_device(vdev); 127*ff53edf6SMax Gurtovoy kfree(vdev); 128*ff53edf6SMax Gurtovoy } 129*ff53edf6SMax Gurtovoy 130*ff53edf6SMax Gurtovoy static int vfio_pci_sriov_configure(struct pci_dev *pdev, int nr_virtfn) 131*ff53edf6SMax Gurtovoy { 132*ff53edf6SMax Gurtovoy if (!enable_sriov) 133*ff53edf6SMax Gurtovoy return -ENOENT; 134*ff53edf6SMax Gurtovoy 135*ff53edf6SMax Gurtovoy return vfio_pci_core_sriov_configure(pdev, nr_virtfn); 136*ff53edf6SMax Gurtovoy } 137*ff53edf6SMax Gurtovoy 138*ff53edf6SMax Gurtovoy static struct pci_driver vfio_pci_driver = { 139*ff53edf6SMax Gurtovoy .name = "vfio-pci", 140*ff53edf6SMax Gurtovoy .id_table = NULL, /* only dynamic ids */ 141*ff53edf6SMax Gurtovoy .probe = vfio_pci_probe, 142*ff53edf6SMax Gurtovoy .remove = vfio_pci_remove, 143*ff53edf6SMax Gurtovoy .sriov_configure = vfio_pci_sriov_configure, 144*ff53edf6SMax Gurtovoy .err_handler = &vfio_pci_core_err_handlers, 145*ff53edf6SMax Gurtovoy }; 146*ff53edf6SMax Gurtovoy 147*ff53edf6SMax Gurtovoy static void __init vfio_pci_fill_ids(void) 148*ff53edf6SMax Gurtovoy { 149*ff53edf6SMax Gurtovoy char *p, *id; 150*ff53edf6SMax Gurtovoy int rc; 151*ff53edf6SMax Gurtovoy 152*ff53edf6SMax Gurtovoy /* no ids passed actually */ 153*ff53edf6SMax Gurtovoy if (ids[0] == '\0') 154*ff53edf6SMax Gurtovoy return; 155*ff53edf6SMax Gurtovoy 156*ff53edf6SMax Gurtovoy /* add ids specified in the module parameter */ 157*ff53edf6SMax Gurtovoy p = ids; 158*ff53edf6SMax Gurtovoy while ((id = strsep(&p, ","))) { 159*ff53edf6SMax Gurtovoy unsigned int vendor, device, subvendor = PCI_ANY_ID, 160*ff53edf6SMax Gurtovoy subdevice = PCI_ANY_ID, class = 0, class_mask = 0; 161*ff53edf6SMax Gurtovoy int fields; 162*ff53edf6SMax Gurtovoy 163*ff53edf6SMax Gurtovoy if (!strlen(id)) 164*ff53edf6SMax Gurtovoy continue; 165*ff53edf6SMax Gurtovoy 166*ff53edf6SMax Gurtovoy fields = sscanf(id, "%x:%x:%x:%x:%x:%x", 167*ff53edf6SMax Gurtovoy &vendor, &device, &subvendor, &subdevice, 168*ff53edf6SMax Gurtovoy &class, &class_mask); 169*ff53edf6SMax Gurtovoy 170*ff53edf6SMax Gurtovoy if (fields < 2) { 171*ff53edf6SMax Gurtovoy pr_warn("invalid id string \"%s\"\n", id); 172*ff53edf6SMax Gurtovoy continue; 173*ff53edf6SMax Gurtovoy } 174*ff53edf6SMax Gurtovoy 175*ff53edf6SMax Gurtovoy rc = pci_add_dynid(&vfio_pci_driver, vendor, device, 176*ff53edf6SMax Gurtovoy subvendor, subdevice, class, class_mask, 0); 177*ff53edf6SMax Gurtovoy if (rc) 178*ff53edf6SMax Gurtovoy pr_warn("failed to add dynamic id [%04x:%04x[%04x:%04x]] class %#08x/%08x (%d)\n", 179*ff53edf6SMax Gurtovoy vendor, device, subvendor, subdevice, 180*ff53edf6SMax Gurtovoy class, class_mask, rc); 181*ff53edf6SMax Gurtovoy else 182*ff53edf6SMax Gurtovoy pr_info("add [%04x:%04x[%04x:%04x]] class %#08x/%08x\n", 183*ff53edf6SMax Gurtovoy vendor, device, subvendor, subdevice, 184*ff53edf6SMax Gurtovoy class, class_mask); 185*ff53edf6SMax Gurtovoy } 186*ff53edf6SMax Gurtovoy } 187*ff53edf6SMax Gurtovoy 188*ff53edf6SMax Gurtovoy static int __init vfio_pci_init(void) 189*ff53edf6SMax Gurtovoy { 190*ff53edf6SMax Gurtovoy int ret; 191*ff53edf6SMax Gurtovoy 192*ff53edf6SMax Gurtovoy ret = vfio_pci_core_init(); 193*ff53edf6SMax Gurtovoy if (ret) 194*ff53edf6SMax Gurtovoy return ret; 195*ff53edf6SMax Gurtovoy 196*ff53edf6SMax Gurtovoy /* Register and scan for devices */ 197*ff53edf6SMax Gurtovoy ret = pci_register_driver(&vfio_pci_driver); 198*ff53edf6SMax Gurtovoy if (ret) 199*ff53edf6SMax Gurtovoy goto out; 200*ff53edf6SMax Gurtovoy 201*ff53edf6SMax Gurtovoy vfio_pci_fill_ids(); 202*ff53edf6SMax Gurtovoy 203*ff53edf6SMax Gurtovoy if (disable_denylist) 204*ff53edf6SMax Gurtovoy pr_warn("device denylist disabled.\n"); 205*ff53edf6SMax Gurtovoy 206*ff53edf6SMax Gurtovoy return 0; 207*ff53edf6SMax Gurtovoy 208*ff53edf6SMax Gurtovoy out: 209*ff53edf6SMax Gurtovoy vfio_pci_core_cleanup(); 210*ff53edf6SMax Gurtovoy return ret; 211*ff53edf6SMax Gurtovoy } 212*ff53edf6SMax Gurtovoy module_init(vfio_pci_init); 213*ff53edf6SMax Gurtovoy 214*ff53edf6SMax Gurtovoy static void __exit vfio_pci_cleanup(void) 215*ff53edf6SMax Gurtovoy { 216*ff53edf6SMax Gurtovoy pci_unregister_driver(&vfio_pci_driver); 217*ff53edf6SMax Gurtovoy vfio_pci_core_cleanup(); 218*ff53edf6SMax Gurtovoy } 219*ff53edf6SMax Gurtovoy module_exit(vfio_pci_cleanup); 220*ff53edf6SMax Gurtovoy 221*ff53edf6SMax Gurtovoy MODULE_LICENSE("GPL v2"); 222*ff53edf6SMax Gurtovoy MODULE_AUTHOR(DRIVER_AUTHOR); 223*ff53edf6SMax Gurtovoy MODULE_DESCRIPTION(DRIVER_DESC); 224