static int mtk_mspace_mmap_physical(struct exm_info *info, struct vm_area_struct *vma) { unsigned long size = vma->vm_end - vma->vm_start; void * va = NULL; if ((vma->vm_flags & VM_SHARED) == 0) { return -EINVAL; } vma->vm_ops = &exm_vm_ops; va = extmem_malloc_page_align(size); if (!va) { printk("[EXT_MEM] %s[%d] malloc failed...", __FILE__, __LINE__); return -ENOMEM; } memset(va, 0, size); vma->vm_flags |= (VM_DONTCOPY | VM_DONTEXPAND); void * pa = (void *)get_phys_from_mspace((unsigned long) va); int ret = remap_pfn_range(vma, vma->vm_start, (((unsigned long) pa) >> PAGE_SHIFT), size, vma->vm_page_prot); extmem_printk("[EXT_MEM] pa:0x%x, va:0x%x, vma->vm_pgoff:0x%x, vm_start:0x%x, vm_end:0x%x\n", pa, va, vma->vm_pgoff, vma->vm_start, vma->vm_end); return ret; }
static int mtk_mspace_mmap_physical(struct exm_info *info, struct vm_area_struct *vma) { unsigned long size = vma->vm_end - vma->vm_start; void * va = NULL; unsigned long pa; int ret = -EINVAL; if ((vma->vm_flags & VM_SHARED) == 0) { return -EINVAL; } vma->vm_ops = &exm_vm_ops; va = extmem_malloc_page_align(size); if (!va) { printk(KERN_ERR "[EXT_MEM] %s failed...\n", __FUNCTION__); return -ENOMEM; } memset(va, 0, size); vma->vm_flags |= (VM_DONTCOPY | VM_DONTEXPAND); #ifdef CONFIG_ARM64 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); #else vma->vm_page_prot = __pgprot_modify(vma->vm_page_prot, L_PTE_MT_MASK, L_PTE_MT_WRITEBACK); #endif pa = get_phys_from_mspace((unsigned long) va); ret = remap_pfn_range(vma, vma->vm_start, (pa >> PAGE_SHIFT), size, vma->vm_page_prot); extmem_printk("[EXT_MEM] pa:%p, va:%p, vma->vm_pgoff:0x%lx, vm_start:0x%lx, vm_end:0x%lx\n", (void *)pa, va, vma->vm_pgoff, vma->vm_start, vma->vm_end); if (ret) { printk(KERN_ERR "[EXT_MEM] %s fail ret:%d\n", __FUNCTION__, ret); } return ret; }