xref: /openbmc/qemu/include/hw/s390x/event-facility.h (revision dafec285bdbfe415ac6823abdc510e0b92c3f094)
10d09e41aSPaolo Bonzini /*
20d09e41aSPaolo Bonzini  * SCLP
30d09e41aSPaolo Bonzini  *    Event Facility definitions
40d09e41aSPaolo Bonzini  *
50d09e41aSPaolo Bonzini  * Copyright IBM, Corp. 2012
60d09e41aSPaolo Bonzini  *
70d09e41aSPaolo Bonzini  * Authors:
80d09e41aSPaolo Bonzini  *  Heinz Graalfs <graalfs@de.ibm.com>
90d09e41aSPaolo Bonzini  *
100d09e41aSPaolo Bonzini  * This work is licensed under the terms of the GNU GPL, version 2 or (at your
110d09e41aSPaolo Bonzini  * option) any later version.  See the COPYING file in the top-level directory.
120d09e41aSPaolo Bonzini  *
130d09e41aSPaolo Bonzini  */
140d09e41aSPaolo Bonzini 
150d09e41aSPaolo Bonzini #ifndef HW_S390_SCLP_EVENT_FACILITY_H
160d09e41aSPaolo Bonzini #define HW_S390_SCLP_EVENT_FACILITY_H
170d09e41aSPaolo Bonzini 
180d09e41aSPaolo Bonzini #include "qemu/thread.h"
19a27bd6c7SMarkus Armbruster #include "hw/qdev-core.h"
2049204458SJason J. Herne #include "hw/s390x/sclp.h"
21db1015e9SEduardo Habkost #include "qom/object.h"
220d09e41aSPaolo Bonzini 
230d09e41aSPaolo Bonzini /* SCLP event types */
246a444f85SHeinz Graalfs #define SCLP_EVENT_OPRTNS_COMMAND               0x01
256a444f85SHeinz Graalfs #define SCLP_EVENT_MESSAGE                      0x02
2649204458SJason J. Herne #define SCLP_EVENT_CONFIG_MGT_DATA              0x04
276a444f85SHeinz Graalfs #define SCLP_EVENT_PMSGCMD                      0x09
280d09e41aSPaolo Bonzini #define SCLP_EVENT_ASCII_CONSOLE_DATA           0x1a
290d09e41aSPaolo Bonzini #define SCLP_EVENT_SIGNAL_QUIESCE               0x1d
300d09e41aSPaolo Bonzini 
310d09e41aSPaolo Bonzini /* SCLP event masks */
321ffed98fSClaudio Imbrenda #define SCLP_EVMASK(T)  (1ULL << (sizeof(sccb_mask_t) * 8 - (T)))
331ffed98fSClaudio Imbrenda 
341ffed98fSClaudio Imbrenda #define SCLP_EVENT_MASK_OP_CMD          SCLP_EVMASK(SCLP_EVENT_OPRTNS_COMMAND)
351ffed98fSClaudio Imbrenda #define SCLP_EVENT_MASK_MSG             SCLP_EVMASK(SCLP_EVENT_MESSAGE)
361ffed98fSClaudio Imbrenda #define SCLP_EVENT_MASK_CONFIG_MGT_DATA SCLP_EVMASK(SCLP_EVENT_CONFIG_MGT_DATA)
371ffed98fSClaudio Imbrenda #define SCLP_EVENT_MASK_PMSGCMD         SCLP_EVMASK(SCLP_EVENT_PMSGCMD)
381ffed98fSClaudio Imbrenda #define SCLP_EVENT_MASK_MSG_ASCII       SCLP_EVMASK(SCLP_EVENT_ASCII_CONSOLE_DATA)
391ffed98fSClaudio Imbrenda #define SCLP_EVENT_MASK_SIGNAL_QUIESCE  SCLP_EVMASK(SCLP_EVENT_SIGNAL_QUIESCE)
400d09e41aSPaolo Bonzini 
410d09e41aSPaolo Bonzini #define SCLP_UNCONDITIONAL_READ                 0x00
420d09e41aSPaolo Bonzini #define SCLP_SELECTIVE_READ                     0x01
430d09e41aSPaolo Bonzini 
440d09e41aSPaolo Bonzini #define TYPE_SCLP_EVENT "s390-sclp-event-type"
45c821774aSEduardo Habkost OBJECT_DECLARE_TYPE(SCLPEvent, SCLPEventClass,
4630b5707cSEduardo Habkost                     SCLP_EVENT)
470d09e41aSPaolo Bonzini 
4849204458SJason J. Herne #define TYPE_SCLP_CPU_HOTPLUG "sclp-cpu-hotplug"
4935925a7aSDavid Hildenbrand #define TYPE_SCLP_QUIESCE "sclpquiesce"
5049204458SJason J. Herne 
5167915de9SCornelia Huck #define SCLP_EVENT_MASK_LEN_MAX 1021
5267915de9SCornelia Huck 
530d09e41aSPaolo Bonzini typedef struct WriteEventMask {
540d09e41aSPaolo Bonzini     SCCBHeader h;
550d09e41aSPaolo Bonzini     uint16_t _reserved;
560d09e41aSPaolo Bonzini     uint16_t mask_length;
5767915de9SCornelia Huck     uint8_t masks[];
5867915de9SCornelia Huck /*
5967915de9SCornelia Huck  * Layout of the masks is
6067915de9SCornelia Huck  *  uint8_t cp_receive_mask[mask_length];
6167915de9SCornelia Huck  *  uint8_t cp_send_mask[mask_length];
6267915de9SCornelia Huck  *  uint8_t receive_mask[mask_length];
6367915de9SCornelia Huck  *  uint8_t send_mask[mask_length];
6467915de9SCornelia Huck  * where 1 <= mask_length <= SCLP_EVENT_MASK_LEN_MAX
6567915de9SCornelia Huck  */
660d09e41aSPaolo Bonzini } QEMU_PACKED WriteEventMask;
670d09e41aSPaolo Bonzini 
6867915de9SCornelia Huck #define WEM_CP_RECEIVE_MASK(wem, mask_len) ((wem)->masks)
6967915de9SCornelia Huck #define WEM_CP_SEND_MASK(wem, mask_len) ((wem)->masks + (mask_len))
7067915de9SCornelia Huck #define WEM_RECEIVE_MASK(wem, mask_len) ((wem)->masks + 2 * (mask_len))
7167915de9SCornelia Huck #define WEM_SEND_MASK(wem, mask_len) ((wem)->masks + 3 * (mask_len))
7267915de9SCornelia Huck 
7398e43b71SClaudio Imbrenda typedef uint64_t sccb_mask_t;
741ffed98fSClaudio Imbrenda 
750d09e41aSPaolo Bonzini typedef struct EventBufferHeader {
760d09e41aSPaolo Bonzini     uint16_t length;
770d09e41aSPaolo Bonzini     uint8_t  type;
780d09e41aSPaolo Bonzini     uint8_t  flags;
790d09e41aSPaolo Bonzini     uint16_t _reserved;
800d09e41aSPaolo Bonzini } QEMU_PACKED EventBufferHeader;
810d09e41aSPaolo Bonzini 
826a444f85SHeinz Graalfs typedef struct MdbHeader {
836a444f85SHeinz Graalfs     uint16_t length;
846a444f85SHeinz Graalfs     uint16_t type;
856a444f85SHeinz Graalfs     uint32_t tag;
866a444f85SHeinz Graalfs     uint32_t revision_code;
876a444f85SHeinz Graalfs } QEMU_PACKED MdbHeader;
886a444f85SHeinz Graalfs 
896a444f85SHeinz Graalfs typedef struct MTO {
906a444f85SHeinz Graalfs     uint16_t line_type_flags;
916a444f85SHeinz Graalfs     uint8_t  alarm_control;
926a444f85SHeinz Graalfs     uint8_t  _reserved[3];
936a444f85SHeinz Graalfs     char     message[];
946a444f85SHeinz Graalfs } QEMU_PACKED MTO;
956a444f85SHeinz Graalfs 
966a444f85SHeinz Graalfs typedef struct GO {
976a444f85SHeinz Graalfs     uint32_t domid;
986a444f85SHeinz Graalfs     uint8_t  hhmmss_time[8];
996a444f85SHeinz Graalfs     uint8_t  th_time[3];
1006a444f85SHeinz Graalfs     uint8_t  _reserved_0;
1016a444f85SHeinz Graalfs     uint8_t  dddyyyy_date[7];
1026a444f85SHeinz Graalfs     uint8_t  _reserved_1;
1036a444f85SHeinz Graalfs     uint16_t general_msg_flags;
1046a444f85SHeinz Graalfs     uint8_t  _reserved_2[10];
1056a444f85SHeinz Graalfs     uint8_t  originating_system_name[8];
1066a444f85SHeinz Graalfs     uint8_t  job_guest_name[8];
1076a444f85SHeinz Graalfs } QEMU_PACKED GO;
1086a444f85SHeinz Graalfs 
1096a444f85SHeinz Graalfs #define MESSAGE_TEXT 0x0004
1106a444f85SHeinz Graalfs 
1116a444f85SHeinz Graalfs typedef struct MDBO {
1126a444f85SHeinz Graalfs     uint16_t length;
1136a444f85SHeinz Graalfs     uint16_t type;
1146a444f85SHeinz Graalfs     union {
1156a444f85SHeinz Graalfs         GO go;
1166a444f85SHeinz Graalfs         MTO mto;
1176a444f85SHeinz Graalfs     };
1186a444f85SHeinz Graalfs } QEMU_PACKED MDBO;
1196a444f85SHeinz Graalfs 
1206a444f85SHeinz Graalfs typedef struct MDB {
1216a444f85SHeinz Graalfs     MdbHeader header;
122880a7817SPhilippe Mathieu-Daudé     MDBO mdbo[];
1236a444f85SHeinz Graalfs } QEMU_PACKED MDB;
1246a444f85SHeinz Graalfs 
1256a444f85SHeinz Graalfs typedef struct SclpMsg {
1266a444f85SHeinz Graalfs     EventBufferHeader header;
1276a444f85SHeinz Graalfs     MDB mdb;
1286a444f85SHeinz Graalfs } QEMU_PACKED SclpMsg;
1296a444f85SHeinz Graalfs 
1306a444f85SHeinz Graalfs #define GDS_ID_MDSMU                            0x1310
1316a444f85SHeinz Graalfs #define GDS_ID_CPMSU                            0x1212
1326a444f85SHeinz Graalfs #define GDS_ID_TEXTCMD                          0x1320
1336a444f85SHeinz Graalfs 
1346a444f85SHeinz Graalfs typedef struct GdsVector {
1356a444f85SHeinz Graalfs     uint16_t length;
1366a444f85SHeinz Graalfs     uint16_t gds_id;
1376a444f85SHeinz Graalfs } QEMU_PACKED GdsVector;
1386a444f85SHeinz Graalfs 
1396a444f85SHeinz Graalfs #define GDS_KEY_SELFDEFTEXTMSG                  0x31
1406a444f85SHeinz Graalfs #define GDS_KEY_TEXTMSG                         0x30
1416a444f85SHeinz Graalfs 
1426a444f85SHeinz Graalfs typedef struct GdsSubvector {
1436a444f85SHeinz Graalfs     uint8_t length;
1446a444f85SHeinz Graalfs     uint8_t key;
1456a444f85SHeinz Graalfs } QEMU_PACKED GdsSubvector;
1466a444f85SHeinz Graalfs 
1476a444f85SHeinz Graalfs /* MDS Message Unit */
1486a444f85SHeinz Graalfs typedef struct MDMSU {
1496a444f85SHeinz Graalfs     GdsVector mdmsu;
1506a444f85SHeinz Graalfs     GdsVector cpmsu;
1516a444f85SHeinz Graalfs     GdsVector text_command;
1526a444f85SHeinz Graalfs     GdsSubvector self_def_text_message;
1536a444f85SHeinz Graalfs     GdsSubvector text_message;
1546a444f85SHeinz Graalfs } QEMU_PACKED MDMSU;
1556a444f85SHeinz Graalfs 
1560d09e41aSPaolo Bonzini typedef struct WriteEventData {
1570d09e41aSPaolo Bonzini     SCCBHeader h;
1580d09e41aSPaolo Bonzini     EventBufferHeader ebh;
1590d09e41aSPaolo Bonzini } QEMU_PACKED WriteEventData;
1600d09e41aSPaolo Bonzini 
1610d09e41aSPaolo Bonzini typedef struct ReadEventData {
1620d09e41aSPaolo Bonzini     SCCBHeader h;
163f7822aa8SCornelia Huck     union {
1641ffed98fSClaudio Imbrenda         sccb_mask_t mask;
165f7822aa8SCornelia Huck         EventBufferHeader ebh;
166f7822aa8SCornelia Huck     };
1670d09e41aSPaolo Bonzini } QEMU_PACKED ReadEventData;
1680d09e41aSPaolo Bonzini 
169db1015e9SEduardo Habkost struct SCLPEvent {
1700d09e41aSPaolo Bonzini     DeviceState qdev;
1710d09e41aSPaolo Bonzini     bool event_pending;
1720d09e41aSPaolo Bonzini     char *name;
173db1015e9SEduardo Habkost };
1740d09e41aSPaolo Bonzini 
175db1015e9SEduardo Habkost struct SCLPEventClass {
1760d09e41aSPaolo Bonzini     DeviceClass parent_class;
1770d09e41aSPaolo Bonzini     int (*init)(SCLPEvent *event);
1780d09e41aSPaolo Bonzini 
1790d09e41aSPaolo Bonzini     /* get SCLP's send mask */
1801ffed98fSClaudio Imbrenda     sccb_mask_t (*get_send_mask)(void);
1810d09e41aSPaolo Bonzini 
1820d09e41aSPaolo Bonzini     /* get SCLP's receive mask */
1831ffed98fSClaudio Imbrenda     sccb_mask_t (*get_receive_mask)(void);
1840d09e41aSPaolo Bonzini 
1850d09e41aSPaolo Bonzini     int (*read_event_data)(SCLPEvent *event, EventBufferHeader *evt_buf_hdr,
1860d09e41aSPaolo Bonzini                            int *slen);
1870d09e41aSPaolo Bonzini 
1880d09e41aSPaolo Bonzini     int (*write_event_data)(SCLPEvent *event, EventBufferHeader *evt_buf_hdr);
1890d09e41aSPaolo Bonzini 
190c3d9f24aSChristian Borntraeger     /* can we handle this event type? */
191c3d9f24aSChristian Borntraeger     bool (*can_handle_event)(uint8_t type);
192db1015e9SEduardo Habkost };
1930d09e41aSPaolo Bonzini 
194477a72a1SHeinz Graalfs #define TYPE_SCLP_EVENT_FACILITY "s390-sclp-event-facility"
19543f01440SEduardo Habkost typedef struct SCLPEventFacility SCLPEventFacility;
196db1015e9SEduardo Habkost typedef struct SCLPEventFacilityClass SCLPEventFacilityClass;
1978110fa1dSEduardo Habkost DECLARE_OBJ_CHECKERS(SCLPEventFacility, SCLPEventFacilityClass,
1988110fa1dSEduardo Habkost                      EVENT_FACILITY, TYPE_SCLP_EVENT_FACILITY)
199477a72a1SHeinz Graalfs 
200db1015e9SEduardo Habkost struct SCLPEventFacilityClass {
201f6102c32SDavid Hildenbrand     SysBusDeviceClass parent_class;
202477a72a1SHeinz Graalfs     void (*command_handler)(SCLPEventFacility *ef, SCCB *sccb, uint64_t code);
203477a72a1SHeinz Graalfs     bool (*event_pending)(SCLPEventFacility *ef);
204db1015e9SEduardo Habkost };
205477a72a1SHeinz Graalfs 
206*af4a3e32SCédric Le Goater BusState *sclp_get_event_facility_bus(SCLPEventFacility *ef);
207052888f0SThomas Huth 
2080d09e41aSPaolo Bonzini #endif
209