Hi,
kernel mapping is implicit with dma_alloc_coherent, in consequence ion_cma_map_kernel only have to return the address of mapped memory (info->cpu_addr). unmap_kernel is useless in this context.
When DMA_ATTR_NO_KERNEL_MAPPING will be available in Android kernel, we could set it when calling dma_alloc_coherent and the mapping will become explicit with a map_kernel and unmap_kernel to do the map/unmap operations.
Regards, Benjamin
2012/12/6 Laura Abbott lauraa@codeaurora.org
Hi,
On 12/6/2012 4:50 AM, benjamin.gaignard@linaro.org wrote:
From: Benjamin Gaignard benjamin.gaignard@linaro.org
<snip>
+/* return physical address in addr */ +static int ion_cma_phys(struct ion_heap *heap, struct ion_buffer *buffer,
ion_phys_addr_t *addr, size_t *len)+{
struct device *dev = heap->priv;struct ion_cma_buffer_info *info = buffer->priv_virt;dev_dbg(dev, "Return buffer %p physical address 0x%x\n", buffer,virt_to_phys(info->cpu_addr));*addr = virt_to_phys(info->cpu_addr);*len = buffer->size;return 0;+}
info->handle should give back the physical address so we should be able to use that directly instead of calling virt_to_phys
+struct sg_table *ion_cma_heap_map_dma(struct ion_heap *heap,
struct ion_buffer *buffer)+{
struct ion_cma_buffer_info *info = buffer->priv_virt;return info->table;+}
+void ion_cma_heap_unmap_dma(struct ion_heap *heap,
struct ion_buffer *buffer)+{
return;+}
+static int ion_cma_mmap(struct ion_heap *mapper, struct ion_buffer *buffer,
struct vm_area_struct *vma)+{
struct device *dev = buffer->heap->priv;struct ion_cma_buffer_info *info = buffer->priv_virt;return dma_mmap_coherent(dev, vma, info->cpu_addr, info->handle,buffer->size);+}
+void *ion_cma_map_kernel(struct ion_heap *heap, struct ion_buffer *buffer) +{
struct ion_cma_buffer_info *info = buffer->priv_virt;/* kernel memory mapping has been done at allocation time */return info->cpu_addr;+}
+static struct ion_heap_ops ion_cma_ops = {
.allocate = ion_cma_allocate,.free = ion_cma_free,.map_dma = ion_cma_heap_map_dma,.unmap_dma = ion_cma_heap_unmap_dma,.phys = ion_cma_phys,.map_user = ion_cma_mmap,.map_kernel = ion_cma_map_kernel,+};
Missing the unmap_kernel?
Thanks, Laura
-- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation