[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 |