lkml.org 
[lkml]   [2010]   [Jun]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 18/19] pci-swiotlb-xen: Add glue code to setup dma_ops utilizing xen_swiotlb_* functions.
    Date
    We add the glue code that sets up a dma_ops structure with the
    xen_swiotlb_* functions. The code turns on xen_swiotlb flag
    when it detects it is running under Xen and it is either
    in privileged mode or the iommu=soft flag was passed in.

    It also disables the bare-metal SWIOTLB if the Xen-SWIOTLB has
    been enabled.

    Note: The Xen-SWIOTLB is only built when CONFIG_XEN is enabled.

    Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    ---
    arch/x86/include/asm/xen/swiotlb-xen.h | 14 ++++++++
    arch/x86/xen/Makefile | 1 +
    arch/x86/xen/pci-swiotlb-xen.c | 58 ++++++++++++++++++++++++++++++++
    3 files changed, 73 insertions(+), 0 deletions(-)
    create mode 100644 arch/x86/include/asm/xen/swiotlb-xen.h
    create mode 100644 arch/x86/xen/pci-swiotlb-xen.c

    diff --git a/arch/x86/include/asm/xen/swiotlb-xen.h b/arch/x86/include/asm/xen/swiotlb-xen.h
    new file mode 100644
    index 0000000..c2bc047
    --- /dev/null
    +++ b/arch/x86/include/asm/xen/swiotlb-xen.h
    @@ -0,0 +1,14 @@
    +#ifndef _ASM_X86_SWIOTLB_XEN_H
    +#define _ASM_X86_SWIOTLB_XEN_H
    +
    +#ifdef CONFIG_SWIOTLB_XEN
    +extern int xen_swiotlb;
    +extern int __init pci_xen_swiotlb_detect(void);
    +extern void __init pci_xen_swiotlb_init(void);
    +#else
    +#define xen_swiotlb 0
    +static inline int __init pci_xen_swiotlb_detect(void) { return 0; }
    +static inline void __init pci_xen_swiotlb_init(void) { }
    +#endif
    +
    +#endif /* _ASM_X86_SWIOTLB_XEN_H */
    diff --git a/arch/x86/xen/Makefile b/arch/x86/xen/Makefile
    index 3bb4fc2..32af238 100644
    --- a/arch/x86/xen/Makefile
    +++ b/arch/x86/xen/Makefile
    @@ -18,3 +18,4 @@ obj-$(CONFIG_SMP) += smp.o
    obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o
    obj-$(CONFIG_XEN_DEBUG_FS) += debugfs.o

    +obj-$(CONFIG_SWIOTLB_XEN) += pci-swiotlb-xen.o
    diff --git a/arch/x86/xen/pci-swiotlb-xen.c b/arch/x86/xen/pci-swiotlb-xen.c
    new file mode 100644
    index 0000000..fc3169d
    --- /dev/null
    +++ b/arch/x86/xen/pci-swiotlb-xen.c
    @@ -0,0 +1,58 @@
    +/* Glue code to lib/swiotlb-xen.c */
    +
    +#include <linux/dma-mapping.h>
    +#include <linux/swiotlb-xen.h>
    +
    +#include <asm/xen/hypervisor.h>
    +#include <xen/xen.h>
    +
    +int xen_swiotlb __read_mostly;
    +
    +static const struct dma_map_ops xen_swiotlb_dma_ops = {
    + .mapping_error = xen_swiotlb_dma_mapping_error,
    + .alloc_coherent = xen_swiotlb_alloc_coherent,
    + .free_coherent = xen_swiotlb_free_coherent,
    + .sync_single_for_cpu = xen_swiotlb_sync_single_for_cpu,
    + .sync_single_for_device = xen_swiotlb_sync_single_for_device,
    + .sync_sg_for_cpu = xen_swiotlb_sync_sg_for_cpu,
    + .sync_sg_for_device = xen_swiotlb_sync_sg_for_device,
    + .map_sg = xen_swiotlb_map_sg_attrs,
    + .unmap_sg = xen_swiotlb_unmap_sg_attrs,
    + .map_page = xen_swiotlb_map_page,
    + .unmap_page = xen_swiotlb_unmap_page,
    + .dma_supported = xen_swiotlb_dma_supported,
    +};
    +
    +/*
    + * pci_xen_swiotlb_detect - set xen_swiotlb to 1 if necessary
    + *
    + * This returns non-zero if we are forced to use xen_swiotlb (by the boot
    + * option).
    + */
    +int __init pci_xen_swiotlb_detect(void)
    +{
    +
    + /* If running as PV guest, either iommu=soft, or swiotlb=force will
    + * activate this IOMMU. If running as PV privileged, activate it
    + * irregardlesss.
    + */
    + if ((xen_initial_domain() || swiotlb || swiotlb_force) &&
    + (xen_pv_domain()))
    + xen_swiotlb = 1;
    +
    + /* If we are running under Xen, we MUST disable the native SWIOTLB.
    + * Don't worry about swiotlb_force flag activating the native, as
    + * the 'swiotlb' flag is the only one turning it on. */
    + if (xen_pv_domain())
    + swiotlb = 0;
    +
    + return xen_swiotlb;
    +}
    +
    +void __init pci_xen_swiotlb_init(void)
    +{
    + if (xen_swiotlb) {
    + xen_swiotlb_init(1);
    + dma_ops = &xen_swiotlb_dma_ops;
    + }
    +}
    --
    1.7.0.1


    \
     
     \ /
      Last update: 2010-06-22 21:51    [W:0.034 / U:123.080 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site