mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-05 01:54:09 +08:00
iommu/amd: Add support for page response
This generates AMD IOMMU COMPLETE_PPR_REQUEST for the specified device with the specified PRI Response Code. Also update amd_iommu_complete_ppr() to accept 'struct device' instead of pdev as it just need device reference. Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> Signed-off-by: Wei Huang <wei.huang2@amd.com> Co-developed-by: Vasant Hegde <vasant.hegde@amd.com> Signed-off-by: Vasant Hegde <vasant.hegde@amd.com> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Link: https://lore.kernel.org/r/20240418103400.6229-11-vasant.hegde@amd.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
61928bab9d
commit
405e2f122b
@ -49,6 +49,8 @@ bool amd_iommu_pasid_supported(void);
|
||||
/* IOPF */
|
||||
int amd_iommu_iopf_init(struct amd_iommu *iommu);
|
||||
void amd_iommu_iopf_uninit(struct amd_iommu *iommu);
|
||||
void amd_iommu_page_response(struct device *dev, struct iopf_fault *evt,
|
||||
struct iommu_page_response *resp);
|
||||
|
||||
/* GCR3 setup */
|
||||
int amd_iommu_set_gcr3(struct iommu_dev_data *dev_data,
|
||||
@ -60,8 +62,7 @@ int __init amd_iommu_alloc_ppr_log(struct amd_iommu *iommu);
|
||||
void __init amd_iommu_free_ppr_log(struct amd_iommu *iommu);
|
||||
void amd_iommu_enable_ppr_log(struct amd_iommu *iommu);
|
||||
void amd_iommu_poll_ppr_log(struct amd_iommu *iommu);
|
||||
int amd_iommu_complete_ppr(struct pci_dev *pdev, u32 pasid,
|
||||
int status, int tag);
|
||||
int amd_iommu_complete_ppr(struct device *dev, u32 pasid, int status, int tag);
|
||||
|
||||
/*
|
||||
* This function flushes all internal caches of
|
||||
|
@ -1628,15 +1628,14 @@ void amd_iommu_domain_update(struct protection_domain *domain)
|
||||
amd_iommu_domain_flush_all(domain);
|
||||
}
|
||||
|
||||
int amd_iommu_complete_ppr(struct pci_dev *pdev, u32 pasid,
|
||||
int status, int tag)
|
||||
int amd_iommu_complete_ppr(struct device *dev, u32 pasid, int status, int tag)
|
||||
{
|
||||
struct iommu_dev_data *dev_data;
|
||||
struct amd_iommu *iommu;
|
||||
struct iommu_cmd cmd;
|
||||
|
||||
dev_data = dev_iommu_priv_get(&pdev->dev);
|
||||
iommu = get_amd_iommu_from_dev(&pdev->dev);
|
||||
dev_data = dev_iommu_priv_get(dev);
|
||||
iommu = get_amd_iommu_from_dev(dev);
|
||||
|
||||
build_complete_ppr(&cmd, dev_data->devid, pasid, status,
|
||||
tag, dev_data->pri_tlp);
|
||||
@ -2852,6 +2851,7 @@ const struct iommu_ops amd_iommu_ops = {
|
||||
.def_domain_type = amd_iommu_def_domain_type,
|
||||
.dev_enable_feat = amd_iommu_dev_enable_feature,
|
||||
.dev_disable_feat = amd_iommu_dev_disable_feature,
|
||||
.page_response = amd_iommu_page_response,
|
||||
.default_domain_ops = &(const struct iommu_domain_ops) {
|
||||
.attach_dev = amd_iommu_attach_device,
|
||||
.map_pages = amd_iommu_map_pages,
|
||||
|
@ -139,3 +139,9 @@ void amd_iommu_iopf_uninit(struct amd_iommu *iommu)
|
||||
iopf_queue_free(iommu->iopf_queue);
|
||||
iommu->iopf_queue = NULL;
|
||||
}
|
||||
|
||||
void amd_iommu_page_response(struct device *dev, struct iopf_fault *evt,
|
||||
struct iommu_page_response *resp)
|
||||
{
|
||||
amd_iommu_complete_ppr(dev, resp->pasid, resp->code, resp->grpid);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user