lkml.org 
[lkml]   [2007]   [Jul]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 09/33] x86-64: update iommu/dma mapping functions to sg helpers
    On Mon, Jul 16, 2007 at 11:47:23AM +0200, Jens Axboe wrote:

    > This prepares x86-64 for sg chaining support.
    >
    > Additional improvements/fixups for pci-gart from
    > Benny Halevy <bhalevy@panasas.com>
    >
    > Cc: ak@suse.de
    > Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
    > ---
    > arch/x86_64/kernel/pci-calgary.c | 25 ++++++++------
    > arch/x86_64/kernel/pci-gart.c | 63 ++++++++++++++++++++-----------------
    > arch/x86_64/kernel/pci-nommu.c | 5 ++-

    Calgary and nommu bits are:

    Acked-by: Muli Ben-Yehuda <muli@il.ibm.com>

    FYI, here's the Calgary diff on top of the outstanding Calgary
    changes.

    diff -r 8642809f9e33 arch/x86_64/kernel/pci-calgary.c
    --- a/arch/x86_64/kernel/pci-calgary.c Mon Jul 16 09:38:14 2007 +0300
    +++ b/arch/x86_64/kernel/pci-calgary.c Tue Jul 17 13:33:24 2007 +0300
    @@ -35,6 +35,7 @@
    #include <linux/pci_ids.h>
    #include <linux/pci.h>
    #include <linux/delay.h>
    +#include <linux/scatterlist.h>
    #include <asm/proto.h>
    #include <asm/calgary.h>
    #include <asm/tce.h>
    @@ -387,31 +388,32 @@ static void calgary_unmap_sg(struct devi
    struct scatterlist *sglist, int nelems, int direction)
    {
    struct iommu_table *tbl = find_iommu_table(dev);
    + struct scatterlist *s;
    + int i;

    if (!translate_phb(to_pci_dev(dev)))
    return;

    - while (nelems--) {
    + for_each_sg(sglist, s, nelems, i) {
    unsigned int npages;
    - dma_addr_t dma = sglist->dma_address;
    - unsigned int dmalen = sglist->dma_length;
    + dma_addr_t dma = s->dma_address;
    + unsigned int dmalen = s->dma_length;

    if (dmalen == 0)
    break;

    npages = num_dma_pages(dma, dmalen);
    iommu_free(tbl, dma, npages);
    - sglist++;
    }
    }

    static int calgary_nontranslate_map_sg(struct device* dev,
    struct scatterlist *sg, int nelems, int direction)
    {
    + struct scatterlist *s;
    int i;

    - for (i = 0; i < nelems; i++ ) {
    - struct scatterlist *s = &sg[i];
    + for_each_sg(sg, s, nelems, i) {
    BUG_ON(!s->page);
    s->dma_address = virt_to_bus(page_address(s->page) +s->offset);
    s->dma_length = s->length;
    @@ -423,6 +425,7 @@ static int calgary_map_sg(struct device
    int nelems, int direction)
    {
    struct iommu_table *tbl = find_iommu_table(dev);
    + struct scatterlist *s;
    unsigned long vaddr;
    unsigned int npages;
    unsigned long entry;
    @@ -431,8 +434,7 @@ static int calgary_map_sg(struct device
    if (!translate_phb(to_pci_dev(dev)))
    return calgary_nontranslate_map_sg(dev, sg, nelems, direction);

    - for (i = 0; i < nelems; i++ ) {
    - struct scatterlist *s = &sg[i];
    + for_each_sg(sg, s, nelems, i) {
    BUG_ON(!s->page);

    vaddr = (unsigned long)page_address(s->page) + s->offset;
    @@ -457,9 +459,9 @@ static int calgary_map_sg(struct device
    return nelems;
    error:
    calgary_unmap_sg(dev, sg, nelems, direction);
    - for (i = 0; i < nelems; i++) {
    - sg[i].dma_address = bad_dma_address;
    - sg[i].dma_length = 0;
    + for_each_sg(sg, s, nelems, i) {
    + s->dma_address = bad_dma_address;
    + s->dma_length = 0;
    }
    return 0;
    }
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2007-07-17 13:07    [W:4.038 / U:0.680 seconds]
    ©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site