page.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "heap.h"
  2. struct page pagepool0[RAM_MPOOL0_MAX_NUM];
  3. struct page *pagepool[1] = {pagepool0,};
  4. const int pagepool_size[1] = {POOL0_NUM,};
  5. unsigned char freepage_num[1];
  6. struct list_index freelist = { (unsigned char)FREE_INDEX_FREE_FLAG, (unsigned char)FREE_INDEX_FREE_FLAG };
  7. void *pagepool_convert_index_to_addr(unsigned char index)
  8. {
  9. void *start_addr = POOL0_ADDR;
  10. #if 0
  11. if(INDEX_ZONE(index) != zone_ram_cache)
  12. {
  13. #if 1
  14. os_printk("%s: invalid index %d\n", __func__, index);
  15. #else
  16. if(index >= POOL1_DSP_NUM)
  17. {
  18. start_addr = HW_RAM_ADDR;
  19. index -= POOL1_DSP_NUM;
  20. }
  21. else
  22. {
  23. start_addr = DSP_ADDR;
  24. }
  25. index = INDEX2PAGE(index);
  26. #endif
  27. }
  28. #endif /* #if 0 */
  29. return ((char *)start_addr + index * PAGE_SIZE);
  30. }
  31. static void __freelist_add(unsigned char new_index, unsigned char prev_index, unsigned char next_index)
  32. {
  33. // os_printk("new index %d prev %d next %d\n",new_index, prev_index, next_index);
  34. NODE(next_index)->prev_index = new_index;
  35. NODE(new_index)->next_index = next_index;
  36. NODE(new_index)->prev_index = prev_index;
  37. NODE(prev_index)->next_index = new_index;
  38. }
  39. static void __freelist_del(unsigned char prev_index, unsigned char next_index)
  40. {
  41. NODE(next_index)->prev_index = prev_index;
  42. NODE(prev_index)->next_index = next_index;
  43. }
  44. void pagepool_freelist_add(unsigned char new_index)
  45. {
  46. // os_printk("++ page index add %d\n",new_index);
  47. __freelist_add(new_index, (unsigned char)FREE_INDEX_FREE_FLAG, freelist.next_index);
  48. }
  49. //void pagepool_freelist_add_tail(unsigned char new_index)
  50. //{
  51. // __freelist_add(new_index, freelist.prev_index, (unsigned char)FREE_INDEX_FLAG);
  52. //}
  53. void pagepool_freelist_del(unsigned char index)
  54. {
  55. // os_printk("-- page index del %d\n",index);
  56. __freelist_del(NODE(index)->prev_index, NODE(index)->next_index);
  57. NODE(index)->prev_index = FREE_INDEX_USED_FLAG;
  58. NODE(index)->next_index = FREE_INDEX_USED_FLAG;
  59. }
  60. int pagepool_is_page_in_freelist(struct page *page)
  61. {
  62. return PAGE_IN_FREELIST(page);
  63. }
  64. void * pmalloc(unsigned int size, void *caller)
  65. {
  66. void *ptr;
  67. page_alloc_ctx_t ctx;
  68. int page_num = SIZE2PAGE(size);
  69. ctx.freelist = &freelist;
  70. ctx.continus_start_alloc_page_num = POOL0_NUM;
  71. ctx.pagepool_cache_ibank_into_freepage_cb = NULL;
  72. ctx.pagepool_freelist_del_cb = pagepool_freelist_del;
  73. ctx.pagepool_is_page_in_freelist = pagepool_is_page_in_freelist;
  74. ctx.pagepool_convert_index_to_addr = pagepool_convert_index_to_addr;
  75. ptr = rom_pagepool_alloc_pages(page_num, zone_ram_cache, pagepool_size, freepage_num, pagepool, &ctx);
  76. //os_printk("%s: ptr 0x%x, size 0x%x, page_num %d, freepage_num %d %p\n",
  77. // __func__, ptr, size, page_num, freepage_num[0], caller);
  78. return ptr;
  79. }
  80. struct page *pagepool_get_page_by_index(unsigned char index)
  81. {
  82. return PAGE(index);
  83. }
  84. unsigned char pagepool_convert_addr_to_pageindex(void *addr)
  85. {
  86. return ((uintptr_t)addr - (uintptr_t)POOL0_ADDR) / PAGE_SIZE;
  87. }
  88. int pfree(void *addr, unsigned int page_num, void *caller)
  89. {
  90. page_free_ctx_t ctx;
  91. ctx.freelist = &freelist;
  92. ctx.pagepool_convert_addr_to_pageindex = pagepool_convert_addr_to_pageindex;
  93. ctx.pagepool_freelist_add = pagepool_freelist_add;
  94. ctx.pagepool_is_page_in_freelist = pagepool_is_page_in_freelist;
  95. ctx.pagepool_get_page_by_index = pagepool_get_page_by_index;
  96. //printk("%s: ptr 0x%x, page_num %d %p\n",
  97. // __func__, addr, page_num, caller);
  98. //dump_stack();
  99. return rom_pagepool_free_pages(addr, page_num, zone_ram_cache, pagepool_size, freepage_num, &ctx);
  100. }
  101. void pagepool_use_dump(uint32_t use_size)
  102. {
  103. uint32_t total_mem = POOL0_NUM * PAGE_SIZE;
  104. os_printk("mpool: %d(used)/%d(total)\n\n"
  105. ,freepage_num[0], POOL0_NUM);
  106. os_printk("total mem size %u\n", total_mem);
  107. os_printk("use mem size %u (%u %%)\n", use_size, \
  108. use_size * 100 / total_mem);
  109. os_printk("free mem size %u (%u %%)\n", total_mem - use_size, \
  110. (total_mem - use_size) * 100 / total_mem);
  111. }