30 Jul, 2012

1 commit

  • This patch adds dma_get_sgtable() function which is required to let
    drivers to share the buffers allocated by DMA-mapping subsystem. Right
    now the driver gets a dma address of the allocated buffer and the kernel
    virtual mapping for it. If it wants to share it with other device (= map
    into its dma address space) it usually hacks around kernel virtual
    addresses to get pointers to pages or assumes that both devices share
    the DMA address space. Both solutions are just hacks for the special
    cases, which should be avoided in the final version of buffer sharing.

    To solve this issue in a generic way, a new call to DMA mapping has been
    introduced - dma_get_sgtable(). It allocates a scatter-list which
    describes the allocated buffer and lets the driver(s) to use it with
    other device(s) by calling dma_map_sg() on it.

    This patch provides a generic implementation based on virt_to_page()
    call. Architectures which require more sophisticated translation might
    provide their own get_sgtable() methods.

    Signed-off-by: Marek Szyprowski
    Reviewed-by: Kyungmin Park
    Reviewed-by: Daniel Vetter

    Marek Szyprowski
     

05 Apr, 2012

1 commit

  • Pull DMA mapping branch from Marek Szyprowski:
    "Short summary for the whole series:

    A few limitations have been identified in the current dma-mapping
    design and its implementations for various architectures. There exist
    more than one function for allocating and freeing the buffers:
    currently these 3 are used dma_{alloc, free}_coherent,
    dma_{alloc,free}_writecombine, dma_{alloc,free}_noncoherent.

    For most of the systems these calls are almost equivalent and can be
    interchanged. For others, especially the truly non-coherent ones
    (like ARM), the difference can be easily noticed in overall driver
    performance. Sadly not all architectures provide implementations for
    all of them, so the drivers might need to be adapted and cannot be
    easily shared between different architectures. The provided patches
    unify all these functions and hide the differences under the already
    existing dma attributes concept. The thread with more references is
    available here:

    http://www.spinics.net/lists/linux-sh/msg09777.html

    These patches are also a prerequisite for unifying DMA-mapping
    implementation on ARM architecture with the common one provided by
    dma_map_ops structure and extending it with IOMMU support. More
    information is available in the following thread:

    http://thread.gmane.org/gmane.linux.kernel.cross-arch/12819

    More works on dma-mapping framework are planned, especially in the
    area of buffer sharing and managing the shared mappings (together with
    the recently introduced dma_buf interface: commit d15bd7ee445d
    "dma-buf: Introduce dma buffer sharing mechanism").

    The patches in the current set introduce a new alloc/free methods
    (with support for memory attributes) in dma_map_ops structure, which
    will later replace dma_alloc_coherent and dma_alloc_writecombine
    functions."

    People finally started piping up with support for merging this, so I'm
    merging it as the last of the pending stuff from the merge window.
    Looks like pohmelfs is going to wait for 3.5 and more external support
    for merging.

    * 'for-linus' of git://git.linaro.org/people/mszyprowski/linux-dma-mapping:
    common: DMA-mapping: add NON-CONSISTENT attribute
    common: DMA-mapping: add WRITE_COMBINE attribute
    common: dma-mapping: introduce mmap method
    common: dma-mapping: remove old alloc_coherent and free_coherent methods
    Hexagon: adapt for dma_map_ops changes
    Unicore32: adapt for dma_map_ops changes
    Microblaze: adapt for dma_map_ops changes
    SH: adapt for dma_map_ops changes
    Alpha: adapt for dma_map_ops changes
    SPARC: adapt for dma_map_ops changes
    PowerPC: adapt for dma_map_ops changes
    MIPS: adapt for dma_map_ops changes
    X86 & IA64: adapt for dma_map_ops changes
    common: dma-mapping: introduce generic alloc() and free() methods

    Linus Torvalds
     

28 Mar, 2012

3 commits

  • Introduce new generic mmap method with attributes argument.

    This method lets drivers to create a userspace mapping for a DMA buffer
    in generic, architecture independent way.

    Signed-off-by: Marek Szyprowski
    Acked-by: Kyungmin Park
    Reviewed-by: Arnd Bergmann

    Marek Szyprowski
     
  • Remove old, unused alloc_coherent and free_coherent methods from
    dma_map_ops structure.

    Signed-off-by: Marek Szyprowski
    Acked-by: Kyungmin Park
    Reviewed-by: Arnd Bergmann

    Marek Szyprowski
     
  • Introduce new generic alloc and free methods with attributes argument.

    Existing alloc_coherent and free_coherent can be implemented on top of the
    new calls with NULL attributes argument. Later also dma_alloc_non_coherent
    can be implemented using DMA_ATTR_NONCOHERENT attribute as well as
    dma_alloc_writecombine with separate DMA_ATTR_WRITECOMBINE attribute.

    This way the drivers will get more generic, platform independent way of
    allocating dma buffers with specific parameters.

    Signed-off-by: Marek Szyprowski
    Acked-by: Kyungmin Park
    Reviewed-by: David Gibson
    Reviewed-by: Arnd Bergmann

    Marek Szyprowski
     

26 Mar, 2012

1 commit

  • The only users of ARCH_HAS_DMA_SET_COHERENT_MASK are 2 ARM platforms:
    ixp4xx and pxa cm_x2xx. We've been getting lucky that the define is
    implicitly included before dma-mapping.h, but the removal of io.h broke
    things (c334bc1 ARM: make mach/io.h include optional). Since memory.h
    is the correct place, but no longer exists, convert the define to a
    kconfig entry.

    Reported-by: Paul Gortmaker
    Signed-off-by: Rob Herring
    Acked-by: Nicolas Pitre
    Cc: Russell King
    Cc: Imre Kaloz
    Cc: Krzysztof Halasa
    Cc: Eric Miao
    Acked-by: Haojian Zhuang
    Cc: Vinod Koul
    Cc: Dan Williams

    Rob Herring
     

07 Nov, 2011

1 commit

  • * 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (106 commits)
    powerpc/p3060qds: Add support for P3060QDS board
    powerpc/83xx: Add shutdown request support to MCU handling on MPC8349 MITX
    powerpc/85xx: Make kexec to interate over online cpus
    powerpc/fsl_booke: Fix comment in head_fsl_booke.S
    powerpc/85xx: issue 15 EOI after core reset for FSL CoreNet devices
    powerpc/8xxx: Fix interrupt handling in MPC8xxx GPIO driver
    powerpc/85xx: Add 'fsl,pq3-gpio' compatiable for GPIO driver
    powerpc/86xx: Correct Gianfar support for GE boards
    powerpc/cpm: Clear muram before it is in use.
    drivers/virt: add ioctl for 32-bit compat on 64-bit to fsl-hv-manager
    powerpc/fsl_msi: add support for "msi-address-64" property
    powerpc/85xx: Setup secondary cores PIR with hard SMP id
    powerpc/fsl-booke: Fix settlbcam for 64-bit
    powerpc/85xx: Adding DCSR node to dtsi device trees
    powerpc/85xx: clean up FPGA device tree nodes for Freecsale QorIQ boards
    powerpc/85xx: fix PHYS_64BIT selection for P1022DS
    powerpc/fsl-booke: Fix setup_initial_memory_limit to not blindly map
    powerpc: respect mem= setting for early memory limit setup
    powerpc: Update corenet64_smp_defconfig
    powerpc: Update mpc85xx/corenet 32-bit defconfigs
    ...

    Fix up trivial conflicts in:
    - arch/powerpc/configs/40x/hcu4_defconfig
    removed stale file, edited elsewhere
    - arch/powerpc/include/asm/udbg.h, arch/powerpc/kernel/udbg.c:
    added opal and gelic drivers vs added ePAPR driver
    - drivers/tty/serial/8250.c
    moved UPIO_TSI to powerpc vs removed UPIO_DWAPB support

    Linus Torvalds
     

03 Nov, 2011

1 commit


20 Sep, 2011

1 commit

  • If an architecture sets ARCH_HAS_DMA_GET_REQUIRED_MASK and has settable
    dma_map_ops, the required mask may change by the ops implementation.
    For example, a system that always has an mmu inline may only require 32
    bits while a swiotlb would desire bits to cover all of memory.

    Therefore add the field if the architecture does not use the generic
    definition of dma_get_required_mask. The first use will by by powerpc.
    Note that this does add some dependency on the order in which files are
    visible here.

    Signed-off-by: Milton Miller
    Signed-off-by: Nishanth Aravamudan
    Signed-off-by: Benjamin Herrenschmidt
    Acked-by: FUJITA Tomonori

    Milton Miller
     

27 Jul, 2011

1 commit


22 Jun, 2011

1 commit

  • Remove linux/mm.h inclusion from netdevice.h -- it's unused (I've checked manually).

    To prevent mm.h inclusion via other channels also extract "enum dma_data_direction"
    definition into separate header. This tiny piece is what gluing netdevice.h with mm.h
    via "netdevice.h => dmaengine.h => dma-mapping.h => scatterlist.h => mm.h".
    Removal of mm.h from scatterlist.h was tried and was found not feasible
    on most archs, so the link was cutoff earlier.

    Hope people are OK with tiny include file.

    Note, that mm_types.h is still dragged in, but it is a separate story.

    Signed-off-by: Alexey Dobriyan
    Signed-off-by: David S. Miller

    Alexey Dobriyan
     

23 Sep, 2010

1 commit

  • This fixes the regression caused by the commit 6fee48cd330c68
    ("dma-mapping: arm: use generic pci_set_dma_mask and
    pci_set_consistent_dma_mask").

    ARM needs to clip the dma coherent mask for dmabounce devices. This
    restores the old trick.

    Note that strictly speaking, the DMA API doesn't allow architectures to do
    such but I'm not sure it's worth adding the new API to set the dma mask
    that allows architectures to clip it.

    Reported-by: Krzysztof Halasa
    Signed-off-by: FUJITA Tomonori
    Acked-by: Russell King
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    FUJITA Tomonori
     

14 Aug, 2010

1 commit

  • commit 4565f0170dfc849b3629c27d769db800467baa62 "dma-mapping: unify
    dma_get_cache_alignment implementations" causes build errors on
    !HAS_DMA architectures/platforms like s390 and sun3:

    include/linux/dma-mapping.h:145: error: static declaration of 'dma_get_cache_alignment' follows non-static declaration
    include/asm-generic/dma-mapping-broken.h:73: error: previous declaration of 'dma_get_cache_alignment' was here

    Fix this by adding an explicit ifdef.

    Cc: Geert Uytterhoeven
    Acked-by: FUJITA Tomonori
    Signed-off-by: Heiko Carstens
    Signed-off-by: Linus Torvalds

    Heiko Carstens
     

11 Aug, 2010

1 commit

  • dma_get_cache_alignment returns the minimum DMA alignment. Architectures
    defines it as ARCH_DMA_MINALIGN (formally ARCH_KMALLOC_MINALIGN). So we
    can unify dma_get_cache_alignment implementations.

    Note that some architectures implement dma_get_cache_alignment wrongly.
    dma_get_cache_alignment() should return the minimum DMA alignment. So
    fully-coherent architectures should return 1. This patch also fixes this
    issue.

    Signed-off-by: FUJITA Tomonori
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    FUJITA Tomonori
     

28 May, 2010

2 commits


13 Mar, 2010

2 commits

  • dma_set_coherent_mask corresponds to pci_set_consistent_dma_mask. This is
    necessary to move to the generic device model DMA API from the PCI bus
    specific API in the long term.

    dma_set_coherent_mask works in the exact same way that
    pci_set_consistent_dma_mask does. So this patch also changes
    pci_set_consistent_dma_mask to call dma_set_coherent_mask.

    Signed-off-by: FUJITA Tomonori
    Cc: James Bottomley
    Cc: David S. Miller
    Cc: Jesse Barnes
    Cc: Benjamin Herrenschmidt
    Cc: Russell King
    Cc: Greg KH
    Cc: Kay Sievers
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    FUJITA Tomonori
     
  • Adds the following macros:

    DECLARE_DMA_UNMAP_ADDR(ADDR_NAME)
    DECLARE_DMA_UNMAP_LEN(LEN_NAME)
    dma_unmap_addr(PTR, ADDR_NAME)
    dma_unmap_addr_set(PTR, ADDR_NAME, VAL)
    dma_unmap_len(PTR, LEN_NAME)
    dma_unmap_len_set(PTR, LEN_NAME, VAL)

    The API corresponds to the pci_unmap state API. We'll move to this new
    generic API from the PCI specific API in the long term. As
    include/asm-generic/pci-dma-compat.h does, the pci_unmap API simply calls
    the new generic API for some time.

    Signed-off-by: FUJITA Tomonori
    Cc: James Bottomley
    Cc: David S. Miller
    Cc: Jesse Barnes
    Cc: Arnd Bergmann
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    FUJITA Tomonori
     

28 Aug, 2009

1 commit


28 Jul, 2009

1 commit

  • is_buffer_dma_capable() was replaced with dma_capable().

    is_buffer_dma_capable() tells if a buffer is dma-capable or
    not. However, it doesn't take a pointer to struct device so it doesn't
    work for POWERPC.

    Signed-off-by: FUJITA Tomonori
    Acked-by: Becky Bruce

    FUJITA Tomonori
     

20 Jun, 2009

2 commits

  • dma_sync_single() and dma_sync_sg() have been described as "Backwards
    compat, remove in 2.7.x" for a long time (since 2.6.5).

    This marks dma_sync_single() and dma_sync_sg() as deprecated so the users
    get notified before removing them.

    Signed-off-by: FUJITA Tomonori
    Cc: Ingo Molnar
    Cc: James Bottomley
    Cc: "David S. Miller"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    FUJITA Tomonori
     
  • Mark them deprecated so that out-of-tree developers get notified about
    this before their modules break when these macros are removed.

    Signed-off-by: Jiri Slaby
    Cc: Yang Hongyang
    Acked-by: FUJITA Tomonori
    Cc: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Jiri Slaby
     

07 Apr, 2009

1 commit


06 Jan, 2009

1 commit


19 Sep, 2008

1 commit


14 Sep, 2008

1 commit


10 Sep, 2008

1 commit

  • is_buffer_dma_capable helper function is to see if a memory region is
    DMA-capable or not. The arugments are the dma_mask (or
    coherent_dma_mask) of a device and the address and size of a memory
    region.

    Signed-off-by: FUJITA Tomonori
    Acked-by: Joerg Roedel
    Signed-off-by: Ingo Molnar

    FUJITA Tomonori
     

29 Apr, 2008

1 commit

  • Introduce new interfaces, dma_*map*_attrs(), for passing architecture-specific
    attributes when memory is mapped and unmapped for DMA. Give the interfaces
    default implementations which ignore attributes. Also introduce the
    dma_{set|get}_attr() interfaces for setting and retrieving individual
    attributes. Define one attribute, DMA_ATTR_WRITE_BARRIER, in anticipation of
    its use by ia64/sn. Select whether architectures implement arch-specific
    versions of the dma_*map*_attrs() interfaces via HAVE_DMA_ATTRS in Kconfig.

    [markn@au1.ibm.com: dma_{set,get}_attr() have to be static inline]
    Signed-off-by: Arthur Kepner
    Cc: Tony Luck
    Cc: Jesse Barnes
    Cc: Jes Sorensen
    Cc: Randy Dunlap
    Cc: Roland Dreier
    Cc: James Bottomley
    Cc: David Miller
    Cc: Benjamin Herrenschmidt
    Cc: Grant Grundler
    Cc: Michael Ellerman
    Signed-off-by: Mark Nelson
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Arthur Kepner
     

06 Feb, 2008

2 commits

  • This adds new accessors for segment_boundary_mask in device_dma_parameters
    structure in the same way I did for max_segment_size. So we can easily change
    where to place struct device_dma_parameters in the future.

    dma_get_segment boundary returns 0xffffffff if dma_parms in struct device
    isn't set up properly. 0xffffffff is the default value used in the block
    layer and the scsi mid layer.

    Signed-off-by: FUJITA Tomonori
    Cc: James Bottomley
    Cc: Jens Axboe
    Cc: Greg KH
    Cc: Jeff Garzik
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    FUJITA Tomonori
     
  • IOMMUs merges scatter/gather segments without considering a low level
    driver's restrictions. The problem is that IOMMUs can't access to the
    limitations because they are in request_queue.

    This patchset introduces a new structure, device_dma_parameters,
    including dma information. A pointer to device_dma_parameters is added
    to struct device. The bus specific structures (like pci_dev) includes
    device_dma_parameters. Low level drivers can use dma_set_max_seg_size
    to tell IOMMUs about the restrictions.

    We can move more dma stuff in struct device (like dma_mask) to struct
    device_dma_parameters later (needs some cleanups before that).

    This includes patches for all the IOMMUs that could merge sg (x86_64,
    ppc, IA64, alpha, sparc64, and parisc) though only the ppc patch was
    tested. The patches for other IOMMUs are only compile tested.

    This patch:

    Add a new structure, device_dma_parameters, including dma information. A
    pointer to device_dma_parameters is added to struct device.

    - there are only max_segment_size and segment_boundary_mask there but we'll
    move more dma stuff in struct device (like dma_mask) to struct
    device_dma_parameters later. segment_boundary_mask is not supported yet.

    - new accessors for the dma parameters are added. So we can easily change
    where to place struct device_dma_parameters in the future.

    - dma_get_max_seg_size returns 64K if dma_parms in struct device isn't set
    up properly. 64K is the default max_segment_size in the block layer.

    Signed-off-by: FUJITA Tomonori
    Acked-by: Jeff Garzik
    Cc: James Bottomley
    Acked-by: Jens Axboe
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    FUJITA Tomonori
     

03 Feb, 2008

1 commit