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