|
|
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] |
a) By un-selecting IOMMU in menu config, I am able to allocate memory in vb2-dma-contig
b) When I enable SYSMMU support for the IP's, I am receiving below fault: Unhandled fault: external abort on non-linefetch (0x818) at 0xb6f55000I think this has something to do with the access to the SYSMMU registers for writing the page table. Has anyone of you faced this issue while testing these(dma_map+iommu) patches on kernel mentioned above? This must be something related to recent changes, as I didn't have issues with these patches on 3.2 kernel.
Regards, Subash On 03/02/2012 01:35 PM, KyongHo Cho wrote:
On Thu, Mar 1, 2012 at 12:04 AM, Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> wrote:+/** + * arm_iommu_map_sg - map a set of SG buffers for streaming mode DMA + * @dev: valid struct device pointer + * @sg: list of buffers + * @nents: number of buffers to map + * @dir: DMA transfer direction + * + * Map a set of buffers described by scatterlist in streaming mode for DMA. + * The scatter gather list elements are merged together (if possible) and + * tagged with the appropriate dma address and length. They are obtained via + * sg_dma_{address,length}. + */ +int arm_iommu_map_sg(struct device *dev, struct scatterlist *sg, int nents, + enum dma_data_direction dir, struct dma_attrs *attrs) +{ + struct scatterlist *s = sg, *dma = sg, *start = sg; + int i, count = 0; + unsigned int offset = s->offset; + unsigned int size = s->offset + s->length; + unsigned int max = dma_get_max_seg_size(dev); + + for (i = 1; i< nents; i++) { + s->dma_address = ARM_DMA_ERROR; + s->dma_length = 0; + + s = sg_next(s); + + if (s->offset || (size& ~PAGE_MASK) || size + s->length> max) { + if (__map_sg_chunk(dev, start, size,&dma->dma_address, + dir)< 0) + goto bad_mapping; + + dma->dma_address += offset; + dma->dma_length = size - offset; + + size = offset = s->offset; + start = s; + dma = sg_next(dma); + count += 1; + } + size += s->length; + } + if (__map_sg_chunk(dev, start, size,&dma->dma_address, dir)< 0) + goto bad_mapping; + + dma->dma_address += offset; + dma->dma_length = size - offset; + + return count+1; + +bad_mapping: + for_each_sg(sg, s, count, i) + __iommu_remove_mapping(dev, sg_dma_address(s), sg_dma_len(s)); + return 0; +} +This looks that the given sg list specifies the list of physical memory chunks and the list of IO virtual memory chunks at the same time after calling arm_dma_map_sg(). It can happen that dma_address and dma_length of a sg entry does not correspond to physical memory information of the sg entry. I think it is beneficial for handling IO virtual memory. However, I worry about any other problems caused by a single sg entry contains information from 2 different context. Regards, Cho KyongHo. -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
-- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
[Linux Kernel] [Kernel Newbies] [x86 Platform Driver] [Share Photos] [Security] [Netfilter] [Bugtraq] [Linux FS] [Photo] [Yosemite] [Yosemite Discussion] [MIPS Linux] [ARM Linux] [Linux Security] [Linux RAID] [Samba] [Video 4 Linux] [Device Mapper] [Linux Resources]
![]() |