cputable.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /*
  2. * arch/ppc64/kernel/cputable.c
  3. *
  4. * Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org)
  5. *
  6. * Modifications for ppc64:
  7. * Copyright (C) 2003 Dave Engebretsen <engebret@us.ibm.com>
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License
  11. * as published by the Free Software Foundation; either version
  12. * 2 of the License, or (at your option) any later version.
  13. */
  14. #include <linux/config.h>
  15. #include <linux/string.h>
  16. #include <linux/sched.h>
  17. #include <linux/threads.h>
  18. #include <linux/init.h>
  19. #include <linux/module.h>
  20. #include <asm/cputable.h>
  21. struct cpu_spec* cur_cpu_spec = NULL;
  22. EXPORT_SYMBOL(cur_cpu_spec);
  23. /* NOTE:
  24. * Unlike ppc32, ppc64 will only call this once for the boot CPU, it's
  25. * the responsibility of the appropriate CPU save/restore functions to
  26. * eventually copy these settings over. Those save/restore aren't yet
  27. * part of the cputable though. That has to be fixed for both ppc32
  28. * and ppc64
  29. */
  30. extern void __setup_cpu_power3(unsigned long offset, struct cpu_spec* spec);
  31. extern void __setup_cpu_power4(unsigned long offset, struct cpu_spec* spec);
  32. extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
  33. extern void __setup_cpu_be(unsigned long offset, struct cpu_spec* spec);
  34. /* We only set the altivec features if the kernel was compiled with altivec
  35. * support
  36. */
  37. #ifdef CONFIG_ALTIVEC
  38. #define CPU_FTR_ALTIVEC_COMP CPU_FTR_ALTIVEC
  39. #define PPC_FEATURE_HAS_ALTIVEC_COMP PPC_FEATURE_HAS_ALTIVEC
  40. #else
  41. #define CPU_FTR_ALTIVEC_COMP 0
  42. #define PPC_FEATURE_HAS_ALTIVEC_COMP 0
  43. #endif
  44. struct cpu_spec cpu_specs[] = {
  45. { /* Power3 */
  46. .pvr_mask = 0xffff0000,
  47. .pvr_value = 0x00400000,
  48. .cpu_name = "POWER3 (630)",
  49. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  50. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
  51. CPU_FTR_PMC8,
  52. .cpu_user_features = COMMON_USER_PPC64,
  53. .icache_bsize = 128,
  54. .dcache_bsize = 128,
  55. .cpu_setup = __setup_cpu_power3,
  56. },
  57. { /* Power3+ */
  58. .pvr_mask = 0xffff0000,
  59. .pvr_value = 0x00410000,
  60. .cpu_name = "POWER3 (630+)",
  61. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  62. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
  63. CPU_FTR_PMC8,
  64. .cpu_user_features = COMMON_USER_PPC64,
  65. .icache_bsize = 128,
  66. .dcache_bsize = 128,
  67. .cpu_setup = __setup_cpu_power3,
  68. },
  69. { /* Northstar */
  70. .pvr_mask = 0xffff0000,
  71. .pvr_value = 0x00330000,
  72. .cpu_name = "RS64-II (northstar)",
  73. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  74. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
  75. CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL,
  76. .cpu_user_features = COMMON_USER_PPC64,
  77. .icache_bsize = 128,
  78. .dcache_bsize = 128,
  79. .cpu_setup = __setup_cpu_power3,
  80. },
  81. { /* Pulsar */
  82. .pvr_mask = 0xffff0000,
  83. .pvr_value = 0x00340000,
  84. .cpu_name = "RS64-III (pulsar)",
  85. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  86. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
  87. CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL,
  88. .cpu_user_features = COMMON_USER_PPC64,
  89. .icache_bsize = 128,
  90. .dcache_bsize = 128,
  91. .cpu_setup = __setup_cpu_power3,
  92. },
  93. { /* I-star */
  94. .pvr_mask = 0xffff0000,
  95. .pvr_value = 0x00360000,
  96. .cpu_name = "RS64-III (icestar)",
  97. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  98. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
  99. CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL,
  100. .cpu_user_features = COMMON_USER_PPC64,
  101. .icache_bsize = 128,
  102. .dcache_bsize = 128,
  103. .cpu_setup = __setup_cpu_power3,
  104. },
  105. { /* S-star */
  106. .pvr_mask = 0xffff0000,
  107. .pvr_value = 0x00370000,
  108. .cpu_name = "RS64-IV (sstar)",
  109. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  110. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
  111. CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL,
  112. .cpu_user_features = COMMON_USER_PPC64,
  113. .icache_bsize = 128,
  114. .dcache_bsize = 128,
  115. .cpu_setup = __setup_cpu_power3,
  116. },
  117. { /* Power4 */
  118. .pvr_mask = 0xffff0000,
  119. .pvr_value = 0x00350000,
  120. .cpu_name = "POWER4 (gp)",
  121. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  122. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
  123. CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
  124. .cpu_user_features = COMMON_USER_PPC64,
  125. .icache_bsize = 128,
  126. .dcache_bsize = 128,
  127. .cpu_setup = __setup_cpu_power4,
  128. },
  129. { /* Power4+ */
  130. .pvr_mask = 0xffff0000,
  131. .pvr_value = 0x00380000,
  132. .cpu_name = "POWER4+ (gq)",
  133. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  134. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
  135. CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
  136. .cpu_user_features = COMMON_USER_PPC64,
  137. .icache_bsize = 128,
  138. .dcache_bsize = 128,
  139. .cpu_setup = __setup_cpu_power4,
  140. },
  141. { /* PPC970 */
  142. .pvr_mask = 0xffff0000,
  143. .pvr_value = 0x00390000,
  144. .cpu_name = "PPC970",
  145. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  146. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
  147. CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
  148. CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
  149. .cpu_user_features = COMMON_USER_PPC64 |
  150. PPC_FEATURE_HAS_ALTIVEC_COMP,
  151. .icache_bsize = 128,
  152. .dcache_bsize = 128,
  153. .cpu_setup = __setup_cpu_ppc970,
  154. },
  155. { /* PPC970FX */
  156. .pvr_mask = 0xffff0000,
  157. .pvr_value = 0x003c0000,
  158. .cpu_name = "PPC970FX",
  159. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  160. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
  161. CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
  162. CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
  163. .cpu_user_features = COMMON_USER_PPC64 |
  164. PPC_FEATURE_HAS_ALTIVEC_COMP,
  165. .icache_bsize = 128,
  166. .dcache_bsize = 128,
  167. .cpu_setup = __setup_cpu_ppc970,
  168. },
  169. { /* PPC970MP */
  170. .pvr_mask = 0xffff0000,
  171. .pvr_value = 0x00440000,
  172. .cpu_name = "PPC970MP",
  173. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  174. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
  175. CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
  176. CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
  177. .cpu_user_features = COMMON_USER_PPC64 |
  178. PPC_FEATURE_HAS_ALTIVEC_COMP,
  179. .icache_bsize = 128,
  180. .dcache_bsize = 128,
  181. .cpu_setup = __setup_cpu_ppc970,
  182. },
  183. { /* Power5 */
  184. .pvr_mask = 0xffff0000,
  185. .pvr_value = 0x003a0000,
  186. .cpu_name = "POWER5 (gr)",
  187. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  188. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
  189. CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT |
  190. CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE |
  191. CPU_FTR_MMCRA_SIHV,
  192. .cpu_user_features = COMMON_USER_PPC64,
  193. .icache_bsize = 128,
  194. .dcache_bsize = 128,
  195. .cpu_setup = __setup_cpu_power4,
  196. },
  197. { /* Power5 */
  198. .pvr_mask = 0xffff0000,
  199. .pvr_value = 0x003b0000,
  200. .cpu_name = "POWER5 (gs)",
  201. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  202. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
  203. CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT |
  204. CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE |
  205. CPU_FTR_MMCRA_SIHV,
  206. .cpu_user_features = COMMON_USER_PPC64,
  207. .icache_bsize = 128,
  208. .dcache_bsize = 128,
  209. .cpu_setup = __setup_cpu_power4,
  210. },
  211. { /* BE DD1.x */
  212. .pvr_mask = 0xffff0000,
  213. .pvr_value = 0x00700000,
  214. .cpu_name = "Broadband Engine",
  215. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  216. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
  217. CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
  218. CPU_FTR_SMT,
  219. .cpu_user_features = COMMON_USER_PPC64 |
  220. PPC_FEATURE_HAS_ALTIVEC_COMP,
  221. .icache_bsize = 128,
  222. .dcache_bsize = 128,
  223. .cpu_setup = __setup_cpu_be,
  224. },
  225. { /* default match */
  226. .pvr_mask = 0x00000000,
  227. .pvr_value = 0x00000000,
  228. .cpu_name = "POWER4 (compatible)",
  229. .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
  230. CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
  231. CPU_FTR_PPCAS_ARCH_V2,
  232. .cpu_user_features = COMMON_USER_PPC64,
  233. .icache_bsize = 128,
  234. .dcache_bsize = 128,
  235. .cpu_setup = __setup_cpu_power4,
  236. }
  237. };