Re: [RFC, v3 9/9] media: platform: Add Mediatek ISP P1 shared memory device
From: Tomasz Figa <hidden>
Date: 2019-07-23 07:20:23
Also in:
linux-arm-kernel, linux-media, linux-mediatek
Hi Jungo, On Fri, Jul 5, 2019 at 4:59 PM Jungo Lin [off-list ref] wrote:
Hi Tomasz: On Fri, 2019-07-05 at 13:22 +0900, Tomasz Figa wrote:quoted
Hi Jungo, On Fri, Jul 5, 2019 at 12:33 PM Jungo Lin [off-list ref] wrote:quoted
Hi Tomasz,[snip]quoted
quoted
After applying your suggestion in SCP device driver, we could remove mtk_cam-smem.h/c. Currently, we use dma_alloc_coherent with SCP device to get SCP address. We could touch the buffer with this SCP address in SCP processor. After that, we use dma_map_page_attrs with P1 device which supports IOMMU domain to get IOVA address. For this address, we will assign it to our ISP HW device to proceed. Below is the snippet for ISP P1 compose buffer initialization. ptr = dma_alloc_coherent(p1_dev->cam_dev.smem_dev, MAX_COMPOSER_SIZE, &addr, GFP_KERNEL); if (!ptr) { dev_err(dev, "failed to allocate compose memory\n"); return -ENOMEM; } isp_ctx->scp_mem_pa = addr;addr contains a DMA address, not a physical address. Could we call it scp_mem_dma instead?quoted
dev_dbg(dev, "scp addr:%pad\n", &addr); /* get iova address */ addr = dma_map_page_attrs(dev, phys_to_page(addr), 0,addr is a DMA address, so phys_to_page() can't be called on it. The simplest thing here would be to use dma_map_single() with ptr as the CPU address expected.We have changed to use ma_map_single() with ptr, but encounter IOMMU error. From the debug log of iommu_dma_map_page[3], we got 0x0000000054800000 instead of expected address: 0x0000000050800000[2]. There is a address offset(0x4000000). If we change to use dma_map_page_attrs with phys_to_page(addr), the address is correct as we expected[2]. Do you have any suggestion on this issue? Do we miss something?
Sorry for the late reply. Could you show me the code changes you made to use dma_map_single()? It would sound like the virtual address passed to dma_map_single() isn't correct. Best regards, Tomasz
[1]
[ 1.344786] __dma_alloc_from_coherent: 0x800000 PAGE_SHIFT:12
device_base:0x0000000050000000 dma:0x0000000050800000
virt_base:ffffff8014000000 va:ffffff8014800000
[ 1.346890] mtk-cam 1a000000.camisp: scp addr:0x0000000050800000
va:ffffff8014800000
[ 1.347864] iommu_dma_map_page:0x0000000054800000 offset:0
[ 1.348562] mtk-cam 1a000000.camisp: iova addr:0x00000000fde00000
[2]
[ 1.346738] __dma_alloc_from_coherent: 0x800000 PAGE_SHIFT:12
device_base:0x0000000050000000 dma:0x0000000050800000
virt_base:ffffff8014000000 va:ffffff8014800000
[ 1.348841] mtk-cam 1a000000.camisp: scp addr:0x0000000050800000
va:ffffff8014800000
[ 1.349816] iommu_dma_map_page:0x0000000050800000 offset:0
[ 1.350514] mtk-cam 1a000000.camisp: iova addr:0x00000000fde00000
[3]
dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page,
unsigned long offset, size_t size, int prot)
{
phys_addr_t phys = page_to_phys(page);
pr_err("iommu_dma_map_page:%pa offset:%lu\n", &phys, offset);
return __iommu_dma_map(dev, page_to_phys(page) + offset, size, prot,
iommu_get_dma_domain(dev));
}
[snip]
Best regards,
Jungo