/*
 *  sync.c
 *
 *   Copyright 2012 Google, Inc
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

#include <errno.h>
#include <fcntl.h>
#include <malloc.h>
#include <poll.h>
#include <stdatomic.h>
#include <stdint.h>
#include <string.h>

#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>

#include <android/sync.h>

/* Legacy Sync API */

struct sync_legacy_merge_data {
 int32_t fd2;
 char name[32];
 int32_t fence;
};

/**
 * DOC: SYNC_IOC_MERGE - merge two fences
 *
 * Takes a struct sync_merge_data.  Creates a new fence containing copies of
 * the sync_pts in both the calling fd and sync_merge_data.fd2.  Returns the
 * new fence's fd in sync_merge_data.fence
 *
 * This is the legacy version of the Sync API before the de-stage that happened
 * on Linux kernel 4.7.
 */
#define SYNC_IOC_LEGACY_MERGE   _IOWR(SYNC_IOC_MAGIC, 1, \
    struct sync_legacy_merge_data)

/**
 * DOC: SYNC_IOC_LEGACY_FENCE_INFO - get detailed information on a fence
 *
 * Takes a struct sync_fence_info_data with extra space allocated for pt_info.
 * Caller should write the size of the buffer into len.  On return, len is
 * updated to reflect the total size of the sync_fence_info_data including
 * pt_info.
 *
 * pt_info is a buffer containing sync_pt_infos for every sync_pt in the fence.
 * To iterate over the sync_pt_infos, use the sync_pt_info.len field.
 *
 * This is the legacy version of the Sync API before the de-stage that happened
 * on Linux kernel 4.7.
 */
#define SYNC_IOC_LEGACY_FENCE_INFO  _IOWR(SYNC_IOC_MAGIC, 2,\
    struct sync_fence_info_data)

/* SW Sync API */

struct sw_sync_create_fence_data {
  __u32 value;
  char name[32];
  __s32 fence;
};

#define SW_SYNC_IOC_MAGIC 'W'
#define SW_SYNC_IOC_CREATE_FENCE _IOWR(SW_SYNC_IOC_MAGIC, 0, struct sw_sync_create_fence_data)
#define SW_SYNC_IOC_INC _IOW(SW_SYNC_IOC_MAGIC, 1, __u32)

// ---------------------------------------------------------------------------
// Support for caching the sync uapi version.
//
// This library supports both legacy (android/staging) uapi and modern
// (mainline) sync uapi. Library calls first try one uapi, and if that fails,
// try the other. Since any given kernel only supports one uapi version, after
// the first successful syscall we know what the kernel supports and can skip
// trying the other.

enum uapi_version {
    UAPI_UNKNOWN,
    UAPI_MODERN,
    UAPI_LEGACY
};
static atomic_int g_uapi_version = ATOMIC_VAR_INIT(UAPI_UNKNOWN);

// ---------------------------------------------------------------------------

int sync_wait(int fd, int timeout)
{
    struct pollfd fds;
    int ret;

    if (fd < 0) {
        errno = EINVAL;
        return -1;
    }

    fds.fd = fd;
    fds.events = POLLIN;

    do {
        ret = poll(&fds, 1, timeout);
        if (ret > 0) {
            if (fds.revents & (POLLERR | POLLNVAL)) {
                errno = EINVAL;
                return -1;
            }
            return 0;
        } else if (ret == 0) {
            errno = ETIME;
            return -1;
        }
    } while (ret == -1 && (errno == EINTR || errno == EAGAIN));

    return ret;
}

static int legacy_sync_merge(const char *name, int fd1, int fd2)
{
    struct sync_legacy_merge_data data;
    int ret;

    data.fd2 = fd2;
    strlcpy(data.name, name, sizeof(data.name));
    ret = ioctl(fd1, SYNC_IOC_LEGACY_MERGE, &data);
    if (ret < 0)
        return ret;
    return data.fence;
}

static int modern_sync_merge(const char *name, int fd1, int fd2)
{
    struct sync_merge_data data;
    int ret;

    data.fd2 = fd2;
    strlcpy(data.name, name, sizeof(data.name));
    data.flags = 0;
    data.pad = 0;

    ret = ioctl(fd1, SYNC_IOC_MERGE, &data);
    if (ret < 0)
        return ret;
    return data.fence;
}

int sync_merge(const char *name, int fd1, int fd2)
{
    int uapi;
    int ret;

    uapi = atomic_load_explicit(&g_uapi_version, memory_order_acquire);

    if (uapi == UAPI_MODERN || uapi == UAPI_UNKNOWN) {
        ret = modern_sync_merge(name, fd1, fd2);
        if (ret >= 0 || errno != ENOTTY) {
            if (ret >= 0 && uapi == UAPI_UNKNOWN) {
                atomic_store_explicit(&g_uapi_version, UAPI_MODERN,
                                      memory_order_release);
            }
            return ret;
        }
    }

    ret = legacy_sync_merge(name, fd1, fd2);
    if (ret >= 0 && uapi == UAPI_UNKNOWN) {
        atomic_store_explicit(&g_uapi_version, UAPI_LEGACY,
                              memory_order_release);
    }
    return ret;
}

static struct sync_fence_info_data *legacy_sync_fence_info(int fd)
{
    struct sync_fence_info_data *legacy_info;
    struct sync_pt_info *legacy_pt_info;
    int err;

    legacy_info = malloc(4096);
    if (legacy_info == NULL)
        return NULL;

    legacy_info->len = 4096;
    err = ioctl(fd, SYNC_IOC_LEGACY_FENCE_INFO, legacy_info);
    if (err < 0) {
        free(legacy_info);
        return NULL;
    }
    return legacy_info;
}

static struct sync_file_info *modern_sync_file_info(int fd)
{
    struct sync_file_info local_info;
    struct sync_file_info *info;
    int err;

    memset(&local_info, 0, sizeof(local_info));
    err = ioctl(fd, SYNC_IOC_FILE_INFO, &local_info);
    if (err < 0)
        return NULL;

    info = calloc(1, sizeof(struct sync_file_info) +
                  local_info.num_fences * sizeof(struct sync_fence_info));
    if (!info)
        return NULL;
    info->sync_fence_info = (__u64)(uintptr_t)(info + 1);

    err = ioctl(fd, SYNC_IOC_FILE_INFO, info);
    if (err < 0) {
        free(info);
        return NULL;
    }

    return info;
}

static struct sync_fence_info_data *sync_file_info_to_legacy_fence_info(
    const struct sync_file_info *info)
{
    struct sync_fence_info_data *legacy_info;
    struct sync_pt_info *legacy_pt_info;
    const struct sync_fence_info *fence_info = sync_get_fence_info(info);
    const uint32_t num_fences = info->num_fences;

    legacy_info = malloc(4096);
    if (legacy_info == NULL)
        return NULL;
    legacy_info->len = sizeof(*legacy_info) +
                        num_fences * sizeof(struct sync_pt_info);
    strlcpy(legacy_info->name, info->name, sizeof(legacy_info->name));
    legacy_info->status = info->status;

    legacy_pt_info = (struct sync_pt_info *)legacy_info->pt_info;
    for (uint32_t i = 0; i < num_fences; i++) {
        legacy_pt_info[i].len = sizeof(*legacy_pt_info);
        strlcpy(legacy_pt_info[i].obj_name, fence_info[i].obj_name,
                sizeof(legacy_pt_info->obj_name));
        strlcpy(legacy_pt_info[i].driver_name, fence_info[i].driver_name,
                sizeof(legacy_pt_info->driver_name));
        legacy_pt_info[i].status = fence_info[i].status;
        legacy_pt_info[i].timestamp_ns = fence_info[i].timestamp_ns;
    }

    return legacy_info;
}

static struct sync_file_info* legacy_fence_info_to_sync_file_info(
                                    struct sync_fence_info_data *legacy_info)
{
    struct sync_file_info *info;
    struct sync_pt_info *pt;
    struct sync_fence_info *fence;
    size_t num_fences;
    int err;

    pt = NULL;
    num_fences = 0;
    while ((pt = sync_pt_info(legacy_info, pt)) != NULL)
        num_fences++;

    info = calloc(1, sizeof(struct sync_file_info) +
                     num_fences * sizeof(struct sync_fence_info));
    if (!info) {
        free(legacy_info);
        return NULL;
    }
    info->sync_fence_info = (__u64)(uintptr_t)(info + 1);

    strlcpy(info->name, legacy_info->name, sizeof(info->name));
    info->status = legacy_info->status;
    info->num_fences = num_fences;

    pt = NULL;
    fence = sync_get_fence_info(info);
    while ((pt = sync_pt_info(legacy_info, pt)) != NULL) {
        strlcpy(fence->obj_name, pt->obj_name, sizeof(fence->obj_name));
        strlcpy(fence->driver_name, pt->driver_name,
                sizeof(fence->driver_name));
        fence->status = pt->status;
        fence->timestamp_ns = pt->timestamp_ns;
        fence++;
    }

    return info;
}

struct sync_fence_info_data *sync_fence_info(int fd)
{
    struct sync_fence_info_data *legacy_info;
    int uapi;

    uapi = atomic_load_explicit(&g_uapi_version, memory_order_acquire);

    if (uapi == UAPI_LEGACY || uapi == UAPI_UNKNOWN) {
        legacy_info = legacy_sync_fence_info(fd);
        if (legacy_info || errno != ENOTTY) {
            if (legacy_info && uapi == UAPI_UNKNOWN) {
                atomic_store_explicit(&g_uapi_version, UAPI_LEGACY,
                                      memory_order_release);
            }
            return legacy_info;
        }
    }

    struct sync_file_info* file_info;
    file_info = modern_sync_file_info(fd);
    if (!file_info)
        return NULL;
    if (uapi == UAPI_UNKNOWN) {
        atomic_store_explicit(&g_uapi_version, UAPI_MODERN,
                              memory_order_release);
    }
    legacy_info = sync_file_info_to_legacy_fence_info(file_info);
    sync_file_info_free(file_info);
    return legacy_info;
}

struct sync_file_info* sync_file_info(int32_t fd)
{
    struct sync_file_info *info;
    int uapi;

    uapi = atomic_load_explicit(&g_uapi_version, memory_order_acquire);

    if (uapi == UAPI_MODERN || uapi == UAPI_UNKNOWN) {
        info = modern_sync_file_info(fd);
        if (info || errno != ENOTTY) {
            if (info && uapi == UAPI_UNKNOWN) {
                atomic_store_explicit(&g_uapi_version, UAPI_MODERN,
                                      memory_order_release);
            }
            return info;
        }
    }

    struct sync_fence_info_data *legacy_info;
    legacy_info = legacy_sync_fence_info(fd);
    if (!legacy_info)
        return NULL;
    if (uapi == UAPI_UNKNOWN) {
        atomic_store_explicit(&g_uapi_version, UAPI_LEGACY,
                              memory_order_release);
    }
    info = legacy_fence_info_to_sync_file_info(legacy_info);
    sync_fence_info_free(legacy_info);
    return info;
}

struct sync_pt_info *sync_pt_info(struct sync_fence_info_data *info,
                                  struct sync_pt_info *itr)
{
    if (itr == NULL)
        itr = (struct sync_pt_info *) info->pt_info;
    else
        itr = (struct sync_pt_info *) ((__u8 *)itr + itr->len);

    if ((__u8 *)itr - (__u8 *)info >= (int)info->len)
        return NULL;

    return itr;
}

void sync_fence_info_free(struct sync_fence_info_data *info)
{
    free(info);
}

void sync_file_info_free(struct sync_file_info *info)
{
    free(info);
}


int sw_sync_timeline_create(void)
{
    int ret;

    ret = open("/sys/kernel/debug/sync/sw_sync", O_RDWR);
    if (ret < 0)
        ret = open("/dev/sw_sync", O_RDWR);

    return ret;
}

int sw_sync_timeline_inc(int fd, unsigned count)
{
    __u32 arg = count;

    return ioctl(fd, SW_SYNC_IOC_INC, &arg);
}

int sw_sync_fence_create(int fd, const char *name, unsigned value)
{
    struct sw_sync_create_fence_data data;
    int err;

    data.value = value;
    strlcpy(data.name, name, sizeof(data.name));

    err = ioctl(fd, SW_SYNC_IOC_CREATE_FENCE, &data);
    if (err < 0)
        return err;

    return data.fence;
}
