/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (C) 2018 Google, Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #ifndef UAPI_GOLDFISH_DMA_H #define UAPI_GOLDFISH_DMA_H #include /* GOLDFISH DMA * * Goldfish DMA is an extension to the pipe device * and is designed to facilitate high-speed RAM->RAM * transfers from guest to host. * * Interface (guest side): * * The guest user calls goldfish_dma_alloc (ioctls) * and then mmap() on a goldfish pipe fd, * which means that it wants high-speed access to * host-visible memory. * * The guest can then write into the pointer * returned by mmap(), and these writes * become immediately visible on the host without BQL * or otherweise context switching. * * dma_alloc_coherent() is used to obtain contiguous * physical memory regions, and we allocate and interact * with this region on both guest and host through * the following ioctls: * * - LOCK: lock the region for data access. * - UNLOCK: unlock the region. This may also be done from the host * through the WAKE_ON_UNLOCK_DMA procedure. * - CREATE_REGION: initialize size info for a dma region. * - GETOFF: send physical address to guest drivers. * - (UN)MAPHOST: uses goldfish_pipe_cmd to tell the host to * (un)map to the guest physical address associated * with the current dma context. This makes the physically * contiguous memory (in)visible to the host. * * Guest userspace obtains a pointer to the DMA memory * through mmap(), which also lazily allocates the memory * with dma_alloc_coherent. (On last pipe close(), the region is freed). * The mmaped() region can handle very high bandwidth * transfers, and pipe operations can be used at the same * time to handle synchronization and command communication. */ #define GOLDFISH_DMA_BUFFER_SIZE (32 * 1024 * 1024) struct goldfish_dma_ioctl_info { __u64 phys_begin; __u64 size; }; /* There is an ioctl associated with goldfish dma driver. * Make it conflict with ioctls that are not likely to be used * in the emulator. * 'G' 00-3F drivers/misc/sgi-gru/grulib.h conflict! * 'G' 00-0F linux/gigaset_dev.h conflict! */ #define GOLDFISH_DMA_IOC_MAGIC 'G' #define GOLDFISH_DMA_IOC_OP(OP) _IOWR(GOLDFISH_DMA_IOC_MAGIC, OP, \ struct goldfish_dma_ioctl_info) #define GOLDFISH_DMA_IOC_LOCK GOLDFISH_DMA_IOC_OP(0) #define GOLDFISH_DMA_IOC_UNLOCK GOLDFISH_DMA_IOC_OP(1) #define GOLDFISH_DMA_IOC_GETOFF GOLDFISH_DMA_IOC_OP(2) #define GOLDFISH_DMA_IOC_CREATE_REGION GOLDFISH_DMA_IOC_OP(3) #endif /* UAPI_GOLDFISH_DMA_H */