Skip to content
Snippets Groups Projects
Select Git revision
  • f0edfea8ef93ed6cc5f747c46c85c8e53e0798a0
  • seco_lf-6.6.52-2.2.1 default protected
  • MODV-209-e-39-add-gpio-line-names-in-kernel-device-tree
  • niccolor/e88-lt9611uxc-dsi-complete-support
  • seco_lf-6.6.52-2.2.1_e88-lt9611uxc-i2s
  • seco_lf-6.6.52-2.2.1_e39-nxpbtuart
  • chka-modv-206-poc
  • seco_lf-6.6.52-2.2.1-rtl8211f_led
  • seco_lf-5.10.y protected
  • seco_lf_v2024.04_6.6.52_2.2.x_e39_spidev-overlay
  • seco_lf_v2024.04_6.6.52_2.2.x_e39_sdcard-card-detect-gpio-mode
  • integrate/gitlab-ci/cleaos-833-add-cnfluence-labels-into-config/into/seco_lf-5.10.y
  • integrate/gitlab-ci/cleaos-448-bitbake-logs-in-failed-job/into/seco_lf-6.6.52-2.2.1
  • integrate/gitlab-ci/cleaos-448-bitbake-logs-in-failed-job/into/seco_lf-5.10.y
  • chka-seco_lf-6.6.52-2.2.1-fix-eth-led-modv-198
  • didi/spi-cs
  • seco_lf-6.6.23-2.0.0_e39-e83-temperature-sensor
  • seco_lf-6.6.23-2.0.0_e39-e83-status-led
  • seco_lf-6.6.23-2.0.0_e39-e83-lvds-7inch-powersequence
  • chka-fix-eth-led-modv-198
  • seco_lf-6.6.52-2.2.1_e88-e83-dev
  • lf-6.6.52-2.2.1
  • lf-6.1.55-2.2.1
  • lf-6.6.3-1.0.0
  • lf-6.6.3-imx95-er2
  • lf-6.1.55-2.2.0
  • lf-6.6.y-imx95-er1
  • lf-5.15.71-2.2.2
  • lf-6.1.36-2.1.0
  • lf-5.15.71-2.2.1
  • lf-6.1.22-2.0.0
  • lf-6.1.1-1.0.1
  • rel_imx_5.4.24_2.1.4
  • rel_imx_4.9.88_2.0.13
  • rel_imx_4.14.98_2.3.5
  • lf-6.1.1-1.0.0
  • rel_imx_5.4.3_2.0.2
  • lf-5.15.71-2.2.0
  • lf-5.10.72-2.2.3
  • lf-5.15.52-2.1.0
  • imx_5.15.52_imx8ulp_er1
41 results

remap.c

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    remap.c 1.92 KiB
    // SPDX-License-Identifier: GPL-2.0
    /*
     * Copyright (c) 2014 The Linux Foundation
     */
    #include <linux/dma-mapping.h>
    #include <linux/slab.h>
    #include <linux/vmalloc.h>
    
    static struct vm_struct *__dma_common_pages_remap(struct page **pages,
    			size_t size, unsigned long vm_flags, pgprot_t prot,
    			const void *caller)
    {
    	struct vm_struct *area;
    
    	area = get_vm_area_caller(size, vm_flags, caller);
    	if (!area)
    		return NULL;
    
    	if (map_vm_area(area, prot, pages)) {
    		vunmap(area->addr);
    		return NULL;
    	}
    
    	return area;
    }
    
    /*
     * Remaps an array of PAGE_SIZE pages into another vm_area.
     * Cannot be used in non-sleeping contexts
     */
    void *dma_common_pages_remap(struct page **pages, size_t size,
    			unsigned long vm_flags, pgprot_t prot,
    			const void *caller)
    {
    	struct vm_struct *area;
    
    	area = __dma_common_pages_remap(pages, size, vm_flags, prot, caller);
    	if (!area)
    		return NULL;
    
    	area->pages = pages;
    
    	return area->addr;
    }
    
    /*
     * Remaps an allocated contiguous region into another vm_area.
     * Cannot be used in non-sleeping contexts
     */
    void *dma_common_contiguous_remap(struct page *page, size_t size,
    			unsigned long vm_flags,
    			pgprot_t prot, const void *caller)
    {
    	int i;
    	struct page **pages;
    	struct vm_struct *area;
    
    	pages = kmalloc(sizeof(struct page *) << get_order(size), GFP_KERNEL);
    	if (!pages)
    		return NULL;
    
    	for (i = 0; i < (size >> PAGE_SHIFT); i++)
    		pages[i] = nth_page(page, i);
    
    	area = __dma_common_pages_remap(pages, size, vm_flags, prot, caller);
    
    	kfree(pages);
    
    	if (!area)
    		return NULL;
    	return area->addr;
    }
    
    /*
     * Unmaps a range previously mapped by dma_common_*_remap
     */
    void dma_common_free_remap(void *cpu_addr, size_t size, unsigned long vm_flags)
    {
    	struct vm_struct *area = find_vm_area(cpu_addr);
    
    	if (!area || (area->flags & vm_flags) != vm_flags) {
    		WARN(1, "trying to free invalid coherent area: %p\n", cpu_addr);
    		return;
    	}
    
    	unmap_kernel_range((unsigned long)cpu_addr, PAGE_ALIGN(size));
    	vunmap(cpu_addr);
    }