1246713Skib/*- 2246713Skib * Copyright (c) 2012 EMC Corp. 3246713Skib * All rights reserved. 4246713Skib * 5246713Skib * Redistribution and use in source and binary forms, with or without 6246713Skib * modification, are permitted provided that the following conditions 7246713Skib * are met: 8246713Skib * 1. Redistributions of source code must retain the above copyright 9246713Skib * notice, this list of conditions and the following disclaimer. 10246713Skib * 2. Redistributions in binary form must reproduce the above copyright 11246713Skib * notice, this list of conditions and the following disclaimer in the 12246713Skib * documentation and/or other materials provided with the distribution. 13246713Skib * 14246713Skib * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15246713Skib * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16246713Skib * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17246713Skib * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18246713Skib * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19246713Skib * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20246713Skib * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21246713Skib * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22246713Skib * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23246713Skib * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24246713Skib * SUCH DAMAGE. 25246713Skib * 26246713Skib * $FreeBSD$ 27246713Skib */ 28246713Skib 29246713Skib#ifndef _SYS_MEMDESC_H_ 30246713Skib#define _SYS_MEMDESC_H_ 31246713Skib 32246713Skibstruct bio; 33246713Skibstruct bus_dma_segment; 34246713Skibstruct uio; 35246713Skibstruct mbuf; 36246713Skibunion ccb; 37246713Skib 38246713Skib/* 39246713Skib * struct memdesc encapsulates various memory descriptors and provides 40246713Skib * abstract access to them. 41246713Skib */ 42246713Skibstruct memdesc { 43246713Skib union { 44246713Skib void *md_vaddr; 45246713Skib vm_paddr_t md_paddr; 46246713Skib struct bus_dma_segment *md_list; 47246713Skib struct bio *md_bio; 48246713Skib struct uio *md_uio; 49246713Skib struct mbuf *md_mbuf; 50246713Skib union ccb *md_ccb; 51246713Skib } u; 52246713Skib size_t md_opaque; /* type specific data. */ 53246713Skib uint32_t md_type; /* Type of memory. */ 54246713Skib}; 55246713Skib 56246713Skib#define MEMDESC_VADDR 1 /* Contiguous virtual address. */ 57246713Skib#define MEMDESC_PADDR 2 /* Contiguous physical address. */ 58246713Skib#define MEMDESC_VLIST 3 /* scatter/gather list of kva addresses. */ 59246713Skib#define MEMDESC_PLIST 4 /* scatter/gather list of physical addresses. */ 60246713Skib#define MEMDESC_BIO 5 /* Pointer to a bio (block io). */ 61246713Skib#define MEMDESC_UIO 6 /* Pointer to a uio (any io). */ 62246713Skib#define MEMDESC_MBUF 7 /* Pointer to a mbuf (network io). */ 63246713Skib#define MEMDESC_CCB 8 /* Cam control block. (scsi/ata io). */ 64246713Skib 65246713Skibstatic inline struct memdesc 66246713Skibmemdesc_vaddr(void *vaddr, size_t len) 67246713Skib{ 68246713Skib struct memdesc mem; 69246713Skib 70246713Skib mem.u.md_vaddr = vaddr; 71246713Skib mem.md_opaque = len; 72246713Skib mem.md_type = MEMDESC_VADDR; 73246713Skib 74246713Skib return (mem); 75246713Skib} 76246713Skib 77246713Skibstatic inline struct memdesc 78246713Skibmemdesc_paddr(vm_paddr_t paddr, size_t len) 79246713Skib{ 80246713Skib struct memdesc mem; 81246713Skib 82246713Skib mem.u.md_paddr = paddr; 83246713Skib mem.md_opaque = len; 84246713Skib mem.md_type = MEMDESC_PADDR; 85246713Skib 86246713Skib return (mem); 87246713Skib} 88246713Skib 89246713Skibstatic inline struct memdesc 90246713Skibmemdesc_vlist(struct bus_dma_segment *vlist, int sglist_cnt) 91246713Skib{ 92246713Skib struct memdesc mem; 93246713Skib 94246713Skib mem.u.md_list = vlist; 95246713Skib mem.md_opaque = sglist_cnt; 96246713Skib mem.md_type = MEMDESC_VLIST; 97246713Skib 98246713Skib return (mem); 99246713Skib} 100246713Skib 101246713Skibstatic inline struct memdesc 102246713Skibmemdesc_plist(struct bus_dma_segment *plist, int sglist_cnt) 103246713Skib{ 104246713Skib struct memdesc mem; 105246713Skib 106246713Skib mem.u.md_list = plist; 107246713Skib mem.md_opaque = sglist_cnt; 108246713Skib mem.md_type = MEMDESC_PLIST; 109246713Skib 110246713Skib return (mem); 111246713Skib} 112246713Skib 113246713Skibstatic inline struct memdesc 114246713Skibmemdesc_bio(struct bio *bio) 115246713Skib{ 116246713Skib struct memdesc mem; 117246713Skib 118246713Skib mem.u.md_bio = bio; 119246713Skib mem.md_type = MEMDESC_BIO; 120246713Skib 121246713Skib return (mem); 122246713Skib} 123246713Skib 124246713Skibstatic inline struct memdesc 125246713Skibmemdesc_uio(struct uio *uio) 126246713Skib{ 127246713Skib struct memdesc mem; 128246713Skib 129246713Skib mem.u.md_uio = uio; 130246713Skib mem.md_type = MEMDESC_UIO; 131246713Skib 132246713Skib return (mem); 133246713Skib} 134246713Skib 135246713Skibstatic inline struct memdesc 136246713Skibmemdesc_mbuf(struct mbuf *mbuf) 137246713Skib{ 138246713Skib struct memdesc mem; 139246713Skib 140246713Skib mem.u.md_mbuf = mbuf; 141246713Skib mem.md_type = MEMDESC_MBUF; 142246713Skib 143246713Skib return (mem); 144246713Skib} 145246713Skib 146246713Skibstatic inline struct memdesc 147246713Skibmemdesc_ccb(union ccb *ccb) 148246713Skib{ 149246713Skib struct memdesc mem; 150246713Skib 151246713Skib mem.u.md_ccb = ccb; 152246713Skib mem.md_type = MEMDESC_CCB; 153246713Skib 154246713Skib return (mem); 155246713Skib} 156246713Skib#endif /* _SYS_MEMDESC_H_ */ 157