Lines Matching refs:varea
107 rt_varea_t varea; in rt_aspace_detach() local
110 varea = ASPACE_VAREA_FIRST(aspace); in rt_aspace_detach()
111 while (varea) in rt_aspace_detach()
113 rt_varea_t prev = varea; in rt_aspace_detach()
114 varea = ASPACE_VAREA_NEXT(varea); in rt_aspace_detach()
136 rt_inline rt_size_t _get_effect_attr(rt_aspace_t aspace, rt_varea_t varea) in _get_effect_attr() argument
138 rt_size_t attr = varea->attr; in _get_effect_attr()
141 if (rt_varea_is_private_locked(varea)) in _get_effect_attr()
147 static int _do_named_map(rt_aspace_t aspace, rt_varea_t varea, void *vaddr, in _do_named_map() argument
157 attr = _get_effect_attr(aspace, varea); in _do_named_map()
172 rt_varea_t varea) in _do_page_fault() argument
183 mem_obj->on_page_fault(varea, msg); in _do_page_fault()
186 int rt_varea_map_with_msg(rt_varea_t varea, struct rt_aspace_fault_msg *msg) in rt_varea_map_with_msg() argument
198 if ((char *)msg->fault_vaddr + store_sz > (char *)varea->start + varea->size) in rt_varea_map_with_msg()
210 aspace = varea->aspace; in rt_varea_map_with_msg()
213 attr = _get_effect_attr(aspace, varea); in rt_varea_map_with_msg()
223 rt_hw_tlb_invalidate_range(varea->aspace, v_addr, store_sz, ARCH_PAGE_SIZE); in rt_varea_map_with_msg()
230 if (rt_hw_mmu_v2p(varea->aspace, msg->fault_vaddr) == ARCH_MAP_FAILED) in rt_varea_map_with_msg()
238 LOG_W("%s: failed on va %p inside varea %p(%s)", __func__, msg->fault_vaddr, varea, in rt_varea_map_with_msg()
239 varea->mem_obj->get_name ? varea->mem_obj->get_name(varea) : "unknow"); in rt_varea_map_with_msg()
245 static int _do_prefetch(rt_aspace_t aspace, rt_varea_t varea, void *start, in _do_prefetch() argument
253 rt_size_t off = varea->offset + ((vaddr - (char *)varea->start) >> ARCH_PAGE_SHIFT); in _do_prefetch()
259 _do_page_fault(&msg, off, vaddr, varea->mem_obj, varea); in _do_prefetch()
261 if (rt_varea_map_with_msg(varea, &msg)) in _do_prefetch()
280 static rt_err_t _expand_varea(rt_varea_t varea, void *new_va, rt_size_t size) in _expand_varea() argument
286 if (varea->mem_obj && varea->mem_obj->on_varea_expand) in _expand_varea()
287 error = varea->mem_obj->on_varea_expand(varea, new_va, size); in _expand_varea()
293 aspace = varea->aspace; in _expand_varea()
294 old_va = varea->start; in _expand_varea()
295 varea->size = size; in _expand_varea()
299 varea->start = new_va; in _expand_varea()
300 varea->offset += ((long)new_va - (long)old_va) >> MM_PAGE_SHIFT; in _expand_varea()
301 _aspace_bst_remove(aspace, varea); in _expand_varea()
302 _aspace_bst_insert(aspace, varea); in _expand_varea()
465 rt_varea_t varea = *pvarea; in _insert_new_varea() local
466 if (varea == RT_NULL) in _insert_new_varea()
469 varea = _varea_create(hint->prefer, hint->map_size); in _insert_new_varea()
471 *pvarea = varea; in _insert_new_varea()
474 if (varea) in _insert_new_varea()
476 varea->start = alloc_va; in _insert_new_varea()
477 _aspace_bst_insert(aspace, varea); in _insert_new_varea()
489 static inline void _varea_post_install(rt_varea_t varea, rt_aspace_t aspace, in _varea_post_install() argument
493 varea->aspace = aspace; in _varea_post_install()
494 varea->attr = attr; in _varea_post_install()
495 varea->mem_obj = mem_obj; in _varea_post_install()
496 varea->flag = flags; in _varea_post_install()
497 varea->offset = offset; in _varea_post_install()
499 if (varea->mem_obj && varea->mem_obj->on_varea_open) in _varea_post_install()
500 varea->mem_obj->on_varea_open(varea); in _varea_post_install()
561 void _varea_uninstall_locked(rt_varea_t varea) in _varea_uninstall_locked() argument
563 rt_aspace_t aspace = varea->aspace; in _varea_uninstall_locked()
565 if (varea->mem_obj && varea->mem_obj->on_varea_close) in _varea_uninstall_locked()
566 varea->mem_obj->on_varea_close(varea); in _varea_uninstall_locked()
569 rt_hw_mmu_unmap(aspace, varea->start, varea->size); in _varea_uninstall_locked()
570 rt_hw_tlb_invalidate_range(aspace, varea->start, varea->size, ARCH_PAGE_SIZE); in _varea_uninstall_locked()
573 _aspace_bst_remove(aspace, varea); in _varea_uninstall_locked()
581 rt_varea_t varea; in _mm_aspace_map() local
608 varea = *pvarea; in _mm_aspace_map()
612 err = _do_prefetch(aspace, varea, varea->start, varea->size); in _mm_aspace_map()
616 __func__, VAREA_NAME(varea)); in _mm_aspace_map()
619 _varea_uninstall_locked(varea); in _mm_aspace_map()
620 if (!(varea->flag & MMF_STATIC_ALLOC)) in _mm_aspace_map()
621 rt_free(varea); in _mm_aspace_map()
633 rt_varea_t varea; in _varea_create() local
634 varea = (rt_varea_t)rt_malloc(sizeof(struct rt_varea)); in _varea_create()
635 if (varea) in _varea_create()
637 varea->start = start; in _varea_create()
638 varea->size = size; in _varea_create()
640 return varea; in _varea_create()
677 rt_varea_t varea = RT_NULL; in rt_aspace_map() local
701 err = _mm_aspace_map(aspace, &varea, addr, length, attr, flags, mem_obj, offset); in rt_aspace_map()
712 int rt_aspace_map_static(rt_aspace_t aspace, rt_varea_t varea, void **addr, in rt_aspace_map_static() argument
718 if (!aspace || !varea || !addr || !mem_obj || length == 0 || in rt_aspace_map_static()
731 varea->size = length; in rt_aspace_map_static()
732 varea->start = *addr; in rt_aspace_map_static()
738 err = _mm_aspace_map(aspace, &varea, addr, length, attr, flags, mem_obj, offset); in rt_aspace_map_static()
747 *addr = varea->start; in rt_aspace_map_static()
752 int _mm_aspace_map_phy(rt_aspace_t aspace, rt_varea_t varea, in _mm_aspace_map_phy() argument
782 err = _varea_install(aspace, &varea, hint, &prop, &vaddr); in _mm_aspace_map_phy()
785 err = _do_named_map(aspace, varea, varea->start, varea->size, in _mm_aspace_map_phy()
790 _varea_uninstall_locked(varea); in _mm_aspace_map_phy()
815 rt_varea_t varea = _varea_create(hint->prefer, hint->map_size); in rt_aspace_map_phy() local
816 if (varea) in rt_aspace_map_phy()
819 err = _mm_aspace_map_phy(aspace, varea, hint, attr, pa_off, ret_va); in rt_aspace_map_phy()
822 rt_free(varea); in rt_aspace_map_phy()
838 int rt_aspace_map_phy_static(rt_aspace_t aspace, rt_varea_t varea, in rt_aspace_map_phy_static() argument
844 if (varea && hint) in rt_aspace_map_phy_static()
846 varea->start = hint->prefer; in rt_aspace_map_phy_static()
847 varea->size = hint->map_size; in rt_aspace_map_phy_static()
849 …LOG_D("%s: start %p size %p phy at %p", __func__, varea->start, varea->size, pa_off << MM_PAGE_SHI… in rt_aspace_map_phy_static()
850 err = _mm_aspace_map_phy(aspace, varea, hint, attr, pa_off, ret_va); in rt_aspace_map_phy_static()
863 rt_varea_t varea; in _aspace_unmap() local
866 varea = _aspace_bst_search(aspace, addr); in _aspace_unmap()
868 if (varea == RT_NULL) in _aspace_unmap()
875 _varea_uninstall_locked(varea); in _aspace_unmap()
876 if (!(varea->flag & MMF_STATIC_ALLOC)) in _aspace_unmap()
878 rt_free(varea); in _aspace_unmap()
913 static rt_err_t _shrink_varea(rt_varea_t varea, void *new_va, rt_size_t size) in _shrink_varea() argument
919 if (varea->mem_obj && varea->mem_obj->on_varea_shrink) in _shrink_varea()
920 error = varea->mem_obj->on_varea_shrink(varea, new_va, size); in _shrink_varea()
926 aspace = varea->aspace; in _shrink_varea()
927 old_va = varea->start; in _shrink_varea()
928 varea->size = size; in _shrink_varea()
932 varea->start = new_va; in _shrink_varea()
933 varea->offset += ((long)new_va - (long)old_va) >> MM_PAGE_SHIFT; in _shrink_varea()
934 _aspace_bst_remove(aspace, varea); in _shrink_varea()
935 _aspace_bst_insert(aspace, varea); in _shrink_varea()
1137 static void *_ascending_search(rt_varea_t varea, rt_size_t req_size, in _ascending_search() argument
1141 while (varea && varea->start < limit.end) in _ascending_search()
1143 char *candidate = (char *)varea->start + varea->size; in _ascending_search()
1149 rt_varea_t nx_va = ASPACE_VAREA_NEXT(varea); in _ascending_search()
1169 varea = nx_va; in _ascending_search()
1182 rt_varea_t varea = _aspace_bst_search_exceed(aspace, candidate); in _find_head_and_asc_search() local
1183 if (varea) in _find_head_and_asc_search()
1185 rt_size_t gap_size = (char *)varea->start - candidate; in _find_head_and_asc_search()
1189 rt_varea_t former = ASPACE_VAREA_PREV(varea); in _find_head_and_asc_search()
1193 gap_size = (char *)varea->start - candidate; in _find_head_and_asc_search()
1198 va = _ascending_search(varea, req_size, align_mask, limit); in _find_head_and_asc_search()
1207 va = _ascending_search(varea, req_size, align_mask, limit); in _find_head_and_asc_search()
1231 rt_varea_t varea = NULL; in _find_free() local
1248 varea = _aspace_bst_search_overlap(aspace, range); in _find_free()
1249 if (!varea) in _find_free()
1271 varea = _aspace_bst_search_overlap(aspace, range); in _find_free()
1273 if (!varea) in _find_free()
1281 va = _ascending_search(varea, req_size, align_mask, limit); in _find_free()
1285 limit.end = (char *)varea->start - 1; in _find_free()
1302 rt_varea_t varea; in rt_aspace_load_page() local
1306 varea = _aspace_bst_search(aspace, addr); in rt_aspace_load_page()
1309 if (!varea) in rt_aspace_load_page()
1316 varea->start, varea->size)) in rt_aspace_load_page()
1323 err = _do_prefetch(aspace, varea, addr, npage << ARCH_PAGE_SHIFT); in rt_aspace_load_page()
1328 int rt_varea_map_page(rt_varea_t varea, void *vaddr, void *page) in rt_varea_map_page() argument
1333 if (!varea || !vaddr || !page) in rt_varea_map_page()
1335 LOG_W("%s(%p,%p,%p): invalid input", __func__, varea, vaddr, page); in rt_varea_map_page()
1344 varea->start, varea->size)) in rt_varea_map_page()
1347 vaddr, ARCH_PAGE_SIZE, varea->start, varea->size); in rt_varea_map_page()
1353 varea->aspace, in rt_varea_map_page()
1354 varea, in rt_varea_map_page()
1358 varea->attr in rt_varea_map_page()
1365 int rt_varea_unmap_page(rt_varea_t varea, void *vaddr) in rt_varea_unmap_page() argument
1368 return rt_varea_unmap_range(varea, va_aligned, ARCH_PAGE_SIZE); in rt_varea_unmap_page()
1374 int rt_varea_map_range(rt_varea_t varea, void *vaddr, void *paddr, rt_size_t length) in rt_varea_map_range() argument
1377 if (!varea || !vaddr || !paddr || !length || in rt_varea_map_range()
1380 LOG_W("%s(%p,%p,%p,%lx): invalid input", __func__, varea, vaddr, paddr, length); in rt_varea_map_range()
1384 varea->start, varea->size)) in rt_varea_map_range()
1387 vaddr, length, varea->start, varea->size); in rt_varea_map_range()
1393 varea->aspace, in rt_varea_map_range()
1394 varea, in rt_varea_map_range()
1398 varea->attr in rt_varea_map_range()
1407 int rt_varea_unmap_range(rt_varea_t varea, void *vaddr, rt_size_t length) in rt_varea_unmap_range() argument
1412 if (!varea || !vaddr || !length) in rt_varea_unmap_range()
1414 LOG_W("%s(%p,%p,%lx): invalid input", __func__, varea, vaddr, length); in rt_varea_unmap_range()
1418 varea->start, varea->size)) in rt_varea_unmap_range()
1421 vaddr, length, varea->start, varea->size); in rt_varea_unmap_range()
1427 rt_hw_mmu_unmap(varea->aspace, (void *)va_align, length); in rt_varea_unmap_range()
1428 rt_hw_tlb_invalidate_range(varea->aspace, (void *)va_align, length, ARCH_PAGE_SIZE); in rt_varea_unmap_range()
1442 rt_varea_t varea; in rt_aspace_control() local
1445 varea = _aspace_bst_search(aspace, addr); in rt_aspace_control()
1448 if (varea) in rt_aspace_control()
1450 err = rt_hw_mmu_control(aspace, varea->start, varea->size, cmd); in rt_aspace_control()
1453 rt_hw_tlb_invalidate_range(aspace, varea->start, varea->size, ARCH_PAGE_SIZE); in rt_aspace_control()
1465 int (*fn)(rt_varea_t varea, void *arg), void *arg) in rt_aspace_traversal() argument
1467 rt_varea_t varea; in rt_aspace_traversal() local
1470 varea = ASPACE_VAREA_FIRST(aspace); in rt_aspace_traversal()
1471 while (varea) in rt_aspace_traversal()
1473 next = ASPACE_VAREA_NEXT(varea); in rt_aspace_traversal()
1474 fn(varea, arg); in rt_aspace_traversal()
1475 varea = next; in rt_aspace_traversal()
1482 static int _dump(rt_varea_t varea, void *arg) in _dump() argument
1484 if (varea->mem_obj && varea->mem_obj->get_name) in _dump()
1486 rt_kprintf("[%p - %p] %s\n", varea->start, (char *)varea->start + varea->size, in _dump()
1487 varea->mem_obj->get_name(varea)); in _dump()
1491 rt_kprintf("[%p - %p] phy-map\n", varea->start, (char *)varea->start + varea->size); in _dump()
1492 rt_kprintf("\t\\_ paddr = %p\n", varea->offset << MM_PAGE_SHIFT); in _dump()
1502 static int _count_vsz(rt_varea_t varea, void *arg) in _count_vsz() argument
1505 RT_ASSERT(varea); in _count_vsz()
1506 *pvsz = *pvsz + varea->size; in _count_vsz()
1584 rt_inline void _dump_varea(rt_varea_t varea) in _dump_varea() argument
1586 …x%lx, size=0x%lx, mem_obj=%p)", VAREA_NAME(varea), varea->attr, varea->flag, varea->start, varea->… in _dump_varea()
1638 rt_inline rt_err_t _page_put(rt_varea_t varea, void *page_va, void *buffer) in _page_put() argument
1643 rt_mm_io_msg_init(&iomsg, VAREA_VA_TO_OFFSET(varea, page_va), page_va, buffer); in _page_put()
1644 varea->mem_obj->page_write(varea, &iomsg); in _page_put()
1654 rt_inline rt_err_t _page_get(rt_varea_t varea, void *page_va, void *buffer) in _page_get() argument
1659 rt_mm_io_msg_init(&iomsg, VAREA_VA_TO_OFFSET(varea, page_va), page_va, buffer); in _page_get()
1660 varea->mem_obj->page_read(varea, &iomsg); in _page_get()
1759 rt_varea_t varea; in rt_aspace_page_put() local
1763 varea = _aspace_bst_search(aspace, page_va); in rt_aspace_page_put()
1764 if (varea && ALIGNED(page_va)) in rt_aspace_page_put()
1766 if (varea->mem_obj) in rt_aspace_page_put()
1768 if (varea->mem_obj->page_write) in rt_aspace_page_put()
1770 if (rt_varea_is_private_locked(varea)) in rt_aspace_page_put()
1777 rc = rt_varea_fix_private_locked(varea, rt_hw_mmu_v2p(aspace, page_va), in rt_aspace_page_put()
1782 varea = _aspace_bst_search(aspace, page_va); in rt_aspace_page_put()
1783 rc = _page_put(varea, page_va, buffer); in rt_aspace_page_put()
1789 rc = _page_put(varea, page_va, buffer); in rt_aspace_page_put()
1812 rt_varea_t varea; in rt_aspace_page_get() local
1817 varea = _aspace_bst_search(aspace, page_va); in rt_aspace_page_get()
1818 if (varea && ALIGNED(page_va)) in rt_aspace_page_get()
1820 if (varea->mem_obj) in rt_aspace_page_get()
1822 if (varea->mem_obj->page_read) in rt_aspace_page_get()
1824 rc = _page_get(varea, page_va, buffer); in rt_aspace_page_get()
1840 __func__, page_va, varea); in rt_aspace_page_get()