#include "base/Stream.h"

#include "host-common/GoldfishDma.h"
#include "host-common/DmaMap.h"

#include "host-common/address_space_device.h"
#include "host-common/android_pipe_host.h"

static void android_goldfish_dma_add_buffer(void* pipe, uint64_t guest_paddr, uint64_t sz) {
    android::DmaMap::get()->addBuffer(pipe, guest_paddr, sz);
}

static void android_goldfish_dma_remove_buffer(uint64_t guest_paddr) {
    android::DmaMap::get()->removeBuffer(guest_paddr);
}

static void* android_goldfish_dma_get_host_addr(uint64_t guest_paddr) {
    void *host_ptr;

    host_ptr = get_address_space_device_control_ops()->get_host_ptr(guest_paddr);
    if (host_ptr) {
        return host_ptr;
    }

    return android::DmaMap::get()->getHostAddr(guest_paddr);
}

static void android_goldfish_dma_invalidate_host_mappings() {
    android::DmaMap::get()->invalidateHostMappings();
}

static void android_goldfish_dma_unlock(uint64_t guest_paddr) {
    void* hwpipe = android::DmaMap::get()->getPipeInstance(guest_paddr);

    if (hwpipe) {
        /*
         * DMA regions allocated with AddressSpaceHostMemoryAllocatorContext
         * don't have hwpipe associated with them.
         */
        android_pipe_host_signal_wake(hwpipe, PIPE_WAKE_UNLOCK_DMA);
    }
}

static void android_goldfish_dma_reset_host_mappings() {
    android::DmaMap::get()->resetHostMappings();
}

static void android_goldfish_dma_save_mappings(android::base::Stream* stream) {
    android::DmaMap::get()->save(stream);
}

static void android_goldfish_dma_load_mappings(android::base::Stream* stream) {
    android::DmaMap::get()->load(stream);
}

const GoldfishDmaOps android_goldfish_dma_ops = {
    .add_buffer = android_goldfish_dma_add_buffer,
    .remove_buffer = android_goldfish_dma_remove_buffer,
    .get_host_addr = android_goldfish_dma_get_host_addr,
    .invalidate_host_mappings = android_goldfish_dma_invalidate_host_mappings,
    .unlock = android_goldfish_dma_unlock,
    .reset_host_mappings = android_goldfish_dma_reset_host_mappings,
    .save_mappings = android_goldfish_dma_save_mappings,
    .load_mappings = android_goldfish_dma_load_mappings,
};
