mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-27 06:18:54 +00:00

Two significant new items: - Allow reporting IOMMU HW events to userspace when the events are clearly linked to a device. This is linked to the VIOMMU object and is intended to be used by a VMM to forward HW events to the virtual machine as part of emulating a vIOMMU. ARM SMMUv3 is the first driver to use this mechanism. Like the existing fault events the data is delivered through a simple FD returning event records on read(). - PASID support in VFIO. "Process Address Space ID" is a PCI feature that allows the device to tag all PCI DMA operations with an ID. The IOMMU will then use the ID to select a unique translation for those DMAs. This is part of Intel's vIOMMU support as VT-D HW requires the hypervisor to manage each PASID entry. The support is generic so any VFIO user could attach any translation to a PASID, and the support should work on ARM SMMUv3 as well. AMD requires additional driver work. Some minor updates, along with fixes: - Prevent using nested parents with fault's, no driver support today - Put a single "cookie_type" value in the iommu_domain to indicate what owns the various opaque owner fields -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRRRCHOFoQz/8F5bUaFwuHvBreFYQUCZ+q6NgAKCRCFwuHvBreF YZ3zAQDbl4/Z0O+CLN2AXq4Zeiyq1HTSoF94hzqmm7lQ17zTIwD8CCdyLXHvupaq tkBIv5IovpaxlrSk6M0kh2K8vPCk9Qk= =CIM3 -----END PGP SIGNATURE----- Merge tag 'for-linus-iommufd' of git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd Pull iommufd updates from Jason Gunthorpe: "Two significant new items: - Allow reporting IOMMU HW events to userspace when the events are clearly linked to a device. This is linked to the VIOMMU object and is intended to be used by a VMM to forward HW events to the virtual machine as part of emulating a vIOMMU. ARM SMMUv3 is the first driver to use this mechanism. Like the existing fault events the data is delivered through a simple FD returning event records on read(). - PASID support in VFIO. The "Process Address Space ID" is a PCI feature that allows the device to tag all PCI DMA operations with an ID. The IOMMU will then use the ID to select a unique translation for those DMAs. This is part of Intel's vIOMMU support as VT-D HW requires the hypervisor to manage each PASID entry. The support is generic so any VFIO user could attach any translation to a PASID, and the support should work on ARM SMMUv3 as well. AMD requires additional driver work. Some minor updates, along with fixes: - Prevent using nested parents with fault's, no driver support today - Put a single "cookie_type" value in the iommu_domain to indicate what owns the various opaque owner fields" * tag 'for-linus-iommufd' of git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd: (49 commits) iommufd: Test attach before detaching pasid iommufd: Fix iommu_vevent_header tables markup iommu: Convert unreachable() to BUG() iommufd: Balance veventq->num_events inc/dec iommufd: Initialize the flags of vevent in iommufd_viommu_report_event() iommufd/selftest: Add coverage for reporting max_pasid_log2 via IOMMU_HW_INFO iommufd: Extend IOMMU_GET_HW_INFO to report PASID capability vfio: VFIO_DEVICE_[AT|DE]TACH_IOMMUFD_PT support pasid vfio-iommufd: Support pasid [at|de]tach for physical VFIO devices ida: Add ida_find_first_range() iommufd/selftest: Add coverage for iommufd pasid attach/detach iommufd/selftest: Add test ops to test pasid attach/detach iommufd/selftest: Add a helper to get test device iommufd/selftest: Add set_dev_pasid in mock iommu iommufd: Allow allocating PASID-compatible domain iommu/vt-d: Add IOMMU_HWPT_ALLOC_PASID support iommufd: Enforce PASID-compatible domain for RID iommufd: Support pasid attach/replace iommufd: Enforce PASID-compatible domain in PASID path iommufd/device: Add pasid_attach array to track per-PASID attach ...
67 lines
2.3 KiB
C
67 lines
2.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/* Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES.
|
|
*/
|
|
#ifndef __LINUX_IOMMU_PRIV_H
|
|
#define __LINUX_IOMMU_PRIV_H
|
|
|
|
#include <linux/iommu.h>
|
|
#include <linux/msi.h>
|
|
|
|
static inline const struct iommu_ops *dev_iommu_ops(struct device *dev)
|
|
{
|
|
/*
|
|
* Assume that valid ops must be installed if iommu_probe_device()
|
|
* has succeeded. The device ops are essentially for internal use
|
|
* within the IOMMU subsystem itself, so we should be able to trust
|
|
* ourselves not to misuse the helper.
|
|
*/
|
|
return dev->iommu->iommu_dev->ops;
|
|
}
|
|
|
|
void dev_iommu_free(struct device *dev);
|
|
|
|
const struct iommu_ops *iommu_ops_from_fwnode(const struct fwnode_handle *fwnode);
|
|
|
|
static inline const struct iommu_ops *iommu_fwspec_ops(struct iommu_fwspec *fwspec)
|
|
{
|
|
return iommu_ops_from_fwnode(fwspec ? fwspec->iommu_fwnode : NULL);
|
|
}
|
|
|
|
void iommu_fwspec_free(struct device *dev);
|
|
|
|
int iommu_device_register_bus(struct iommu_device *iommu,
|
|
const struct iommu_ops *ops,
|
|
const struct bus_type *bus,
|
|
struct notifier_block *nb);
|
|
void iommu_device_unregister_bus(struct iommu_device *iommu,
|
|
const struct bus_type *bus,
|
|
struct notifier_block *nb);
|
|
|
|
struct iommu_attach_handle *iommu_attach_handle_get(struct iommu_group *group,
|
|
ioasid_t pasid,
|
|
unsigned int type);
|
|
int iommu_attach_group_handle(struct iommu_domain *domain,
|
|
struct iommu_group *group,
|
|
struct iommu_attach_handle *handle);
|
|
void iommu_detach_group_handle(struct iommu_domain *domain,
|
|
struct iommu_group *group);
|
|
int iommu_replace_group_handle(struct iommu_group *group,
|
|
struct iommu_domain *new_domain,
|
|
struct iommu_attach_handle *handle);
|
|
|
|
#if IS_ENABLED(CONFIG_IOMMUFD_DRIVER_CORE) && IS_ENABLED(CONFIG_IRQ_MSI_IOMMU)
|
|
int iommufd_sw_msi(struct iommu_domain *domain, struct msi_desc *desc,
|
|
phys_addr_t msi_addr);
|
|
#else /* !CONFIG_IOMMUFD_DRIVER_CORE || !CONFIG_IRQ_MSI_IOMMU */
|
|
static inline int iommufd_sw_msi(struct iommu_domain *domain,
|
|
struct msi_desc *desc, phys_addr_t msi_addr)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
#endif /* CONFIG_IOMMUFD_DRIVER_CORE && CONFIG_IRQ_MSI_IOMMU */
|
|
|
|
int iommu_replace_device_pasid(struct iommu_domain *domain,
|
|
struct device *dev, ioasid_t pasid,
|
|
struct iommu_attach_handle *handle);
|
|
#endif /* __LINUX_IOMMU_PRIV_H */
|