brintos

brintos / linux-shallow public Read only

0
0
Text · 2.6 KiB · 0f721ae Raw
105 lines · c
1// SPDX-License-Identifier: MIT2/*3 * Copyright © 2023-2024 Intel Corporation4 */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 check43 *44 * This function is called as part of the SR-IOV probe to validate if all45 * 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 initialize78 *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 from91 * @p: the &drm_printer92 *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}105