bat_rw.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /*
  2. * (C) Copyright 2002
  3. * Rich Ireland, Enterasys Networks, rireland@enterasys.com.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <asm/processor.h>
  9. #include <asm/mmu.h>
  10. #include <asm/io.h>
  11. #include <linux/compiler.h>
  12. #ifdef CONFIG_ADDR_MAP
  13. #include <addr_map.h>
  14. #endif
  15. DECLARE_GLOBAL_DATA_PTR;
  16. int write_bat (ppc_bat_t bat, unsigned long upper, unsigned long lower)
  17. {
  18. __maybe_unused int batn = -1;
  19. sync();
  20. switch (bat) {
  21. case DBAT0:
  22. mtspr (DBAT0L, lower);
  23. mtspr (DBAT0U, upper);
  24. batn = 0;
  25. break;
  26. case IBAT0:
  27. mtspr (IBAT0L, lower);
  28. mtspr (IBAT0U, upper);
  29. break;
  30. case DBAT1:
  31. mtspr (DBAT1L, lower);
  32. mtspr (DBAT1U, upper);
  33. batn = 1;
  34. break;
  35. case IBAT1:
  36. mtspr (IBAT1L, lower);
  37. mtspr (IBAT1U, upper);
  38. break;
  39. case DBAT2:
  40. mtspr (DBAT2L, lower);
  41. mtspr (DBAT2U, upper);
  42. batn = 2;
  43. break;
  44. case IBAT2:
  45. mtspr (IBAT2L, lower);
  46. mtspr (IBAT2U, upper);
  47. break;
  48. case DBAT3:
  49. mtspr (DBAT3L, lower);
  50. mtspr (DBAT3U, upper);
  51. batn = 3;
  52. break;
  53. case IBAT3:
  54. mtspr (IBAT3L, lower);
  55. mtspr (IBAT3U, upper);
  56. break;
  57. #ifdef CONFIG_HIGH_BATS
  58. case DBAT4:
  59. mtspr (DBAT4L, lower);
  60. mtspr (DBAT4U, upper);
  61. batn = 4;
  62. break;
  63. case IBAT4:
  64. mtspr (IBAT4L, lower);
  65. mtspr (IBAT4U, upper);
  66. break;
  67. case DBAT5:
  68. mtspr (DBAT5L, lower);
  69. mtspr (DBAT5U, upper);
  70. batn = 5;
  71. break;
  72. case IBAT5:
  73. mtspr (IBAT5L, lower);
  74. mtspr (IBAT5U, upper);
  75. break;
  76. case DBAT6:
  77. mtspr (DBAT6L, lower);
  78. mtspr (DBAT6U, upper);
  79. batn = 6;
  80. break;
  81. case IBAT6:
  82. mtspr (IBAT6L, lower);
  83. mtspr (IBAT6U, upper);
  84. break;
  85. case DBAT7:
  86. mtspr (DBAT7L, lower);
  87. mtspr (DBAT7U, upper);
  88. batn = 7;
  89. break;
  90. case IBAT7:
  91. mtspr (IBAT7L, lower);
  92. mtspr (IBAT7U, upper);
  93. break;
  94. #endif
  95. default:
  96. return (-1);
  97. }
  98. #ifdef CONFIG_ADDR_MAP
  99. if ((gd->flags & GD_FLG_RELOC) && (batn >= 0)) {
  100. phys_size_t size;
  101. if (!BATU_VALID(upper))
  102. size = 0;
  103. else
  104. size = BATU_SIZE(upper);
  105. addrmap_set_entry(BATU_VADDR(upper), BATL_PADDR(lower),
  106. size, batn);
  107. }
  108. #endif
  109. sync();
  110. isync();
  111. return (0);
  112. }
  113. int read_bat (ppc_bat_t bat, unsigned long *upper, unsigned long *lower)
  114. {
  115. unsigned long register u;
  116. unsigned long register l;
  117. switch (bat) {
  118. case DBAT0:
  119. l = mfspr (DBAT0L);
  120. u = mfspr (DBAT0U);
  121. break;
  122. case IBAT0:
  123. l = mfspr (IBAT0L);
  124. u = mfspr (IBAT0U);
  125. break;
  126. case DBAT1:
  127. l = mfspr (DBAT1L);
  128. u = mfspr (DBAT1U);
  129. break;
  130. case IBAT1:
  131. l = mfspr (IBAT1L);
  132. u = mfspr (IBAT1U);
  133. break;
  134. case DBAT2:
  135. l = mfspr (DBAT2L);
  136. u = mfspr (DBAT2U);
  137. break;
  138. case IBAT2:
  139. l = mfspr (IBAT2L);
  140. u = mfspr (IBAT2U);
  141. break;
  142. case DBAT3:
  143. l = mfspr (DBAT3L);
  144. u = mfspr (DBAT3U);
  145. break;
  146. case IBAT3:
  147. l = mfspr (IBAT3L);
  148. u = mfspr (IBAT3U);
  149. break;
  150. #ifdef CONFIG_HIGH_BATS
  151. case DBAT4:
  152. l = mfspr (DBAT4L);
  153. u = mfspr (DBAT4U);
  154. break;
  155. case IBAT4:
  156. l = mfspr (IBAT4L);
  157. u = mfspr (IBAT4U);
  158. break;
  159. case DBAT5:
  160. l = mfspr (DBAT5L);
  161. u = mfspr (DBAT5U);
  162. break;
  163. case IBAT5:
  164. l = mfspr (IBAT5L);
  165. u = mfspr (IBAT5U);
  166. break;
  167. case DBAT6:
  168. l = mfspr (DBAT6L);
  169. u = mfspr (DBAT6U);
  170. break;
  171. case IBAT6:
  172. l = mfspr (IBAT6L);
  173. u = mfspr (IBAT6U);
  174. break;
  175. case DBAT7:
  176. l = mfspr (DBAT7L);
  177. u = mfspr (DBAT7U);
  178. break;
  179. case IBAT7:
  180. l = mfspr (IBAT7L);
  181. u = mfspr (IBAT7U);
  182. break;
  183. #endif
  184. default:
  185. return (-1);
  186. }
  187. *upper = u;
  188. *lower = l;
  189. return (0);
  190. }
  191. void print_bats(void)
  192. {
  193. printf("BAT registers:\n");
  194. printf ("\tIBAT0L = 0x%08X ", mfspr (IBAT0L));
  195. printf ("\tIBAT0U = 0x%08X\n", mfspr (IBAT0U));
  196. printf ("\tDBAT0L = 0x%08X ", mfspr (DBAT0L));
  197. printf ("\tDBAT0U = 0x%08X\n", mfspr (DBAT0U));
  198. printf ("\tIBAT1L = 0x%08X ", mfspr (IBAT1L));
  199. printf ("\tIBAT1U = 0x%08X\n", mfspr (IBAT1U));
  200. printf ("\tDBAT1L = 0x%08X ", mfspr (DBAT1L));
  201. printf ("\tDBAT1U = 0x%08X\n", mfspr (DBAT1U));
  202. printf ("\tIBAT2L = 0x%08X ", mfspr (IBAT2L));
  203. printf ("\tIBAT2U = 0x%08X\n", mfspr (IBAT2U));
  204. printf ("\tDBAT2L = 0x%08X ", mfspr (DBAT2L));
  205. printf ("\tDBAT2U = 0x%08X\n", mfspr (DBAT2U));
  206. printf ("\tIBAT3L = 0x%08X ", mfspr (IBAT3L));
  207. printf ("\tIBAT3U = 0x%08X\n", mfspr (IBAT3U));
  208. printf ("\tDBAT3L = 0x%08X ", mfspr (DBAT3L));
  209. printf ("\tDBAT3U = 0x%08X\n", mfspr (DBAT3U));
  210. #ifdef CONFIG_HIGH_BATS
  211. printf ("\tIBAT4L = 0x%08X ", mfspr (IBAT4L));
  212. printf ("\tIBAT4U = 0x%08X\n", mfspr (IBAT4U));
  213. printf ("\tDBAT4L = 0x%08X ", mfspr (DBAT4L));
  214. printf ("\tDBAT4U = 0x%08X\n", mfspr (DBAT4U));
  215. printf ("\tIBAT5L = 0x%08X ", mfspr (IBAT5L));
  216. printf ("\tIBAT5U = 0x%08X\n", mfspr (IBAT5U));
  217. printf ("\tDBAT5L = 0x%08X ", mfspr (DBAT5L));
  218. printf ("\tDBAT5U = 0x%08X\n", mfspr (DBAT5U));
  219. printf ("\tIBAT6L = 0x%08X ", mfspr (IBAT6L));
  220. printf ("\tIBAT6U = 0x%08X\n", mfspr (IBAT6U));
  221. printf ("\tDBAT6L = 0x%08X ", mfspr (DBAT6L));
  222. printf ("\tDBAT6U = 0x%08X\n", mfspr (DBAT6U));
  223. printf ("\tIBAT7L = 0x%08X ", mfspr (IBAT7L));
  224. printf ("\tIBAT7U = 0x%08X\n", mfspr (IBAT7U));
  225. printf ("\tDBAT7L = 0x%08X ", mfspr (DBAT7L));
  226. printf ("\tDBAT7U = 0x%08X\n", mfspr (DBAT7U));
  227. #endif
  228. }