vfio: powerpc/spapr/iommu/powernv/ioda2: Rework IOMMU ownership control
This adds tce_iommu_take_ownership() and tce_iommu_release_ownership which call in a loop iommu_take_ownership()/iommu_release_ownership() for every table on the group. As there is just one now, no change in behaviour is expected. At the moment the iommu_table struct has a set_bypass() which enables/ disables DMA bypass on IODA2 PHB. This is exposed to POWERPC IOMMU code which calls this callback when external IOMMU users such as VFIO are about to get over a PHB. The set_bypass() callback is not really an iommu_table function but IOMMU/PE function. This introduces a iommu_table_group_ops struct and adds take_ownership()/release_ownership() callbacks to it which are called when an external user takes/releases control over the IOMMU. This replaces set_bypass() with ownership callbacks as it is not necessarily just bypass enabling, it can be something else/more so let's give it more generic name. The callbacks is implemented for IODA2 only. Other platforms (P5IOC2, IODA1) will use the old iommu_take_ownership/iommu_release_ownership API. The following patches will replace iommu_take_ownership/ iommu_release_ownership calls in IODA2 with full IOMMU table release/ create. As we here and touching bypass control, this removes pnv_pci_ioda2_setup_bypass_pe() as it does not do much more compared to pnv_pci_ioda2_set_bypass. This moves tce_bypass_base initialization to pnv_pci_ioda2_setup_dma_pe. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> [aw: for the vfio related changes] Acked-by: Alex Williamson <alex.williamson@redhat.com> Reviewed-by: Gavin Shan <gwshan@linux.vnet.ibm.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:

committed by
Michael Ellerman

parent
0eaf4defc7
commit
f87a88642e
@@ -93,7 +93,6 @@ struct iommu_table {
|
||||
unsigned long it_page_shift;/* table iommu page size */
|
||||
struct list_head it_group_list;/* List of iommu_table_group_link */
|
||||
struct iommu_table_ops *it_ops;
|
||||
void (*set_bypass)(struct iommu_table *tbl, bool enable);
|
||||
};
|
||||
|
||||
/* Pure 2^n version of get_order */
|
||||
@@ -126,6 +125,15 @@ extern struct iommu_table *iommu_init_table(struct iommu_table * tbl,
|
||||
int nid);
|
||||
#define IOMMU_TABLE_GROUP_MAX_TABLES 1
|
||||
|
||||
struct iommu_table_group;
|
||||
|
||||
struct iommu_table_group_ops {
|
||||
/* Switch ownership from platform code to external user (e.g. VFIO) */
|
||||
void (*take_ownership)(struct iommu_table_group *table_group);
|
||||
/* Switch ownership from external user (e.g. VFIO) back to core */
|
||||
void (*release_ownership)(struct iommu_table_group *table_group);
|
||||
};
|
||||
|
||||
struct iommu_table_group_link {
|
||||
struct list_head next;
|
||||
struct rcu_head rcu;
|
||||
@@ -135,6 +143,7 @@ struct iommu_table_group_link {
|
||||
struct iommu_table_group {
|
||||
struct iommu_group *group;
|
||||
struct iommu_table *tables[IOMMU_TABLE_GROUP_MAX_TABLES];
|
||||
struct iommu_table_group_ops *ops;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_IOMMU_API
|
||||
|
Reference in New Issue
Block a user