2014-04-16 09:24:44 +02:00
/*
* 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 ;
} ;
2015-03-12 15:48:02 +01:00
struct tegra_mc_timing {
unsigned long rate ;
u32 * emem_data ;
} ;
2014-04-16 09:24:44 +02:00
/* 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 {
2015-01-23 09:45:35 +01:00
const char * name ;
2014-04-16 09:24:44 +02:00
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 ;
2015-08-06 14:20:31 +02:00
unsigned int num_tlb_lines ;
2014-04-16 09:24:44 +02:00
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 ) ;
2015-01-23 09:49:25 +01:00
void tegra_smmu_remove ( struct tegra_smmu * smmu ) ;
2014-04-16 09:24:44 +02:00
# else
static inline struct tegra_smmu *
tegra_smmu_probe ( struct device * dev , const struct tegra_smmu_soc * soc ,
struct tegra_mc * mc )
{
return NULL ;
}
2015-01-23 09:49:25 +01:00
static inline void tegra_smmu_remove ( struct tegra_smmu * smmu )
{
}
2014-04-16 09:24:44 +02:00
# endif
struct tegra_mc_soc {
const struct tegra_mc_client * clients ;
unsigned int num_clients ;
2015-03-12 15:48:02 +01:00
const unsigned long * emem_regs ;
2014-04-16 09:24:44 +02:00
unsigned int num_emem_regs ;
unsigned int num_address_bits ;
unsigned int atom_size ;
2015-06-04 19:33:48 +00:00
u8 client_id_mask ;
2014-04-16 09:24:44 +02:00
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 ;
2015-03-12 15:48:02 +01:00
struct tegra_mc_timing * timings ;
unsigned int num_timings ;
2014-04-16 09:24:44 +02:00
} ;
2015-03-12 15:48:02 +01:00
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 ) ;
2014-04-16 09:24:44 +02:00
# endif /* __SOC_TEGRA_MC_H__ */