[ewg] [PATCH ofed-1.2-rc3 3/4] ehca: backport for rhel-4.5 - use introduced dma_ops

Stefan Roscher ossrosch at linux.vnet.ibm.com
Thu May 10 07:29:08 PDT 2007



Signed-off-by: Stefan Roscher <stefan.roscher at de.ibm.com>
---
backport_ehca_3_rhel45_dma.patch |  226 +++++++++++++++++++++++++++++++++++++++
1 files changed, 226 insertions(+)


diff -Nurp ofa_kernel-1.2_old/kernel_patches/backport/2.6.9_U5/backport_ehca_3_rhel45_dma.patch ofa_kernel-1.2_new/kernel_patches/backport/2.6.9_U5/backport_ehca_3_rhel45_dma.patch
--- ofa_kernel-1.2_old/kernel_patches/backport/2.6.9_U5/backport_ehca_3_rhel45_dma.patch	1970-01-01 01:00:00.000000000 +0100
+++ ofa_kernel-1.2_new/kernel_patches/backport/2.6.9_U5/backport_ehca_3_rhel45_dma.patch	2007-05-10 17:30:24.000000000 +0200
@@ -0,0 +1,226 @@
+diff -Nurp ofa_kernel-1.2_orig/drivers/infiniband/hw/ehca/ehca_dma.c ofa_kernel-1.2_new/drivers/infiniband/hw/ehca/ehca_dma.c
+--- ofa_kernel-1.2_orig/drivers/infiniband/hw/ehca/ehca_dma.c	1970-01-01 01:00:00.000000000 +0100
++++ ofa_kernel-1.2_new/drivers/infiniband/hw/ehca/ehca_dma.c	2007-05-03 16:25:30.000000000 +0200
+@@ -0,0 +1,194 @@
++/*
++ *  IBM eServer eHCA Infiniband device driver for Linux on POWER
++ *
++ *  eHCA dma mapping via ibmebus
++ *
++ *  Authors: Stefan Roscher <stefan.roscher at de.ibm.com>
++ *           Hoang-Nam Nguyen <hnguyen at de.ibm.com>
++ *
++ *  Copyright (c) 2007 IBM Corporation
++ *
++ *  All rights reserved.
++ *
++ *  This source code is distributed under a dual license of GPL v2.0 and OpenIB
++ *  BSD.
++ *
++ * OpenIB BSD License
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * Redistributions of source code must retain the above copyright notice, this
++ * list of conditions and the following disclaimer.
++ *
++ * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials
++ * provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
++ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
++ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
++ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
++ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
++ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
++ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
++ * POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include <asm/ibmebus.h>
++#include <rdma/ib_verbs.h>
++
++static int ehca_mapping_error(struct ib_device *dev, u64 dma_addr);
++
++static u64 ehca_dma_map_single(struct ib_device *dev,
++			        void *cpu_addr, size_t size,
++			        enum dma_data_direction direction);
++
++static void ehca_dma_unmap_single(struct ib_device *dev,
++				   u64 addr, size_t size,
++				  enum dma_data_direction direction);
++
++static u64 ehca_dma_map_page(struct ib_device *dev,
++			      struct page *page,
++			      unsigned long offset,
++			      size_t size,
++			     enum dma_data_direction direction);
++
++static void ehca_dma_unmap_page(struct ib_device *dev,
++				 u64 addr, size_t size,
++				enum dma_data_direction direction);
++
++int ehca_map_sg(struct ib_device *dev, struct scatterlist *sg, int nents,
++		enum dma_data_direction direction);
++
++static void ehca_unmap_sg(struct ib_device *dev,
++			   struct scatterlist *sg, int nents,
++			  enum dma_data_direction direction);
++
++static u64 ehca_sg_dma_address(struct ib_device *dev, struct scatterlist *sg);
++
++static unsigned int ehca_sg_dma_len(struct ib_device *dev,
++				    struct scatterlist *sg);
++
++static void ehca_sync_single_for_cpu(struct ib_device *dev,
++				      u64 addr,
++				      size_t size,
++				     enum dma_data_direction dir);
++
++static void ehca_sync_single_for_device(struct ib_device *dev,
++					 u64 addr,
++					 size_t size,
++					enum dma_data_direction dir);
++
++static void *ehca_dma_alloc_coherent(struct ib_device *dev, size_t size,
++				     u64 *dma_handle, gfp_t flag);
++
++static void ehca_dma_free_coherent(struct ib_device *dev, size_t size,
++				   void *cpu_addr, dma_addr_t dma_handle);
++
++struct ib_dma_mapping_ops ehca_dma_mapping_ops = {
++	ehca_mapping_error,
++	ehca_dma_map_single,
++	ehca_dma_unmap_single,
++	ehca_dma_map_page,
++	ehca_dma_unmap_page,
++	ehca_map_sg,
++	ehca_unmap_sg,
++	ehca_sg_dma_address,
++	ehca_sg_dma_len,
++	ehca_sync_single_for_cpu,
++	ehca_sync_single_for_device,
++	ehca_dma_alloc_coherent,
++	ehca_dma_free_coherent
++};
++
++static int ehca_mapping_error(struct ib_device *dev, u64 dma_addr)
++{
++	return dma_addr == 0L;
++}
++
++static u64 ehca_dma_map_single(struct ib_device *dev,
++			        void *cpu_addr, size_t size,
++			        enum dma_data_direction direction)
++{
++	return ibmebus_map_single(dev, cpu_addr, size, direction);
++}
++
++static void ehca_dma_unmap_single(struct ib_device *dev,
++				   u64 addr, size_t size,
++				   enum dma_data_direction direction)
++{
++	ibmebus_unmap_single(dev, addr, size, direction);
++}
++
++static u64 ehca_dma_map_page(struct ib_device *dev,
++			      struct page *page,
++			      unsigned long offset,
++			      size_t size,
++			      enum dma_data_direction direction)
++{
++	return dma_map_page(dev->dma_device, page, offset, size, direction);
++}
++
++static void ehca_dma_unmap_page(struct ib_device *dev,
++				 u64 addr, size_t size,
++				 enum dma_data_direction direction)
++{
++	dma_unmap_page(dev->dma_device, addr, size, direction);
++}
++
++int ehca_map_sg(struct ib_device *dev, struct scatterlist *sg, int nents,
++		 enum dma_data_direction direction)
++{
++	return ibmebus_map_sg(dev, sg, nents, direction);
++}
++
++static void ehca_unmap_sg(struct ib_device *dev,
++			   struct scatterlist *sg, int nents,
++			   enum dma_data_direction direction)
++{
++	ibmebus_unmap_sg(dev, sg, nents, direction);
++}
++
++static u64 ehca_sg_dma_address(struct ib_device *dev, struct scatterlist *sg)
++{
++	return sg_dma_address(sg);
++}
++
++static unsigned int ehca_sg_dma_len(struct ib_device *dev,
++				     struct scatterlist *sg)
++{
++	return sg_dma_len(sg);
++}
++
++static void ehca_sync_single_for_cpu(struct ib_device *dev,
++				      u64 addr,
++				      size_t size,
++				      enum dma_data_direction dir)
++{
++	dma_sync_single_for_cpu(dev->dma_device, addr, size, dir);
++}
++
++static void ehca_sync_single_for_device(struct ib_device *dev,
++					 u64 addr,
++					 size_t size,
++					 enum dma_data_direction dir)
++{
++	dma_sync_single_for_device(dev->dma_device, addr, size, dir);
++}
++
++static void *ehca_dma_alloc_coherent(struct ib_device *dev, size_t size,
++				      u64 *dma_handle, gfp_t flag)
++{
++	return ibmebus_alloc_coherent(dev, size, dma_handle, flag);
++}
++
++static void ehca_dma_free_coherent(struct ib_device *dev, size_t size,
++				    void *cpu_addr, dma_addr_t dma_handle)
++{
++	ibmebus_free_coherent(dev, size, cpu_addr, dma_handle);
++}
+diff -Nurp ofa_kernel-1.2_orig/drivers/infiniband/hw/ehca/ehca_main.c ofa_kernel-1.2_new/drivers/infiniband/hw/ehca/ehca_main.c
+--- ofa_kernel-1.2_orig/drivers/infiniband/hw/ehca/ehca_main.c	2007-04-29 15:10:56.000000000 +0200
++++ ofa_kernel-1.2_new/drivers/infiniband/hw/ehca/ehca_main.c	2007-05-03 16:19:28.000000000 +0200
+@@ -279,6 +279,7 @@ init_node_guid1:
+ 
+ int ehca_init_device(struct ehca_shca *shca)
+ {
++	extern struct ib_dma_mapping_ops ehca_dma_mapping_ops;
+ 	int ret;
+ 
+ 	ret = init_node_guid(shca);
+@@ -354,6 +355,7 @@ int ehca_init_device(struct ehca_shca *s
+ 	shca->ib_device.detach_mcast	    = ehca_detach_mcast;
+ 	/* shca->ib_device.process_mad	    = ehca_process_mad;	    */
+ 	shca->ib_device.mmap		    = ehca_mmap;
++	shca->ib_device.dma_ops             = &ehca_dma_mapping_ops;
+ 
+ 	return ret;
+ }
+diff -Nurp ofa_kernel-1.2_orig/drivers/infiniband/hw/ehca/Makefile ofa_kernel-1.2_new/drivers/infiniband/hw/ehca/Makefile
+--- ofa_kernel-1.2_orig/drivers/infiniband/hw/ehca/Makefile	2007-04-29 15:10:56.000000000 +0200
++++ ofa_kernel-1.2_new/drivers/infiniband/hw/ehca/Makefile	2007-05-03 16:26:13.000000000 +0200
+@@ -12,5 +12,5 @@ obj-$(CONFIG_INFINIBAND_EHCA) += ib_ehca
+ 
+ ib_ehca-objs  = ehca_main.o ehca_hca.o ehca_mcast.o ehca_pd.o ehca_av.o ehca_eq.o \
+ 		ehca_cq.o ehca_qp.o ehca_sqp.o ehca_mrmw.o ehca_reqs.o ehca_irq.o \
+-		ehca_uverbs.o ipz_pt_fn.o hcp_if.o hcp_phyp.o
++		ehca_uverbs.o ehca_dma.o ipz_pt_fn.o hcp_if.o hcp_phyp.o




More information about the ewg mailing list