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