master
  1/*-
  2 * SPDX-License-Identifier: BSD-2-Clause
  3 *
  4 * Copyright (c) 2013 The FreeBSD Foundation
  5 *
  6 * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
  7 * under sponsorship from the FreeBSD Foundation.
  8 *
  9 * Redistribution and use in source and binary forms, with or without
 10 * modification, are permitted provided that the following conditions
 11 * are met:
 12 * 1. Redistributions of source code must retain the above copyright
 13 *    notice, this list of conditions and the following disclaimer.
 14 * 2. Redistributions in binary form must reproduce the above copyright
 15 *    notice, this list of conditions and the following disclaimer in the
 16 *    documentation and/or other materials provided with the distribution.
 17 *
 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 28 * SUCH DAMAGE.
 29 */
 30
 31#ifndef	__X86_BUSDMA_IMPL_H
 32#define	__X86_BUSDMA_IMPL_H
 33
 34struct bus_dma_tag_common {
 35	struct bus_dma_impl *impl;
 36	struct bus_dma_tag_common *parent;
 37	bus_size_t	  alignment;
 38	bus_addr_t	  boundary;
 39	bus_addr_t	  lowaddr;
 40	bus_addr_t	  highaddr;
 41	bus_dma_filter_t *filter;
 42	void		 *filterarg;
 43	bus_size_t	  maxsize;
 44	u_int		  nsegments;
 45	bus_size_t	  maxsegsz;
 46	int		  flags;
 47	bus_dma_lock_t	 *lockfunc;
 48	void		 *lockfuncarg;
 49	int		  ref_count;
 50	int		  domain;
 51};
 52
 53struct bus_dma_impl {
 54	int (*tag_create)(bus_dma_tag_t parent,
 55	    bus_size_t alignment, bus_addr_t boundary, bus_addr_t lowaddr,
 56	    bus_addr_t highaddr, bus_dma_filter_t *filter,
 57	    void *filterarg, bus_size_t maxsize, int nsegments,
 58	    bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
 59	    void *lockfuncarg, bus_dma_tag_t *dmat);
 60	int (*tag_destroy)(bus_dma_tag_t dmat);
 61	int (*tag_set_domain)(bus_dma_tag_t);
 62	bool (*id_mapped)(bus_dma_tag_t, vm_paddr_t, bus_size_t);
 63	int (*map_create)(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp);
 64	int (*map_destroy)(bus_dma_tag_t dmat, bus_dmamap_t map);
 65	int (*mem_alloc)(bus_dma_tag_t dmat, void** vaddr, int flags,
 66	    bus_dmamap_t *mapp);
 67	void (*mem_free)(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map);
 68	int (*load_ma)(bus_dma_tag_t dmat, bus_dmamap_t map,
 69	    struct vm_page **ma, bus_size_t tlen, int ma_offs, int flags,
 70	    bus_dma_segment_t *segs, int *segp);
 71	int (*load_phys)(bus_dma_tag_t dmat, bus_dmamap_t map,
 72	    vm_paddr_t buf, bus_size_t buflen, int flags,
 73	    bus_dma_segment_t *segs, int *segp);
 74	int (*load_buffer)(bus_dma_tag_t dmat, bus_dmamap_t map,
 75	    void *buf, bus_size_t buflen, struct pmap *pmap, int flags,
 76	    bus_dma_segment_t *segs, int *segp);
 77	void (*map_waitok)(bus_dma_tag_t dmat, bus_dmamap_t map,
 78	    struct memdesc *mem, bus_dmamap_callback_t *callback,
 79	    void *callback_arg);
 80	bus_dma_segment_t *(*map_complete)(bus_dma_tag_t dmat, bus_dmamap_t map,
 81	    bus_dma_segment_t *segs, int nsegs, int error);
 82	void (*map_unload)(bus_dma_tag_t dmat, bus_dmamap_t map);
 83	void (*map_sync)(bus_dma_tag_t dmat, bus_dmamap_t map,
 84	    bus_dmasync_op_t op);
 85#ifdef KMSAN
 86	void (*load_kmsan)(bus_dmamap_t map, struct memdesc *mem);
 87#endif
 88};
 89
 90int bus_dma_run_filter(struct bus_dma_tag_common *dmat, vm_paddr_t paddr);
 91int common_bus_dma_tag_create(struct bus_dma_tag_common *parent,
 92    bus_size_t alignment,
 93    bus_addr_t boundary, bus_addr_t lowaddr, bus_addr_t highaddr,
 94    bus_dma_filter_t *filter, void *filterarg, bus_size_t maxsize,
 95    int nsegments, bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
 96    void *lockfuncarg, size_t sz, void **dmat);
 97
 98extern struct bus_dma_impl bus_dma_bounce_impl;
 99
100#endif