blob: 3d6376255c9684bb77d5b5d83bbc241f02b707e8 [file] [log] [blame]
/*
* 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 <linux/types.h>
/* 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 */