msmc.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * MSMC controller utilities
  4. *
  5. * (C) Copyright 2012-2014
  6. * Texas Instruments Incorporated, <www.ti.com>
  7. */
  8. #include <common.h>
  9. #include <asm/arch/msmc.h>
  10. struct mpax {
  11. u32 mpaxl;
  12. u32 mpaxh;
  13. };
  14. struct msms_regs {
  15. u32 pid;
  16. u32 _res_04;
  17. u32 smcerrar;
  18. u32 smcerrxr;
  19. u32 smedcc;
  20. u32 smcea;
  21. u32 smsecc;
  22. u32 smpfar;
  23. u32 smpfxr;
  24. u32 smpfr;
  25. u32 smpfcr;
  26. u32 _res_2c;
  27. u32 sbndc[8];
  28. u32 sbndm;
  29. u32 sbnde;
  30. u32 _res_58;
  31. u32 cfglck;
  32. u32 cfgulck;
  33. u32 cfglckstat;
  34. u32 sms_mpax_lck;
  35. u32 sms_mpax_ulck;
  36. u32 sms_mpax_lckstat;
  37. u32 ses_mpax_lck;
  38. u32 ses_mpax_ulck;
  39. u32 ses_mpax_lckstat;
  40. u32 smestat;
  41. u32 smirstat;
  42. u32 smirc;
  43. u32 smiestat;
  44. u32 smiec;
  45. u32 _res_94_c0[12];
  46. u32 smncerrar;
  47. u32 smncerrxr;
  48. u32 smncea;
  49. u32 _res_d0_1fc[76];
  50. struct mpax sms[16][8];
  51. struct mpax ses[16][8];
  52. };
  53. void msmc_share_all_segments(int priv_id)
  54. {
  55. struct msms_regs *msmc = (struct msms_regs *)KS2_MSMC_CTRL_BASE;
  56. int j;
  57. for (j = 0; j < 8; j++) {
  58. msmc->sms[priv_id][j].mpaxh &= 0xffffff7ful;
  59. msmc->ses[priv_id][j].mpaxh &= 0xffffff7ful;
  60. }
  61. }
  62. void msmc_map_ses_segment(int priv_id, int ses_pair,
  63. u32 src_pfn, u32 dst_pfn, enum mpax_seg_size size)
  64. {
  65. struct msms_regs *msmc = (struct msms_regs *)KS2_MSMC_CTRL_BASE;
  66. msmc->ses[priv_id][ses_pair].mpaxh = src_pfn << 12 |
  67. (size & 0x1f) | 0x80;
  68. msmc->ses[priv_id][ses_pair].mpaxl = dst_pfn << 8 | 0x3f;
  69. }
  70. void msmc_get_ses_mpax(int priv_id, int ses_pair, u32 *mpax)
  71. {
  72. struct msms_regs *msmc = (struct msms_regs *)KS2_MSMC_CTRL_BASE;
  73. *mpax++ = msmc->ses[priv_id][ses_pair].mpaxl;
  74. *mpax = msmc->ses[priv_id][ses_pair].mpaxh;
  75. }
  76. void msmc_set_ses_mpax(int priv_id, int ses_pair, u32 *mpax)
  77. {
  78. struct msms_regs *msmc = (struct msms_regs *)KS2_MSMC_CTRL_BASE;
  79. msmc->ses[priv_id][ses_pair].mpaxl = *mpax++;
  80. msmc->ses[priv_id][ses_pair].mpaxh = *mpax;
  81. }