I'm investigating some memory corruption issues in an ethernet driver for an embedded system.
I suspect a problem between a bus mastering DMA controller and slow SDRAM. So I want to use a bounce buffer in fast SRAM. To do this I need two things: I must place the SRAM's physical address (from the bus master's perspective) into the DMA controller buffer descriptor, and I must memcpy the data from the bounce buffer into the sk_buff in SDRAM once the DMA controller reports an incoming packet.
What I haven't been able to determine, from reading
is whether skb->data is a physical or virtual address. i.e. should I call
memcpy(skb->data, phys_to_virt(bounce_addr), len);
or
memcpy(phys_to_virt(skb->data), phys_to_virt(bounce_addr), len);
to get the packet into an sk_buff so the rest of the linux networking stack can process it?
EDIT: This is the driver in question. I'd say that it's passing virtual addresses into the DMA controller registers and therefore can't work, but I have a devkit on which this code works. However my SDRAM doesn't have as good timings as the devkit DDR SDRAM, hence I'm thinking of implementing bounce buffers.
It's virtual. Basically anything of type
foo *
in the kernel is going to be a virtual address, and in fact, you'll very, very, rarely deal with physical addresses outside of low-level memory management -- you'll either have virtual addresses, orstruct page
that you need tokmap
to get a virtual address.