mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-24 11:02:51 +00:00
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 */
|