# HG changeset patch
# User Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
# Node ID 4a2a96e72076f84ad5c9166812c6f3dcea23214e
# Parent 0f4c73a1e92a195bd90beff00c1e1c669e6f4a6a
[POWERPC][XEN] Alloc IOMMU to map a Foreign page
VIO to a physical device reulsts in the granted page getting mapped
into the IOMMU.
Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>
---
xen/arch/powerpc/iommu.c | 35 ++++++++++++++++++++++++++++-------
1 files changed, 28 insertions(+), 7 deletions(-)
diff -r 0f4c73a1e92a -r 4a2a96e72076 xen/arch/powerpc/iommu.c
--- a/xen/arch/powerpc/iommu.c Wed Oct 04 14:06:14 2006 -0400
+++ b/xen/arch/powerpc/iommu.c Sat Oct 07 15:38:27 2006 -0400
@@ -32,6 +32,12 @@
#include "tce.h"
#include "iommu.h"
+#ifdef DEBUG
+#define DBG(fmt...) printk(fmt)
+#else
+#define DBG(fmt...)
+#endif
+
struct iommu_funcs {
int (*iommu_put)(ulong, union tce);
};
@@ -46,16 +52,31 @@ int iommu_put(u32 buid, ulong ioba, unio
struct domain *d = v->domain;
if (buid < iommu_phbs_num && iommu_phbs[buid].iommu_put != NULL) {
- ulong gpfn;
+ ulong gmfn;
ulong mfn;
+ int mtype;
- gpfn = tce.tce_bits.tce_rpn;
- mfn = gmfn_to_mfn(d, gpfn);
+ gmfn = tce.tce_bits.tce_rpn;
+
+
+ mfn = pfn2mfn(d, gmfn, &mtype);
if (mfn != INVALID_MFN) {
-#ifdef DEBUG
- printk("%s: ioba=0x%lx pfn=0x%lx mfn=0x%lx\n", __func__,
- ioba, pfn, mfn);
-#endif
+ switch (mtype) {
+ case PFN_TYPE_RMA:
+ case PFN_TYPE_LOGICAL:
+ break;
+ case PFN_TYPE_FOREIGN:
+ DBG("%s: assigning to Foriegn page: "
+ "gmfn: 0x%lx mfn: 0x%lx\n", __func__, gmfn, mfn);
+ break;
+ default:
+ printk("%s: unsupported type[%d]: gmfn: 0x%lx mfn: 0x%lx\n",
+ __func__, mtype, gmfn, mfn);
+ return -1;
+ break;
+ }
+ DBG("%s: ioba=0x%lx gmfn=0x%lx mfn=0x%lx\n", __func__,
+ ioba, gmfn, mfn);
tce.tce_bits.tce_rpn = mfn;
return iommu_phbs[buid].iommu_put(ioba, tce);
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|