/* Copyright (C) 2016 The Android Open Source Project ** ** 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. */ #pragma once #include static const uint32_t kDmaBufSizeMB = 32; // 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. // // See docs/GOLDFISH-VIRTUAL-HARDWARE.txt and // docs/ANDROID-QEMU-PIPE.txt // // for more details. // Host / virtual device interface: typedef struct { // add_buffer(): // Tell us that there is a physically-contiguous buffer in the guest // starting at |guest_paddr|. This should be used upon allocation // of the DMA buffer in the ugest. void (*add_buffer)(void* pipe, uint64_t guest_paddr, uint64_t sz); // remove_buffer(): // Tell us that we don't care about tracking this buffer anymore. // This should usually be used when the DMA buffer has been freed // in the ugest. void (*remove_buffer)(uint64_t guest_paddr); // get_host_addr(): // Obtain a pointer to guest physical memory that is usable as // as host void*. void* (*get_host_addr)(uint64_t guest_paddr); // invalidate_host_mappings(): // Sometimes (say, on snapshot save/load) we may need to re-map // the guest DMA buffers so to regain access to them. // This function tells our map of DMA buffers to remap the buffers // next time they are used. void (*invalidate_host_mappings)(void); // unlock(): // Unlocks the buffer at |guest_paddr| to signal the guest // that we are done writing it. void (*unlock)(uint64_t guest_paddr); // reset_host_mappings(); // Not only invalidates the mappings, but also removes them from the record. void (*reset_host_mappings)(void); } GoldfishDmaOps; extern GoldfishDmaOps android_goldfish_dma_ops;