[PATCH 26/34] AMD IOMMU: add mapping functions for scatter gather lists

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Sun Jun 29 08:07:16 PDT 2008


On Thu, 26 Jun 2008 21:28:02 +0200
Joerg Roedel <joerg.roedel at amd.com> wrote:

> This patch adds the dma_ops functions for mapping and unmapping scatter gather
> lists.
> 
> Signed-off-by: Joerg Roedel <joerg.roedel at amd.com>
> ---
>  arch/x86/kernel/amd_iommu.c |   98 +++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 98 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
> index b4079f6..f4747fe 100644
> --- a/arch/x86/kernel/amd_iommu.c
> +++ b/arch/x86/kernel/amd_iommu.c
> @@ -700,3 +700,101 @@ static void unmap_single(struct device *dev, dma_addr_t dma_addr,
>  	spin_unlock_irqrestore(&domain->lock, flags);
>  }
>  
> +static int map_sg_no_iommu(struct device *dev, struct scatterlist *sglist,
> +			   int nelems, int dir)
> +{
> +	struct scatterlist *s;
> +	int i;
> +
> +	for_each_sg(sglist, s, nelems, i) {
> +		s->dma_address = (dma_addr_t)sg_phys(s);
> +		s->dma_length  = s->length;
> +	}
> +
> +	return nelems;
> +}
> +
> +static int map_sg(struct device *dev, struct scatterlist *sglist,
> +		  int nelems, int dir)
> +{
> +	unsigned long flags;
> +	struct amd_iommu *iommu;
> +	struct protection_domain *domain;
> +	u16 devid;
> +	int i;
> +	struct scatterlist *s;
> +	phys_addr_t paddr;
> +	int mapped_elems = 0;
> +
> +	get_device_resources(dev, &iommu, &domain, &devid);
> +
> +	if (!iommu || !domain)
> +		return map_sg_no_iommu(dev, sglist, nelems, dir);

VT-d put a pointer in struct dev_archdata to store IOMMU info per
device. Is is useful for you too?


More information about the iommu mailing list