lkml.org 
[lkml]   [2008]   [Nov]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRE: [PATCH 2/9] introcude linux/iommu.h for an iommu api
    Joerg Roedel wrote:
    > This patch introduces the API to abstract the exported VT-d functions
    > for KVM into a generic API. This way the AMD IOMMU implementation can
    > plug into this API later.
    >
    > Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
    > ---
    > include/linux/iommu.h | 100
    > +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed,
    > 100 insertions(+), 0 deletions(-) create mode 100644
    > include/linux/iommu.h
    >
    > diff --git a/include/linux/iommu.h b/include/linux/iommu.h
    > new file mode 100644
    > index 0000000..6dbc279
    > --- /dev/null
    > +++ b/include/linux/iommu.h
    > @@ -0,0 +1,100 @@
    > +/*
    > + * Copyright (C) 2007-2008 Advanced Micro Devices, Inc.
    > + * Author: Joerg Roedel <joerg.roedel@amd.com>
    > + *
    > + * This program is free software; you can redistribute it and/or
    > modify it + * under the terms of the GNU General Public License
    > version 2 as published + * by the Free Software Foundation.
    > + *
    > + * This program is distributed in the hope that it will be useful,
    > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    > + * GNU General Public License for more details.
    > + *
    > + * You should have received a copy of the GNU General Public License
    > + * along with this program; if not, write to the Free Software
    > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    > 02111-1307 USA + */
    > +
    > +#ifndef __LINUX_IOMMU_H
    > +#define __LINUX_IOMMU_H
    > +
    > +struct device;
    > +
    > +struct iommu_domain {
    > + void *priv;
    > +};
    > +
    > +struct iommu_ops {
    > + int (*domain_init)(struct iommu_domain *domain, struct device *dev);

    needn't parameter dev, use attach_dev to assign dev to domain.

    > + void (*domain_destroy)(struct iommu_domain *domain);
    > + int (*attach_dev)(struct iommu_domain *domain, struct device *dev);
    > + void (*detach_dev)(struct iommu_domain *domain, struct device *dev);
    > + int (*map)(struct iommu_domain *domain, dma_addr_t iova,
    > + phys_addr_t paddr, size_t size, int prot);

    It maps/unmaps pages for iommu in kvm, so I think it's better change to
    int (*map_pages)(struct iommu_domain *domain, unsigned long gfn, unsigned long pfn,
    unsigned long npages, int prot);
    and also add unmap op:
    int (*unmap_pages)(struct iommu_domain *domain, unsigned long gfn, unsigned long npages);

    > + phys_addr_t (*iova_to_phys)(struct iommu_domain *domain,
    > + dma_addr_t iova);
    > +};
    > +
    > +#ifdef CONFIG_IOMMU_API
    > +
    > +extern void register_iommu(struct iommu_ops *ops);
    > +extern bool iommu_found(void);
    > +extern struct iommu_domain *iommu_domain_alloc(struct device *dev);
    > +extern void iommu_domain_free(struct iommu_domain *domain);
    > +extern int iommu_attach_device(struct iommu_domain *domain,
    > + struct device *dev);
    > +extern void iommu_detach_device(struct iommu_domain *domain,
    > + struct device *dev);
    > +extern int iommu_map_address(struct iommu_domain *domain, dma_addr_t
    > iova, + phys_addr_t paddr, size_t size, int prot);

    similarly:
    extern int iommu_map_pages(struct iommu_domain *domain, unsigned long gfn, unsigned long pfn,
    unsigned long npages, int prot);
    extern int iommu_unmap_pages(struct iommu_domain *domain, unsigned long gfn, unsigned long npages);

    Regards,
    Weidong



    \
     
     \ /
      Last update: 2008-11-28 03:53    [W:0.033 / U:61.324 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site