cpu_32.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /* cpu.c: Dinky routines to look for the kind of Sparc cpu
  2. * we are on.
  3. *
  4. * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
  5. */
  6. #include <linux/kernel.h>
  7. #include <linux/init.h>
  8. #include <linux/smp.h>
  9. #include <linux/threads.h>
  10. #include <asm/oplib.h>
  11. #include <asm/page.h>
  12. #include <asm/head.h>
  13. #include <asm/psr.h>
  14. #include <asm/mbus.h>
  15. #include <asm/cpudata.h>
  16. DEFINE_PER_CPU(cpuinfo_sparc, __cpu_data) = { 0 };
  17. struct cpu_iu_info {
  18. int psr_impl;
  19. int psr_vers;
  20. char *cpu_name; /* should be enough I hope... */
  21. };
  22. struct cpu_fp_info {
  23. int psr_impl;
  24. int fp_vers;
  25. char *fp_name;
  26. };
  27. /* In order to get the fpu type correct, you need to take the IDPROM's
  28. * machine type value into consideration too. I will fix this.
  29. */
  30. #define CPU_FP(psr, ver, name) \
  31. { .psr_impl = (psr), .fp_vers = (ver), .fp_name = (name) }
  32. static struct cpu_fp_info linux_sparc_fpu[] = {
  33. CPU_FP(0, 0, "Fujitsu MB86910 or Weitek WTL1164/5"),
  34. CPU_FP(0, 1, "Fujitsu MB86911 or Weitek WTL1164/5 or LSI L64831"),
  35. CPU_FP(0, 2, "LSI Logic L64802 or Texas Instruments ACT8847"),
  36. /* SparcStation SLC, SparcStation1 */
  37. CPU_FP(0, 3, "Weitek WTL3170/2"),
  38. /* SPARCstation-5 */
  39. CPU_FP(0, 4, "Lsi Logic/Meiko L64804 or compatible"),
  40. CPU_FP(0, 5, "reserved"),
  41. CPU_FP(0, 6, "reserved"),
  42. CPU_FP(0, 7, "No FPU"),
  43. CPU_FP(1, 0, "ROSS HyperSparc combined IU/FPU"),
  44. CPU_FP(1, 1, "Lsi Logic L64814"),
  45. CPU_FP(1, 2, "Texas Instruments TMS390-C602A"),
  46. CPU_FP(1, 3, "Cypress CY7C602 FPU"),
  47. CPU_FP(1, 4, "reserved"),
  48. CPU_FP(1, 5, "reserved"),
  49. CPU_FP(1, 6, "reserved"),
  50. CPU_FP(1, 7, "No FPU"),
  51. CPU_FP(2, 0, "BIT B5010 or B5110/20 or B5210"),
  52. CPU_FP(2, 1, "reserved"),
  53. CPU_FP(2, 2, "reserved"),
  54. CPU_FP(2, 3, "reserved"),
  55. CPU_FP(2, 4, "reserved"),
  56. CPU_FP(2, 5, "reserved"),
  57. CPU_FP(2, 6, "reserved"),
  58. CPU_FP(2, 7, "No FPU"),
  59. /* SuperSparc 50 module */
  60. CPU_FP(4, 0, "SuperSparc on-chip FPU"),
  61. /* SparcClassic */
  62. CPU_FP(4, 4, "TI MicroSparc on chip FPU"),
  63. CPU_FP(5, 0, "Matsushita MN10501"),
  64. CPU_FP(5, 1, "reserved"),
  65. CPU_FP(5, 2, "reserved"),
  66. CPU_FP(5, 3, "reserved"),
  67. CPU_FP(5, 4, "reserved"),
  68. CPU_FP(5, 5, "reserved"),
  69. CPU_FP(5, 6, "reserved"),
  70. CPU_FP(5, 7, "No FPU"),
  71. CPU_FP(9, 3, "Fujitsu or Weitek on-chip FPU"),
  72. };
  73. #define NSPARCFPU ARRAY_SIZE(linux_sparc_fpu)
  74. #define CPU_INFO(psr, ver, name) \
  75. { .psr_impl = (psr), .psr_vers = (ver), .cpu_name = (name) }
  76. static struct cpu_iu_info linux_sparc_chips[] = {
  77. /* Sun4/100, 4/200, SLC */
  78. CPU_INFO(0, 0, "Fujitsu MB86900/1A or LSI L64831 SparcKIT-40"),
  79. /* borned STP1012PGA */
  80. CPU_INFO(0, 4, "Fujitsu MB86904"),
  81. CPU_INFO(0, 5, "Fujitsu TurboSparc MB86907"),
  82. /* SparcStation2, SparcServer 490 & 690 */
  83. CPU_INFO(1, 0, "LSI Logic Corporation - L64811"),
  84. /* SparcStation2 */
  85. CPU_INFO(1, 1, "Cypress/ROSS CY7C601"),
  86. /* Embedded controller */
  87. CPU_INFO(1, 3, "Cypress/ROSS CY7C611"),
  88. /* Ross Technologies HyperSparc */
  89. CPU_INFO(1, 0xf, "ROSS HyperSparc RT620"),
  90. CPU_INFO(1, 0xe, "ROSS HyperSparc RT625 or RT626"),
  91. /* ECL Implementation, CRAY S-MP Supercomputer... AIEEE! */
  92. /* Someone please write the code to support this beast! ;) */
  93. CPU_INFO(2, 0, "Bipolar Integrated Technology - B5010"),
  94. CPU_INFO(3, 0, "LSI Logic Corporation - unknown-type"),
  95. CPU_INFO(4, 0, "Texas Instruments, Inc. - SuperSparc-(II)"),
  96. /* SparcClassic -- borned STP1010TAB-50*/
  97. CPU_INFO(4, 1, "Texas Instruments, Inc. - MicroSparc"),
  98. CPU_INFO(4, 2, "Texas Instruments, Inc. - MicroSparc II"),
  99. CPU_INFO(4, 3, "Texas Instruments, Inc. - SuperSparc 51"),
  100. CPU_INFO(4, 4, "Texas Instruments, Inc. - SuperSparc 61"),
  101. CPU_INFO(4, 5, "Texas Instruments, Inc. - unknown"),
  102. CPU_INFO(5, 0, "Matsushita - MN10501"),
  103. CPU_INFO(6, 0, "Philips Corporation - unknown"),
  104. CPU_INFO(7, 0, "Harvest VLSI Design Center, Inc. - unknown"),
  105. /* Gallium arsenide 200MHz, BOOOOGOOOOMIPS!!! */
  106. CPU_INFO(8, 0, "Systems and Processes Engineering Corporation (SPEC)"),
  107. CPU_INFO(9, 0, "Fujitsu or Weitek Power-UP"),
  108. CPU_INFO(9, 1, "Fujitsu or Weitek Power-UP"),
  109. CPU_INFO(9, 2, "Fujitsu or Weitek Power-UP"),
  110. CPU_INFO(9, 3, "Fujitsu or Weitek Power-UP"),
  111. CPU_INFO(0xa, 0, "UNKNOWN CPU-VENDOR/TYPE"),
  112. CPU_INFO(0xb, 0, "UNKNOWN CPU-VENDOR/TYPE"),
  113. CPU_INFO(0xc, 0, "UNKNOWN CPU-VENDOR/TYPE"),
  114. CPU_INFO(0xd, 0, "UNKNOWN CPU-VENDOR/TYPE"),
  115. CPU_INFO(0xe, 0, "UNKNOWN CPU-VENDOR/TYPE"),
  116. CPU_INFO(0xf, 0, "UNKNOWN CPU-VENDOR/TYPE"),
  117. };
  118. #define NSPARCCHIPS ARRAY_SIZE(linux_sparc_chips)
  119. char *sparc_cpu_type;
  120. char *sparc_fpu_type;
  121. unsigned int fsr_storage;
  122. void __cpuinit cpu_probe(void)
  123. {
  124. int psr_impl, psr_vers, fpu_vers;
  125. int i, psr;
  126. psr_impl = ((get_psr() >> 28) & 0xf);
  127. psr_vers = ((get_psr() >> 24) & 0xf);
  128. psr = get_psr();
  129. put_psr(psr | PSR_EF);
  130. fpu_vers = ((get_fsr() >> 17) & 0x7);
  131. put_psr(psr);
  132. for (i = 0; i < NSPARCCHIPS; i++) {
  133. if (linux_sparc_chips[i].psr_impl == psr_impl)
  134. if (linux_sparc_chips[i].psr_vers == psr_vers) {
  135. sparc_cpu_type = linux_sparc_chips[i].cpu_name;
  136. break;
  137. }
  138. }
  139. if (i == NSPARCCHIPS)
  140. {
  141. printk(KERN_ERR "CPU: Unknown chip, impl[0x%x] vers[0x%x]\n",
  142. psr_impl, psr_vers);
  143. sparc_cpu_type = "Unknown CPU";
  144. }
  145. for (i = 0; i < NSPARCFPU; i++) {
  146. if (linux_sparc_fpu[i].psr_impl == psr_impl)
  147. if (linux_sparc_fpu[i].fp_vers == fpu_vers) {
  148. sparc_fpu_type = linux_sparc_fpu[i].fp_name;
  149. break;
  150. }
  151. }
  152. if (i == NSPARCFPU) {
  153. printk(KERN_ERR "FPU: Unknown chip, impl[0x%x] vers[0x%x]\n",
  154. psr_impl, fpu_vers);
  155. sparc_fpu_type = "Unknown FPU";
  156. }
  157. }