xref: /openbmc/qemu/pc-bios/s390-ccw/sclp.h (revision 52a96afa)
10369b2ebSAlexander Graf /*
20369b2ebSAlexander Graf  * SCLP ASCII access driver
30369b2ebSAlexander Graf  *
40369b2ebSAlexander Graf  * Copyright (c) 2013 Alexander Graf <agraf@suse.de>
50369b2ebSAlexander Graf  *
60369b2ebSAlexander Graf  * This work is licensed under the terms of the GNU GPL, version 2 or (at
70369b2ebSAlexander Graf  * your option) any later version. See the COPYING file in the top-level
80369b2ebSAlexander Graf  * directory.
90369b2ebSAlexander Graf  */
100369b2ebSAlexander Graf 
110369b2ebSAlexander Graf #ifndef SCLP_H
120369b2ebSAlexander Graf #define SCLP_H
130369b2ebSAlexander Graf 
140369b2ebSAlexander Graf /* SCLP command codes */
150369b2ebSAlexander Graf #define SCLP_CMDW_READ_SCP_INFO                 0x00020001
160369b2ebSAlexander Graf #define SCLP_CMDW_READ_SCP_INFO_FORCED          0x00120001
170369b2ebSAlexander Graf #define SCLP_CMD_READ_EVENT_DATA                0x00770005
180369b2ebSAlexander Graf #define SCLP_CMD_WRITE_EVENT_DATA               0x00760005
190369b2ebSAlexander Graf #define SCLP_CMD_READ_EVENT_DATA                0x00770005
200369b2ebSAlexander Graf #define SCLP_CMD_WRITE_EVENT_DATA               0x00760005
210369b2ebSAlexander Graf #define SCLP_CMD_WRITE_EVENT_MASK               0x00780005
220369b2ebSAlexander Graf 
230369b2ebSAlexander Graf /* SCLP response codes */
240369b2ebSAlexander Graf #define SCLP_RC_NORMAL_READ_COMPLETION          0x0010
250369b2ebSAlexander Graf #define SCLP_RC_NORMAL_COMPLETION               0x0020
260369b2ebSAlexander Graf #define SCLP_RC_INVALID_SCLP_COMMAND            0x01f0
270369b2ebSAlexander Graf #define SCLP_RC_CONTAINED_EQUIPMENT_CHECK       0x0340
280369b2ebSAlexander Graf #define SCLP_RC_INSUFFICIENT_SCCB_LENGTH        0x0300
290369b2ebSAlexander Graf #define SCLP_RC_INVALID_FUNCTION                0x40f0
300369b2ebSAlexander Graf #define SCLP_RC_NO_EVENT_BUFFERS_STORED         0x60f0
310369b2ebSAlexander Graf #define SCLP_RC_INVALID_SELECTION_MASK          0x70f0
320369b2ebSAlexander Graf #define SCLP_RC_INCONSISTENT_LENGTHS            0x72f0
330369b2ebSAlexander Graf #define SCLP_RC_EVENT_BUFFER_SYNTAX_ERROR       0x73f0
340369b2ebSAlexander Graf #define SCLP_RC_INVALID_MASK_LENGTH             0x74f0
350369b2ebSAlexander Graf 
360369b2ebSAlexander Graf /* Service Call Control Block (SCCB) and its elements */
370369b2ebSAlexander Graf 
380369b2ebSAlexander Graf #define SCCB_SIZE 4096
390369b2ebSAlexander Graf 
400369b2ebSAlexander Graf #define SCLP_VARIABLE_LENGTH_RESPONSE           0x80
410369b2ebSAlexander Graf #define SCLP_EVENT_BUFFER_ACCEPTED              0x80
420369b2ebSAlexander Graf 
430369b2ebSAlexander Graf #define SCLP_FC_NORMAL_WRITE                    0
440369b2ebSAlexander Graf 
450369b2ebSAlexander Graf typedef struct SCCBHeader {
460369b2ebSAlexander Graf     uint16_t length;
470369b2ebSAlexander Graf     uint8_t function_code;
480369b2ebSAlexander Graf     uint8_t control_mask[3];
490369b2ebSAlexander Graf     uint16_t response_code;
500369b2ebSAlexander Graf } __attribute__((packed)) SCCBHeader;
510369b2ebSAlexander Graf 
520369b2ebSAlexander Graf #define SCCB_DATA_LEN (SCCB_SIZE - sizeof(SCCBHeader))
530369b2ebSAlexander Graf 
540369b2ebSAlexander Graf typedef struct ReadInfo {
550369b2ebSAlexander Graf     SCCBHeader h;
560369b2ebSAlexander Graf     uint16_t rnmax;
570369b2ebSAlexander Graf     uint8_t rnsize;
589a22473cSFarhan Ali     uint8_t reserved[13];
59a0e11b61SCollin Walling     uint8_t loadparm[LOADPARM_LEN];
600369b2ebSAlexander Graf } __attribute__((packed)) ReadInfo;
610369b2ebSAlexander Graf 
620369b2ebSAlexander Graf typedef struct SCCB {
630369b2ebSAlexander Graf     SCCBHeader h;
640369b2ebSAlexander Graf     char data[SCCB_DATA_LEN];
650369b2ebSAlexander Graf  } __attribute__((packed)) SCCB;
660369b2ebSAlexander Graf 
670369b2ebSAlexander Graf /* SCLP event types */
680369b2ebSAlexander Graf #define SCLP_EVENT_ASCII_CONSOLE_DATA           0x1a
690369b2ebSAlexander Graf #define SCLP_EVENT_SIGNAL_QUIESCE               0x1d
700369b2ebSAlexander Graf 
710369b2ebSAlexander Graf /* SCLP event masks */
720369b2ebSAlexander Graf #define SCLP_EVENT_MASK_SIGNAL_QUIESCE          0x00000008
730369b2ebSAlexander Graf #define SCLP_EVENT_MASK_MSG_ASCII               0x00000040
740369b2ebSAlexander Graf 
750369b2ebSAlexander Graf #define SCLP_UNCONDITIONAL_READ                 0x00
760369b2ebSAlexander Graf #define SCLP_SELECTIVE_READ                     0x01
770369b2ebSAlexander Graf 
780369b2ebSAlexander Graf typedef struct WriteEventMask {
790369b2ebSAlexander Graf     SCCBHeader h;
800369b2ebSAlexander Graf     uint16_t _reserved;
810369b2ebSAlexander Graf     uint16_t mask_length;
820369b2ebSAlexander Graf     uint32_t cp_receive_mask;
830369b2ebSAlexander Graf     uint32_t cp_send_mask;
840369b2ebSAlexander Graf     uint32_t send_mask;
850369b2ebSAlexander Graf     uint32_t receive_mask;
860369b2ebSAlexander Graf } __attribute__((packed)) WriteEventMask;
870369b2ebSAlexander Graf 
880369b2ebSAlexander Graf typedef struct EventBufferHeader {
890369b2ebSAlexander Graf     uint16_t length;
900369b2ebSAlexander Graf     uint8_t  type;
910369b2ebSAlexander Graf     uint8_t  flags;
920369b2ebSAlexander Graf     uint16_t _reserved;
930369b2ebSAlexander Graf } __attribute__((packed)) EventBufferHeader;
940369b2ebSAlexander Graf 
950369b2ebSAlexander Graf typedef struct WriteEventData {
960369b2ebSAlexander Graf     SCCBHeader h;
970369b2ebSAlexander Graf     EventBufferHeader ebh;
98*f7795e40SPhilippe Mathieu-Daudé     char data[];
990369b2ebSAlexander Graf } __attribute__((packed)) WriteEventData;
1000369b2ebSAlexander Graf 
1010369b2ebSAlexander Graf typedef struct ReadEventData {
1020369b2ebSAlexander Graf     SCCBHeader h;
1030369b2ebSAlexander Graf     EventBufferHeader ebh;
1040369b2ebSAlexander Graf     uint32_t mask;
1050369b2ebSAlexander Graf } __attribute__((packed)) ReadEventData;
1060369b2ebSAlexander Graf 
1070369b2ebSAlexander Graf #define __pa(x) (x)
1080369b2ebSAlexander Graf 
1090369b2ebSAlexander Graf #endif /* SCLP_H */
110