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 14struct clk; 15struct device; 16struct page; 17 18struct tegra_smmu_enable { 19 unsigned int reg; 20 unsigned int bit; 21}; 22 23/* latency allowance */ 24struct tegra_mc_la { 25 unsigned int reg; 26 unsigned int shift; 27 unsigned int mask; 28 unsigned int def; 29}; 30 31struct 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 42struct tegra_smmu_swgroup { 43 unsigned int swgroup; 44 unsigned int reg; 45}; 46 47struct tegra_smmu_ops { 48 void (*flush_dcache)(struct page *page, unsigned long offset, 49 size_t size); 50}; 51 52struct 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_tlb_lines; 63 unsigned int num_asids; 64 65 const struct tegra_smmu_ops *ops; 66}; 67 68struct tegra_mc; 69struct tegra_smmu; 70 71#ifdef CONFIG_TEGRA_IOMMU_SMMU 72struct tegra_smmu *tegra_smmu_probe(struct device *dev, 73 const struct tegra_smmu_soc *soc, 74 struct tegra_mc *mc); 75#else 76static inline struct tegra_smmu * 77tegra_smmu_probe(struct device *dev, const struct tegra_smmu_soc *soc, 78 struct tegra_mc *mc) 79{ 80 return NULL; 81} 82#endif 83 84struct tegra_mc_soc { 85 const struct tegra_mc_client *clients; 86 unsigned int num_clients; 87 88 const unsigned int *emem_regs; 89 unsigned int num_emem_regs; 90 91 unsigned int num_address_bits; 92 unsigned int atom_size; 93 94 const struct tegra_smmu_soc *smmu; 95}; 96 97struct tegra_mc { 98 struct device *dev; 99 struct tegra_smmu *smmu; 100 void __iomem *regs; 101 struct clk *clk; 102 int irq; 103 104 const struct tegra_mc_soc *soc; 105 unsigned long tick; 106}; 107 108#endif /* __SOC_TEGRA_MC_H__ */ 109