ioremap.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-05-06 Jesven first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <mmu.h>
  13. #include <mm_aspace.h>
  14. #include <ioremap.h>
  15. void *rt_ioremap_start;
  16. size_t rt_ioremap_size;
  17. #ifdef RT_USING_SMART
  18. #include <lwp_mm.h>
  19. #define DBG_TAG "mm.ioremap"
  20. #define DBG_LVL DBG_LOG
  21. #include <rtdbg.h>
  22. enum ioremap_type
  23. {
  24. MM_AREA_TYPE_PHY,
  25. MM_AREA_TYPE_PHY_CACHED
  26. };
  27. static void *_ioremap_type(void *paddr, size_t size, enum ioremap_type type)
  28. {
  29. void *v_addr = NULL;
  30. size_t attr;
  31. size_t lo_off;
  32. int err;
  33. lo_off = (uintptr_t)paddr & ARCH_PAGE_MASK;
  34. struct rt_mm_va_hint hint = {
  35. .prefer = RT_NULL,
  36. .map_size = RT_ALIGN(size + lo_off, ARCH_PAGE_SIZE),
  37. .flags = 0,
  38. .limit_start = rt_ioremap_start,
  39. .limit_range_size = rt_ioremap_size,
  40. };
  41. switch (type)
  42. {
  43. case MM_AREA_TYPE_PHY:
  44. attr = MMU_MAP_K_DEVICE;
  45. break;
  46. case MM_AREA_TYPE_PHY_CACHED:
  47. attr = MMU_MAP_K_RWCB;
  48. break;
  49. default:
  50. return v_addr;
  51. }
  52. err = rt_aspace_map_phy(&rt_kernel_space, &hint, attr, MM_PA_TO_OFF(paddr), &v_addr);
  53. if (err)
  54. {
  55. LOG_W("IOREMAP 0x%lx failed %d\n", paddr, err);
  56. v_addr = NULL;
  57. }
  58. else
  59. {
  60. v_addr = v_addr + lo_off;
  61. }
  62. return v_addr;
  63. }
  64. void *rt_ioremap(void *paddr, size_t size)
  65. {
  66. return _ioremap_type(paddr, size, MM_AREA_TYPE_PHY);
  67. }
  68. void *rt_ioremap_nocache(void *paddr, size_t size)
  69. {
  70. return _ioremap_type(paddr, size, MM_AREA_TYPE_PHY);
  71. }
  72. void *rt_ioremap_cached(void *paddr, size_t size)
  73. {
  74. return _ioremap_type(paddr, size, MM_AREA_TYPE_PHY_CACHED);
  75. }
  76. void rt_iounmap(volatile void *vaddr)
  77. {
  78. rt_aspace_unmap(&rt_kernel_space, (void *)vaddr, 1);
  79. }
  80. #else
  81. void *rt_ioremap(void *paddr, size_t size)
  82. {
  83. return paddr;
  84. }
  85. void *rt_ioremap_nocache(void *paddr, size_t size)
  86. {
  87. return paddr;
  88. }
  89. void *rt_ioremap_cached(void *paddr, size_t size)
  90. {
  91. return paddr;
  92. }
  93. void rt_iounmap(volatile void *vaddr)
  94. {
  95. }
  96. #endif