1*0369b2ebSAlexander Graf /* 2*0369b2ebSAlexander Graf * SCLP ASCII access driver 3*0369b2ebSAlexander Graf * 4*0369b2ebSAlexander Graf * Copyright (c) 2013 Alexander Graf <agraf@suse.de> 5*0369b2ebSAlexander Graf * 6*0369b2ebSAlexander Graf * This work is licensed under the terms of the GNU GPL, version 2 or (at 7*0369b2ebSAlexander Graf * your option) any later version. See the COPYING file in the top-level 8*0369b2ebSAlexander Graf * directory. 9*0369b2ebSAlexander Graf */ 10*0369b2ebSAlexander Graf 11*0369b2ebSAlexander Graf #ifndef SCLP_H 12*0369b2ebSAlexander Graf #define SCLP_H 13*0369b2ebSAlexander Graf 14*0369b2ebSAlexander Graf /* SCLP command codes */ 15*0369b2ebSAlexander Graf #define SCLP_CMDW_READ_SCP_INFO 0x00020001 16*0369b2ebSAlexander Graf #define SCLP_CMDW_READ_SCP_INFO_FORCED 0x00120001 17*0369b2ebSAlexander Graf #define SCLP_CMD_READ_EVENT_DATA 0x00770005 18*0369b2ebSAlexander Graf #define SCLP_CMD_WRITE_EVENT_DATA 0x00760005 19*0369b2ebSAlexander Graf #define SCLP_CMD_READ_EVENT_DATA 0x00770005 20*0369b2ebSAlexander Graf #define SCLP_CMD_WRITE_EVENT_DATA 0x00760005 21*0369b2ebSAlexander Graf #define SCLP_CMD_WRITE_EVENT_MASK 0x00780005 22*0369b2ebSAlexander Graf 23*0369b2ebSAlexander Graf /* SCLP response codes */ 24*0369b2ebSAlexander Graf #define SCLP_RC_NORMAL_READ_COMPLETION 0x0010 25*0369b2ebSAlexander Graf #define SCLP_RC_NORMAL_COMPLETION 0x0020 26*0369b2ebSAlexander Graf #define SCLP_RC_INVALID_SCLP_COMMAND 0x01f0 27*0369b2ebSAlexander Graf #define SCLP_RC_CONTAINED_EQUIPMENT_CHECK 0x0340 28*0369b2ebSAlexander Graf #define SCLP_RC_INSUFFICIENT_SCCB_LENGTH 0x0300 29*0369b2ebSAlexander Graf #define SCLP_RC_INVALID_FUNCTION 0x40f0 30*0369b2ebSAlexander Graf #define SCLP_RC_NO_EVENT_BUFFERS_STORED 0x60f0 31*0369b2ebSAlexander Graf #define SCLP_RC_INVALID_SELECTION_MASK 0x70f0 32*0369b2ebSAlexander Graf #define SCLP_RC_INCONSISTENT_LENGTHS 0x72f0 33*0369b2ebSAlexander Graf #define SCLP_RC_EVENT_BUFFER_SYNTAX_ERROR 0x73f0 34*0369b2ebSAlexander Graf #define SCLP_RC_INVALID_MASK_LENGTH 0x74f0 35*0369b2ebSAlexander Graf 36*0369b2ebSAlexander Graf /* Service Call Control Block (SCCB) and its elements */ 37*0369b2ebSAlexander Graf 38*0369b2ebSAlexander Graf #define SCCB_SIZE 4096 39*0369b2ebSAlexander Graf 40*0369b2ebSAlexander Graf #define SCLP_VARIABLE_LENGTH_RESPONSE 0x80 41*0369b2ebSAlexander Graf #define SCLP_EVENT_BUFFER_ACCEPTED 0x80 42*0369b2ebSAlexander Graf 43*0369b2ebSAlexander Graf #define SCLP_FC_NORMAL_WRITE 0 44*0369b2ebSAlexander Graf 45*0369b2ebSAlexander Graf typedef struct SCCBHeader { 46*0369b2ebSAlexander Graf uint16_t length; 47*0369b2ebSAlexander Graf uint8_t function_code; 48*0369b2ebSAlexander Graf uint8_t control_mask[3]; 49*0369b2ebSAlexander Graf uint16_t response_code; 50*0369b2ebSAlexander Graf } __attribute__((packed)) SCCBHeader; 51*0369b2ebSAlexander Graf 52*0369b2ebSAlexander Graf #define SCCB_DATA_LEN (SCCB_SIZE - sizeof(SCCBHeader)) 53*0369b2ebSAlexander Graf 54*0369b2ebSAlexander Graf typedef struct ReadInfo { 55*0369b2ebSAlexander Graf SCCBHeader h; 56*0369b2ebSAlexander Graf uint16_t rnmax; 57*0369b2ebSAlexander Graf uint8_t rnsize; 58*0369b2ebSAlexander Graf } __attribute__((packed)) ReadInfo; 59*0369b2ebSAlexander Graf 60*0369b2ebSAlexander Graf typedef struct SCCB { 61*0369b2ebSAlexander Graf SCCBHeader h; 62*0369b2ebSAlexander Graf char data[SCCB_DATA_LEN]; 63*0369b2ebSAlexander Graf } __attribute__((packed)) SCCB; 64*0369b2ebSAlexander Graf 65*0369b2ebSAlexander Graf /* SCLP event types */ 66*0369b2ebSAlexander Graf #define SCLP_EVENT_ASCII_CONSOLE_DATA 0x1a 67*0369b2ebSAlexander Graf #define SCLP_EVENT_SIGNAL_QUIESCE 0x1d 68*0369b2ebSAlexander Graf 69*0369b2ebSAlexander Graf /* SCLP event masks */ 70*0369b2ebSAlexander Graf #define SCLP_EVENT_MASK_SIGNAL_QUIESCE 0x00000008 71*0369b2ebSAlexander Graf #define SCLP_EVENT_MASK_MSG_ASCII 0x00000040 72*0369b2ebSAlexander Graf 73*0369b2ebSAlexander Graf #define SCLP_UNCONDITIONAL_READ 0x00 74*0369b2ebSAlexander Graf #define SCLP_SELECTIVE_READ 0x01 75*0369b2ebSAlexander Graf 76*0369b2ebSAlexander Graf typedef struct WriteEventMask { 77*0369b2ebSAlexander Graf SCCBHeader h; 78*0369b2ebSAlexander Graf uint16_t _reserved; 79*0369b2ebSAlexander Graf uint16_t mask_length; 80*0369b2ebSAlexander Graf uint32_t cp_receive_mask; 81*0369b2ebSAlexander Graf uint32_t cp_send_mask; 82*0369b2ebSAlexander Graf uint32_t send_mask; 83*0369b2ebSAlexander Graf uint32_t receive_mask; 84*0369b2ebSAlexander Graf } __attribute__((packed)) WriteEventMask; 85*0369b2ebSAlexander Graf 86*0369b2ebSAlexander Graf typedef struct EventBufferHeader { 87*0369b2ebSAlexander Graf uint16_t length; 88*0369b2ebSAlexander Graf uint8_t type; 89*0369b2ebSAlexander Graf uint8_t flags; 90*0369b2ebSAlexander Graf uint16_t _reserved; 91*0369b2ebSAlexander Graf } __attribute__((packed)) EventBufferHeader; 92*0369b2ebSAlexander Graf 93*0369b2ebSAlexander Graf typedef struct WriteEventData { 94*0369b2ebSAlexander Graf SCCBHeader h; 95*0369b2ebSAlexander Graf EventBufferHeader ebh; 96*0369b2ebSAlexander Graf char data[0]; 97*0369b2ebSAlexander Graf } __attribute__((packed)) WriteEventData; 98*0369b2ebSAlexander Graf 99*0369b2ebSAlexander Graf typedef struct ReadEventData { 100*0369b2ebSAlexander Graf SCCBHeader h; 101*0369b2ebSAlexander Graf EventBufferHeader ebh; 102*0369b2ebSAlexander Graf uint32_t mask; 103*0369b2ebSAlexander Graf } __attribute__((packed)) ReadEventData; 104*0369b2ebSAlexander Graf 105*0369b2ebSAlexander Graf #define __pa(x) (x) 106*0369b2ebSAlexander Graf 107*0369b2ebSAlexander Graf #endif /* SCLP_H */ 108