/*
 * Copyright (c) 2012, 2014, 2016 Jonas 'Sortie' Termansen.
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * sortix/display.h
 * Display message declarations.
 */

#ifndef _INCLUDE_SORTIX_DISPLAY_H
#define _INCLUDE_SORTIX_DISPLAY_H

#include <sys/cdefs.h>

#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

static const uint32_t DISPMSG_CONTROL_VALID = 1 << 0;
static const uint32_t DISPMSG_CONTROL_VGA = 1 << 1;
static const uint32_t DISPMSG_CONTROL_OTHER_RESOLUTIONS = 1 << 2;
static const uint32_t DISPMSG_CONTROL_FALLBACK = 1 << 3;
static const uint32_t DISPMSG_CONTROL_DEFAULT = 1 << 4;
static const uint32_t DISPMSG_CONTROL_GOOD_DEFAULT = 1 << 5;
static const uint32_t DISPMSG_CONTROL_VM_AUTO_SCALE = 1 << 6;

struct dispmsg_string
{
	size_t byte_size; /* Including the terminating NUL-byte. */
	char* str;
};

struct dispmsg_crtc_mode
{
	uint64_t driver_index;
	uint64_t magic;
	uint32_t control;
	uint32_t fb_format;
	uint32_t view_xres;
	uint32_t view_yres;
	uint64_t fb_location;
	uint64_t pitch;
	uint32_t surf_off_x;
	uint32_t surf_off_y;
	uint32_t start_x;
	uint32_t start_y;
	uint32_t end_x;
	uint32_t end_y;
	uint32_t desktop_height;
};

struct dispmsg_header
{
	uint64_t msgid; /* in */
};

#define DISPMSG_ENUMERATE_DEVICES 0x00
struct dispmsg_enumerate_devices
{
	uint64_t msgid; /* in */
	size_t devices_length; /* in, out */
	uint64_t* devices; /* in, *out */
};

#define DISPMSG_GET_DRIVER_COUNT 0x01
struct dispmsg_get_driver_count
{
	uint64_t msgid; /* in */
	uint64_t device; /* in */
	uint64_t driver_count; /* out */
};

#define DISPMSG_GET_DRIVER_NAME 0x02
struct dispmsg_get_driver_name
{
	uint64_t msgid; /* in */
	uint64_t device; /* in */
	uint64_t driver_index; /* in */
	struct dispmsg_string name; /* out */
};

#define DISPMSG_GET_DRIVER 0x03
struct dispmsg_get_driver
{
	uint64_t msgid; /* in */
	uint64_t device; /* in */
	uint64_t driver_index; /* out */
};

#define DISPMSG_SET_DRIVER 0x04
struct dispmsg_set_driver
{
	uint64_t msgid; /* in */
	uint64_t device; /* in */
	uint64_t driver_index; /* in */
};

#define DISPMSG_SET_CRTC_MODE 0x05
struct dispmsg_set_crtc_mode
{
	uint64_t msgid; /* in */
	uint64_t device; /* in */
	uint64_t connector; /* in */
	struct dispmsg_crtc_mode mode; /* in */
};

#define DISPMSG_GET_CRTC_MODE 0x06
struct dispmsg_get_crtc_mode
{
	uint64_t msgid; /* in */
	uint64_t device; /* in */
	uint64_t connector; /* in */
	struct dispmsg_crtc_mode mode; /* out */
};

#define DISPMSG_GET_CRTC_MODES 0x07
struct dispmsg_get_crtc_modes
{
	uint64_t msgid; /* in */
	uint64_t device; /* in */
	uint64_t connector; /* in */
	size_t modes_length; /* in, out */
	struct dispmsg_crtc_mode* modes; /* in, *out */
};

#define DISPMSG_GET_MEMORY_SIZE 0x08
struct dispmsg_get_memory_size
{
	uint64_t msgid; /* in */
	uint64_t device; /* in */
	uint64_t memory_size; /* out */
};

#define DISPMSG_WRITE_MEMORY 0x09
struct dispmsg_write_memory
{
	uint64_t msgid; /* in */
	uint64_t device; /* in */
	uint64_t offset; /* in */
	size_t size; /* in */
	uint8_t* src; /* in, *in */
};

#define DISPMSG_READ_MEMORY 0x0A
struct dispmsg_read_memory
{
	uint64_t msgid; /* in */
	uint64_t device; /* in */
	uint64_t offset; /* in */
	size_t size; /* in */
	uint8_t* dst; /* in, *out */
};

struct tiocgdisplay
{
	uint64_t device;
	uint64_t connector;
};

struct tiocgdisplays
{
	size_t count; /* in, out */
	struct tiocgdisplay* displays; /* in, *out */
};

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif
