1*435c758dSShalini Chellathurai Saroja /* 2*435c758dSShalini Chellathurai Saroja * SPDX-License-Identifier: GPL-2.0-or-later 3*435c758dSShalini Chellathurai Saroja * 4*435c758dSShalini Chellathurai Saroja * SCLP event type 11 - Control-Program Identification (CPI): 5*435c758dSShalini Chellathurai Saroja * CPI is used to send program identifiers from the guest to the 6*435c758dSShalini Chellathurai Saroja * Service-Call Logical Processor (SCLP). It is not sent by the SCLP. 7*435c758dSShalini Chellathurai Saroja * 8*435c758dSShalini Chellathurai Saroja * Control-program identifiers provide data about the guest operating 9*435c758dSShalini Chellathurai Saroja * system. The control-program identifiers are: system type, system name, 10*435c758dSShalini Chellathurai Saroja * system level and sysplex name. 11*435c758dSShalini Chellathurai Saroja * 12*435c758dSShalini Chellathurai Saroja * In Linux, all the control-program identifiers are user configurable. The 13*435c758dSShalini Chellathurai Saroja * system type, system name, and sysplex name use EBCDIC characters from 14*435c758dSShalini Chellathurai Saroja * this set: capital A-Z, 0-9, $, @, #, and blank. In Linux, the system 15*435c758dSShalini Chellathurai Saroja * type, system name and sysplex name are arbitrary free-form texts. 16*435c758dSShalini Chellathurai Saroja * 17*435c758dSShalini Chellathurai Saroja * In Linux, the 8-byte hexadecimal system-level has the format 18*435c758dSShalini Chellathurai Saroja * 0x<a><b><cc><dd><eeee><ff><gg><hh>, where: 19*435c758dSShalini Chellathurai Saroja * <a>: is a 4-bit digit, its most significant bit indicates hypervisor use 20*435c758dSShalini Chellathurai Saroja * <b>: is one digit that represents Linux distributions as follows 21*435c758dSShalini Chellathurai Saroja * 0: generic Linux 22*435c758dSShalini Chellathurai Saroja * 1: Red Hat Enterprise Linux 23*435c758dSShalini Chellathurai Saroja * 2: SUSE Linux Enterprise Server 24*435c758dSShalini Chellathurai Saroja * 3: Canonical Ubuntu 25*435c758dSShalini Chellathurai Saroja * 4: Fedora 26*435c758dSShalini Chellathurai Saroja * 5: openSUSE Leap 27*435c758dSShalini Chellathurai Saroja * 6: Debian GNU/Linux 28*435c758dSShalini Chellathurai Saroja * 7: Red Hat Enterprise Linux CoreOS 29*435c758dSShalini Chellathurai Saroja * <cc>: are two digits for a distribution-specific encoding of the major 30*435c758dSShalini Chellathurai Saroja * version of the distribution 31*435c758dSShalini Chellathurai Saroja * <dd>: are two digits for a distribution-specific encoding of the minor 32*435c758dSShalini Chellathurai Saroja * version of the distribution 33*435c758dSShalini Chellathurai Saroja * <eeee>: are four digits for the patch level of the distribution 34*435c758dSShalini Chellathurai Saroja * <ff>: are two digits for the major version of the kernel 35*435c758dSShalini Chellathurai Saroja * <gg>: are two digits for the minor version of the kernel 36*435c758dSShalini Chellathurai Saroja * <hh>: are two digits for the stable version of the kernel 37*435c758dSShalini Chellathurai Saroja * (e.g. 74872343805430528, when converted to hex is 0x010a000000060b00). On 38*435c758dSShalini Chellathurai Saroja * machines prior to z16, some of the values are not available to display. 39*435c758dSShalini Chellathurai Saroja * 40*435c758dSShalini Chellathurai Saroja * Sysplex refers to a cluster of logical partitions that communicates and 41*435c758dSShalini Chellathurai Saroja * co-operates with each other. 42*435c758dSShalini Chellathurai Saroja * 43*435c758dSShalini Chellathurai Saroja * The CPI feature is supported since 10.1. 44*435c758dSShalini Chellathurai Saroja * 45*435c758dSShalini Chellathurai Saroja * Copyright IBM, Corp. 2024 46*435c758dSShalini Chellathurai Saroja * 47*435c758dSShalini Chellathurai Saroja * Authors: 48*435c758dSShalini Chellathurai Saroja * Shalini Chellathurai Saroja <shalini@linux.ibm.com> 49*435c758dSShalini Chellathurai Saroja * 50*435c758dSShalini Chellathurai Saroja */ 51*435c758dSShalini Chellathurai Saroja 52*435c758dSShalini Chellathurai Saroja #include "qemu/osdep.h" 53*435c758dSShalini Chellathurai Saroja #include "hw/s390x/event-facility.h" 54*435c758dSShalini Chellathurai Saroja 55*435c758dSShalini Chellathurai Saroja typedef struct Data { 56*435c758dSShalini Chellathurai Saroja uint8_t id_format; 57*435c758dSShalini Chellathurai Saroja uint8_t reserved0; 58*435c758dSShalini Chellathurai Saroja uint8_t system_type[8]; 59*435c758dSShalini Chellathurai Saroja uint64_t reserved1; 60*435c758dSShalini Chellathurai Saroja uint8_t system_name[8]; 61*435c758dSShalini Chellathurai Saroja uint64_t reserved2; 62*435c758dSShalini Chellathurai Saroja uint64_t system_level; 63*435c758dSShalini Chellathurai Saroja uint64_t reserved3; 64*435c758dSShalini Chellathurai Saroja uint8_t sysplex_name[8]; 65*435c758dSShalini Chellathurai Saroja uint8_t reserved4[16]; 66*435c758dSShalini Chellathurai Saroja } QEMU_PACKED Data; 67*435c758dSShalini Chellathurai Saroja 68*435c758dSShalini Chellathurai Saroja typedef struct ControlProgramIdMsg { 69*435c758dSShalini Chellathurai Saroja EventBufferHeader ebh; 70*435c758dSShalini Chellathurai Saroja Data data; 71*435c758dSShalini Chellathurai Saroja } QEMU_PACKED ControlProgramIdMsg; 72*435c758dSShalini Chellathurai Saroja 73*435c758dSShalini Chellathurai Saroja static bool can_handle_event(uint8_t type) 74*435c758dSShalini Chellathurai Saroja { 75*435c758dSShalini Chellathurai Saroja return type == SCLP_EVENT_CTRL_PGM_ID; 76*435c758dSShalini Chellathurai Saroja } 77*435c758dSShalini Chellathurai Saroja 78*435c758dSShalini Chellathurai Saroja static sccb_mask_t send_mask(void) 79*435c758dSShalini Chellathurai Saroja { 80*435c758dSShalini Chellathurai Saroja return 0; 81*435c758dSShalini Chellathurai Saroja } 82*435c758dSShalini Chellathurai Saroja 83*435c758dSShalini Chellathurai Saroja /* Enable SCLP to accept buffers of event type CPI from the control-program. */ 84*435c758dSShalini Chellathurai Saroja static sccb_mask_t receive_mask(void) 85*435c758dSShalini Chellathurai Saroja { 86*435c758dSShalini Chellathurai Saroja return SCLP_EVENT_MASK_CTRL_PGM_ID; 87*435c758dSShalini Chellathurai Saroja } 88*435c758dSShalini Chellathurai Saroja 89*435c758dSShalini Chellathurai Saroja static int write_event_data(SCLPEvent *event, EventBufferHeader *evt_buf_hdr) 90*435c758dSShalini Chellathurai Saroja { 91*435c758dSShalini Chellathurai Saroja ControlProgramIdMsg *cpim = container_of(evt_buf_hdr, ControlProgramIdMsg, 92*435c758dSShalini Chellathurai Saroja ebh); 93*435c758dSShalini Chellathurai Saroja 94*435c758dSShalini Chellathurai Saroja cpim->ebh.flags = SCLP_EVENT_BUFFER_ACCEPTED; 95*435c758dSShalini Chellathurai Saroja return SCLP_RC_NORMAL_COMPLETION; 96*435c758dSShalini Chellathurai Saroja } 97*435c758dSShalini Chellathurai Saroja 98*435c758dSShalini Chellathurai Saroja static void cpi_class_init(ObjectClass *klass, const void *data) 99*435c758dSShalini Chellathurai Saroja { 100*435c758dSShalini Chellathurai Saroja DeviceClass *dc = DEVICE_CLASS(klass); 101*435c758dSShalini Chellathurai Saroja SCLPEventClass *k = SCLP_EVENT_CLASS(klass); 102*435c758dSShalini Chellathurai Saroja 103*435c758dSShalini Chellathurai Saroja dc->user_creatable = false; 104*435c758dSShalini Chellathurai Saroja 105*435c758dSShalini Chellathurai Saroja k->can_handle_event = can_handle_event; 106*435c758dSShalini Chellathurai Saroja k->get_send_mask = send_mask; 107*435c758dSShalini Chellathurai Saroja k->get_receive_mask = receive_mask; 108*435c758dSShalini Chellathurai Saroja k->write_event_data = write_event_data; 109*435c758dSShalini Chellathurai Saroja } 110*435c758dSShalini Chellathurai Saroja 111*435c758dSShalini Chellathurai Saroja static const TypeInfo sclp_cpi_info = { 112*435c758dSShalini Chellathurai Saroja .name = TYPE_SCLP_EVENT_CPI, 113*435c758dSShalini Chellathurai Saroja .parent = TYPE_SCLP_EVENT, 114*435c758dSShalini Chellathurai Saroja .instance_size = sizeof(SCLPEventCPI), 115*435c758dSShalini Chellathurai Saroja .class_init = cpi_class_init, 116*435c758dSShalini Chellathurai Saroja }; 117*435c758dSShalini Chellathurai Saroja 118*435c758dSShalini Chellathurai Saroja static void sclp_cpi_register_types(void) 119*435c758dSShalini Chellathurai Saroja { 120*435c758dSShalini Chellathurai Saroja type_register_static(&sclp_cpi_info); 121*435c758dSShalini Chellathurai Saroja } 122*435c758dSShalini Chellathurai Saroja 123*435c758dSShalini Chellathurai Saroja type_init(sclp_cpi_register_types) 124