|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |