From 0ed70037ea8373ba6e7e4525dd115c0e4389deb9 Mon Sep 17 00:00:00 2001
From: Patrick Daly <pdaly@codeaurora.org>
Date: Mon, 8 Jan 2018 14:28:19 -0800
Subject: [PATCH] lrdp: iommulib: Add fast-map support

Fast map uses a different io-pgtable implementation. Detect this
and use fast-map data structures instead where required.

Change-Id: I2d2cdbd2427aea4ffa4896bbc63b6d57c9c66f32
---
 linux-ramdump-parser-v2/iommulib.py | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/linux-ramdump-parser-v2/iommulib.py b/linux-ramdump-parser-v2/iommulib.py
index 2a772a0..1ca1d6e 100644
--- a/linux-ramdump-parser-v2/iommulib.py
+++ b/linux-ramdump-parser-v2/iommulib.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
+# Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License version 2 and
@@ -97,6 +97,8 @@ class IommuLib(object):
 
         iommu_domain_ops = self.ramdump.read_structure_field(
             domain_ptr, 'struct iommu_domain', 'ops')
+        if iommu_domain_ops is None or iommu_domain_ops == 0:
+            return
 
         if iommu_domain_ops == arm_smmu_ops:
             if priv_ptr is not None:
@@ -107,15 +109,24 @@ class IommuLib(object):
 
             pgtbl_ops_ptr = self.ramdump.read_structure_field(
                 arm_smmu_domain_ptr, 'struct arm_smmu_domain', 'pgtbl_ops')
+            if pgtbl_ops_ptr is None or pgtbl_ops_ptr == 0:
+                return
 
             pg_table = 0
             level = 0
-            if pgtbl_ops_ptr != 0:
-                io_pgtable_ptr = self.ramdump.container_of(
-                    pgtbl_ops_ptr, 'struct io_pgtable', 'ops')
+            fn = self.ramdump.read_structure_field(pgtbl_ops_ptr,
+                    'struct io_pgtable_ops', 'map')
+            if fn == self.ramdump.address_of('av8l_fast_map'):
+                av8l_fast_io_pgtable_ptr = self.ramdump.container_of(
+                    pgtbl_ops_ptr, 'struct av8l_fast_io_pgtable', 'iop.ops')
 
+                pg_table = self.ramdump.read_structure_field(
+                    av8l_fast_io_pgtable_ptr, 'struct av8l_fast_io_pgtable',
+                    'pgd')
+                level = 3
+            else:
                 arm_lpae_io_pgtable_ptr = self.ramdump.container_of(
-                    io_pgtable_ptr, 'struct arm_lpae_io_pgtable', 'iop')
+                    pgtbl_ops_ptr, 'struct arm_lpae_io_pgtable', 'iop.ops')
 
                 pg_table = self.ramdump.read_structure_field(
                     arm_lpae_io_pgtable_ptr, 'struct arm_lpae_io_pgtable',
-- 
GitLab