All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wei Wang <wei.wang2@amd.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [RFC PATCH 3/3] AMD IOMMU: Enable p2m sharing
Date: Fri, 25 Mar 2011 11:32:06 +0100	[thread overview]
Message-ID: <4D8C6F26.1030506@amd.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 201 bytes --]

--
Advanced Micro Devices GmbH
Sitz: Dornach, Gemeinde Aschheim,
Landkreis München Registergericht München,
HRB Nr. 43632
WEEE-Reg-Nr: DE 12919551
Geschäftsführer:
Alberto Bozzo, Andrew Bowd


[-- Attachment #2: p2m_3.patch --]
[-- Type: text/plain, Size: 4783 bytes --]

# HG changeset patch
# User Wei Wang <wei.wang2@amd.com>
# Date 1300981300 -3600
# Node ID 7be7906a406ed176ca6cc4e074a46cdc827d3764
# Parent  48052c25abfd39b5c1b96481bb908bcedf1af7d5
Introduce a new parameter (iommu=sharept) for both vtd and amd-vi 
to enable p2m-iommu page table sharing.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 48052c25abfd -r 7be7906a406e xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c	Thu Mar 24 16:34:29 2011 +0100
+++ b/xen/arch/x86/mm/p2m.c	Thu Mar 24 16:41:40 2011 +0100
@@ -1921,8 +1921,7 @@
 
     p2m->phys_table = pagetable_from_mfn(page_to_mfn(p2m_top));
 
-    if ( hap_enabled(d) && (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) )
-        iommu_set_pgd(d);
+    iommu_share_p2m_table(d);
 
     P2M_PRINTK("populating p2m table\n");
 
diff -r 48052c25abfd -r 7be7906a406e xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Thu Mar 24 16:34:29 2011 +0100
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Thu Mar 24 16:41:40 2011 +0100
@@ -723,13 +723,22 @@
     mfn_t pgd_mfn;
 
     ASSERT( is_hvm_domain(d) && d->arch.hvm_domain.hap_enabled );
+    
+    if ( !iommu_sharept )
+    {
+        iommu_hap_pt_share = 0;
+        return;
+    }
 
     if ( hd->root_table != NULL )
         free_amd_iommu_pgtable(hd->root_table);
 
     pgd_mfn = pagetable_get_mfn(p2m_get_pagetable(p2m_get_hostp2m(d)));
     hd->root_table = mfn_to_page(mfn_x(pgd_mfn));
-
+    
+    /* To use p2m table, force paging mode = 4 */
+    hd->paging_mode = IOMMU_PAGING_MODE_LEVEL_4;
+    
     iommu_hap_pt_share = 1;
     AMD_IOMMU_DEBUG("Share p2m table with iommu: p2m table = 0x%lx\n",
                     mfn_x(pgd_mfn));
diff -r 48052c25abfd -r 7be7906a406e xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Thu Mar 24 16:34:29 2011 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Thu Mar 24 16:41:40 2011 +0100
@@ -458,4 +458,5 @@
     .read_msi_from_ire = amd_iommu_read_msi_from_ire,
     .suspend = amd_iommu_suspend,
     .resume = amd_iommu_resume,
+    .share_p2m = amd_iommu_set_p2m_table,
 };
diff -r 48052c25abfd -r 7be7906a406e xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c	Thu Mar 24 16:34:29 2011 +0100
+++ b/xen/drivers/passthrough/iommu.c	Thu Mar 24 16:41:40 2011 +0100
@@ -50,6 +50,7 @@
 bool_t __read_mostly iommu_hap_pt_share;
 bool_t __read_mostly amd_iommu_debug;
 bool_t __read_mostly amd_iommu_perdev_intremap;
+bool_t __read_mostly iommu_sharept;
 
 static void __init parse_iommu_param(char *s)
 {
@@ -82,6 +83,8 @@
             iommu_passthrough = 1;
         else if ( !strcmp(s, "dom0-strict") )
             iommu_dom0_strict = 1;
+        else if ( !strcmp(s, "sharept") )
+            iommu_sharept = 1;
 
         s = ss + 1;
     } while ( ss );
@@ -419,6 +422,14 @@
         ops->suspend();
 }
 
+void iommu_share_p2m_table(struct domain* d)
+{
+    const struct iommu_ops *ops = iommu_get_ops();
+
+    if ( hap_enabled(d) && iommu_enabled && is_hvm_domain(d) )
+        ops->share_p2m(d);        
+}
+
 /*
  * Local variables:
  * mode: C
diff -r 48052c25abfd -r 7be7906a406e xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c	Thu Mar 24 16:34:29 2011 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c	Thu Mar 24 16:41:40 2011 +0100
@@ -45,9 +45,6 @@
 #define nr_ioapics              iosapic_get_nr_iosapics()
 #endif
 
-static int sharept = 0;
-boolean_param("sharept", sharept);
-
 int nr_iommus;
 
 static void setup_dom0_devices(struct domain *d);
@@ -1747,7 +1744,7 @@
     bool_t share = TRUE;
 
     /* sharept defaults to 0 for now, default to 1 when feature matures */
-    if ( !sharept )
+    if ( !iommu_sharept )
         share = FALSE;
 
     /*
@@ -2300,6 +2297,7 @@
     .read_msi_from_ire = msi_msg_read_remap_rte,
     .suspend = vtd_suspend,
     .resume = vtd_resume,
+    .share_p2m = iommu_set_pgd,
 };
 
 /*
diff -r 48052c25abfd -r 7be7906a406e xen/include/xen/iommu.h
--- a/xen/include/xen/iommu.h	Thu Mar 24 16:34:29 2011 +0100
+++ b/xen/include/xen/iommu.h	Thu Mar 24 16:41:40 2011 +0100
@@ -33,6 +33,7 @@
 extern bool_t iommu_hap_pt_share;
 extern bool_t amd_iommu_debug;
 extern bool_t amd_iommu_perdev_intremap;
+extern bool_t iommu_sharept;
 
 extern struct rangeset *mmio_ro_ranges;
 
@@ -133,6 +134,7 @@
     unsigned int (*read_apic_from_ire)(unsigned int apic, unsigned int reg);
     void (*suspend)(void);
     void (*resume)(void);
+    void (*share_p2m)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);
@@ -144,5 +146,6 @@
 void iommu_resume(void);
 
 void iommu_set_dom0_mapping(struct domain *d);
+void iommu_share_p2m_table(struct domain *d);
 
 #endif /* _IOMMU_H_ */

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

                 reply	other threads:[~2011-03-25 10:32 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4D8C6F26.1030506@amd.com \
    --to=wei.wang2@amd.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.