cpu.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. /*
  2. * (C) Copyright 2000-2007
  3. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. /*
  8. * CPU specific code
  9. *
  10. * written or collected and sometimes rewritten by
  11. * Magnus Damm <damm@bitsmart.com>
  12. *
  13. * minor modifications by
  14. * Wolfgang Denk <wd@denx.de>
  15. */
  16. #include <common.h>
  17. #include <watchdog.h>
  18. #include <command.h>
  19. #include <asm/cache.h>
  20. #include <asm/ppc4xx.h>
  21. #include <netdev.h>
  22. DECLARE_GLOBAL_DATA_PTR;
  23. void board_reset(void);
  24. /*
  25. * To provide an interface to detect CPU number for boards that support
  26. * more then one CPU, we implement the "weak" default functions here.
  27. *
  28. * Returns CPU number
  29. */
  30. int __get_cpu_num(void)
  31. {
  32. return NA_OR_UNKNOWN_CPU;
  33. }
  34. int get_cpu_num(void) __attribute__((weak, alias("__get_cpu_num")));
  35. #if defined(CONFIG_PCI)
  36. #if defined(CONFIG_405GP) || \
  37. defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
  38. defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
  39. #define PCI_ASYNC
  40. static int pci_async_enabled(void)
  41. {
  42. #if defined(CONFIG_405GP)
  43. return (mfdcr(CPC0_PSR) & PSR_PCI_ASYNC_EN);
  44. #endif
  45. #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
  46. defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
  47. defined(CONFIG_460EX) || defined(CONFIG_460GT)
  48. unsigned long val;
  49. mfsdr(SDR0_SDSTP1, val);
  50. return (val & SDR0_SDSTP1_PAME_MASK);
  51. #endif
  52. }
  53. #endif
  54. #endif /* CONFIG_PCI */
  55. #if defined(CONFIG_PCI) && \
  56. !defined(CONFIG_405) && !defined(CONFIG_405EX)
  57. int pci_arbiter_enabled(void)
  58. {
  59. #if defined(CONFIG_405GP)
  60. return (mfdcr(CPC0_PSR) & PSR_PCI_ARBIT_EN);
  61. #endif
  62. #if defined(CONFIG_405EP)
  63. return (mfdcr(CPC0_PCI) & CPC0_PCI_ARBIT_EN);
  64. #endif
  65. #if defined(CONFIG_440GP)
  66. return (mfdcr(CPC0_STRP1) & CPC0_STRP1_PAE_MASK);
  67. #endif
  68. #if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
  69. unsigned long val;
  70. mfsdr(SDR0_XCR0, val);
  71. return (val & SDR0_XCR0_PAE_MASK);
  72. #endif
  73. #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
  74. defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
  75. defined(CONFIG_460EX) || defined(CONFIG_460GT)
  76. unsigned long val;
  77. mfsdr(SDR0_PCI0, val);
  78. return (val & SDR0_PCI0_PAE_MASK);
  79. #endif
  80. }
  81. #endif
  82. #if defined(CONFIG_405EP)
  83. #define I2C_BOOTROM
  84. static int i2c_bootrom_enabled(void)
  85. {
  86. #if defined(CONFIG_405EP)
  87. return (mfdcr(CPC0_BOOT) & CPC0_BOOT_SEP);
  88. #else
  89. unsigned long val;
  90. mfsdr(SDR0_SDCS0, val);
  91. return (val & SDR0_SDCS_SDD);
  92. #endif
  93. }
  94. #endif
  95. #if defined(CONFIG_440GX)
  96. #define SDR0_PINSTP_SHIFT 29
  97. static char *bootstrap_str[] = {
  98. "EBC (16 bits)",
  99. "EBC (8 bits)",
  100. "EBC (32 bits)",
  101. "EBC (8 bits)",
  102. "PCI",
  103. "I2C (Addr 0x54)",
  104. "Reserved",
  105. "I2C (Addr 0x50)",
  106. };
  107. static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
  108. #endif
  109. #if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
  110. #define SDR0_PINSTP_SHIFT 30
  111. static char *bootstrap_str[] = {
  112. "EBC (8 bits)",
  113. "PCI",
  114. "I2C (Addr 0x54)",
  115. "I2C (Addr 0x50)",
  116. };
  117. static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
  118. #endif
  119. #if defined(CONFIG_440EP) || defined(CONFIG_440GR)
  120. #define SDR0_PINSTP_SHIFT 29
  121. static char *bootstrap_str[] = {
  122. "EBC (8 bits)",
  123. "PCI",
  124. "NAND (8 bits)",
  125. "EBC (16 bits)",
  126. "EBC (16 bits)",
  127. "I2C (Addr 0x54)",
  128. "PCI",
  129. "I2C (Addr 0x52)",
  130. };
  131. static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
  132. #endif
  133. #if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
  134. #define SDR0_PINSTP_SHIFT 29
  135. static char *bootstrap_str[] = {
  136. "EBC (8 bits)",
  137. "EBC (16 bits)",
  138. "EBC (16 bits)",
  139. "NAND (8 bits)",
  140. "PCI",
  141. "I2C (Addr 0x54)",
  142. "PCI",
  143. "I2C (Addr 0x52)",
  144. };
  145. static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
  146. #endif
  147. #if defined(CONFIG_460EX) || defined(CONFIG_460GT)
  148. #define SDR0_PINSTP_SHIFT 29
  149. static char *bootstrap_str[] = {
  150. "EBC (8 bits)",
  151. "EBC (16 bits)",
  152. "PCI",
  153. "PCI",
  154. "EBC (16 bits)",
  155. "NAND (8 bits)",
  156. "I2C (Addr 0x54)", /* A8 */
  157. "I2C (Addr 0x52)", /* A4 */
  158. };
  159. static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
  160. #endif
  161. #if defined(CONFIG_460SX)
  162. #define SDR0_PINSTP_SHIFT 29
  163. static char *bootstrap_str[] = {
  164. "EBC (8 bits)",
  165. "EBC (16 bits)",
  166. "EBC (32 bits)",
  167. "NAND (8 bits)",
  168. "I2C (Addr 0x54)", /* A8 */
  169. "I2C (Addr 0x52)", /* A4 */
  170. };
  171. static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G' };
  172. #endif
  173. #if defined(CONFIG_405EZ)
  174. #define SDR0_PINSTP_SHIFT 28
  175. static char *bootstrap_str[] = {
  176. "EBC (8 bits)",
  177. "SPI (fast)",
  178. "NAND (512 page, 4 addr cycle)",
  179. "I2C (Addr 0x50)",
  180. "EBC (32 bits)",
  181. "I2C (Addr 0x50)",
  182. "NAND (2K page, 5 addr cycle)",
  183. "I2C (Addr 0x50)",
  184. "EBC (16 bits)",
  185. "Reserved",
  186. "NAND (2K page, 4 addr cycle)",
  187. "I2C (Addr 0x50)",
  188. "NAND (512 page, 3 addr cycle)",
  189. "I2C (Addr 0x50)",
  190. "SPI (slow)",
  191. "I2C (Addr 0x50)",
  192. };
  193. static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', \
  194. 'I', 'x', 'K', 'L', 'M', 'N', 'O', 'P' };
  195. #endif
  196. #if defined(CONFIG_405EX)
  197. #define SDR0_PINSTP_SHIFT 29
  198. static char *bootstrap_str[] = {
  199. "EBC (8 bits)",
  200. "EBC (16 bits)",
  201. "EBC (16 bits)",
  202. "NAND (8 bits)",
  203. "NAND (8 bits)",
  204. "I2C (Addr 0x54)",
  205. "EBC (8 bits)",
  206. "I2C (Addr 0x52)",
  207. };
  208. static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
  209. #endif
  210. #if defined(SDR0_PINSTP_SHIFT)
  211. static int bootstrap_option(void)
  212. {
  213. unsigned long val;
  214. mfsdr(SDR0_PINSTP, val);
  215. return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
  216. }
  217. #endif /* SDR0_PINSTP_SHIFT */
  218. #if defined(CONFIG_440GP)
  219. static int do_chip_reset (unsigned long sys0, unsigned long sys1)
  220. {
  221. /* Changes to CPC0_SYS0 and CPC0_SYS1 require chip
  222. * reset.
  223. */
  224. mtdcr (CPC0_CR0, mfdcr (CPC0_CR0) | 0x80000000); /* Set SWE */
  225. mtdcr (CPC0_SYS0, sys0);
  226. mtdcr (CPC0_SYS1, sys1);
  227. mtdcr (CPC0_CR0, mfdcr (CPC0_CR0) & ~0x80000000); /* Clr SWE */
  228. mtspr (SPRN_DBCR0, 0x20000000); /* Reset the chip */
  229. return 1;
  230. }
  231. #endif /* CONFIG_440GP */
  232. int checkcpu (void)
  233. {
  234. #if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
  235. uint pvr = get_pvr();
  236. ulong clock = gd->cpu_clk;
  237. char buf[32];
  238. #if defined(CONFIG_460EX) || defined(CONFIG_460GT)
  239. u32 reg;
  240. #endif
  241. char addstr[64] = "";
  242. sys_info_t sys_info;
  243. int cpu_num;
  244. cpu_num = get_cpu_num();
  245. if (cpu_num >= 0)
  246. printf("CPU%d: ", cpu_num);
  247. else
  248. puts("CPU: ");
  249. get_sys_info(&sys_info);
  250. #if defined(CONFIG_XILINX_440)
  251. puts("IBM PowerPC ");
  252. #else
  253. puts("AMCC PowerPC ");
  254. #endif
  255. switch (pvr) {
  256. #if !defined(CONFIG_440)
  257. case PVR_405GP_RB:
  258. puts("405GP Rev. B");
  259. break;
  260. case PVR_405GP_RC:
  261. puts("405GP Rev. C");
  262. break;
  263. case PVR_405GP_RD:
  264. puts("405GP Rev. D");
  265. break;
  266. case PVR_405GP_RE:
  267. puts("405GP Rev. E");
  268. break;
  269. case PVR_405GPR_RB:
  270. puts("405GPr Rev. B");
  271. break;
  272. case PVR_405EP_RB:
  273. puts("405EP Rev. B");
  274. break;
  275. case PVR_405EZ_RA:
  276. puts("405EZ Rev. A");
  277. break;
  278. case PVR_405EX1_RA:
  279. puts("405EX Rev. A");
  280. strcpy(addstr, "Security support");
  281. break;
  282. case PVR_405EXR2_RA:
  283. puts("405EXr Rev. A");
  284. strcpy(addstr, "No Security support");
  285. break;
  286. case PVR_405EX1_RC:
  287. puts("405EX Rev. C");
  288. strcpy(addstr, "Security support");
  289. break;
  290. case PVR_405EX2_RC:
  291. puts("405EX Rev. C");
  292. strcpy(addstr, "No Security support");
  293. break;
  294. case PVR_405EXR1_RC:
  295. puts("405EXr Rev. C");
  296. strcpy(addstr, "Security support");
  297. break;
  298. case PVR_405EXR2_RC:
  299. puts("405EXr Rev. C");
  300. strcpy(addstr, "No Security support");
  301. break;
  302. case PVR_405EX1_RD:
  303. puts("405EX Rev. D");
  304. strcpy(addstr, "Security support");
  305. break;
  306. case PVR_405EX2_RD:
  307. puts("405EX Rev. D");
  308. strcpy(addstr, "No Security support");
  309. break;
  310. case PVR_405EXR1_RD:
  311. puts("405EXr Rev. D");
  312. strcpy(addstr, "Security support");
  313. break;
  314. case PVR_405EXR2_RD:
  315. puts("405EXr Rev. D");
  316. strcpy(addstr, "No Security support");
  317. break;
  318. #else /* CONFIG_440 */
  319. #if defined(CONFIG_440GP)
  320. case PVR_440GP_RB:
  321. puts("440GP Rev. B");
  322. /* See errata 1.12: CHIP_4 */
  323. if ((mfdcr(CPC0_SYS0) != mfdcr(CPC0_STRP0)) ||
  324. (mfdcr(CPC0_SYS1) != mfdcr(CPC0_STRP1)) ){
  325. puts ( "\n\t CPC0_SYSx DCRs corrupted. "
  326. "Resetting chip ...\n");
  327. udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
  328. do_chip_reset ( mfdcr(CPC0_STRP0),
  329. mfdcr(CPC0_STRP1) );
  330. }
  331. break;
  332. case PVR_440GP_RC:
  333. puts("440GP Rev. C");
  334. break;
  335. #endif /* CONFIG_440GP */
  336. case PVR_440GX_RA:
  337. puts("440GX Rev. A");
  338. break;
  339. case PVR_440GX_RB:
  340. puts("440GX Rev. B");
  341. break;
  342. case PVR_440GX_RC:
  343. puts("440GX Rev. C");
  344. break;
  345. case PVR_440GX_RF:
  346. puts("440GX Rev. F");
  347. break;
  348. case PVR_440EP_RA:
  349. puts("440EP Rev. A");
  350. break;
  351. #ifdef CONFIG_440EP
  352. case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
  353. puts("440EP Rev. B");
  354. break;
  355. case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
  356. puts("440EP Rev. C");
  357. break;
  358. #endif /* CONFIG_440EP */
  359. #ifdef CONFIG_440GR
  360. case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
  361. puts("440GR Rev. A");
  362. break;
  363. case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
  364. puts("440GR Rev. B");
  365. break;
  366. #endif /* CONFIG_440GR */
  367. #ifdef CONFIG_440EPX
  368. case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
  369. puts("440EPx Rev. A");
  370. strcpy(addstr, "Security/Kasumi support");
  371. break;
  372. case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
  373. puts("440EPx Rev. A");
  374. strcpy(addstr, "No Security/Kasumi support");
  375. break;
  376. #endif /* CONFIG_440EPX */
  377. #ifdef CONFIG_440GRX
  378. case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
  379. puts("440GRx Rev. A");
  380. strcpy(addstr, "Security/Kasumi support");
  381. break;
  382. case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
  383. puts("440GRx Rev. A");
  384. strcpy(addstr, "No Security/Kasumi support");
  385. break;
  386. #endif /* CONFIG_440GRX */
  387. case PVR_440SP_6_RAB:
  388. puts("440SP Rev. A/B");
  389. strcpy(addstr, "RAID 6 support");
  390. break;
  391. case PVR_440SP_RAB:
  392. puts("440SP Rev. A/B");
  393. strcpy(addstr, "No RAID 6 support");
  394. break;
  395. case PVR_440SP_6_RC:
  396. puts("440SP Rev. C");
  397. strcpy(addstr, "RAID 6 support");
  398. break;
  399. case PVR_440SP_RC:
  400. puts("440SP Rev. C");
  401. strcpy(addstr, "No RAID 6 support");
  402. break;
  403. case PVR_440SPe_6_RA:
  404. puts("440SPe Rev. A");
  405. strcpy(addstr, "RAID 6 support");
  406. break;
  407. case PVR_440SPe_RA:
  408. puts("440SPe Rev. A");
  409. strcpy(addstr, "No RAID 6 support");
  410. break;
  411. case PVR_440SPe_6_RB:
  412. puts("440SPe Rev. B");
  413. strcpy(addstr, "RAID 6 support");
  414. break;
  415. case PVR_440SPe_RB:
  416. puts("440SPe Rev. B");
  417. strcpy(addstr, "No RAID 6 support");
  418. break;
  419. #if defined(CONFIG_460EX) || defined(CONFIG_460GT)
  420. case PVR_460EX_RA:
  421. puts("460EX Rev. A");
  422. strcpy(addstr, "No Security/Kasumi support");
  423. break;
  424. case PVR_460EX_SE_RA:
  425. puts("460EX Rev. A");
  426. strcpy(addstr, "Security/Kasumi support");
  427. break;
  428. case PVR_460EX_RB:
  429. puts("460EX Rev. B");
  430. mfsdr(SDR0_ECID3, reg);
  431. if (reg & 0x00100000)
  432. strcpy(addstr, "No Security/Kasumi support");
  433. else
  434. strcpy(addstr, "Security/Kasumi support");
  435. break;
  436. case PVR_460GT_RA:
  437. puts("460GT Rev. A");
  438. strcpy(addstr, "No Security/Kasumi support");
  439. break;
  440. case PVR_460GT_SE_RA:
  441. puts("460GT Rev. A");
  442. strcpy(addstr, "Security/Kasumi support");
  443. break;
  444. case PVR_460GT_RB:
  445. puts("460GT Rev. B");
  446. mfsdr(SDR0_ECID3, reg);
  447. if (reg & 0x00100000)
  448. strcpy(addstr, "No Security/Kasumi support");
  449. else
  450. strcpy(addstr, "Security/Kasumi support");
  451. break;
  452. #endif
  453. case PVR_460SX_RA:
  454. puts("460SX Rev. A");
  455. strcpy(addstr, "Security support");
  456. break;
  457. case PVR_460SX_RA_V1:
  458. puts("460SX Rev. A");
  459. strcpy(addstr, "No Security support");
  460. break;
  461. case PVR_460GX_RA:
  462. puts("460GX Rev. A");
  463. strcpy(addstr, "Security support");
  464. break;
  465. case PVR_460GX_RA_V1:
  466. puts("460GX Rev. A");
  467. strcpy(addstr, "No Security support");
  468. break;
  469. case PVR_APM821XX_RA:
  470. puts("APM821XX Rev. A");
  471. strcpy(addstr, "Security support");
  472. break;
  473. case PVR_VIRTEX5:
  474. puts("440x5 VIRTEX5");
  475. break;
  476. #endif /* CONFIG_440 */
  477. default:
  478. printf (" UNKNOWN (PVR=%08x)", pvr);
  479. break;
  480. }
  481. printf (" at %s MHz (PLB=%lu OPB=%lu EBC=%lu",
  482. strmhz(buf, clock),
  483. sys_info.freqPLB / 1000000,
  484. get_OPB_freq() / 1000000,
  485. sys_info.freqEBC / 1000000);
  486. #if defined(CONFIG_PCI) && \
  487. (defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \
  488. defined(CONFIG_440GR) || defined(CONFIG_440GRX))
  489. printf(" PCI=%lu MHz", sys_info.freqPCI / 1000000);
  490. #endif
  491. printf(")\n");
  492. if (addstr[0] != 0)
  493. printf(" %s\n", addstr);
  494. #if defined(I2C_BOOTROM)
  495. printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
  496. #endif /* I2C_BOOTROM */
  497. #if defined(SDR0_PINSTP_SHIFT)
  498. printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
  499. printf ("Boot ROM Location %s", bootstrap_str[bootstrap_option()]);
  500. putc('\n');
  501. #endif /* SDR0_PINSTP_SHIFT */
  502. #if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
  503. printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
  504. #endif
  505. #if defined(CONFIG_PCI) && defined(PCI_ASYNC)
  506. if (pci_async_enabled()) {
  507. printf (", PCI async ext clock used");
  508. } else {
  509. printf (", PCI sync clock at %lu MHz",
  510. sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
  511. }
  512. #endif
  513. #if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
  514. putc('\n');
  515. #endif
  516. #if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX)
  517. printf(" 16 KiB I-Cache 16 KiB D-Cache");
  518. #elif defined(CONFIG_440)
  519. printf(" 32 KiB I-Cache 32 KiB D-Cache");
  520. #else
  521. printf(" 16 KiB I-Cache %d KiB D-Cache",
  522. ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
  523. #endif
  524. #endif /* !defined(CONFIG_405) */
  525. putc ('\n');
  526. return 0;
  527. }
  528. int ppc440spe_revB() {
  529. unsigned int pvr;
  530. pvr = get_pvr();
  531. if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
  532. return 1;
  533. else
  534. return 0;
  535. }
  536. /* ------------------------------------------------------------------------- */
  537. int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  538. {
  539. #if defined(CONFIG_BOARD_RESET)
  540. board_reset();
  541. #else
  542. #if defined(CONFIG_SYS_4xx_RESET_TYPE)
  543. mtspr(SPRN_DBCR0, CONFIG_SYS_4xx_RESET_TYPE << 28);
  544. #else
  545. /*
  546. * Initiate system reset in debug control register DBCR
  547. */
  548. mtspr(SPRN_DBCR0, 0x30000000);
  549. #endif /* defined(CONFIG_SYS_4xx_RESET_TYPE) */
  550. #endif /* defined(CONFIG_BOARD_RESET) */
  551. return 1;
  552. }
  553. /*
  554. * Get timebase clock frequency
  555. */
  556. unsigned long get_tbclk (void)
  557. {
  558. sys_info_t sys_info;
  559. get_sys_info(&sys_info);
  560. return (sys_info.freqProcessor);
  561. }
  562. #if defined(CONFIG_WATCHDOG)
  563. void watchdog_reset(void)
  564. {
  565. int re_enable = disable_interrupts();
  566. reset_4xx_watchdog();
  567. if (re_enable) enable_interrupts();
  568. }
  569. void reset_4xx_watchdog(void)
  570. {
  571. /*
  572. * Clear TSR(WIS) bit
  573. */
  574. mtspr(SPRN_TSR, 0x40000000);
  575. }
  576. #endif /* CONFIG_WATCHDOG */
  577. /*
  578. * Initializes on-chip ethernet controllers.
  579. * to override, implement board_eth_init()
  580. */
  581. int cpu_eth_init(bd_t *bis)
  582. {
  583. #if defined(CONFIG_PPC4xx_EMAC)
  584. ppc_4xx_eth_initialize(bis);
  585. #endif
  586. return 0;
  587. }