mc.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2014 NVIDIA CORPORATION. All rights reserved.
  4. */
  5. #ifndef MEMORY_TEGRA_MC_H
  6. #define MEMORY_TEGRA_MC_H
  7. #include <linux/bits.h>
  8. #include <linux/io.h>
  9. #include <linux/types.h>
  10. #include <soc/tegra/mc.h>
  11. #define MC_INTSTATUS 0x00
  12. #define MC_INTMASK 0x04
  13. #define MC_ERR_STATUS 0x08
  14. #define MC_ERR_ADR 0x0c
  15. #define MC_GART_ERROR_REQ 0x30
  16. #define MC_EMEM_ADR_CFG 0x54
  17. #define MC_DECERR_EMEM_OTHERS_STATUS 0x58
  18. #define MC_SECURITY_VIOLATION_STATUS 0x74
  19. #define MC_EMEM_ARB_CFG 0x90
  20. #define MC_EMEM_ARB_OUTSTANDING_REQ 0x94
  21. #define MC_EMEM_ARB_TIMING_RCD 0x98
  22. #define MC_EMEM_ARB_TIMING_RP 0x9c
  23. #define MC_EMEM_ARB_TIMING_RC 0xa0
  24. #define MC_EMEM_ARB_TIMING_RAS 0xa4
  25. #define MC_EMEM_ARB_TIMING_FAW 0xa8
  26. #define MC_EMEM_ARB_TIMING_RRD 0xac
  27. #define MC_EMEM_ARB_TIMING_RAP2PRE 0xb0
  28. #define MC_EMEM_ARB_TIMING_WAP2PRE 0xb4
  29. #define MC_EMEM_ARB_TIMING_R2R 0xb8
  30. #define MC_EMEM_ARB_TIMING_W2W 0xbc
  31. #define MC_EMEM_ARB_TIMING_R2W 0xc0
  32. #define MC_EMEM_ARB_TIMING_W2R 0xc4
  33. #define MC_EMEM_ARB_MISC2 0xc8
  34. #define MC_EMEM_ARB_DA_TURNS 0xd0
  35. #define MC_EMEM_ARB_DA_COVERS 0xd4
  36. #define MC_EMEM_ARB_MISC0 0xd8
  37. #define MC_EMEM_ARB_MISC1 0xdc
  38. #define MC_EMEM_ARB_RING1_THROTTLE 0xe0
  39. #define MC_EMEM_ARB_OVERRIDE 0xe8
  40. #define MC_TIMING_CONTROL_DBG 0xf8
  41. #define MC_TIMING_CONTROL 0xfc
  42. #define MC_ERR_VPR_STATUS 0x654
  43. #define MC_ERR_VPR_ADR 0x658
  44. #define MC_ERR_SEC_STATUS 0x67c
  45. #define MC_ERR_SEC_ADR 0x680
  46. #define MC_ERR_MTS_STATUS 0x9b0
  47. #define MC_ERR_MTS_ADR 0x9b4
  48. #define MC_ERR_ROUTE_SANITY_STATUS 0x9c0
  49. #define MC_ERR_ROUTE_SANITY_ADR 0x9c4
  50. #define MC_ERR_GENERALIZED_CARVEOUT_STATUS 0xc00
  51. #define MC_ERR_GENERALIZED_CARVEOUT_ADR 0xc04
  52. #define MC_GLOBAL_INTSTATUS 0xf24
  53. #define MC_ERR_ADR_HI 0x11fc
  54. #define MC_INT_DECERR_ROUTE_SANITY BIT(20)
  55. #define MC_INT_DECERR_GENERALIZED_CARVEOUT BIT(17)
  56. #define MC_INT_DECERR_MTS BIT(16)
  57. #define MC_INT_SECERR_SEC BIT(13)
  58. #define MC_INT_DECERR_VPR BIT(12)
  59. #define MC_INT_INVALID_APB_ASID_UPDATE BIT(11)
  60. #define MC_INT_INVALID_SMMU_PAGE BIT(10)
  61. #define MC_INT_ARBITRATION_EMEM BIT(9)
  62. #define MC_INT_SECURITY_VIOLATION BIT(8)
  63. #define MC_INT_INVALID_GART_PAGE BIT(7)
  64. #define MC_INT_DECERR_EMEM BIT(6)
  65. #define MC_ERR_STATUS_TYPE_SHIFT 28
  66. #define MC_ERR_STATUS_TYPE_INVALID_SMMU_PAGE (0x6 << 28)
  67. #define MC_ERR_STATUS_TYPE_MASK (0x7 << 28)
  68. #define MC_ERR_STATUS_READABLE BIT(27)
  69. #define MC_ERR_STATUS_WRITABLE BIT(26)
  70. #define MC_ERR_STATUS_NONSECURE BIT(25)
  71. #define MC_ERR_STATUS_ADR_HI_SHIFT 20
  72. #define MC_ERR_STATUS_ADR_HI_MASK 0x3
  73. #define MC_ERR_STATUS_SECURITY BIT(17)
  74. #define MC_ERR_STATUS_RW BIT(16)
  75. #define MC_EMEM_ADR_CFG_EMEM_NUMDEV BIT(0)
  76. #define MC_EMEM_ARB_CFG_CYCLES_PER_UPDATE(x) ((x) & 0x1ff)
  77. #define MC_EMEM_ARB_CFG_CYCLES_PER_UPDATE_MASK 0x1ff
  78. #define MC_EMEM_ARB_OUTSTANDING_REQ_MAX_MASK 0x1ff
  79. #define MC_EMEM_ARB_OUTSTANDING_REQ_HOLDOFF_OVERRIDE BIT(30)
  80. #define MC_EMEM_ARB_OUTSTANDING_REQ_LIMIT_ENABLE BIT(31)
  81. #define MC_EMEM_ARB_OVERRIDE_EACK_MASK 0x3
  82. #define MC_TIMING_UPDATE BIT(0)
  83. #define MC_BROADCAST_CHANNEL ~0
  84. static inline u32 tegra_mc_scale_percents(u64 val, unsigned int percents)
  85. {
  86. val = val * percents;
  87. do_div(val, 100);
  88. return min_t(u64, val, U32_MAX);
  89. }
  90. static inline struct tegra_mc *
  91. icc_provider_to_tegra_mc(struct icc_provider *provider)
  92. {
  93. return container_of(provider, struct tegra_mc, provider);
  94. }
  95. static inline u32 mc_ch_readl(const struct tegra_mc *mc, int ch,
  96. unsigned long offset)
  97. {
  98. if (!mc->bcast_ch_regs)
  99. return 0;
  100. if (ch == MC_BROADCAST_CHANNEL)
  101. return readl_relaxed(mc->bcast_ch_regs + offset);
  102. return readl_relaxed(mc->ch_regs[ch] + offset);
  103. }
  104. static inline void mc_ch_writel(const struct tegra_mc *mc, int ch,
  105. u32 value, unsigned long offset)
  106. {
  107. if (!mc->bcast_ch_regs)
  108. return;
  109. if (ch == MC_BROADCAST_CHANNEL)
  110. writel_relaxed(value, mc->bcast_ch_regs + offset);
  111. else
  112. writel_relaxed(value, mc->ch_regs[ch] + offset);
  113. }
  114. static inline u32 mc_readl(const struct tegra_mc *mc, unsigned long offset)
  115. {
  116. return readl_relaxed(mc->regs + offset);
  117. }
  118. static inline void mc_writel(const struct tegra_mc *mc, u32 value,
  119. unsigned long offset)
  120. {
  121. writel_relaxed(value, mc->regs + offset);
  122. }
  123. extern const struct tegra_mc_reset_ops tegra_mc_reset_ops_common;
  124. #ifdef CONFIG_ARCH_TEGRA_2x_SOC
  125. extern const struct tegra_mc_soc tegra20_mc_soc;
  126. #endif
  127. #ifdef CONFIG_ARCH_TEGRA_3x_SOC
  128. extern const struct tegra_mc_soc tegra30_mc_soc;
  129. #endif
  130. #ifdef CONFIG_ARCH_TEGRA_114_SOC
  131. extern const struct tegra_mc_soc tegra114_mc_soc;
  132. #endif
  133. #ifdef CONFIG_ARCH_TEGRA_124_SOC
  134. extern const struct tegra_mc_soc tegra124_mc_soc;
  135. #endif
  136. #ifdef CONFIG_ARCH_TEGRA_132_SOC
  137. extern const struct tegra_mc_soc tegra132_mc_soc;
  138. #endif
  139. #ifdef CONFIG_ARCH_TEGRA_210_SOC
  140. extern const struct tegra_mc_soc tegra210_mc_soc;
  141. #endif
  142. #ifdef CONFIG_ARCH_TEGRA_186_SOC
  143. extern const struct tegra_mc_soc tegra186_mc_soc;
  144. #endif
  145. #ifdef CONFIG_ARCH_TEGRA_194_SOC
  146. extern const struct tegra_mc_soc tegra194_mc_soc;
  147. #endif
  148. #ifdef CONFIG_ARCH_TEGRA_234_SOC
  149. extern const struct tegra_mc_soc tegra234_mc_soc;
  150. #endif
  151. #if defined(CONFIG_ARCH_TEGRA_3x_SOC) || \
  152. defined(CONFIG_ARCH_TEGRA_114_SOC) || \
  153. defined(CONFIG_ARCH_TEGRA_124_SOC) || \
  154. defined(CONFIG_ARCH_TEGRA_132_SOC) || \
  155. defined(CONFIG_ARCH_TEGRA_210_SOC)
  156. int tegra30_mc_probe(struct tegra_mc *mc);
  157. extern const struct tegra_mc_ops tegra30_mc_ops;
  158. #endif
  159. #if defined(CONFIG_ARCH_TEGRA_186_SOC) || \
  160. defined(CONFIG_ARCH_TEGRA_194_SOC) || \
  161. defined(CONFIG_ARCH_TEGRA_234_SOC)
  162. extern const struct tegra_mc_ops tegra186_mc_ops;
  163. #endif
  164. irqreturn_t tegra30_mc_handle_irq(int irq, void *data);
  165. extern const char * const tegra_mc_status_names[32];
  166. extern const char * const tegra_mc_error_names[8];
  167. /*
  168. * These IDs are for internal use of Tegra ICC drivers. The ID numbers are
  169. * chosen such that they don't conflict with the device-tree ICC node IDs.
  170. */
  171. #define TEGRA_ICC_MC 1000
  172. #define TEGRA_ICC_EMC 1001
  173. #define TEGRA_ICC_EMEM 1002
  174. #endif /* MEMORY_TEGRA_MC_H */