at v5.13-rc2 221 lines 4.7 kB view raw
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Copyright (C) 2014 NVIDIA Corporation 4 */ 5 6#ifndef __SOC_TEGRA_MC_H__ 7#define __SOC_TEGRA_MC_H__ 8 9#include <linux/bits.h> 10#include <linux/debugfs.h> 11#include <linux/err.h> 12#include <linux/interconnect-provider.h> 13#include <linux/reset-controller.h> 14#include <linux/types.h> 15 16struct clk; 17struct device; 18struct page; 19 20struct tegra_smmu_enable { 21 unsigned int reg; 22 unsigned int bit; 23}; 24 25struct tegra_mc_timing { 26 unsigned long rate; 27 28 u32 *emem_data; 29}; 30 31/* latency allowance */ 32struct tegra_mc_la { 33 unsigned int reg; 34 unsigned int shift; 35 unsigned int mask; 36 unsigned int def; 37}; 38 39struct tegra_mc_client { 40 unsigned int id; 41 const char *name; 42 unsigned int swgroup; 43 44 unsigned int fifo_size; 45 46 struct tegra_smmu_enable smmu; 47 struct tegra_mc_la la; 48}; 49 50struct tegra_smmu_swgroup { 51 const char *name; 52 unsigned int swgroup; 53 unsigned int reg; 54}; 55 56struct tegra_smmu_group_soc { 57 const char *name; 58 const unsigned int *swgroups; 59 unsigned int num_swgroups; 60}; 61 62struct tegra_smmu_soc { 63 const struct tegra_mc_client *clients; 64 unsigned int num_clients; 65 66 const struct tegra_smmu_swgroup *swgroups; 67 unsigned int num_swgroups; 68 69 const struct tegra_smmu_group_soc *groups; 70 unsigned int num_groups; 71 72 bool supports_round_robin_arbitration; 73 bool supports_request_limit; 74 75 unsigned int num_tlb_lines; 76 unsigned int num_asids; 77}; 78 79struct tegra_mc; 80struct tegra_smmu; 81struct gart_device; 82 83#ifdef CONFIG_TEGRA_IOMMU_SMMU 84struct tegra_smmu *tegra_smmu_probe(struct device *dev, 85 const struct tegra_smmu_soc *soc, 86 struct tegra_mc *mc); 87void tegra_smmu_remove(struct tegra_smmu *smmu); 88#else 89static inline struct tegra_smmu * 90tegra_smmu_probe(struct device *dev, const struct tegra_smmu_soc *soc, 91 struct tegra_mc *mc) 92{ 93 return NULL; 94} 95 96static inline void tegra_smmu_remove(struct tegra_smmu *smmu) 97{ 98} 99#endif 100 101#ifdef CONFIG_TEGRA_IOMMU_GART 102struct gart_device *tegra_gart_probe(struct device *dev, struct tegra_mc *mc); 103int tegra_gart_suspend(struct gart_device *gart); 104int tegra_gart_resume(struct gart_device *gart); 105#else 106static inline struct gart_device * 107tegra_gart_probe(struct device *dev, struct tegra_mc *mc) 108{ 109 return ERR_PTR(-ENODEV); 110} 111 112static inline int tegra_gart_suspend(struct gart_device *gart) 113{ 114 return -ENODEV; 115} 116 117static inline int tegra_gart_resume(struct gart_device *gart) 118{ 119 return -ENODEV; 120} 121#endif 122 123struct tegra_mc_reset { 124 const char *name; 125 unsigned long id; 126 unsigned int control; 127 unsigned int status; 128 unsigned int reset; 129 unsigned int bit; 130}; 131 132struct tegra_mc_reset_ops { 133 int (*hotreset_assert)(struct tegra_mc *mc, 134 const struct tegra_mc_reset *rst); 135 int (*hotreset_deassert)(struct tegra_mc *mc, 136 const struct tegra_mc_reset *rst); 137 int (*block_dma)(struct tegra_mc *mc, 138 const struct tegra_mc_reset *rst); 139 bool (*dma_idling)(struct tegra_mc *mc, 140 const struct tegra_mc_reset *rst); 141 int (*unblock_dma)(struct tegra_mc *mc, 142 const struct tegra_mc_reset *rst); 143 int (*reset_status)(struct tegra_mc *mc, 144 const struct tegra_mc_reset *rst); 145}; 146 147#define TEGRA_MC_ICC_TAG_DEFAULT 0 148#define TEGRA_MC_ICC_TAG_ISO BIT(0) 149 150struct tegra_mc_icc_ops { 151 int (*set)(struct icc_node *src, struct icc_node *dst); 152 int (*aggregate)(struct icc_node *node, u32 tag, u32 avg_bw, 153 u32 peak_bw, u32 *agg_avg, u32 *agg_peak); 154 struct icc_node_data *(*xlate_extended)(struct of_phandle_args *spec, 155 void *data); 156}; 157 158struct tegra_mc_soc { 159 const struct tegra_mc_client *clients; 160 unsigned int num_clients; 161 162 const unsigned long *emem_regs; 163 unsigned int num_emem_regs; 164 165 unsigned int num_address_bits; 166 unsigned int atom_size; 167 168 u8 client_id_mask; 169 170 const struct tegra_smmu_soc *smmu; 171 172 u32 intmask; 173 174 const struct tegra_mc_reset_ops *reset_ops; 175 const struct tegra_mc_reset *resets; 176 unsigned int num_resets; 177 178 const struct tegra_mc_icc_ops *icc_ops; 179 180 int (*init)(struct tegra_mc *mc); 181}; 182 183struct tegra_mc { 184 struct device *dev; 185 struct tegra_smmu *smmu; 186 struct gart_device *gart; 187 void __iomem *regs; 188 struct clk *clk; 189 int irq; 190 191 const struct tegra_mc_soc *soc; 192 unsigned long tick; 193 194 struct tegra_mc_timing *timings; 195 unsigned int num_timings; 196 197 struct reset_controller_dev reset; 198 199 struct icc_provider provider; 200 201 spinlock_t lock; 202 203 struct { 204 struct dentry *root; 205 } debugfs; 206}; 207 208int tegra_mc_write_emem_configuration(struct tegra_mc *mc, unsigned long rate); 209unsigned int tegra_mc_get_emem_device_count(struct tegra_mc *mc); 210 211#ifdef CONFIG_TEGRA_MC 212struct tegra_mc *devm_tegra_memory_controller_get(struct device *dev); 213#else 214static inline struct tegra_mc * 215devm_tegra_memory_controller_get(struct device *dev) 216{ 217 return ERR_PTR(-ENODEV); 218} 219#endif 220 221#endif /* __SOC_TEGRA_MC_H__ */