msmc.c 1.8 KB

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