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 = kmalloc(sizeof(unsigned long)*nchunks, GFP_KERNEL); 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(__pa(chunk_list), nchunks, V2_CHUNK_SIZE, usage, lock); kfree(chunk_list); return ret; }
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; }
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; int chunk_list_len; phys_addr_t chunk_list_phys; 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_len = sizeof(unsigned long)*nchunks; chunk_list = kmalloc(chunk_list_len, GFP_KERNEL); if (!chunk_list) return -ENOMEM; chunk_list_phys = virt_to_phys(chunk_list); for (i = 0; i < nchunks; i++) chunk_list[i] = phy_base + i * V2_CHUNK_SIZE; /* */ dmac_flush_range(chunk_list, chunk_list + chunk_list_len); outer_flush_range(chunk_list_phys, chunk_list_phys + chunk_list_len); ret = ion_cp_change_chunks_state(chunk_list_phys, nchunks, V2_CHUNK_SIZE, usage, lock); kfree(chunk_list); return ret; }