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]; 59*a0e11b61SCollin 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; 980369b2ebSAlexander Graf char data[0]; 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