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

[Xen-devel] [PATCH v03 09/10] 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.

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

diff --git a/xen/arch/arm/remoteproc/omap_iommu.c 
b/xen/arch/arm/remoteproc/omap_iommu.c
index f00bfc6..70867e9 100644
--- a/xen/arch/arm/remoteproc/omap_iommu.c
+++ b/xen/arch/arm/remoteproc/omap_iommu.c
@@ -75,6 +75,8 @@ static int mmu_omap_copy_pagetable(struct mmu_info *mmu, 
struct mmu_pagetable *p
 static paddr_t mmu_ipu_translate_pagetable(struct mmu_info *mmu, struct 
mmu_pagetable *pgt);
 static paddr_t mmu_gpu_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,
 };
@@ -107,6 +109,7 @@ struct mmu_info omap_ipu_mmu = {
     .num_traps          = ARRAY_SIZE(ipu_trap_offsets),
     .copy_pagetable_pfunc      = mmu_omap_copy_pagetable,
     .translate_pfunc   = mmu_ipu_translate_pagetable,
+    .print_pagetable_pfunc  = mmu_ipu_print_pagetables,
 };
 
 static const struct pagetable_data pagetable_gpu_data = {
@@ -226,6 +229,71 @@ static paddr_t mmu_pte_table_alloc(struct mmu_info *mmu, 
paddr_t pgd, u32 sect_n
     return __pa(pte) | IPU_PGD_TABLE;
 }
 
+static void mmu_ipu_print_one_pagetable(struct mmu_info *mmu, struct 
mmu_pagetable *pgt, u32 index)
+{
+    u32 *pagetable;
+    u32 i, page_counter = 0;
+
+    ASSERT(pgt);
+    ASSERT(pgt->hyp_pagetable);
+    ASSERT(pgt->paddr);
+    ASSERT(pgt->maddr);
+
+    pagetable = pgt->hyp_pagetable;
+
+    pr_mmu(mmu, "pgt[%u][0x%"PRIpaddr"][0x%"PRIpaddr"]", index, pgt->paddr, 
pgt->maddr);
+    for ( i = 0; i < MMU_PTRS_PER_PGD(mmu); i++ )
+    {
+        paddr_t pgd = pagetable[i];
+        paddr_t *pte_table = NULL;
+
+        if ( !pgd )
+            continue;
+
+        /* "supersection" 16 Mb */
+        /* "section" 1Mb */
+        if ( ipu_pgd_is_super(pgd) || ipu_pgd_is_section(pgd) )
+        {
+            pr_mmu(mmu, "pgt[%u][0x%"PRIpaddr"][0x%"PRIpaddr"] pgd[%u] 
0x%"PRIpaddr" (max %lu)",
+                   index, pgt->paddr, pgt->maddr, i, pgd, 
MMU_PTRS_PER_PGD(mmu));
+
+        /* "table" */
+        }
+        else if ( ipu_pgd_is_table(pgd) )
+        {
+            u32 j;
+
+            pte_table = __va(pgd & 
MMU_SECTION_MASK(MMU_OMAP_SECOND_LEVEL_SHIFT));
+            if ( !pte_table )
+            {
+                pr_mmu(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(mmu, "pgt[%u][0x%"PRIpaddr"][0x%"PRIpaddr"] 
pgd[%u][0x%"PRIpaddr"]\t pte[%u][0x%"PRIpaddr"] (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 paddr_t mmu_ipu_translate_pagetable(struct mmu_info *mmu, struct 
mmu_pagetable *pgt)
 {
     /* IPU pagetable consists of set of 32 bit pointers */
-- 
1.9.1


_______________________________________________
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®.