/* Copyright (c) 2013-2015, 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 * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef MSM_IOMMU_PRIV_H #define MSM_IOMMU_PRIV_H /** * struct msm_iommu_pt - Container for first level page table and its * attributes. * fl_table: Pointer to the first level page table. * redirect: Set to 1 if L2 redirect for page tables are enabled, 0 otherwise. * unaligned_fl_table: Original address of memory for the page table. * fl_table is manually aligned (as per spec) but we need the original address * to free the table. * fl_table_shadow: This is "copy" of the fl_table with some differences. * It stores the same information as fl_table except that instead of storing * second level page table address + page table entry descriptor bits it * stores the second level page table address and the number of used second * level page tables entries. This is used to check whether we need to free * the second level page table which allows us to also free the second level * page table after doing a TLB invalidate which should catch bugs with * clients trying to unmap an address that is being used. * fl_table_shadow will use the lower 9 bits for the use count and the upper * bits for the second level page table address. * sl_table_shadow uses the same concept as fl_table_shadow but for LPAE 2nd * level page tables. */ #if defined(CONFIG_IOMMU_LPAE) || defined(CONFIG_IOMMU_AARCH64) struct msm_iommu_pt { u64 *fl_table; u64 **sl_table_shadow; int redirect; u64 *unaligned_fl_table; }; #else struct msm_iommu_pt { u32 *fl_table; int redirect; u32 *fl_table_shadow; }; #endif /** * struct msm_iommu_priv - Container for page table attributes and other * private iommu domain information. * attributes. * pt: Page table attribute structure * list_attached: List of devices (contexts) attached to this domain. * client_name: Name of the domain client. * procid: Procid used by the clients * asid: Unique asid assigned to each domain * attributes: Attributes associated with domains, like DYNAMIC attributes * base: If the domain is dynamic in nature, it must point to its base domain */ struct msm_iommu_priv { struct msm_iommu_pt pt; struct list_head list_attached; const char *client_name; u32 procid; u32 asid; u32 attributes; struct iommu_domain *base; }; #endif