This time the IOMMU updates are mostly cleanups or fixes. No big new
features or drivers this time. In particular the changes include:
* Bigger cleanup of the Domain<->IOMMU data structures and the
code that manages them in the Intel VT-d driver. This makes
the code easier to understand and maintain, and also easier to
keep the data structures in sync. It is also a preparation
step to make use of default domains from the IOMMU core in the
Intel VT-d driver.
* Fixes for a couple of DMA-API misuses in ARM IOMMU drivers,
namely in the ARM and Tegra SMMU drivers.
* Fix for a potential buffer overflow in the OMAP iommu driver's
debug code
* A couple of smaller fixes and cleanups in various drivers
* One small new feature: Report domain-id usage in the Intel
VT-d driver to easier detect bugs where these are leaked.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)
iQIcBAABAgAGBQJV7sCEAAoJECvwRC2XARrjz3YP/Au4IIfqykfPvmI0cmPhVnAV
Q72tltwkbK2u2iP+pHheveaMngJtAshsZrnhBon4KJRIt/KTLZQvsFplHDaRhPfY
yw3LIxhC5kLG/S6irY9Ozb0+uTMdQ3BU2uS23pyoFVfCz+RngBrAwDBcTKqZDCDG
8dNd+T21XlzxuyeGr58h9upz2VFtq6feoGFhLU5PNxTlf4JWZe77D7NlbSvx6Nwy
7Ai8dVRgpV9ciUP7w8FXrCUvbMZQDIoTMiWGNSlogVMgA0dllGES91UZYhWf3pil
abuX6DeFul/cOhEOnH2xa+j5zz2O/upe9stU4wAFw6IhPiAELTHc2NKlWAhwb0SY
bpDRf7dgLnUfqpmZLpWjTwN4jllc0qS2MIHj+eUu0uhdFi4Z0BuH2wSCdbR7xkqk
u5u0Jq7hDNKs5FmQTSsWSiAdjakMsRjIN7jMrBbOeZnBSmUnLx74KGPLTb63ncR3
WIOi4Iyu+LSXBIvZDiLu3lIIh7Atzd+y7IDnb8KXdyqfy+h53OZZOJNbP/qTWHgT
ZUdm/qrqjIQpTQfleOEadC7vY/y3fR5sBtOQHUamfntni3oYCc4AMRlNdf3eV9lb
Tyss6F699mU7d/vennTaIToBgVwaXdLYtmvGWjnoT/kqOMclyDf3cIUtZGtp2rJR
ddmzDA3vBUC5pGj8Hd8R
=yoGE
-----END PGP SIGNATURE-----
Merge tag 'iommu-updates-v4.3' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu
Pull iommu updates for from Joerg Roedel:
"This time the IOMMU updates are mostly cleanups or fixes. No big new
features or drivers this time. In particular the changes include:
- Bigger cleanup of the Domain<->IOMMU data structures and the code
that manages them in the Intel VT-d driver. This makes the code
easier to understand and maintain, and also easier to keep the data
structures in sync. It is also a preparation step to make use of
default domains from the IOMMU core in the Intel VT-d driver.
- Fixes for a couple of DMA-API misuses in ARM IOMMU drivers, namely
in the ARM and Tegra SMMU drivers.
- Fix for a potential buffer overflow in the OMAP iommu driver's
debug code
- A couple of smaller fixes and cleanups in various drivers
- One small new feature: Report domain-id usage in the Intel VT-d
driver to easier detect bugs where these are leaked"
* tag 'iommu-updates-v4.3' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu: (83 commits)
iommu/vt-d: Really use upper context table when necessary
x86/vt-d: Fix documentation of DRHD
iommu/fsl: Really fix init section(s) content
iommu/io-pgtable-arm: Unmap and free table when overwriting with block
iommu/io-pgtable-arm: Move init-fn declarations to io-pgtable.h
iommu/msm: Use BUG_ON instead of if () BUG()
iommu/vt-d: Access iomem correctly
iommu/vt-d: Make two functions static
iommu/vt-d: Use BUG_ON instead of if () BUG()
iommu/vt-d: Return false instead of 0 in irq_remapping_cap()
iommu/amd: Use BUG_ON instead of if () BUG()
iommu/amd: Make a symbol static
iommu/amd: Simplify allocation in irq_remapping_alloc()
iommu/tegra-smmu: Parameterize number of TLB lines
iommu/tegra-smmu: Factor out tegra_smmu_set_pde()
iommu/tegra-smmu: Extract tegra_smmu_pte_get_use()
iommu/tegra-smmu: Use __GFP_ZERO to allocate zeroed pages
iommu/tegra-smmu: Remove PageReserved manipulation
iommu/tegra-smmu: Convert to use DMA API
iommu/tegra-smmu: smmu_flush_ptc() wants device addresses
...
122 lines
2.3 KiB
C
122 lines
2.3 KiB
C
/*
|
|
* Copyright (C) 2014 NVIDIA Corporation
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#ifndef __SOC_TEGRA_MC_H__
|
|
#define __SOC_TEGRA_MC_H__
|
|
|
|
#include <linux/types.h>
|
|
|
|
struct clk;
|
|
struct device;
|
|
struct page;
|
|
|
|
struct tegra_smmu_enable {
|
|
unsigned int reg;
|
|
unsigned int bit;
|
|
};
|
|
|
|
struct tegra_mc_timing {
|
|
unsigned long rate;
|
|
|
|
u32 *emem_data;
|
|
};
|
|
|
|
/* latency allowance */
|
|
struct tegra_mc_la {
|
|
unsigned int reg;
|
|
unsigned int shift;
|
|
unsigned int mask;
|
|
unsigned int def;
|
|
};
|
|
|
|
struct tegra_mc_client {
|
|
unsigned int id;
|
|
const char *name;
|
|
unsigned int swgroup;
|
|
|
|
unsigned int fifo_size;
|
|
|
|
struct tegra_smmu_enable smmu;
|
|
struct tegra_mc_la la;
|
|
};
|
|
|
|
struct tegra_smmu_swgroup {
|
|
const char *name;
|
|
unsigned int swgroup;
|
|
unsigned int reg;
|
|
};
|
|
|
|
struct tegra_smmu_soc {
|
|
const struct tegra_mc_client *clients;
|
|
unsigned int num_clients;
|
|
|
|
const struct tegra_smmu_swgroup *swgroups;
|
|
unsigned int num_swgroups;
|
|
|
|
bool supports_round_robin_arbitration;
|
|
bool supports_request_limit;
|
|
|
|
unsigned int num_tlb_lines;
|
|
unsigned int num_asids;
|
|
};
|
|
|
|
struct tegra_mc;
|
|
struct tegra_smmu;
|
|
|
|
#ifdef CONFIG_TEGRA_IOMMU_SMMU
|
|
struct tegra_smmu *tegra_smmu_probe(struct device *dev,
|
|
const struct tegra_smmu_soc *soc,
|
|
struct tegra_mc *mc);
|
|
void tegra_smmu_remove(struct tegra_smmu *smmu);
|
|
#else
|
|
static inline struct tegra_smmu *
|
|
tegra_smmu_probe(struct device *dev, const struct tegra_smmu_soc *soc,
|
|
struct tegra_mc *mc)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline void tegra_smmu_remove(struct tegra_smmu *smmu)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
struct tegra_mc_soc {
|
|
const struct tegra_mc_client *clients;
|
|
unsigned int num_clients;
|
|
|
|
const unsigned long *emem_regs;
|
|
unsigned int num_emem_regs;
|
|
|
|
unsigned int num_address_bits;
|
|
unsigned int atom_size;
|
|
|
|
u8 client_id_mask;
|
|
|
|
const struct tegra_smmu_soc *smmu;
|
|
};
|
|
|
|
struct tegra_mc {
|
|
struct device *dev;
|
|
struct tegra_smmu *smmu;
|
|
void __iomem *regs;
|
|
struct clk *clk;
|
|
int irq;
|
|
|
|
const struct tegra_mc_soc *soc;
|
|
unsigned long tick;
|
|
|
|
struct tegra_mc_timing *timings;
|
|
unsigned int num_timings;
|
|
};
|
|
|
|
void tegra_mc_write_emem_configuration(struct tegra_mc *mc, unsigned long rate);
|
|
unsigned int tegra_mc_get_emem_device_count(struct tegra_mc *mc);
|
|
|
|
#endif /* __SOC_TEGRA_MC_H__ */
|