diff --git a/sys/kern/subr_bus_dma.c b/sys/kern/subr_bus_dma.c --- a/sys/kern/subr_bus_dma.c +++ b/sys/kern/subr_bus_dma.c @@ -583,6 +583,10 @@ error = _bus_dmamap_load_mbuf_sg(dmat, map, mem->u.md_mbuf, NULL, &nsegs, flags); break; + case MEMDESC_VMPAGES: + error = _bus_dmamap_load_ma(dmat, map, mem->u.md_ma, + mem->md_len, mem->md_offset, flags, NULL, &nsegs); + break; } nsegs++; diff --git a/sys/sys/memdesc.h b/sys/sys/memdesc.h --- a/sys/sys/memdesc.h +++ b/sys/sys/memdesc.h @@ -35,6 +35,7 @@ struct bus_dma_segment; struct uio; struct mbuf; +struct vm_page; union ccb; /* @@ -49,11 +50,15 @@ struct bio *md_bio; struct uio *md_uio; struct mbuf *md_mbuf; + struct vm_page **md_ma; } u; union { /* type specific data. */ - size_t md_len; /* VADDR, PADDR */ + size_t md_len; /* VADDR, PADDR, VMPAGES */ int md_nseg; /* VLIST, PLIST */ }; + union { + uint32_t md_offset; /* VMPAGES */ + }; uint32_t md_type; /* Type of memory. */ }; @@ -64,6 +69,7 @@ #define MEMDESC_BIO 5 /* Pointer to a bio (block io). */ #define MEMDESC_UIO 6 /* Pointer to a uio (any io). */ #define MEMDESC_MBUF 7 /* Pointer to a mbuf (network io). */ +#define MEMDESC_VMPAGES 8 /* Pointer to array of VM pages. */ static inline struct memdesc memdesc_vaddr(void *vaddr, size_t len) @@ -146,6 +152,19 @@ return (mem); } +static inline struct memdesc +memdesc_vmpages(struct vm_page **ma, size_t len, u_int ma_offset) +{ + struct memdesc mem; + + mem.u.md_ma = ma; + mem.md_len = len; + mem.md_type = MEMDESC_VMPAGES; + mem.md_offset = ma_offset; + + return (mem); +} + struct memdesc memdesc_ccb(union ccb *ccb); #endif /* _SYS_MEMDESC_H_ */