]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
iommu/tegra: smmu: print queried page contents in iova_to_phys
authorSri Krishna chowdary <schowdary@nvidia.com>
Wed, 4 Feb 2015 10:36:19 +0000 (16:06 +0530)
committerSri Krishna Chowdary <schowdary@nvidia.com>
Wed, 11 Feb 2015 03:54:48 +0000 (19:54 -0800)
sample output on cat:

$ cat /d/70019000.iommu/as000/iova_to_phys
iova=0x0000000080047000 pa=0x0000000139431000 bytes=1000 npte=251

0x0000000139431000: 0x80043400 0x00000000 0x00000040 0x00000000
0x0000000139431010: 0x00000000 0x00000000 0x00000000 0x00000000
.
.
0x0000000139431ff0: 0x00000000 0x00000000 0x00000000 0x00000000

Bug 200068466

Change-Id: Idf33a9dd8c42e89c3b223733c389e7f8bae8ca7e
Signed-off-by: Sri Krishna chowdary <schowdary@nvidia.com>
Reviewed-on: http://git-master/r/681151
Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>
drivers/iommu/tegra-smmu.c

index 0742f5562c868b73019172eaae1d4465b043adf9..882745fb0dd7ff9d6dde68818226e70e36c02198 100644 (file)
@@ -1953,6 +1953,36 @@ static phys_addr_t tegra_smmu_inquired_phys;
 static size_t tegra_smmu_inquired_bytes;
 static int tegra_smmu_inquired_npte;
 
+static void smmu_dump_phys_page(struct seq_file *m, phys_addr_t phys)
+{
+       ulong addr, base;
+       phys_addr_t paddr;
+       ulong offset;
+
+       offset = round_down(phys & ~PAGE_MASK, 16);
+
+       base = (ulong) kmap(phys_to_page(phys));
+       addr = round_down(base + (phys & ~PAGE_MASK), 16);
+       paddr = (phys & PAGE_MASK) + (addr - base);
+
+       for (; addr < base + PAGE_SIZE; addr += 16, paddr += 16) {
+               u32 *ptr = (u32 *)addr;
+               char buffer[127];
+               snprintf(buffer, 127,
+                        "%pa: 0x%08x 0x%08x 0x%08x 0x%08x",
+                        &paddr, *ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3));
+               if (m)
+                       seq_printf(m, "\n%s", buffer);
+               else
+                       pr_debug("\n%s", buffer);
+       }
+       kunmap(phys_to_page(phys));
+       if (m)
+               seq_printf(m, "\n");
+       else
+               pr_debug("\n");
+}
+
 static int smmu_iova2pa_show(struct seq_file *m, void *v)
 {
        seq_printf(m, "iova=%pa pa=%pa bytes=%zx npte=%d\n",
@@ -1960,6 +1990,9 @@ static int smmu_iova2pa_show(struct seq_file *m, void *v)
                   &tegra_smmu_inquired_phys,
                   tegra_smmu_inquired_bytes,
                   tegra_smmu_inquired_npte);
+
+       /* pass m if you want to print in seq file */
+       smmu_dump_phys_page(NULL, tegra_smmu_inquired_phys);
        return 0;
 }