Пример #1
0
static int
msm_buspm_dev_alloc(struct file *filp, struct buspm_alloc_params data)
{
    unsigned long paddr;
    void *vaddr;
    struct msm_buspm_map_dev *dev = filp->private_data;


    if (dev->vaddr)
        msm_buspm_dev_free(filp);


    vaddr = allocate_contiguous_ebi(data.size, PAGE_SIZE, 0);
    paddr = (vaddr) ? memory_pool_node_paddr(vaddr) : 0L;

    if (vaddr == NULL) {
        pr_err("allocation of 0x%x bytes failed", data.size);
        return -ENOMEM;
    }

    dev->vaddr = vaddr;
    dev->paddr = paddr;
    dev->buflen = data.size;
    filp->f_pos = 0;
    pr_debug("virt addr = 0x%p\n", dev->vaddr);
    pr_debug("phys addr = 0x%lx\n", dev->paddr);

    return 0;
}
Пример #2
0
static int ion_cp_change_mem_v2(unsigned int phy_base, unsigned int size,
			      void *data, int lock)
{
	enum cp_mem_usage usage = (enum cp_mem_usage) data;
	unsigned long *chunk_list;
	int nchunks;
	int ret;
	int i;

	if (usage < 0 || usage >= MAX_USAGE)
		return -EINVAL;

	if (!IS_ALIGNED(size, V2_CHUNK_SIZE)) {
		pr_err("%s: heap size is not aligned to %x\n",
			__func__, V2_CHUNK_SIZE);
		return -EINVAL;
	}

	nchunks = size / V2_CHUNK_SIZE;

	chunk_list = allocate_contiguous_ebi(sizeof(unsigned long)*nchunks,
						SZ_4K, 0);
	if (!chunk_list)
		return -ENOMEM;

	for (i = 0; i < nchunks; i++)
		chunk_list[i] = phy_base + i * V2_CHUNK_SIZE;

	ret = ion_cp_change_chunks_state(memory_pool_node_paddr(chunk_list),
					nchunks, V2_CHUNK_SIZE, usage, lock);

	free_contiguous_memory(chunk_list);
	return ret;
}