108 lines
		
	
	
	
		
			2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			108 lines
		
	
	
	
		
			2 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;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* 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 {
							 | 
						||
| 
								 | 
							
									unsigned int swgroup;
							 | 
						||
| 
								 | 
							
									unsigned int reg;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct tegra_smmu_ops {
							 | 
						||
| 
								 | 
							
									void (*flush_dcache)(struct page *page, unsigned long offset,
							 | 
						||
| 
								 | 
							
											     size_t size);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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_asids;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const struct tegra_smmu_ops *ops;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								static inline struct tegra_smmu *
							 | 
						||
| 
								 | 
							
								tegra_smmu_probe(struct device *dev, const struct tegra_smmu_soc *soc,
							 | 
						||
| 
								 | 
							
										 struct tegra_mc *mc)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return NULL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct tegra_mc_soc {
							 | 
						||
| 
								 | 
							
									const struct tegra_mc_client *clients;
							 | 
						||
| 
								 | 
							
									unsigned int num_clients;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const unsigned int *emem_regs;
							 | 
						||
| 
								 | 
							
									unsigned int num_emem_regs;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									unsigned int num_address_bits;
							 | 
						||
| 
								 | 
							
									unsigned int atom_size;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									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;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* __SOC_TEGRA_MC_H__ */
							 |