[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v02 4/7] arm: omap: introduce print pagetable function for IPU remoteproc



This patch adds a possibility to dump all pagetables of
IPU remoteproc. The only reason to have this patch - is a
low level debug.

Change-Id: If327ca62c964ff9cba3d0952c80a15c06884470b
Signed-off-by: Andrii Tseglytskyi <andrii.tseglytskyi@xxxxxxxxxxxxxxx>
---
 xen/arch/arm/platforms/omap_iommu.c |   68 ++++++++++++++++++++++++++++++++++-
 1 file changed, 67 insertions(+), 1 deletion(-)

diff --git a/xen/arch/arm/platforms/omap_iommu.c 
b/xen/arch/arm/platforms/omap_iommu.c
index bbaa7bc..d3a3c15 100644
--- a/xen/arch/arm/platforms/omap_iommu.c
+++ b/xen/arch/arm/platforms/omap_iommu.c
@@ -19,7 +19,6 @@
 #include <xen/errno.h>
 #include <xen/stdbool.h>
 #include <xen/mm.h>
-#include <xen/vmap.h>
 #include <xen/sched.h>
 #include <xen/remoteproc_iommu.h>
 
@@ -73,6 +72,8 @@
 static u32 mmu_ipu_translate_pagetable(struct mmu_info *mmu, struct 
mmu_pagetable *pgt);
 static u32 mmu_sgx_translate_pagetable(struct mmu_info *mmu, struct 
mmu_pagetable *pgt);
 
+static void mmu_ipu_print_pagetables(struct mmu_info *mmu);
+
 static u32 ipu_trap_offsets[] = {
     MMU_IPU_TTB_OFFSET,
 };
@@ -104,6 +105,7 @@ struct mmu_info omap_ipu_mmu = {
     .mem_size       = 0x1000,
     .num_traps          = ARRAY_SIZE(ipu_trap_offsets),
     .translate_pfunc   = mmu_ipu_translate_pagetable,
+    .print_pagetable_pfunc  = mmu_ipu_print_pagetables,
 };
 
 static const struct pagetable_data pagetable_sgx_data = {
@@ -165,6 +167,70 @@ static u32 mmu_pte_table_alloc(struct mmu_info *mmu, u32 
pgd, u32 sect_num,
     return __pa(pte) | PGD_TABLE;
 }
 
+static void mmu_ipu_print_one_pagetable(struct mmu_info *mmu, struct 
mmu_pagetable *pgt, u32 index)
+{
+    u32 i, page_counter = 0;
+    u32 *pagetable;
+
+    ASSERT(pgt);
+    ASSERT(pgt->hyp_pagetable);
+    ASSERT(pgt->paddr);
+    ASSERT(pgt->maddr);
+
+    pagetable = pgt->hyp_pagetable;
+
+    pr_mmu("pgt[%u][0x%08x][0x%08x]", index, pgt->paddr, pgt->maddr);
+    for ( i = 0; i < MMU_PTRS_PER_PGD(mmu); i++ )
+    {
+        u32 pgd = pagetable[i];
+        u32 *pte_table = NULL;
+        u32 j;
+
+        if ( !pgd )
+            continue;
+
+        /* "supersection" 16 Mb */
+        /* "section" 1Mb */
+        if ( ipu_pgd_is_super(pgd) || ipu_pgd_is_section(pgd) )
+        {
+            pr_mmu("pgt[%u][0x%08x][0x%08x] pgd[%u] 0x%08x (max %lu)",
+                   index, pgt->paddr, pgt->maddr, i, pgd, 
MMU_PTRS_PER_PGD(mmu));
+
+        /* "table" */
+        }
+        else if ( ipu_pgd_is_table(pgd) )
+        {
+            pte_table = __va(pgd & 
MMU_SECTION_MASK(MMU_OMAP_SECOND_LEVEL_SHIFT));
+            if ( !pte_table )
+            {
+                pr_mmu("failed to map pagetable");
+                return;
+            }
+
+            for ( j = 0; j < MMU_PTRS_PER_PTE(mmu); j++ )
+            {
+                if ( !pte_table[j] )
+                    continue;
+
+                page_counter++;
+                pr_mmu("pgt[%u][0x%08x][0x%08x] pgd[%u][0x%08x]\t 
pte[%u][0x%08x] (max %lu)",
+                    index, pgt->paddr, pgt->maddr, i, pgd, j, pte_table[j], 
MMU_PTRS_PER_PTE(mmu));
+            }
+        }
+    }
+    ASSERT(page_counter == pgt->page_counter);
+}
+
+static void mmu_ipu_print_pagetables(struct mmu_info *mmu)
+{
+       struct mmu_pagetable *pgt;
+       u32 i = 0;
+
+       list_for_each_entry(pgt, &mmu->pagetables_list, link_node) {
+               mmu_ipu_print_one_pagetable(mmu, pgt, i++);
+       }
+}
+
 static u32 mmu_ipu_translate_pagetable(struct mmu_info *mmu, struct 
mmu_pagetable *pgt)
 {
     u32 *kern_pgt, *hyp_pgt;
-- 
1.7.9.5


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.