1 /* 2 * Copyright (C) 2014 NVIDIA Corporation 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 */ 8 9 #ifndef __SOC_TEGRA_MC_H__ 10 #define __SOC_TEGRA_MC_H__ 11 12 #include <linux/types.h> 13 14 struct clk; 15 struct device; 16 struct page; 17 18 struct tegra_smmu_enable { 19 unsigned int reg; 20 unsigned int bit; 21 }; 22 23 /* latency allowance */ 24 struct tegra_mc_la { 25 unsigned int reg; 26 unsigned int shift; 27 unsigned int mask; 28 unsigned int def; 29 }; 30 31 struct tegra_mc_client { 32 unsigned int id; 33 const char *name; 34 unsigned int swgroup; 35 36 unsigned int fifo_size; 37 38 struct tegra_smmu_enable smmu; 39 struct tegra_mc_la la; 40 }; 41 42 struct tegra_smmu_swgroup { 43 unsigned int swgroup; 44 unsigned int reg; 45 }; 46 47 struct tegra_smmu_ops { 48 void (*flush_dcache)(struct page *page, unsigned long offset, 49 size_t size); 50 }; 51 52 struct tegra_smmu_soc { 53 const struct tegra_mc_client *clients; 54 unsigned int num_clients; 55 56 const struct tegra_smmu_swgroup *swgroups; 57 unsigned int num_swgroups; 58 59 bool supports_round_robin_arbitration; 60 bool supports_request_limit; 61 62 unsigned int num_asids; 63 64 const struct tegra_smmu_ops *ops; 65 }; 66 67 struct tegra_mc; 68 struct tegra_smmu; 69 70 #ifdef CONFIG_TEGRA_IOMMU_SMMU 71 struct tegra_smmu *tegra_smmu_probe(struct device *dev, 72 const struct tegra_smmu_soc *soc, 73 struct tegra_mc *mc); 74 #else 75 static inline struct tegra_smmu * 76 tegra_smmu_probe(struct device *dev, const struct tegra_smmu_soc *soc, 77 struct tegra_mc *mc) 78 { 79 return NULL; 80 } 81 #endif 82 83 struct tegra_mc_soc { 84 const struct tegra_mc_client *clients; 85 unsigned int num_clients; 86 87 const unsigned int *emem_regs; 88 unsigned int num_emem_regs; 89 90 unsigned int num_address_bits; 91 unsigned int atom_size; 92 93 const struct tegra_smmu_soc *smmu; 94 }; 95 96 struct tegra_mc { 97 struct device *dev; 98 struct tegra_smmu *smmu; 99 void __iomem *regs; 100 struct clk *clk; 101 int irq; 102 103 const struct tegra_mc_soc *soc; 104 unsigned long tick; 105 }; 106 107 #endif /* __SOC_TEGRA_MC_H__ */ 108