162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _HVSI_H
362306a36Sopenharmony_ci#define _HVSI_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#define VS_DATA_PACKET_HEADER           0xff
662306a36Sopenharmony_ci#define VS_CONTROL_PACKET_HEADER        0xfe
762306a36Sopenharmony_ci#define VS_QUERY_PACKET_HEADER          0xfd
862306a36Sopenharmony_ci#define VS_QUERY_RESPONSE_PACKET_HEADER 0xfc
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/* control verbs */
1162306a36Sopenharmony_ci#define VSV_SET_MODEM_CTL    1 /* to service processor only */
1262306a36Sopenharmony_ci#define VSV_MODEM_CTL_UPDATE 2 /* from service processor only */
1362306a36Sopenharmony_ci#define VSV_CLOSE_PROTOCOL   3
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* query verbs */
1662306a36Sopenharmony_ci#define VSV_SEND_VERSION_NUMBER 1
1762306a36Sopenharmony_ci#define VSV_SEND_MODEM_CTL_STATUS 2
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/* yes, these masks are not consecutive. */
2062306a36Sopenharmony_ci#define HVSI_TSDTR 0x01
2162306a36Sopenharmony_ci#define HVSI_TSCD  0x20
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define HVSI_MAX_OUTGOING_DATA 12
2462306a36Sopenharmony_ci#define HVSI_VERSION 1
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistruct hvsi_header {
2762306a36Sopenharmony_ci	uint8_t  type;
2862306a36Sopenharmony_ci	uint8_t  len;
2962306a36Sopenharmony_ci	__be16 seqno;
3062306a36Sopenharmony_ci} __attribute__((packed));
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistruct hvsi_data {
3362306a36Sopenharmony_ci	struct hvsi_header hdr;
3462306a36Sopenharmony_ci	uint8_t  data[HVSI_MAX_OUTGOING_DATA];
3562306a36Sopenharmony_ci} __attribute__((packed));
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistruct hvsi_control {
3862306a36Sopenharmony_ci	struct hvsi_header hdr;
3962306a36Sopenharmony_ci	__be16 verb;
4062306a36Sopenharmony_ci	/* optional depending on verb: */
4162306a36Sopenharmony_ci	__be32 word;
4262306a36Sopenharmony_ci	__be32 mask;
4362306a36Sopenharmony_ci} __attribute__((packed));
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistruct hvsi_query {
4662306a36Sopenharmony_ci	struct hvsi_header hdr;
4762306a36Sopenharmony_ci	__be16 verb;
4862306a36Sopenharmony_ci} __attribute__((packed));
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistruct hvsi_query_response {
5162306a36Sopenharmony_ci	struct hvsi_header hdr;
5262306a36Sopenharmony_ci	__be16 verb;
5362306a36Sopenharmony_ci	__be16 query_seqno;
5462306a36Sopenharmony_ci	union {
5562306a36Sopenharmony_ci		uint8_t  version;
5662306a36Sopenharmony_ci		__be32 mctrl_word;
5762306a36Sopenharmony_ci	} u;
5862306a36Sopenharmony_ci} __attribute__((packed));
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci/* hvsi lib struct definitions */
6162306a36Sopenharmony_ci#define HVSI_INBUF_SIZE		255
6262306a36Sopenharmony_cistruct tty_struct;
6362306a36Sopenharmony_cistruct hvsi_priv {
6462306a36Sopenharmony_ci	unsigned int	inbuf_len;	/* data in input buffer */
6562306a36Sopenharmony_ci	unsigned char	inbuf[HVSI_INBUF_SIZE];
6662306a36Sopenharmony_ci	unsigned int	inbuf_cur;	/* Cursor in input buffer */
6762306a36Sopenharmony_ci	unsigned int	inbuf_pktlen;	/* packet length from cursor */
6862306a36Sopenharmony_ci	atomic_t	seqno;		/* packet sequence number */
6962306a36Sopenharmony_ci	unsigned int	opened:1;	/* driver opened */
7062306a36Sopenharmony_ci	unsigned int	established:1;	/* protocol established */
7162306a36Sopenharmony_ci	unsigned int 	is_console:1;	/* used as a kernel console device */
7262306a36Sopenharmony_ci	unsigned int	mctrl_update:1;	/* modem control updated */
7362306a36Sopenharmony_ci	unsigned short	mctrl;		/* modem control */
7462306a36Sopenharmony_ci	struct tty_struct *tty;		/* tty structure */
7562306a36Sopenharmony_ci	int (*get_chars)(uint32_t termno, char *buf, int count);
7662306a36Sopenharmony_ci	int (*put_chars)(uint32_t termno, const char *buf, int count);
7762306a36Sopenharmony_ci	uint32_t	termno;
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci/* hvsi lib functions */
8162306a36Sopenharmony_cistruct hvc_struct;
8262306a36Sopenharmony_ciextern void hvsilib_init(struct hvsi_priv *pv,
8362306a36Sopenharmony_ci			 int (*get_chars)(uint32_t termno, char *buf, int count),
8462306a36Sopenharmony_ci			 int (*put_chars)(uint32_t termno, const char *buf,
8562306a36Sopenharmony_ci					  int count),
8662306a36Sopenharmony_ci			 int termno, int is_console);
8762306a36Sopenharmony_ciextern int hvsilib_open(struct hvsi_priv *pv, struct hvc_struct *hp);
8862306a36Sopenharmony_ciextern void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp);
8962306a36Sopenharmony_ciextern int hvsilib_read_mctrl(struct hvsi_priv *pv);
9062306a36Sopenharmony_ciextern int hvsilib_write_mctrl(struct hvsi_priv *pv, int dtr);
9162306a36Sopenharmony_ciextern void hvsilib_establish(struct hvsi_priv *pv);
9262306a36Sopenharmony_ciextern int hvsilib_get_chars(struct hvsi_priv *pv, char *buf, int count);
9362306a36Sopenharmony_ciextern int hvsilib_put_chars(struct hvsi_priv *pv, const char *buf, int count);
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci#endif /* _HVSI_H */
96