Re: [Patch v4 3/9] iommu/amd: Detect pre enabled translation

From: Baoquan He
Date: Sun May 29 2016 - 23:24:23 EST


On 05/28/16 at 08:49pm, Wan Zongshun wrote:
>
>
> -------- Original Message --------
> >@@ -1101,6 +1121,11 @@ static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h)
> >
> > iommu->int_enabled = false;
> >
> >+ init_translation_status(iommu);
> >+
> >+ if (translation_pre_enabled())
> >+ pr_warn("Translation is already enabled - trying to copy translation structures\n");
> >+
>
> You missed this 'iommu' parameter here, even I saw you fixed it in
> another patch, but please keep each patch to be meaningful.

Hi Zongshun,

Thanks for reviewing this patchset and great comments, will remember and
update with change.

Yes, translation_pre_enabled() in this patchset need a parameter "struct
amd_iommu*".

In fact I am still debugging and trying to figure out what need be done
further to stop the IO_PAGE_FAULT happened on ethernet network card. I
kept changing code and adjust the patches. Up to now seems I still
didn't figure out why. There must be something I didn't notice and
everything will be fine as soon as I close that valve. With my
understand pci bug scanning will detect each pci device and do the
initialization job like setting configuration space registers and
control registers. After that we can safely re-init the pci device and
re-install the new io-page tables, and this is how Joerg has done for
vt-d fix for kdump if my understanding is correct. And I tried to do
like that in this patchset, don't know why it doesn't work.

As you know in previous post I thought the final initialization of
device should be done when its related driver probe and do the mapping
job, I tried re-install io-page tables at this time. Seems it didn't
work too. So I left that way.

Sorry for this rough post, will pay attention and make a formal post if
there's new update.

Thanks
Baoquan
>
> > ret = init_iommu_from_acpi(iommu, h);
> > if (ret)
> > return ret;
> >diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h
> >index 9d32b20..01783cc 100644
> >--- a/drivers/iommu/amd_iommu_types.h
> >+++ b/drivers/iommu/amd_iommu_types.h
> >@@ -384,6 +384,7 @@ extern struct kmem_cache *amd_iommu_irq_cache;
> > #define APERTURE_PAGE_INDEX(a) (((a) >> 21) & 0x3fULL)
> >
> >
> >+
> > /*
> > * This struct is used to pass information about
> > * incoming PPR faults around.
> >@@ -401,6 +402,8 @@ struct amd_iommu_fault {
> > struct iommu_domain;
> > struct irq_domain;
> >
> >+#define AMD_IOMMU_FLAG_TRANS_PRE_ENABLED (1 << 0)
> >+
> > /*
> > * This structure contains generic data for IOMMU protection domains
> > * independent of their use.
> >@@ -525,6 +528,7 @@ struct amd_iommu {
> > struct irq_domain *ir_domain;
> > struct irq_domain *msi_domain;
> > #endif
> >+ u32 flags;
> > };
> >
> > struct devid_map {
> >