blob: b3dc77e3eac60ecc8ae92ab435d0f353b6036b0f [file] [log] [blame]
/* 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