18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/arch/m68k/sun3/sun3dvma.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2000 Sam Creasey 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Contains common routines for sun3/sun3x DVMA management. 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/memblock.h> 118c2ecf20Sopenharmony_ci#include <linux/init.h> 128c2ecf20Sopenharmony_ci#include <linux/module.h> 138c2ecf20Sopenharmony_ci#include <linux/kernel.h> 148c2ecf20Sopenharmony_ci#include <linux/gfp.h> 158c2ecf20Sopenharmony_ci#include <linux/mm.h> 168c2ecf20Sopenharmony_ci#include <linux/list.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include <asm/page.h> 198c2ecf20Sopenharmony_ci#include <asm/dvma.h> 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#undef DVMA_DEBUG 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#ifdef CONFIG_SUN3X 248c2ecf20Sopenharmony_ciextern void dvma_unmap_iommu(unsigned long baddr, int len); 258c2ecf20Sopenharmony_ci#else 268c2ecf20Sopenharmony_cistatic inline void dvma_unmap_iommu(unsigned long a, int b) 278c2ecf20Sopenharmony_ci{ 288c2ecf20Sopenharmony_ci} 298c2ecf20Sopenharmony_ci#endif 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#ifdef CONFIG_SUN3 328c2ecf20Sopenharmony_ciextern void sun3_dvma_init(void); 338c2ecf20Sopenharmony_ci#endif 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_cistatic unsigned long *iommu_use; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci#define dvma_index(baddr) ((baddr - DVMA_START) >> DVMA_PAGE_SHIFT) 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#define dvma_entry_use(baddr) (iommu_use[dvma_index(baddr)]) 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_cistruct hole { 428c2ecf20Sopenharmony_ci unsigned long start; 438c2ecf20Sopenharmony_ci unsigned long end; 448c2ecf20Sopenharmony_ci unsigned long size; 458c2ecf20Sopenharmony_ci struct list_head list; 468c2ecf20Sopenharmony_ci}; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_cistatic struct list_head hole_list; 498c2ecf20Sopenharmony_cistatic struct list_head hole_cache; 508c2ecf20Sopenharmony_cistatic struct hole initholes[64]; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci#ifdef DVMA_DEBUG 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic unsigned long dvma_allocs; 558c2ecf20Sopenharmony_cistatic unsigned long dvma_frees; 568c2ecf20Sopenharmony_cistatic unsigned long long dvma_alloc_bytes; 578c2ecf20Sopenharmony_cistatic unsigned long long dvma_free_bytes; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistatic void print_use(void) 608c2ecf20Sopenharmony_ci{ 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci int i; 638c2ecf20Sopenharmony_ci int j = 0; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci pr_info("dvma entry usage:\n"); 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci for(i = 0; i < IOMMU_TOTAL_ENTRIES; i++) { 688c2ecf20Sopenharmony_ci if(!iommu_use[i]) 698c2ecf20Sopenharmony_ci continue; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci j++; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci pr_info("dvma entry: %08x len %08lx\n", 748c2ecf20Sopenharmony_ci (i << DVMA_PAGE_SHIFT) + DVMA_START, iommu_use[i]); 758c2ecf20Sopenharmony_ci } 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci pr_info("%d entries in use total\n", j); 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci pr_info("allocation/free calls: %lu/%lu\n", dvma_allocs, dvma_frees); 808c2ecf20Sopenharmony_ci pr_info("allocation/free bytes: %Lx/%Lx\n", dvma_alloc_bytes, 818c2ecf20Sopenharmony_ci dvma_free_bytes); 828c2ecf20Sopenharmony_ci} 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_cistatic void print_holes(struct list_head *holes) 858c2ecf20Sopenharmony_ci{ 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci struct list_head *cur; 888c2ecf20Sopenharmony_ci struct hole *hole; 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci pr_info("listing dvma holes\n"); 918c2ecf20Sopenharmony_ci list_for_each(cur, holes) { 928c2ecf20Sopenharmony_ci hole = list_entry(cur, struct hole, list); 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci if((hole->start == 0) && (hole->end == 0) && (hole->size == 0)) 958c2ecf20Sopenharmony_ci continue; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci pr_info("hole: start %08lx end %08lx size %08lx\n", 988c2ecf20Sopenharmony_ci hole->start, hole->end, hole->size); 998c2ecf20Sopenharmony_ci } 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci pr_info("end of hole listing...\n"); 1028c2ecf20Sopenharmony_ci} 1038c2ecf20Sopenharmony_ci#endif /* DVMA_DEBUG */ 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cistatic inline int refill(void) 1068c2ecf20Sopenharmony_ci{ 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci struct hole *hole; 1098c2ecf20Sopenharmony_ci struct hole *prev = NULL; 1108c2ecf20Sopenharmony_ci struct list_head *cur; 1118c2ecf20Sopenharmony_ci int ret = 0; 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci list_for_each(cur, &hole_list) { 1148c2ecf20Sopenharmony_ci hole = list_entry(cur, struct hole, list); 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci if(!prev) { 1178c2ecf20Sopenharmony_ci prev = hole; 1188c2ecf20Sopenharmony_ci continue; 1198c2ecf20Sopenharmony_ci } 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci if(hole->end == prev->start) { 1228c2ecf20Sopenharmony_ci hole->size += prev->size; 1238c2ecf20Sopenharmony_ci hole->end = prev->end; 1248c2ecf20Sopenharmony_ci list_move(&(prev->list), &hole_cache); 1258c2ecf20Sopenharmony_ci ret++; 1268c2ecf20Sopenharmony_ci } 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci } 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci return ret; 1318c2ecf20Sopenharmony_ci} 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cistatic inline struct hole *rmcache(void) 1348c2ecf20Sopenharmony_ci{ 1358c2ecf20Sopenharmony_ci struct hole *ret; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci if(list_empty(&hole_cache)) { 1388c2ecf20Sopenharmony_ci if(!refill()) { 1398c2ecf20Sopenharmony_ci pr_crit("out of dvma hole cache!\n"); 1408c2ecf20Sopenharmony_ci BUG(); 1418c2ecf20Sopenharmony_ci } 1428c2ecf20Sopenharmony_ci } 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci ret = list_entry(hole_cache.next, struct hole, list); 1458c2ecf20Sopenharmony_ci list_del(&(ret->list)); 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci return ret; 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci} 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_cistatic inline unsigned long get_baddr(int len, unsigned long align) 1528c2ecf20Sopenharmony_ci{ 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci struct list_head *cur; 1558c2ecf20Sopenharmony_ci struct hole *hole; 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci if(list_empty(&hole_list)) { 1588c2ecf20Sopenharmony_ci#ifdef DVMA_DEBUG 1598c2ecf20Sopenharmony_ci pr_crit("out of dvma holes! (printing hole cache)\n"); 1608c2ecf20Sopenharmony_ci print_holes(&hole_cache); 1618c2ecf20Sopenharmony_ci print_use(); 1628c2ecf20Sopenharmony_ci#endif 1638c2ecf20Sopenharmony_ci BUG(); 1648c2ecf20Sopenharmony_ci } 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci list_for_each(cur, &hole_list) { 1678c2ecf20Sopenharmony_ci unsigned long newlen; 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci hole = list_entry(cur, struct hole, list); 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci if(align > DVMA_PAGE_SIZE) 1728c2ecf20Sopenharmony_ci newlen = len + ((hole->end - len) & (align-1)); 1738c2ecf20Sopenharmony_ci else 1748c2ecf20Sopenharmony_ci newlen = len; 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci if(hole->size > newlen) { 1778c2ecf20Sopenharmony_ci hole->end -= newlen; 1788c2ecf20Sopenharmony_ci hole->size -= newlen; 1798c2ecf20Sopenharmony_ci dvma_entry_use(hole->end) = newlen; 1808c2ecf20Sopenharmony_ci#ifdef DVMA_DEBUG 1818c2ecf20Sopenharmony_ci dvma_allocs++; 1828c2ecf20Sopenharmony_ci dvma_alloc_bytes += newlen; 1838c2ecf20Sopenharmony_ci#endif 1848c2ecf20Sopenharmony_ci return hole->end; 1858c2ecf20Sopenharmony_ci } else if(hole->size == newlen) { 1868c2ecf20Sopenharmony_ci list_move(&(hole->list), &hole_cache); 1878c2ecf20Sopenharmony_ci dvma_entry_use(hole->start) = newlen; 1888c2ecf20Sopenharmony_ci#ifdef DVMA_DEBUG 1898c2ecf20Sopenharmony_ci dvma_allocs++; 1908c2ecf20Sopenharmony_ci dvma_alloc_bytes += newlen; 1918c2ecf20Sopenharmony_ci#endif 1928c2ecf20Sopenharmony_ci return hole->start; 1938c2ecf20Sopenharmony_ci } 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ci } 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci pr_crit("unable to find dvma hole!\n"); 1988c2ecf20Sopenharmony_ci BUG(); 1998c2ecf20Sopenharmony_ci return 0; 2008c2ecf20Sopenharmony_ci} 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_cistatic inline int free_baddr(unsigned long baddr) 2038c2ecf20Sopenharmony_ci{ 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci unsigned long len; 2068c2ecf20Sopenharmony_ci struct hole *hole; 2078c2ecf20Sopenharmony_ci struct list_head *cur; 2088c2ecf20Sopenharmony_ci unsigned long orig_baddr; 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci orig_baddr = baddr; 2118c2ecf20Sopenharmony_ci len = dvma_entry_use(baddr); 2128c2ecf20Sopenharmony_ci dvma_entry_use(baddr) = 0; 2138c2ecf20Sopenharmony_ci baddr &= DVMA_PAGE_MASK; 2148c2ecf20Sopenharmony_ci dvma_unmap_iommu(baddr, len); 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci#ifdef DVMA_DEBUG 2178c2ecf20Sopenharmony_ci dvma_frees++; 2188c2ecf20Sopenharmony_ci dvma_free_bytes += len; 2198c2ecf20Sopenharmony_ci#endif 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci list_for_each(cur, &hole_list) { 2228c2ecf20Sopenharmony_ci hole = list_entry(cur, struct hole, list); 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci if(hole->end == baddr) { 2258c2ecf20Sopenharmony_ci hole->end += len; 2268c2ecf20Sopenharmony_ci hole->size += len; 2278c2ecf20Sopenharmony_ci return 0; 2288c2ecf20Sopenharmony_ci } else if(hole->start == (baddr + len)) { 2298c2ecf20Sopenharmony_ci hole->start = baddr; 2308c2ecf20Sopenharmony_ci hole->size += len; 2318c2ecf20Sopenharmony_ci return 0; 2328c2ecf20Sopenharmony_ci } 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci } 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci hole = rmcache(); 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_ci hole->start = baddr; 2398c2ecf20Sopenharmony_ci hole->end = baddr + len; 2408c2ecf20Sopenharmony_ci hole->size = len; 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_ci// list_add_tail(&(hole->list), cur); 2438c2ecf20Sopenharmony_ci list_add(&(hole->list), cur); 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci return 0; 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci} 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_civoid __init dvma_init(void) 2508c2ecf20Sopenharmony_ci{ 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci struct hole *hole; 2538c2ecf20Sopenharmony_ci int i; 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&hole_list); 2568c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&hole_cache); 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci /* prepare the hole cache */ 2598c2ecf20Sopenharmony_ci for(i = 0; i < 64; i++) 2608c2ecf20Sopenharmony_ci list_add(&(initholes[i].list), &hole_cache); 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci hole = rmcache(); 2638c2ecf20Sopenharmony_ci hole->start = DVMA_START; 2648c2ecf20Sopenharmony_ci hole->end = DVMA_END; 2658c2ecf20Sopenharmony_ci hole->size = DVMA_SIZE; 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci list_add(&(hole->list), &hole_list); 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_ci iommu_use = memblock_alloc(IOMMU_TOTAL_ENTRIES * sizeof(unsigned long), 2708c2ecf20Sopenharmony_ci SMP_CACHE_BYTES); 2718c2ecf20Sopenharmony_ci if (!iommu_use) 2728c2ecf20Sopenharmony_ci panic("%s: Failed to allocate %zu bytes\n", __func__, 2738c2ecf20Sopenharmony_ci IOMMU_TOTAL_ENTRIES * sizeof(unsigned long)); 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci dvma_unmap_iommu(DVMA_START, DVMA_SIZE); 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci#ifdef CONFIG_SUN3 2788c2ecf20Sopenharmony_ci sun3_dvma_init(); 2798c2ecf20Sopenharmony_ci#endif 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ci} 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ciunsigned long dvma_map_align(unsigned long kaddr, int len, int align) 2848c2ecf20Sopenharmony_ci{ 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ci unsigned long baddr; 2878c2ecf20Sopenharmony_ci unsigned long off; 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci if(!len) 2908c2ecf20Sopenharmony_ci len = 0x800; 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci if(!kaddr || !len) { 2938c2ecf20Sopenharmony_ci// pr_err("error: kaddr %lx len %x\n", kaddr, len); 2948c2ecf20Sopenharmony_ci// *(int *)4 = 0; 2958c2ecf20Sopenharmony_ci return 0; 2968c2ecf20Sopenharmony_ci } 2978c2ecf20Sopenharmony_ci 2988c2ecf20Sopenharmony_ci pr_debug("dvma_map request %08x bytes from %08lx\n", len, kaddr); 2998c2ecf20Sopenharmony_ci off = kaddr & ~DVMA_PAGE_MASK; 3008c2ecf20Sopenharmony_ci kaddr &= PAGE_MASK; 3018c2ecf20Sopenharmony_ci len += off; 3028c2ecf20Sopenharmony_ci len = ((len + (DVMA_PAGE_SIZE-1)) & DVMA_PAGE_MASK); 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_ci if(align == 0) 3058c2ecf20Sopenharmony_ci align = DVMA_PAGE_SIZE; 3068c2ecf20Sopenharmony_ci else 3078c2ecf20Sopenharmony_ci align = ((align + (DVMA_PAGE_SIZE-1)) & DVMA_PAGE_MASK); 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ci baddr = get_baddr(len, align); 3108c2ecf20Sopenharmony_ci// pr_info("using baddr %lx\n", baddr); 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ci if(!dvma_map_iommu(kaddr, baddr, len)) 3138c2ecf20Sopenharmony_ci return (baddr + off); 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci pr_crit("dvma_map failed kaddr %lx baddr %lx len %x\n", kaddr, baddr, 3168c2ecf20Sopenharmony_ci len); 3178c2ecf20Sopenharmony_ci BUG(); 3188c2ecf20Sopenharmony_ci return 0; 3198c2ecf20Sopenharmony_ci} 3208c2ecf20Sopenharmony_ciEXPORT_SYMBOL(dvma_map_align); 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_civoid dvma_unmap(void *baddr) 3238c2ecf20Sopenharmony_ci{ 3248c2ecf20Sopenharmony_ci unsigned long addr; 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ci addr = (unsigned long)baddr; 3278c2ecf20Sopenharmony_ci /* check if this is a vme mapping */ 3288c2ecf20Sopenharmony_ci if(!(addr & 0x00f00000)) 3298c2ecf20Sopenharmony_ci addr |= 0xf00000; 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci free_baddr(addr); 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci return; 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci} 3368c2ecf20Sopenharmony_ciEXPORT_SYMBOL(dvma_unmap); 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_civoid *dvma_malloc_align(unsigned long len, unsigned long align) 3398c2ecf20Sopenharmony_ci{ 3408c2ecf20Sopenharmony_ci unsigned long kaddr; 3418c2ecf20Sopenharmony_ci unsigned long baddr; 3428c2ecf20Sopenharmony_ci unsigned long vaddr; 3438c2ecf20Sopenharmony_ci 3448c2ecf20Sopenharmony_ci if(!len) 3458c2ecf20Sopenharmony_ci return NULL; 3468c2ecf20Sopenharmony_ci 3478c2ecf20Sopenharmony_ci pr_debug("dvma_malloc request %lx bytes\n", len); 3488c2ecf20Sopenharmony_ci len = ((len + (DVMA_PAGE_SIZE-1)) & DVMA_PAGE_MASK); 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci if((kaddr = __get_free_pages(GFP_ATOMIC, get_order(len))) == 0) 3518c2ecf20Sopenharmony_ci return NULL; 3528c2ecf20Sopenharmony_ci 3538c2ecf20Sopenharmony_ci if((baddr = (unsigned long)dvma_map_align(kaddr, len, align)) == 0) { 3548c2ecf20Sopenharmony_ci free_pages(kaddr, get_order(len)); 3558c2ecf20Sopenharmony_ci return NULL; 3568c2ecf20Sopenharmony_ci } 3578c2ecf20Sopenharmony_ci 3588c2ecf20Sopenharmony_ci vaddr = dvma_btov(baddr); 3598c2ecf20Sopenharmony_ci 3608c2ecf20Sopenharmony_ci if(dvma_map_cpu(kaddr, vaddr, len) < 0) { 3618c2ecf20Sopenharmony_ci dvma_unmap((void *)baddr); 3628c2ecf20Sopenharmony_ci free_pages(kaddr, get_order(len)); 3638c2ecf20Sopenharmony_ci return NULL; 3648c2ecf20Sopenharmony_ci } 3658c2ecf20Sopenharmony_ci 3668c2ecf20Sopenharmony_ci pr_debug("mapped %08lx bytes %08lx kern -> %08lx bus\n", len, kaddr, 3678c2ecf20Sopenharmony_ci baddr); 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_ci return (void *)vaddr; 3708c2ecf20Sopenharmony_ci 3718c2ecf20Sopenharmony_ci} 3728c2ecf20Sopenharmony_ciEXPORT_SYMBOL(dvma_malloc_align); 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_civoid dvma_free(void *vaddr) 3758c2ecf20Sopenharmony_ci{ 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ci return; 3788c2ecf20Sopenharmony_ci 3798c2ecf20Sopenharmony_ci} 3808c2ecf20Sopenharmony_ciEXPORT_SYMBOL(dvma_free); 381