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__
2018-04-13 14:33:49 +03:00
# include <linux/reset-controller.h>
2014-04-16 09:24:44 +02:00
# 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 ;
} ;
2017-10-12 16:29:19 +02:00
struct tegra_smmu_group_soc {
const char * name ;
const unsigned int * swgroups ;
unsigned int num_swgroups ;
} ;
2014-04-16 09:24:44 +02:00
struct tegra_smmu_soc {
const struct tegra_mc_client * clients ;
unsigned int num_clients ;
const struct tegra_smmu_swgroup * swgroups ;
unsigned int num_swgroups ;
2017-10-12 16:29:19 +02:00
const struct tegra_smmu_group_soc * groups ;
unsigned int num_groups ;
2014-04-16 09:24:44 +02:00
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
2018-04-13 14:33:49 +03:00
struct tegra_mc_reset {
const char * name ;
unsigned long id ;
unsigned int control ;
unsigned int status ;
unsigned int reset ;
unsigned int bit ;
} ;
struct tegra_mc_reset_ops {
int ( * hotreset_assert ) ( struct tegra_mc * mc ,
const struct tegra_mc_reset * rst ) ;
int ( * hotreset_deassert ) ( struct tegra_mc * mc ,
const struct tegra_mc_reset * rst ) ;
int ( * block_dma ) ( struct tegra_mc * mc ,
const struct tegra_mc_reset * rst ) ;
bool ( * dma_idling ) ( struct tegra_mc * mc ,
const struct tegra_mc_reset * rst ) ;
int ( * unblock_dma ) ( struct tegra_mc * mc ,
const struct tegra_mc_reset * rst ) ;
int ( * reset_status ) ( struct tegra_mc * mc ,
const struct tegra_mc_reset * rst ) ;
} ;
2014-04-16 09:24:44 +02:00
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 ;
2018-04-09 22:28:29 +03:00
u32 intmask ;
2018-04-13 14:33:49 +03:00
const struct tegra_mc_reset_ops * reset_ops ;
const struct tegra_mc_reset * resets ;
unsigned int num_resets ;
2014-04-16 09:24:44 +02:00
} ;
struct tegra_mc {
struct device * dev ;
struct tegra_smmu * smmu ;
2018-12-12 23:38:52 +03:00
void __iomem * regs ;
2014-04-16 09:24:44 +02:00
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 ;
2018-04-13 14:33:49 +03:00
struct reset_controller_dev reset ;
spinlock_t lock ;
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__ */