Date: Fri, 16 Jul 2010 00:56:17 +0000 (UTC) From: Jeff Roberson <jeff@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r210153 - projects/ofed/head/sys/ofed/include/linux Message-ID: <201007160056.o6G0uHNt052923@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jeff Date: Fri Jul 16 00:56:17 2010 New Revision: 210153 URL: http://svn.freebsd.org/changeset/base/210153 Log: - Add a scatterlist implementation and make use of it in the dma mapping code. Sponsored by: Isilon Systems, iX Systems, and Panasas. Modified: projects/ofed/head/sys/ofed/include/linux/dma-mapping.h projects/ofed/head/sys/ofed/include/linux/scatterlist.h Modified: projects/ofed/head/sys/ofed/include/linux/dma-mapping.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/dma-mapping.h Thu Jul 15 23:34:58 2010 (r210152) +++ projects/ofed/head/sys/ofed/include/linux/dma-mapping.h Fri Jul 16 00:56:17 2010 (r210153) @@ -150,17 +150,22 @@ dma_unmap_single_attrs(struct device *de } static inline int -dma_map_sg_attrs(struct device *dev, struct scatterlist *sg, int nents, +dma_map_sg_attrs(struct device *dev, struct scatterlist *sgl, int nents, enum dma_data_direction dir, struct dma_attrs *attrs) { - KASSERT(0, ("%s", __FUNCTION__)); + struct scatterlist *sg; + int i; + + for_each_sg(sgl, sg, nents, i) + sg_dma_address(sg) = sg_phys(sg); + + return (nents); } static inline void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction dir, struct dma_attrs *attrs) { - KASSERT(0, ("%s", __FUNCTION__)); } static inline dma_addr_t @@ -177,7 +182,6 @@ dma_unmap_page(struct device *dev, dma_a { } -/* XXX This is x86 specific, no syncs required. */ static inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, enum dma_data_direction direction) Modified: projects/ofed/head/sys/ofed/include/linux/scatterlist.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/scatterlist.h Thu Jul 15 23:34:58 2010 (r210152) +++ projects/ofed/head/sys/ofed/include/linux/scatterlist.h Fri Jul 16 00:56:17 2010 (r210153) @@ -29,11 +29,69 @@ #define _LINUX_SCATTERLIST_H_ #include <linux/string.h> +#include <linux/page.h> struct scatterlist { + union { + struct page *page; + struct scatterlist *sg; + } sl_un; + unsigned long address; + unsigned long offset; + uint32_t length; + uint32_t flags; }; -#define sg_dma_address(sg) 0 -#define sg_dma_len(sg) 0 +#define sg_dma_address(sg) (sg)->address +#define sg_dma_len(sg) (sg)->length +#define sg_page(sg) (sg)->sl_un.page +#define sg_scatternext(sg) (sg)->sl_un.sg + +#define SG_END 0x01 +#define SG_CHAIN 0x02 + +static inline void +sg_set_page(struct scatterlist *sg, struct page *page, unsigned int len, + unsigned int offset) +{ + sg_page(sg) = page; + sg_dma_len(sg) = len; + sg_dma_address(sg) = 0; + sg->offset = offset; +} + +static inline void +sg_set_buf(struct scatterlist *sg, const void *buf, unsigned int buflen) +{ + sg_set_page(sg, PHYS_TO_VM_PAGE(vtophys(buf)), buflen, + ((uintptr_t)buf) & PAGE_MASK); +} + +static inline void +sg_init_table(struct scatterlist *sg, unsigned int nents) +{ + bzero(sg, sizeof(*sg) * nents); + sg[nents].flags = SG_END; +} + +static inline struct scatterlist * +sg_next(struct scatterlist *sg) +{ + if (sg->flags & SG_END) + return (NULL); + sg++; + if (sg->flags & SG_CHAIN) + sg = sg_scatternext(sg); + return (sg); +} + +static inline vm_paddr_t +sg_phys(struct scatterlist *sg) +{ + return sg_page(sg)->phys_addr + sg->offset; +} + +#define for_each_sg(sglist, sg, sgmax, _itr) \ + for (_itr = 0, sg = (sglist); _itr < (sgmax); _itr++, sg = sg_next(sg)) #endif /* _LINUX_SCATTERLIST_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201007160056.o6G0uHNt052923>