cpu.c 15 KB

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