Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.13-rc1 104 lines 2.6 kB view raw
1// SPDX-License-Identifier: MIT 2/* 3 * Copyright © 2023-2024 Intel Corporation 4 */ 5 6#include <drm/drm_managed.h> 7 8#include "xe_assert.h" 9#include "xe_device.h" 10#include "xe_module.h" 11#include "xe_sriov.h" 12#include "xe_sriov_pf.h" 13#include "xe_sriov_printk.h" 14 15static unsigned int wanted_max_vfs(struct xe_device *xe) 16{ 17 return xe_modparam.max_vfs; 18} 19 20static int pf_reduce_totalvfs(struct xe_device *xe, int limit) 21{ 22 struct device *dev = xe->drm.dev; 23 struct pci_dev *pdev = to_pci_dev(dev); 24 int err; 25 26 err = pci_sriov_set_totalvfs(pdev, limit); 27 if (err) 28 xe_sriov_notice(xe, "Failed to set number of VFs to %d (%pe)\n", 29 limit, ERR_PTR(err)); 30 return err; 31} 32 33static bool pf_continue_as_native(struct xe_device *xe, const char *why) 34{ 35 xe_sriov_dbg(xe, "%s, continuing as native\n", why); 36 pf_reduce_totalvfs(xe, 0); 37 return false; 38} 39 40/** 41 * xe_sriov_pf_readiness - Check if PF functionality can be enabled. 42 * @xe: the &xe_device to check 43 * 44 * This function is called as part of the SR-IOV probe to validate if all 45 * PF prerequisites are satisfied and we can continue with enabling PF mode. 46 * 47 * Return: true if the PF mode can be turned on. 48 */ 49bool xe_sriov_pf_readiness(struct xe_device *xe) 50{ 51 struct device *dev = xe->drm.dev; 52 struct pci_dev *pdev = to_pci_dev(dev); 53 int totalvfs = pci_sriov_get_totalvfs(pdev); 54 int newlimit = min_t(u16, wanted_max_vfs(xe), totalvfs); 55 56 xe_assert(xe, totalvfs <= U16_MAX); 57 58 if (!dev_is_pf(dev)) 59 return false; 60 61 if (!xe_device_uc_enabled(xe)) 62 return pf_continue_as_native(xe, "Guc submission disabled"); 63 64 if (!newlimit) 65 return pf_continue_as_native(xe, "all VFs disabled"); 66 67 pf_reduce_totalvfs(xe, newlimit); 68 69 xe->sriov.pf.device_total_vfs = totalvfs; 70 xe->sriov.pf.driver_max_vfs = newlimit; 71 72 return true; 73} 74 75/** 76 * xe_sriov_pf_init_early - Initialize SR-IOV PF specific data. 77 * @xe: the &xe_device to initialize 78 * 79 * Return: 0 on success or a negative error code on failure. 80 */ 81int xe_sriov_pf_init_early(struct xe_device *xe) 82{ 83 xe_assert(xe, IS_SRIOV_PF(xe)); 84 85 return drmm_mutex_init(&xe->drm, &xe->sriov.pf.master_lock); 86} 87 88/** 89 * xe_sriov_pf_print_vfs_summary - Print SR-IOV PF information. 90 * @xe: the &xe_device to print info from 91 * @p: the &drm_printer 92 * 93 * Print SR-IOV PF related information into provided DRM printer. 94 */ 95void xe_sriov_pf_print_vfs_summary(struct xe_device *xe, struct drm_printer *p) 96{ 97 struct pci_dev *pdev = to_pci_dev(xe->drm.dev); 98 99 xe_assert(xe, IS_SRIOV_PF(xe)); 100 101 drm_printf(p, "total: %u\n", xe->sriov.pf.device_total_vfs); 102 drm_printf(p, "supported: %u\n", xe->sriov.pf.driver_max_vfs); 103 drm_printf(p, "enabled: %u\n", pci_num_vf(pdev)); 104}