Message ID | 1489608329-7275-8-git-send-email-olekstysh@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
>>> On 15.03.17 at 21:05, <olekstysh@gmail.com> wrote: > --- a/xen/include/xen/iommu.h > +++ b/xen/include/xen/iommu.h > @@ -181,6 +181,7 @@ struct iommu_ops { > int __must_check (*unmap_page)(struct domain *d, unsigned long gfn); > int __must_check (*unmap_pages)(struct domain *d, unsigned long gfn, > unsigned long page_count); > + int (*alloc_page_table)(struct domain *d); > void (*free_page_table)(struct page_info *); > #ifdef CONFIG_X86 > void (*update_ire_from_apic)(unsigned int apic, unsigned int reg, unsigned int value); As you can see in patch context here, we have x86-specific callbacks. If the new one is used on ARM only, it should be made ARM-only. Jan
On Wed, Mar 22, 2017 at 5:49 PM, Jan Beulich <JBeulich@suse.com> wrote: >>>> On 15.03.17 at 21:05, <olekstysh@gmail.com> wrote: >> --- a/xen/include/xen/iommu.h >> +++ b/xen/include/xen/iommu.h >> @@ -181,6 +181,7 @@ struct iommu_ops { >> int __must_check (*unmap_page)(struct domain *d, unsigned long gfn); >> int __must_check (*unmap_pages)(struct domain *d, unsigned long gfn, >> unsigned long page_count); >> + int (*alloc_page_table)(struct domain *d); >> void (*free_page_table)(struct page_info *); >> #ifdef CONFIG_X86 >> void (*update_ire_from_apic)(unsigned int apic, unsigned int reg, unsigned int value); > > As you can see in patch context here, we have x86-specific callbacks. > If the new one is used on ARM only, it should be made ARM-only. Agree. Will do.
diff --git a/xen/drivers/passthrough/arm/iommu.c b/xen/drivers/passthrough/arm/iommu.c index 95b1abb..f132032 100644 --- a/xen/drivers/passthrough/arm/iommu.c +++ b/xen/drivers/passthrough/arm/iommu.c @@ -70,6 +70,7 @@ void arch_iommu_domain_destroy(struct domain *d) int arch_iommu_populate_page_table(struct domain *d) { - /* The IOMMU shares the p2m with the CPU */ - return -ENOSYS; + const struct iommu_ops *ops = iommu_get_ops(); + + return ops->alloc_page_table ? ops->alloc_page_table(d) : -ENOSYS; } diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h index ab68ae2..3150d7b 100644 --- a/xen/include/xen/iommu.h +++ b/xen/include/xen/iommu.h @@ -181,6 +181,7 @@ struct iommu_ops { int __must_check (*unmap_page)(struct domain *d, unsigned long gfn); int __must_check (*unmap_pages)(struct domain *d, unsigned long gfn, unsigned long page_count); + int (*alloc_page_table)(struct domain *d); void (*free_page_table)(struct page_info *); #ifdef CONFIG_X86 void (*update_ire_from_apic)(unsigned int apic, unsigned int reg, unsigned int value);