/* Copyright 2013 The ChromiumOS Authors
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * For hysterical raisins, there are several mechanisms for communicating with
 * the EC. This abstracts them.
 */

#ifndef __UTIL_COMM_HOST_H
#define __UTIL_COMM_HOST_H

#include "common.h"
#include "ec_commands.h"

/* ec_command return value for non-success result from EC */
#define EECRESULT 1000

/* Maximum output and input sizes for EC command, in bytes */
extern int ec_max_outsize, ec_max_insize;

/*
 * Maximum-size output and input buffers, for use by callers.  This saves each
 * caller needing to allocate/free its own buffers.
 */
extern void *ec_outbuf;
extern void *ec_inbuf;

/* Interfaces to allow for comm_init() */
enum comm_interface {
	COMM_DEV = BIT(0),
	COMM_LPC = BIT(1),
	COMM_I2C = BIT(2),
	COMM_SERVO = BIT(3),
	COMM_USB = BIT(4),
	COMM_ALL = -1
};

/**
 * Initialize alternative interfaces
 *
 * @param interfaces	Interfaces to try; use COMM_ALL to try all of them.
 * @param device_name For DEV option, the device file to use.
 * @param i2c_bus For I2C option, the bus number to use (or -1 to autodetect).
 * @return 0 in case of success, or error code.
 */
int comm_init_alt(int interfaces, const char *device_name, int i2c_bus);

/**
 * Initialize dev interface
 *
 * @return 0 in case of success, or error code.
 */
int comm_init_dev(const char *device_name);

/**
 * Get the file descriptor associated with the dev interface. comm_init_dev
 * must be called first in order for the file descriptor to be valid.
 *
 * @return file descriptor
 */
int comm_get_fd(void);

/**
 * Initialize input & output buffers
 *
 * @return 0 in case of success, or error code.
 */
int comm_init_buffer(void);

/**
 * Send a command to the EC.  Returns the length of output data returned (0 if
 * none), or negative on error.
 */
int ec_command(int command, int version, const void *outdata,
	       int outsize, /* to
			       the
			       EC
			     */
	       void *indata, int insize); /* from the EC */

/**
 * Set the offset to be applied to the command number when ec_command() calls
 * ec_command_proto().
 */
void set_command_offset(int offset);

/**
 * Send a command to the EC.  Returns the length of output data returned (0 if
 * none), or negative on error.  This is the low-level interface implemented
 * by the protocol-specific driver.  DO NOT call this version directly from
 * anywhere but ec_command(), or the --device option will not work.
 */
extern int (*ec_command_proto)(int command, int version, const void *outdata,
			       int outsize, /* to EC */
			       void *indata, int insize); /* from EC */

/**
 * Return the content of the EC information area mapped as "memory".
 * The offsets are defined by the EC_MEMMAP_ constants. Returns the number
 * of bytes read, or negative on error. Specifying bytes=0 will read a
 * string (always including the trailing '\0').
 */
extern int (*ec_readmem)(int offset, int bytes, void *dest);

/**
 * Wait for a MKBP event matching 'mask' for at most 'timeout' milliseconds.
 * Then read the incoming event content in 'buffer' (or at most
 * 'buf_size' bytes of it).
 * Return the size of the event read on success, 0 in case of timeout,
 * or a negative value in case of error.
 */
extern int (*ec_pollevent)(unsigned long mask, void *buffer, size_t buf_size,
			   int timeout);

#endif /* __UTIL_COMM_HOST_H */
