/* SPDX-License-Identifier: Apache-2.0 */
/* Copyright (C) 2018 IBM Corp. */

#ifndef PROTOCOL_H
#define PROTOCOL_H

struct mbox_context;

/*
 * The GET_MBOX_INFO command is special as it can change the interface based on
 * negotiation. As such we need to accommodate all response types
 */
struct protocol_get_info {
	struct {
		uint8_t api_version;
	} req;
	struct {
		uint8_t api_version;
		union {
			struct {
				uint16_t read_window_size;
				uint16_t write_window_size;
			} v1;
			struct {
				uint8_t block_size_shift;
				uint16_t timeout;
			} v2;
		};
	} resp;
};

struct protocol_get_flash_info {
	struct {
		union {
			struct {
				uint32_t flash_size;
				uint32_t erase_size;
			} v1;
			struct {
				uint16_t flash_size;
				uint16_t erase_size;
			} v2;
		};
	} resp;
};

struct protocol_create_window {
	struct {
		uint16_t offset;
		uint16_t size;
		uint8_t id;
		bool ro;
	} req;
	struct {
		uint16_t lpc_address;
		uint16_t size;
		uint16_t offset;
	} resp;
};

struct protocol_mark_dirty {
	struct {
		union {
			struct {
				uint16_t offset;
				uint32_t size;
			} v1;
			struct {
				uint16_t offset;
				uint16_t size;
			} v2;
		};
	} req;
};

struct protocol_erase {
	struct {
		uint16_t offset;
		uint16_t size;
	} req;
};

struct protocol_flush {
	struct {
		uint16_t offset;
		uint32_t size;
	} req;
};

struct protocol_close {
	struct {
		uint8_t flags;
	} req;
};

struct protocol_ack {
	struct {
		uint8_t flags;
	} req;
};

struct protocol_ops {
	int (*reset)(struct mbox_context *context);
	int (*get_info)(struct mbox_context *context,
			struct protocol_get_info *io);
	int (*get_flash_info)(struct mbox_context *context,
			      struct protocol_get_flash_info *io);
	int (*create_window)(struct mbox_context *context,
			     struct protocol_create_window *io);
	int (*mark_dirty)(struct mbox_context *context,
			  struct protocol_mark_dirty *io);
	int (*erase)(struct mbox_context *context, struct protocol_erase *io);
	int (*flush)(struct mbox_context *context, struct protocol_flush *io);
	int (*close)(struct mbox_context *context, struct protocol_close *io);
	int (*ack)(struct mbox_context *context, struct protocol_ack *io);
};

int protocol_init(struct mbox_context *context);
void protocol_free(struct mbox_context *context);

int protocol_negotiate_version(struct mbox_context *context, uint8_t requested);

#define EVENT_SUPPRESS		false
#define EVENT_TRIGGER		true

int protocol_events_set(struct mbox_context *context, uint8_t bmc_event,
			bool write_back);
int protocol_events_clear(struct mbox_context *context, uint8_t bmc_event,
			  bool write_back);

/* Protocol v1 */
int protocol_v1_reset(struct mbox_context *context);
int protocol_v1_get_info(struct mbox_context *context,
			 struct protocol_get_info *io);
int protocol_v1_get_flash_info(struct mbox_context *context,
			       struct protocol_get_flash_info *io);
int protocol_v1_create_window(struct mbox_context *context,
			      struct protocol_create_window *io);
int protocol_v1_mark_dirty(struct mbox_context *context,
			   struct protocol_mark_dirty *io);
int protocol_v1_flush(struct mbox_context *context, struct protocol_flush *io);
int protocol_v1_close(struct mbox_context *context, struct protocol_close *io);
int protocol_v1_ack(struct mbox_context *context, struct protocol_ack *io);

/* Protocol v2 */
int protocol_v2_get_info(struct mbox_context *context,
			 struct protocol_get_info *io);
int protocol_v2_get_flash_info(struct mbox_context *context,
			       struct protocol_get_flash_info *io);
int protocol_v2_create_window(struct mbox_context *context,
			      struct protocol_create_window *io);
int protocol_v2_mark_dirty(struct mbox_context *context,
			   struct protocol_mark_dirty *io);
int protocol_v2_erase(struct mbox_context *context,
		      struct protocol_erase *io);
int protocol_v2_flush(struct mbox_context *context, struct protocol_flush *io);
int protocol_v2_close(struct mbox_context *context, struct protocol_close *io);

#endif /* PROTOCOL_H */
