123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #include "heap.h"
- struct page pagepool0[RAM_MPOOL0_MAX_NUM];
- struct page *pagepool[1] = {pagepool0,};
- const int pagepool_size[1] = {POOL0_NUM,};
- unsigned char freepage_num[1];
- struct list_index freelist = { (unsigned char)FREE_INDEX_FREE_FLAG, (unsigned char)FREE_INDEX_FREE_FLAG };
- void *pagepool_convert_index_to_addr(unsigned char index)
- {
- void *start_addr = POOL0_ADDR;
- #if 0
- if(INDEX_ZONE(index) != zone_ram_cache)
- {
- #if 1
- os_printk("%s: invalid index %d\n", __func__, index);
- #else
- if(index >= POOL1_DSP_NUM)
- {
- start_addr = HW_RAM_ADDR;
- index -= POOL1_DSP_NUM;
- }
- else
- {
- start_addr = DSP_ADDR;
- }
- index = INDEX2PAGE(index);
- #endif
- }
- #endif /* #if 0 */
- return ((char *)start_addr + index * PAGE_SIZE);
- }
- static void __freelist_add(unsigned char new_index, unsigned char prev_index, unsigned char next_index)
- {
- // os_printk("new index %d prev %d next %d\n",new_index, prev_index, next_index);
- NODE(next_index)->prev_index = new_index;
- NODE(new_index)->next_index = next_index;
- NODE(new_index)->prev_index = prev_index;
- NODE(prev_index)->next_index = new_index;
- }
- static void __freelist_del(unsigned char prev_index, unsigned char next_index)
- {
- NODE(next_index)->prev_index = prev_index;
- NODE(prev_index)->next_index = next_index;
- }
- void pagepool_freelist_add(unsigned char new_index)
- {
- // os_printk("++ page index add %d\n",new_index);
- __freelist_add(new_index, (unsigned char)FREE_INDEX_FREE_FLAG, freelist.next_index);
- }
- //void pagepool_freelist_add_tail(unsigned char new_index)
- //{
- // __freelist_add(new_index, freelist.prev_index, (unsigned char)FREE_INDEX_FLAG);
- //}
- void pagepool_freelist_del(unsigned char index)
- {
- // os_printk("-- page index del %d\n",index);
- __freelist_del(NODE(index)->prev_index, NODE(index)->next_index);
- NODE(index)->prev_index = FREE_INDEX_USED_FLAG;
- NODE(index)->next_index = FREE_INDEX_USED_FLAG;
- }
- int pagepool_is_page_in_freelist(struct page *page)
- {
- return PAGE_IN_FREELIST(page);
- }
- void * pmalloc(unsigned int size, void *caller)
- {
- void *ptr;
- page_alloc_ctx_t ctx;
- int page_num = SIZE2PAGE(size);
- ctx.freelist = &freelist;
- ctx.continus_start_alloc_page_num = POOL0_NUM;
- ctx.pagepool_cache_ibank_into_freepage_cb = NULL;
- ctx.pagepool_freelist_del_cb = pagepool_freelist_del;
- ctx.pagepool_is_page_in_freelist = pagepool_is_page_in_freelist;
- ctx.pagepool_convert_index_to_addr = pagepool_convert_index_to_addr;
- ptr = rom_pagepool_alloc_pages(page_num, zone_ram_cache, pagepool_size, freepage_num, pagepool, &ctx);
- //os_printk("%s: ptr 0x%x, size 0x%x, page_num %d, freepage_num %d %p\n",
- // __func__, ptr, size, page_num, freepage_num[0], caller);
- return ptr;
- }
- struct page *pagepool_get_page_by_index(unsigned char index)
- {
- return PAGE(index);
- }
- unsigned char pagepool_convert_addr_to_pageindex(void *addr)
- {
- return ((uintptr_t)addr - (uintptr_t)POOL0_ADDR) / PAGE_SIZE;
- }
- int pfree(void *addr, unsigned int page_num, void *caller)
- {
- page_free_ctx_t ctx;
- ctx.freelist = &freelist;
- ctx.pagepool_convert_addr_to_pageindex = pagepool_convert_addr_to_pageindex;
- ctx.pagepool_freelist_add = pagepool_freelist_add;
- ctx.pagepool_is_page_in_freelist = pagepool_is_page_in_freelist;
- ctx.pagepool_get_page_by_index = pagepool_get_page_by_index;
- //printk("%s: ptr 0x%x, page_num %d %p\n",
- // __func__, addr, page_num, caller);
- //dump_stack();
- return rom_pagepool_free_pages(addr, page_num, zone_ram_cache, pagepool_size, freepage_num, &ctx);
- }
- void pagepool_use_dump(uint32_t use_size)
- {
- uint32_t total_mem = POOL0_NUM * PAGE_SIZE;
- os_printk("mpool: %d(used)/%d(total)\n\n"
- ,freepage_num[0], POOL0_NUM);
- os_printk("total mem size %u\n", total_mem);
- os_printk("use mem size %u (%u %%)\n", use_size, \
- use_size * 100 / total_mem);
-
- os_printk("free mem size %u (%u %%)\n", total_mem - use_size, \
- (total_mem - use_size) * 100 / total_mem);
- }
|