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