probe.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * arch/sh/kernel/cpu/sh3/probe.c
  3. *
  4. * CPU Subtype Probing for SH-3.
  5. *
  6. * Copyright (C) 1999, 2000 Niibe Yutaka
  7. * Copyright (C) 2002 Paul Mundt
  8. *
  9. * This file is subject to the terms and conditions of the GNU General Public
  10. * License. See the file "COPYING" in the main directory of this archive
  11. * for more details.
  12. */
  13. #include <linux/init.h>
  14. #include <asm/processor.h>
  15. #include <asm/cache.h>
  16. #include <asm/io.h>
  17. void cpu_probe(void)
  18. {
  19. unsigned long addr0, addr1, data0, data1, data2, data3;
  20. jump_to_uncached();
  21. /*
  22. * Check if the entry shadows or not.
  23. * When shadowed, it's 128-entry system.
  24. * Otherwise, it's 256-entry system.
  25. */
  26. addr0 = CACHE_OC_ADDRESS_ARRAY + (3 << 12);
  27. addr1 = CACHE_OC_ADDRESS_ARRAY + (1 << 12);
  28. /* First, write back & invalidate */
  29. data0 = __raw_readl(addr0);
  30. __raw_writel(data0&~(SH_CACHE_VALID|SH_CACHE_UPDATED), addr0);
  31. data1 = __raw_readl(addr1);
  32. __raw_writel(data1&~(SH_CACHE_VALID|SH_CACHE_UPDATED), addr1);
  33. /* Next, check if there's shadow or not */
  34. data0 = __raw_readl(addr0);
  35. data0 ^= SH_CACHE_VALID;
  36. __raw_writel(data0, addr0);
  37. data1 = __raw_readl(addr1);
  38. data2 = data1 ^ SH_CACHE_VALID;
  39. __raw_writel(data2, addr1);
  40. data3 = __raw_readl(addr0);
  41. /* Lastly, invaliate them. */
  42. __raw_writel(data0&~SH_CACHE_VALID, addr0);
  43. __raw_writel(data2&~SH_CACHE_VALID, addr1);
  44. back_to_cached();
  45. boot_cpu_data.dcache.ways = 4;
  46. boot_cpu_data.dcache.entry_shift = 4;
  47. boot_cpu_data.dcache.linesz = L1_CACHE_BYTES;
  48. boot_cpu_data.dcache.flags = 0;
  49. /*
  50. * 7709A/7729 has 16K cache (256-entry), while 7702 has only
  51. * 2K(direct) 7702 is not supported (yet)
  52. */
  53. if (data0 == data1 && data2 == data3) { /* Shadow */
  54. boot_cpu_data.dcache.way_incr = (1 << 11);
  55. boot_cpu_data.dcache.entry_mask = 0x7f0;
  56. boot_cpu_data.dcache.sets = 128;
  57. boot_cpu_data.type = CPU_SH7708;
  58. boot_cpu_data.flags |= CPU_HAS_MMU_PAGE_ASSOC;
  59. } else { /* 7709A or 7729 */
  60. boot_cpu_data.dcache.way_incr = (1 << 12);
  61. boot_cpu_data.dcache.entry_mask = 0xff0;
  62. boot_cpu_data.dcache.sets = 256;
  63. boot_cpu_data.type = CPU_SH7729;
  64. #if defined(CONFIG_CPU_SUBTYPE_SH7706)
  65. boot_cpu_data.type = CPU_SH7706;
  66. #endif
  67. #if defined(CONFIG_CPU_SUBTYPE_SH7710)
  68. boot_cpu_data.type = CPU_SH7710;
  69. #endif
  70. #if defined(CONFIG_CPU_SUBTYPE_SH7712)
  71. boot_cpu_data.type = CPU_SH7712;
  72. #endif
  73. #if defined(CONFIG_CPU_SUBTYPE_SH7720)
  74. boot_cpu_data.type = CPU_SH7720;
  75. #endif
  76. #if defined(CONFIG_CPU_SUBTYPE_SH7721)
  77. boot_cpu_data.type = CPU_SH7721;
  78. #endif
  79. #if defined(CONFIG_CPU_SUBTYPE_SH7705)
  80. boot_cpu_data.type = CPU_SH7705;
  81. #if defined(CONFIG_SH7705_CACHE_32KB)
  82. boot_cpu_data.dcache.way_incr = (1 << 13);
  83. boot_cpu_data.dcache.entry_mask = 0x1ff0;
  84. boot_cpu_data.dcache.sets = 512;
  85. __raw_writel(CCR_CACHE_32KB, CCR3_REG);
  86. #else
  87. __raw_writel(CCR_CACHE_16KB, CCR3_REG);
  88. #endif
  89. #endif
  90. }
  91. /*
  92. * SH-3 doesn't have separate caches
  93. */
  94. boot_cpu_data.dcache.flags |= SH_CACHE_COMBINED;
  95. boot_cpu_data.icache = boot_cpu_data.dcache;
  96. boot_cpu_data.family = CPU_FAMILY_SH3;
  97. }