Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f3572db8 authored by Joerg Roedel's avatar Joerg Roedel
Browse files

iommu/amd: Add function to get IOMMUv2 domain for pdev



The AMD IOMMUv2 driver needs to get the IOMMUv2 domain
associated with a particular device. This patch adds a
function to get this information.

Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
parent c99afa25
Loading
Loading
Loading
Loading
+18 −0
Original line number Original line Diff line number Diff line
@@ -2958,6 +2958,8 @@ static int amd_iommu_domain_init(struct iommu_domain *dom)
	if (!domain->pt_root)
	if (!domain->pt_root)
		goto out_free;
		goto out_free;


	domain->iommu_domain = dom;

	dom->priv = domain;
	dom->priv = domain;


	return 0;
	return 0;
@@ -3463,3 +3465,19 @@ int amd_iommu_complete_ppr(struct pci_dev *pdev, int pasid,
	return iommu_queue_command(iommu, &cmd);
	return iommu_queue_command(iommu, &cmd);
}
}
EXPORT_SYMBOL(amd_iommu_complete_ppr);
EXPORT_SYMBOL(amd_iommu_complete_ppr);

struct iommu_domain *amd_iommu_get_v2_domain(struct pci_dev *pdev)
{
	struct protection_domain *domain;

	domain = get_domain(&pdev->dev);
	if (IS_ERR(domain))
		return NULL;

	/* Only return IOMMUv2 domains */
	if (!(domain->flags & PD_IOMMUV2_MASK))
		return NULL;

	return domain->iommu_domain;
}
EXPORT_SYMBOL(amd_iommu_get_v2_domain);
+1 −0
Original line number Original line Diff line number Diff line
@@ -46,6 +46,7 @@ extern int amd_iommu_flush_tlb(struct iommu_domain *dom, int pasid);
extern int amd_iommu_domain_set_gcr3(struct iommu_domain *dom, int pasid,
extern int amd_iommu_domain_set_gcr3(struct iommu_domain *dom, int pasid,
				     unsigned long cr3);
				     unsigned long cr3);
extern int amd_iommu_domain_clear_gcr3(struct iommu_domain *dom, int pasid);
extern int amd_iommu_domain_clear_gcr3(struct iommu_domain *dom, int pasid);
extern struct iommu_domain *amd_iommu_get_v2_domain(struct pci_dev *pdev);


#define PPR_SUCCESS			0x0
#define PPR_SUCCESS			0x0
#define PPR_INVALID			0x1
#define PPR_INVALID			0x1
+4 −0
Original line number Original line Diff line number Diff line
@@ -360,6 +360,8 @@ struct amd_iommu_fault {
#define PPR_FAULT_RSVD  (1 << 7)
#define PPR_FAULT_RSVD  (1 << 7)
#define PPR_FAULT_GN    (1 << 8)
#define PPR_FAULT_GN    (1 << 8)


struct iommu_domain;

/*
/*
 * This structure contains generic data for  IOMMU protection domains
 * This structure contains generic data for  IOMMU protection domains
 * independent of their use.
 * independent of their use.
@@ -379,6 +381,8 @@ struct protection_domain {
	unsigned dev_cnt;	/* devices assigned to this domain */
	unsigned dev_cnt;	/* devices assigned to this domain */
	unsigned dev_iommu[MAX_IOMMUS]; /* per-IOMMU reference count */
	unsigned dev_iommu[MAX_IOMMUS]; /* per-IOMMU reference count */
	void *priv;		/* private data */
	void *priv;		/* private data */
	struct iommu_domain *iommu_domain; /* Pointer to generic
					      domain structure */


};
};