[openib-general] How to support IOMMUs for ipath driver

Ralph Campbell ralphc at pathscale.com
Wed Sep 13 10:35:02 PDT 2006


On Tue, 2006-09-12 at 20:15 -0700, Roland Dreier wrote:
>  > My current proposal is to provide wrapper routines for the
>  > dma_*() routines which only the IB kernel code would use.
>  > These ib_dma_*() variants would allow a device driver to interpose
>  > on the call and do appropriate code to convert the kernel virtual
>  > or physical page addresses to something the device driver can handle.
>  > For ib_mthca and ib_ehca, these would result in the corresponding
>  > dma_*() routine being called. For ib_ipath, a different implementation
>  > would be needed.
> 
> Seems like the least-bad way forward.
> 
> A few comments on the proposed implementation:
> 
>  > @@ -984,6 +985,19 @@ struct ib_device {
>  >  						  struct ib_grh *in_grh,
>  >  						  struct ib_mad *in_mad,
>  >  						  struct ib_mad *out_mad);
>  > +	int                        (*mapping_error)(dma_addr_t dma_addr);
>  > +	dma_addr_t                 (*map_single)(struct device *hwdev,
>  > +						 void *ptr, size_t size,
>  > +						 int direction);
>  > +	void                       (*unmap_single)(struct device *dev,
>  > +						   dma_addr_t addr,
>  > +						   size_t size, int direction);
>  > +	int                        (*map_sg)(struct device *hwdev,
>  > +					     struct scatterlist *sg,
>  > +					     int nents, int direction);
>  > +	void                       (*unmap_sg)(struct device *hwdev,
>  > +					       struct scatterlist *sg,
>  > +					       int nents, int direction);
> 
> First of all I would put all this into a "struct ib_dma_ops" or
> something like that, so struct ib_device can have just a member like
> 
> 	struct ib_dma_ops	*dma_ops;
> 
> That keeps the definition of struct ib_device from getting too much
> more gigantic, and also makes it easy for the core to export a
> standard dma_ops pointer that devices that use the default
> implementation can use.
> 
> Why not make the DMA operations take a struct ib_device * instead of a
> struct device *?  I think that would actually clean up the consumer
> code, and it would make it easier for ipath -- otherwise you have to
> find your way back from the struct device *.
> 
> Also, I think you will need a few more methods.  <asm-x86_64/dma-mapping.h>
> has a definition of DMA operations that might be useful to refer too.
> But for example SRP uses at least dma_sync_single_for_cpu() and
> dma_sync_single_for_device().  Actually that might be the only extra
> method needed for now.
> 
>  - R.

These are all good suggestions and I will incorporate them.





More information about the general mailing list