/* 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.
*/

#ifndef HW_MISC_GOLDFISH_SYNC_H
#define HW_MISC_GOLDFISH_SYNC_H

#include <stdint.h>

/* A list of commands to send to the guest through the goldfish_sync device
 * CMD_CREATE_TIMELINE: used to create a new timeline handle.
 * CMD_CREATE_FENCE: used to create a new sync fence handle.
 * CMD_INCREMENT_TIMELINE: used to increment a timeline's value.
 * CMD_DESTROY_TIMELINE: used to destroy a given timeline handle.
 * and sync thread handle. */
typedef enum {
    GOLDFISH_SYNC_CMD_CREATE_TIMELINE = 1,
    GOLDFISH_SYNC_CMD_CREATE_FENCE = 2,
    GOLDFISH_SYNC_CMD_INCREMENT_TIMELINE = 3,
    GOLDFISH_SYNC_CMD_DESTROY_TIMELINE = 4,
} GoldfishSyncCommand;

/* A set of callbacks that must be implemented by the host-side sync service
 * and will be called by the virtual device at runtime. */
typedef struct {
    /* Called when the guest sends the result of a previous command to the
     * host. */
    void (*receive_hostcmd_result)(uint32_t cmd,
                                   uint64_t handle,
                                   uint32_t time_arg,
                                   uint64_t hostcmd_handle);

    /* Called when the guest wants to trigger a host-side wait for a
     * specific glsync and thread pointer pair */
    void (*trigger_host_wait)(uint64_t glsync_ptr,
                              uint64_t thread_ptr,
                              uint64_t timeline);
} GoldfishSyncServiceOps;

/* Register the host-side sync service callbacks with the device. This
 * must be called at emulation setup time before the device runs. */
void goldfish_sync_set_service_ops(const GoldfishSyncServiceOps *ops);

/* Send a command to the guest through the goldfish_sync device. */
void goldfish_sync_send_command(uint32_t cmd,
                                uint64_t handle,
                                uint32_t time_arg,
                                uint64_t hostcmd_handle);

#endif  /* HW_MISC_GOLDFISH_SYNC_H */
