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