cache.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2020 Andes Technology Corporation
  5. *
  6. * Authors:
  7. * Nylon Chen <nylon7@andestech.com>
  8. */
  9. #include <sbi/riscv_asm.h>
  10. #include <sbi/riscv_io.h>
  11. #include <sbi/sbi_types.h>
  12. #include "platform.h"
  13. uintptr_t mcall_set_mcache_ctl(unsigned long input)
  14. {
  15. csr_clear(CSR_MCACHECTL, V5_MCACHE_CTL_MASK);
  16. csr_write(CSR_MCACHECTL, input);
  17. return 0;
  18. }
  19. uintptr_t mcall_set_mmisc_ctl(unsigned long input)
  20. {
  21. csr_clear(CSR_MMISCCTL, V5_MMISC_CTL_MASK);
  22. csr_write(CSR_MMISCCTL, input);
  23. return 0;
  24. }
  25. uintptr_t mcall_icache_op(unsigned int enable)
  26. {
  27. if (enable) {
  28. csr_set(CSR_MCACHECTL, V5_MCACHE_CTL_IC_EN);
  29. } else {
  30. csr_clear(CSR_MCACHECTL, V5_MCACHE_CTL_IC_EN);
  31. asm volatile("fence.i\n\t");
  32. }
  33. return 0;
  34. }
  35. uintptr_t mcall_dcache_op(unsigned int enable)
  36. {
  37. if (enable) {
  38. csr_set(CSR_MCACHECTL, V5_MCACHE_CTL_DC_EN);
  39. } else {
  40. csr_clear(CSR_MCACHECTL, V5_MCACHE_CTL_DC_EN);
  41. csr_write(CSR_MCCTLCOMMAND, V5_UCCTL_L1D_WBINVAL_ALL);
  42. }
  43. return 0;
  44. }
  45. uintptr_t mcall_l1_cache_i_prefetch_op(unsigned long enable)
  46. {
  47. if (enable) {
  48. csr_set(CSR_MCACHECTL, V5_MCACHE_CTL_L1I_PREFETCH_EN);
  49. } else {
  50. csr_clear(CSR_MCACHECTL, V5_MCACHE_CTL_L1I_PREFETCH_EN);
  51. }
  52. return 0;
  53. }
  54. uintptr_t mcall_l1_cache_d_prefetch_op(unsigned long enable)
  55. {
  56. if (enable) {
  57. csr_set(CSR_MCACHECTL, V5_MCACHE_CTL_L1D_PREFETCH_EN);
  58. } else {
  59. csr_clear(CSR_MCACHECTL, V5_MCACHE_CTL_L1D_PREFETCH_EN);
  60. }
  61. return 0;
  62. }
  63. uintptr_t mcall_non_blocking_load_store(unsigned long enable)
  64. {
  65. if (enable) {
  66. csr_set(CSR_MCACHECTL, V5_MMISC_CTL_NON_BLOCKING_EN);
  67. } else {
  68. csr_clear(CSR_MCACHECTL, V5_MMISC_CTL_NON_BLOCKING_EN);
  69. }
  70. return 0;
  71. }
  72. uintptr_t mcall_write_around(unsigned long enable)
  73. {
  74. if (enable) {
  75. csr_set(CSR_MCACHECTL, V5_MCACHE_CTL_DC_WAROUND_1_EN);
  76. } else {
  77. csr_clear(CSR_MCACHECTL, V5_MCACHE_CTL_DC_WAROUND_1_EN);
  78. }
  79. return 0;
  80. }