2007-02-09 23:33:53

by Kumar Gala

[permalink] [raw]
Subject: DMA mapping API for non-system memory pools

We've been having a discussion on the linuxppc-dev list about how to
handle IO memory that exists on some PPC SoC devices. These IO
memories behave like system memory but are faster to the processor or
device needed accessing for things like buffer descriptors.

Here's an example in which allocation is done either via system
memory or a specialized allocator for MURAM from drivers/net/ucc_geth.c:

(Yes, the system memory should be moved to use the dma mapping api)

if (uf_info->bd_mem_part == MEM_PART_SYSTEM) {
u32 align = 4;
if (UCC_GETH_TX_BD_RING_ALIGNMENT > 4)
align = UCC_GETH_TX_BD_RING_ALIGNMENT;
ugeth->tx_bd_ring_offset[j] =
kmalloc((u32) (length + align),
GFP_KERNEL);

if (ugeth->tx_bd_ring_offset[j] != 0)
ugeth->p_tx_bd_ring[j] =
(void*)((ugeth-
>tx_bd_ring_offset[j] +
align) & ~(align - 1));
} else if (uf_info->bd_mem_part == MEM_PART_MURAM) {
ugeth->tx_bd_ring_offset[j] =
qe_muram_alloc(length,

UCC_GETH_TX_BD_RING_ALIGNMENT);
if (!IS_MURAM_ERR(ugeth->tx_bd_ring_offset[j]))
ugeth->p_tx_bd_ring[j] =
(u8 *) qe_muram_addr(ugeth->

tx_bd_ring_offset[j]);
}

ideally all this would be handled via the dma mapping API, the
question is how to convey to the API to use the IO memory vs the
system memory? Should we look at adding a new GFP_IOMEM flag or do
something based on struct device?

Any ideas on direction (or if this is a solved problem elsewhere)
would be appreciated.

Thanks

- kumar


2007-02-09 23:53:36

by James Bottomley

[permalink] [raw]
Subject: Re: DMA mapping API for non-system memory pools

On Fri, 2007-02-09 at 17:33 -0600, Kumar Gala wrote:
> ideally all this would be handled via the dma mapping API, the
> question is how to convey to the API to use the IO memory vs the
> system memory? Should we look at adding a new GFP_IOMEM flag or do
> something based on struct device?
>
> Any ideas on direction (or if this is a solved problem elsewhere)
> would be appreciated.

Doesn't the dma_declare_coherent_memory() API work for this case? it
was designed for the ARM SoC (and the voyager weird SCSI card).

James


2007-02-09 23:54:32

by Matthew Jacob

[permalink] [raw]
Subject: Re: DMA mapping API for non-system memory pools

Yes- this would be interesting to know wrt to doing things like
PCI<>PCI xfers (e.g., for things like the Micromemory NVRAM card).

On 2/9/07, Kumar Gala <[email protected]> wrote:
> We've been having a discussion on the linuxppc-dev list about how to
> handle IO memory that exists on some PPC SoC devices. These IO
> memories behave like system memory but are faster to the processor or
> device needed accessing for things like buffer descriptors.
>