1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _HVSI_H 3 #define _HVSI_H 4 5 #define VS_DATA_PACKET_HEADER 0xff 6 #define VS_CONTROL_PACKET_HEADER 0xfe 7 #define VS_QUERY_PACKET_HEADER 0xfd 8 #define VS_QUERY_RESPONSE_PACKET_HEADER 0xfc 9 10 /* control verbs */ 11 #define VSV_SET_MODEM_CTL 1 /* to service processor only */ 12 #define VSV_MODEM_CTL_UPDATE 2 /* from service processor only */ 13 #define VSV_CLOSE_PROTOCOL 3 14 15 /* query verbs */ 16 #define VSV_SEND_VERSION_NUMBER 1 17 #define VSV_SEND_MODEM_CTL_STATUS 2 18 19 /* yes, these masks are not consecutive. */ 20 #define HVSI_TSDTR 0x01 21 #define HVSI_TSCD 0x20 22 23 #define HVSI_MAX_OUTGOING_DATA 12 24 #define HVSI_VERSION 1 25 26 struct hvsi_header { 27 uint8_t type; 28 uint8_t len; 29 __be16 seqno; 30 } __attribute__((packed)); 31 32 struct hvsi_data { 33 struct hvsi_header hdr; 34 uint8_t data[HVSI_MAX_OUTGOING_DATA]; 35 } __attribute__((packed)); 36 37 struct hvsi_control { 38 struct hvsi_header hdr; 39 __be16 verb; 40 /* optional depending on verb: */ 41 __be32 word; 42 __be32 mask; 43 } __attribute__((packed)); 44 45 struct hvsi_query { 46 struct hvsi_header hdr; 47 __be16 verb; 48 } __attribute__((packed)); 49 50 struct hvsi_query_response { 51 struct hvsi_header hdr; 52 __be16 verb; 53 __be16 query_seqno; 54 union { 55 uint8_t version; 56 __be32 mctrl_word; 57 } u; 58 } __attribute__((packed)); 59 60 /* hvsi lib struct definitions */ 61 #define HVSI_INBUF_SIZE 255 62 struct tty_struct; 63 struct hvsi_priv { 64 unsigned int inbuf_len; /* data in input buffer */ 65 unsigned char inbuf[HVSI_INBUF_SIZE]; 66 unsigned int inbuf_cur; /* Cursor in input buffer */ 67 size_t inbuf_pktlen; /* packet length from cursor */ 68 atomic_t seqno; /* packet sequence number */ 69 unsigned int opened:1; /* driver opened */ 70 unsigned int established:1; /* protocol established */ 71 unsigned int is_console:1; /* used as a kernel console device */ 72 unsigned int mctrl_update:1; /* modem control updated */ 73 unsigned short mctrl; /* modem control */ 74 struct tty_struct *tty; /* tty structure */ 75 ssize_t (*get_chars)(uint32_t termno, u8 *buf, size_t count); 76 ssize_t (*put_chars)(uint32_t termno, const u8 *buf, size_t count); 77 uint32_t termno; 78 }; 79 80 /* hvsi lib functions */ 81 struct hvc_struct; 82 extern void hvsilib_init(struct hvsi_priv *pv, 83 ssize_t (*get_chars)(uint32_t termno, u8 *buf, 84 size_t count), 85 ssize_t (*put_chars)(uint32_t termno, const u8 *buf, 86 size_t count), 87 int termno, int is_console); 88 extern int hvsilib_open(struct hvsi_priv *pv, struct hvc_struct *hp); 89 extern void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp); 90 extern int hvsilib_read_mctrl(struct hvsi_priv *pv); 91 extern int hvsilib_write_mctrl(struct hvsi_priv *pv, int dtr); 92 extern void hvsilib_establish(struct hvsi_priv *pv); 93 extern ssize_t hvsilib_get_chars(struct hvsi_priv *pv, u8 *buf, size_t count); 94 extern ssize_t hvsilib_put_chars(struct hvsi_priv *pv, const u8 *buf, 95 size_t count); 96 97 #endif /* _HVSI_H */ 98