From: Anish K K <ani...@gm...> - 2010-02-13 09:33:11
|
Hi all, I am using linux 2.6.22.18 kernel running on Marvel Sheeva MV88F6281 board. I posses a doubt regarding the usage of ioremap. In the Marvel board there is an XOR/DMA engine. The DMA engine can be used to move data from SDRAM to SDRAM or from PCIe to SDRAM. For DMA Read from PCIe receive buffer, the DESTINATION is a buffer allocated in kernel space gReadBuffer = kmalloc(BUF_SIZE, GFP_KERNEL); the SOURCE is the virtual address of the pcie receive buffer obtained by gBaseVirt = ioremap(pci_resource_start (gDev, 0), gBaseLen); the source address obtained by ioremap function (gBaseVirt) fails for (virt_addr_valid((u32)) check. In otherwords, ioremapped address is failing to generate its corresponding physical address. Can any one point out me what is going wrong here. The failing point is pasted below: void *xor_memcpy(void *to, const void *from, __kernel_size_t n) { u32 xor_dma_unaligned_to, xor_dma_unaligned_from; void *orig_to = to; u32 to_pa, from_pa; int ua = 0; int chan; struct xor_channel_t *channel; DPRINTK("xor_memcpy(0x%x, 0x%x, %lu): entering\n", (u32) to, (u32) from, (unsigned long)n); if (xor_engine_initialized == 0) { DPRINTK(KERN_WARNING" %s: xor engines not initialized yet\n", __func__); xor_dma_miss++; return asm_memmove(to, from, n); } if (!(virt_addr_valid((u32) to) && virt_addr_valid((u32) from))) { /*THE IOREMAPPED ADDRESS FAILS THIS CHECK*/ DPRINTK("xor_memcpy(0x%x, 0x%x, %lu): falling back to memcpy\n", (u32) to, (u32) from, (unsigned long)n); xor_dma_miss++; return asm_memmove(to, from, n); } /* * We can only handled completely cache-aligned transactions * with the DMA engine. Source and Dst must be cache-line * aligned AND the length must be a multiple of the cache-line. */ to_pa = virt_to_phys(to); from_pa = virt_to_phys((void*)from); if (((to_pa + n > from_pa) && (to_pa < from_pa)) || ((from_pa < to_pa) && (from_pa + n > to_pa))) { DPRINTK("overlapping copy region (0x%x, 0x%x, %lu), falling back\n", to_pa, from_pa, (unsigned long)n); xor_dma_miss++; return asm_memmove(to, from, n); } /* * Ok, start addr is not cache line-aligned, so we need to make it so. */ ........ ..... ........ ..... } I am quite new in kernel. Please help me. Thanks in advance Regards, Anish |