113e19fb3SRuslan Bukin /*- 213e19fb3SRuslan Bukin * Copyright (c) 2014 Ruslan Bukin <br@bsdpad.com> 313e19fb3SRuslan Bukin * All rights reserved. 413e19fb3SRuslan Bukin * 513e19fb3SRuslan Bukin * This software was developed by SRI International and the University of 613e19fb3SRuslan Bukin * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237) 713e19fb3SRuslan Bukin * ("CTSRD"), as part of the DARPA CRASH research programme. 813e19fb3SRuslan Bukin * 913e19fb3SRuslan Bukin * Redistribution and use in source and binary forms, with or without 1013e19fb3SRuslan Bukin * modification, are permitted provided that the following conditions 1113e19fb3SRuslan Bukin * are met: 1213e19fb3SRuslan Bukin * 1. Redistributions of source code must retain the above copyright 1313e19fb3SRuslan Bukin * notice, this list of conditions and the following disclaimer. 1413e19fb3SRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright 1513e19fb3SRuslan Bukin * notice, this list of conditions and the following disclaimer in the 1613e19fb3SRuslan Bukin * documentation and/or other materials provided with the distribution. 1713e19fb3SRuslan Bukin * 1813e19fb3SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1913e19fb3SRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2013e19fb3SRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2113e19fb3SRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2213e19fb3SRuslan Bukin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2313e19fb3SRuslan Bukin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2413e19fb3SRuslan Bukin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2513e19fb3SRuslan Bukin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2613e19fb3SRuslan Bukin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2713e19fb3SRuslan Bukin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2813e19fb3SRuslan Bukin * SUCH DAMAGE. 2913e19fb3SRuslan Bukin */ 3013e19fb3SRuslan Bukin 3113e19fb3SRuslan Bukin #define READ2(_sc, _reg) \ 3213e19fb3SRuslan Bukin bus_read_2((_sc)->res[0], _reg) 3313e19fb3SRuslan Bukin #define READ4(_sc, _reg) \ 3413e19fb3SRuslan Bukin bus_read_4((_sc)->res[0], _reg) 3513e19fb3SRuslan Bukin #define WRITE2(_sc, _reg, _val) \ 3613e19fb3SRuslan Bukin bus_write_2((_sc)->res[0], _reg, _val) 3713e19fb3SRuslan Bukin #define WRITE4(_sc, _reg, _val) \ 3813e19fb3SRuslan Bukin bus_write_4((_sc)->res[0], _reg, _val) 3913e19fb3SRuslan Bukin 4013e19fb3SRuslan Bukin #define PAGE_SHIFT 12 4113e19fb3SRuslan Bukin #define VRING_ALIGN 4096 4213e19fb3SRuslan Bukin 4313e19fb3SRuslan Bukin #define VQ_ALLOC 0x01 /* set once we have a pfn */ 4413e19fb3SRuslan Bukin #define VQ_MAX_DESCRIPTORS 512 4513e19fb3SRuslan Bukin 4613e19fb3SRuslan Bukin struct vqueue_info { 4713e19fb3SRuslan Bukin uint16_t vq_qsize; /* size of this queue (a power of 2) */ 4813e19fb3SRuslan Bukin uint16_t vq_num; 4913e19fb3SRuslan Bukin uint16_t vq_flags; 5013e19fb3SRuslan Bukin uint16_t vq_last_avail; /* a recent value of vq_avail->va_idx */ 5113e19fb3SRuslan Bukin uint16_t vq_save_used; /* saved vq_used->vu_idx; see vq_endchains */ 5213e19fb3SRuslan Bukin uint32_t vq_pfn; /* PFN of virt queue (not shifted!) */ 5313e19fb3SRuslan Bukin 5413e19fb3SRuslan Bukin volatile struct vring_desc *vq_desc; /* descriptor array */ 5513e19fb3SRuslan Bukin volatile struct vring_avail *vq_avail; /* the "avail" ring */ 5613e19fb3SRuslan Bukin volatile struct vring_used *vq_used; /* the "used" ring */ 5713e19fb3SRuslan Bukin }; 5813e19fb3SRuslan Bukin 5913e19fb3SRuslan Bukin int vq_ring_ready(struct vqueue_info *vq); 6013e19fb3SRuslan Bukin int vq_has_descs(struct vqueue_info *vq); 6113e19fb3SRuslan Bukin void * paddr_map(uint32_t offset, uint32_t phys, uint32_t size); 6213e19fb3SRuslan Bukin void paddr_unmap(void *phys, uint32_t size); 6313e19fb3SRuslan Bukin int vq_getchain(uint32_t beri_mem_offset, struct vqueue_info *vq, 6413e19fb3SRuslan Bukin struct iovec *iov, int n_iov, uint16_t *flags); 6513e19fb3SRuslan Bukin void vq_relchain(struct vqueue_info *vq, struct iovec *iov, int n, uint32_t iolen); 661aac28e7SRuslan Bukin struct iovec * getcopy(struct iovec *iov, int n); 6713e19fb3SRuslan Bukin 68a8098016SRuslan Bukin int setup_pio(device_t dev, char *name, device_t *pio_dev); 69a8098016SRuslan Bukin int setup_offset(device_t dev, uint32_t *offset); 70