|
From: | Anthony Liguori |
Subject: | Re: [Qemu-devel] Re: [PATCH 2 of 5] add can_dma/post_dma for direct IO |
Date: | Tue, 16 Dec 2008 11:48:01 -0600 |
User-agent: | Thunderbird 2.0.0.17 (X11/20080925) |
Avi Kivity wrote:
Blue Swirl wrote:I don't understand. It's not a device that needs bouncing, it's aparticular transfer. This could be either due to the transfer targetingmmio, or due to the transfer requiring a transformation.Should the bouncing be something more much complex, for example negotiated between the devices? Or maybe the devices set up a transforming and non-transforming channel (which the other end should be able to transform some more) and use them as needed?Yes. We already have two cases:- may do partial request: useful for block storage where requests can be huge - need full request: networking, where you can't send or receive half a packet; on the other hand, packets are small (even with tso)You're adding a third case, always bounce, when the data undergoes a transformation which can't happen in-place.
IMHO, IOMMU translation is distinct from mapping/data transformation. I would think the IOMMU translation API would be different in that it took a physical address and returned a physical address.
The IOMMU DMA API (which could transform data potentially) should return a virtual address and data a physical address. In the normal case (non-transforming IOMMU), it should just fall-through to CPU DMA API (which is just map/unmap).
The PCI DMA API would normally fall through to the IOMMU DMA API. So we would have: PCI DMA map(addr): if IOMMU: return IOMMU DMA map(addr) return CPU DMA map(addr) IOMMU DMA map(addr): new_address = IOMMU translate(addr) if transform: return IOMMU byte-swap map(addr) return CPU DMA map(addr) Regards, Anthony Liguori
[Prev in Thread] | Current Thread | [Next in Thread] |