cpu.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * (C) Copyright 2003
  3. * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <command.h>
  9. #include <netdev.h>
  10. #include <asm/mipsregs.h>
  11. #include <asm/cacheops.h>
  12. #include <asm/reboot.h>
  13. #define cache_op(op,addr) \
  14. __asm__ __volatile__( \
  15. " .set push \n" \
  16. " .set noreorder \n" \
  17. " .set mips3\n\t \n" \
  18. " cache %0, %1 \n" \
  19. " .set pop \n" \
  20. : \
  21. : "i" (op), "R" (*(unsigned char *)(addr)))
  22. void __attribute__((weak)) _machine_restart(void)
  23. {
  24. }
  25. int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  26. {
  27. _machine_restart();
  28. fprintf(stderr, "*** reset failed ***\n");
  29. return 0;
  30. }
  31. void flush_cache(ulong start_addr, ulong size)
  32. {
  33. unsigned long lsize = CONFIG_SYS_CACHELINE_SIZE;
  34. unsigned long addr = start_addr & ~(lsize - 1);
  35. unsigned long aend = (start_addr + size - 1) & ~(lsize - 1);
  36. /* aend will be miscalculated when size is zero, so we return here */
  37. if (size == 0)
  38. return;
  39. while (1) {
  40. cache_op(HIT_WRITEBACK_INV_D, addr);
  41. cache_op(HIT_INVALIDATE_I, addr);
  42. if (addr == aend)
  43. break;
  44. addr += lsize;
  45. }
  46. }
  47. void flush_dcache_range(ulong start_addr, ulong stop)
  48. {
  49. unsigned long lsize = CONFIG_SYS_CACHELINE_SIZE;
  50. unsigned long addr = start_addr & ~(lsize - 1);
  51. unsigned long aend = (stop - 1) & ~(lsize - 1);
  52. while (1) {
  53. cache_op(HIT_WRITEBACK_INV_D, addr);
  54. if (addr == aend)
  55. break;
  56. addr += lsize;
  57. }
  58. }
  59. void invalidate_dcache_range(ulong start_addr, ulong stop)
  60. {
  61. unsigned long lsize = CONFIG_SYS_CACHELINE_SIZE;
  62. unsigned long addr = start_addr & ~(lsize - 1);
  63. unsigned long aend = (stop - 1) & ~(lsize - 1);
  64. while (1) {
  65. cache_op(HIT_INVALIDATE_D, addr);
  66. if (addr == aend)
  67. break;
  68. addr += lsize;
  69. }
  70. }
  71. void write_one_tlb(int index, u32 pagemask, u32 hi, u32 low0, u32 low1)
  72. {
  73. write_c0_entrylo0(low0);
  74. write_c0_pagemask(pagemask);
  75. write_c0_entrylo1(low1);
  76. write_c0_entryhi(hi);
  77. write_c0_index(index);
  78. tlb_write_indexed();
  79. }
  80. int cpu_eth_init(bd_t *bis)
  81. {
  82. #ifdef CONFIG_SOC_AU1X00
  83. au1x00_enet_initialize(bis);
  84. #endif
  85. return 0;
  86. }