From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Wei Wang2" Subject: Re: Re: [PATCH][HVM] pass-through PCI device hotplug support Date: Fri, 15 Feb 2008 18:19:51 +0100 Message-ID: <1203095991.4789.34.camel@gran.amd.com> References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-HAru7pnppQ3E05yV9D3h" Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Keir Fraser Cc: xen-devel@lists.xensource.com, "Zhai, Edwin" List-Id: xen-devel@lists.xenproject.org --=-HAru7pnppQ3E05yV9D3h Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Keir, c/s 17056 also works for AMD-IOMMU, attached patch introduces a new vendor independent interface for device detachment.=20 Thanks, Wei --=20 AMD Saxony, Dresden, Germany Operating System Research Center Legal Information: AMD Saxony Limited Liability Company & Co. KG Sitz (Gesch=C3=A4ftsanschrift): Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland Registergericht Dresden: HRA 4896 vertretungsberechtigter Komplement=C3=A4r: AMD Saxony LLC (Sitz Wilmington, Delaware, USA) Gesch=C3=A4ftsf=C3=BChrer der AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy=20 On Fri, 2008-02-15 at 14:36 +0000, Keir Fraser wrote: > On 15/2/08 13:32, "Zhai, Edwin" wrote: >=20 > > This patch is the new version against 17051 to enable HVM guest VT-d de= vice > > hotplug. > >=20 > > ** Currently only 2 virtual pci slots(6~7) are made as being capable of > > hotplug,=20 > > so more than 2 vtd dev can't be hotplugged, but we can easily extend it= in > > future. >=20 > Now applied, but perhaps too hastily. I found it broke the > !CONFIG_PASSTHROUGH build and in fixing that I noticed that you dumped co= de > in a bunch of random places in qemu. Perhaps all passthrough stuff should= be > gathered in one place? Alternatively at least the device model changes (i= n > piix4acpi.c) should be decoupled a bit from the backend logic in > passthrough.c, so the former can cleanly build without the latter. I also > killed pt_uninit() because I couldn't even find where pci_cleanup() was > defined. No passthrough function should be in vl.c: I #ifdef'ed in the fo= r > now but the functions should probably be moved. And you did a big dump of > random crap into vl.h. >=20 > -- Keir >=20 >=20 >=20 > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel >=20 >=20 --=-HAru7pnppQ3E05yV9D3h Content-Disposition: attachment; filename=hotplugin.patch Content-Type: text/plain; charset=utf-8; name=hotplugin.patch Content-Transfer-Encoding: 7bit diff -r 1cb8d51b4d77 xen/arch/x86/domctl.c --- a/xen/arch/x86/domctl.c Fri Feb 15 14:31:20 2008 +0000 +++ b/xen/arch/x86/domctl.c Fri Feb 15 18:15:46 2008 +0100 @@ -601,7 +601,7 @@ long arch_do_domctl( if ( !device_assigned(bus, devfn) ) break; - reassign_device_ownership(d, dom0, bus, devfn); + deassign_device(d, bus, devfn); gdprintk(XENLOG_INFO, "XEN_DOMCTL_deassign_device: bdf = %x:%x:%x\n", bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); put_domain(d); diff -r 1cb8d51b4d77 xen/arch/x86/hvm/iommu.c --- a/xen/arch/x86/hvm/iommu.c Fri Feb 15 14:31:20 2008 +0000 +++ b/xen/arch/x86/hvm/iommu.c Fri Feb 15 18:15:46 2008 +0100 @@ -133,3 +133,13 @@ int iommu_unmap_page(struct domain *d, u return hd->platform_ops->unmap_page(d, gfn); } + +void deassign_device(struct domain *d, u8 bus, u8 devfn) +{ + struct hvm_iommu *hd = domain_hvm_iommu(d); + + if ( !iommu_enabled || !hd->platform_ops) + return; + + return hd->platform_ops->reassign_device(d, dom0, bus, devfn); +} diff -r 1cb8d51b4d77 xen/arch/x86/hvm/svm/amd_iommu/pci-amd-iommu.c --- a/xen/arch/x86/hvm/svm/amd_iommu/pci-amd-iommu.c Fri Feb 15 14:31:20 2008 +0000 +++ b/xen/arch/x86/hvm/svm/amd_iommu/pci-amd-iommu.c Fri Feb 15 18:15:46 2008 +0100 @@ -562,10 +562,17 @@ void amd_iommu_domain_destroy(struct dom release_domain_devices(d); } +void amd_iommu_return_device(struct domain *s, struct domain *t, u8 bus, u8 devfn) +{ + pdev_flr(bus, devfn); + reassign_device(s, t, bus, devfn); +} + struct iommu_ops amd_iommu_ops = { .init = amd_iommu_domain_init, .assign_device = amd_iommu_assign_device, .teardown = amd_iommu_domain_destroy, .map_page = amd_iommu_map_page, .unmap_page = amd_iommu_unmap_page, + .reassign_device = amd_iommu_return_device, }; diff -r 1cb8d51b4d77 xen/arch/x86/hvm/vmx/vtd/intel-iommu.c --- a/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c Fri Feb 15 14:31:20 2008 +0000 +++ b/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c Fri Feb 15 18:15:46 2008 +0100 @@ -2164,6 +2164,7 @@ struct iommu_ops intel_iommu_ops = { .teardown = iommu_domain_teardown, .map_page = intel_iommu_map_page, .unmap_page = intel_iommu_unmap_page, + .reassign_device = reassign_device_ownership, }; /* diff -r 1cb8d51b4d77 xen/include/asm-x86/iommu.h --- a/xen/include/asm-x86/iommu.h Fri Feb 15 14:31:20 2008 +0000 +++ b/xen/include/asm-x86/iommu.h Fri Feb 15 18:15:46 2008 +0100 @@ -74,6 +74,7 @@ void iommu_domain_destroy(struct domain void iommu_domain_destroy(struct domain *d); int device_assigned(u8 bus, u8 devfn); int assign_device(struct domain *d, u8 bus, u8 devfn); +void deassign_device(struct domain *d, u8 bus, u8 devfn); void reassign_device_ownership(struct domain *source, struct domain *target, u8 bus, u8 devfn); @@ -102,6 +103,7 @@ struct iommu_ops { void (*teardown)(struct domain *d); int (*map_page)(struct domain *d, unsigned long gfn, unsigned long mfn); int (*unmap_page)(struct domain *d, unsigned long gfn); + void (*reassign_device)(struct domain *s, struct domain *t, u8 bus, u8 devfn); }; #endif /* _IOMMU_H_ */ --=-HAru7pnppQ3E05yV9D3h Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --=-HAru7pnppQ3E05yV9D3h--